1 /******************************************************************************* 2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3 * 4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided 5 *that the following conditions are met: 6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7 *following disclaimer. 8 *2. Redistributions in binary form must reproduce the above copyright notice, 9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided 10 *with the distribution. 11 * 12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20 21 ********************************************************************************/ 22 /*****************************************************************************/ 23 /** \file 24 * 25 * The file implementing SCSI/ATA Translation (SAT) for LL Layer callback 26 * 27 */ 28 /*****************************************************************************/ 29 #include <sys/cdefs.h> 30 #include <dev/pms/config.h> 31 32 #include <dev/pms/freebsd/driver/common/osenv.h> 33 #include <dev/pms/freebsd/driver/common/ostypes.h> 34 #include <dev/pms/freebsd/driver/common/osdebug.h> 35 36 #ifdef SATA_ENABLE 37 38 #include <dev/pms/RefTisa/sallsdk/api/sa.h> 39 #include <dev/pms/RefTisa/sallsdk/api/saapi.h> 40 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h> 41 42 #include <dev/pms/RefTisa/tisa/api/titypes.h> 43 #include <dev/pms/RefTisa/tisa/api/ostiapi.h> 44 #include <dev/pms/RefTisa/tisa/api/tiapi.h> 45 #include <dev/pms/RefTisa/tisa/api/tiglobal.h> 46 47 #ifdef FDS_SM 48 #include <dev/pms/RefTisa/sat/api/sm.h> 49 #include <dev/pms/RefTisa/sat/api/smapi.h> 50 #include <dev/pms/RefTisa/sat/api/tdsmapi.h> 51 #endif 52 53 #ifdef FDS_DM 54 #include <dev/pms/RefTisa/discovery/api/dm.h> 55 #include <dev/pms/RefTisa/discovery/api/dmapi.h> 56 #include <dev/pms/RefTisa/discovery/api/tddmapi.h> 57 #endif 58 59 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h> 60 #include <dev/pms/freebsd/driver/common/osstring.h> 61 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h> 62 63 #ifdef INITIATOR_DRIVER 64 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h> 65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h> 66 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h> 67 #endif 68 69 #ifdef TARGET_DRIVER 70 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h> 71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h> 72 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h> 73 #endif 74 75 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h> 76 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h> 77 78 #include <dev/pms/RefTisa/tisa/sassata/sata/host/sat.h> 79 #include <dev/pms/RefTisa/tisa/sassata/sata/host/satproto.h> 80 81 /***************************************************************************** 82 *! \brief ossaSATACompleted 83 * 84 * This routine is called to complete a SATA request previously issued to the 85 * LL Layer in saSATAStart() 86 * 87 * \param agRoot: Handles for this instance of SAS/SATA hardware 88 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 89 * \param agIOStatus: Status of completed I/O. 90 * \param agFirstDword:Pointer to the four bytes of FIS. 91 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 92 * length. 93 * \param agParam: Additional info based on status. 94 * 95 * \return: none 96 * 97 *****************************************************************************/ 98 GLOBAL void 99 ossaSATACompleted( 100 agsaRoot_t *agRoot, 101 agsaIORequest_t *agIORequest, 102 bit32 agIOStatus, 103 void *agFirstDword, 104 bit32 agIOInfoLen, 105 void *agParam 106 ) 107 108 { 109 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 110 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 111 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 112 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared); 113 tdIORequestBody_t *tdIORequestBody; 114 satIOContext_t *satIOContext; 115 satDeviceData_t *pSatDevData; 116 tdsaDeviceData_t *tdsaDeviceData = agNULL; 117 tdsaPortContext_t *onePortContext; 118 tiDeviceHandle_t *tiDeviceHandle = agNULL; 119 agsaDevHandle_t *agDevHandle = agNULL; 120 bit32 status; 121 tdsaDeviceData_t *oneDeviceData = agNULL; 122 123 TDSA_OUT_ENTER(tiRoot); 124 125 TI_DBG6(("ossaSATACompleted: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 126 agIORequest, agIOStatus, agIOInfoLen)); 127 128 if (agIORequest == agNULL) 129 { 130 TI_DBG1(("ossaSATACompleted: agIORequest is NULL!!!!\n")); 131 return; 132 } 133 134 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 135 136 if (tdIORequestBody == agNULL) 137 { 138 TI_DBG1(("ossaSATACompleted: tdIORequestBody is NULL!!!!\n")); 139 return; 140 } 141 /* for debugging */ 142 if (tdIORequestBody->ioCompleted == agTRUE) 143 { 144 tiDeviceHandle = tdIORequestBody->tiDevHandle; 145 if (tiDeviceHandle == agNULL) 146 { 147 TI_DBG1(("ossaSATACompleted: tiDeviceHandle is NULL!!!!\n")); 148 return; 149 } 150 tdsaDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 151 TI_DBG1(("ossaSATACompleted: Error!!!!!! double completion\n")); 152 if (tdsaDeviceData == agNULL) 153 { 154 TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n")); 155 return; 156 } 157 TI_DBG1(("ossaSATACompleted: did %d \n", tdsaDeviceData->id)); 158 return; 159 } 160 161 tdIORequestBody->ioCompleted = agTRUE; 162 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext); 163 164 if (satIOContext == agNULL) 165 { 166 TI_DBG1(("ossaSATACompleted: satIOContext is NULL!!!!\n")); 167 return; 168 } 169 170 pSatDevData = satIOContext->pSatDevData; 171 172 if (tdIORequestBody->tiDevHandle != agNULL) 173 { 174 oneDeviceData = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData; 175 } 176 177 if (pSatDevData == agNULL && oneDeviceData != agNULL) 178 { 179 TI_DBG1(("ossaSATACompleted: pSatDevData is NULL, loc 1, wrong\n")); 180 pSatDevData = &(oneDeviceData->satDevData); 181 } 182 183 if (pSatDevData == agNULL) 184 { 185 TI_DBG1(("ossaSATACompleted: pSatDevData is NULL loc 2, wrong\n")); 186 if (satIOContext->satOrgIOContext == agNULL) 187 { 188 TI_DBG1(("ossaSATACompleted: external command\n")); 189 } 190 else 191 { 192 TI_DBG1(("ossaSATACompleted: internal command\n")); 193 } 194 goto ext; 195 } 196 197 tdsaDeviceData = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData; 198 if (oneDeviceData != tdsaDeviceData) 199 { 200 if (satIOContext->satOrgIOContext == agNULL) 201 { 202 TI_DBG1(("ossaSATACompleted: diff device handle; external command\n")); 203 } 204 else 205 { 206 TI_DBG1(("ossaSATACompleted: diff device handle; internal command\n")); 207 } 208 } 209 210 if (tdsaDeviceData == agNULL) 211 { 212 TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n")); 213 return; 214 } 215 216 onePortContext = tdsaDeviceData->tdPortContext; 217 218 /* retries in OSSA_IO_XFER_OPEN_RETRY_TIMEOUT */ 219 if (agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT) 220 { 221 if (tdsaDeviceData->valid == agTRUE && tdsaDeviceData->registered == agTRUE && 222 tdsaDeviceData->tdPortContext != agNULL ) 223 { 224 if (tdIORequestBody->reTries <= OPEN_RETRY_RETRIES) /* 10 */ 225 { 226 agDevHandle = tdsaDeviceData->agDevHandle; 227 status = saSATAStart( agRoot, 228 agIORequest, 229 tdsaRotateQnumber(tiRoot, tdsaDeviceData), 230 agDevHandle, 231 satIOContext->reqType, 232 &(tdIORequestBody->transport.SATA.agSATARequestBody), 233 satIOContext->sataTag, 234 ossaSATACompleted); 235 236 if (status == AGSA_RC_SUCCESS) 237 { 238 TI_DBG1(("ossaSATACompleted: retried\n")); 239 tdIORequestBody->ioStarted = agTRUE; 240 tdIORequestBody->ioCompleted = agFALSE; 241 tdIORequestBody->reTries++; 242 goto ext; 243 } 244 else 245 { 246 TI_DBG1(("ossaSATACompleted: retry failed\n")); 247 tdIORequestBody->ioStarted = agFALSE; 248 tdIORequestBody->ioCompleted = agTRUE; 249 tdIORequestBody->reTries = 0; 250 } 251 } 252 else 253 { 254 /* retries is over, do nothing */ 255 TI_DBG1(("ossaSATACompleted: retry is over and fail\n")); 256 tdIORequestBody->reTries = 0; 257 } 258 } 259 else 260 { 261 TI_DBG1(("ossaSATACompleted: incorrect device state or no portcontext\n")); 262 tdIORequestBody->reTries = 0; 263 } 264 } /* if OSSA_IO_XFER_OPEN_RETRY_TIMEOUT*/ 265 266 /* release tag value for SATA */ 267 if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) || 268 (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) ) 269 { 270 satTagRelease(tiRoot, pSatDevData, satIOContext->sataTag); 271 } 272 273 /* send SMP_PHY_CONTROL_HARD_RESET */ 274 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA) 275 { 276 if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */ 277 { 278 TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n")); 279 pSatDevData->NumOfFCA++; 280 tdsaPhyControlSend(tiRoot, 281 tdsaDeviceData, 282 SMP_PHY_CONTROL_HARD_RESET, 283 agNULL, 284 tdsaRotateQnumber(tiRoot, tdsaDeviceData) 285 ); 286 } 287 else 288 { 289 /* given up after one time of SMP HARD RESET; */ 290 TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n")); 291 if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0) 292 { 293 /* 294 1. remove this device 295 2. device removal event 296 */ 297 tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData); 298 tdsaDeviceData->valid = agFALSE; 299 tdsaDeviceData->valid2 = agFALSE; 300 tdsaDeviceData->registered = agFALSE; 301 // pSatDevData->NumOfFCA = 0; 302 ostiInitiatorEvent( 303 tiRoot, 304 onePortContext->tiPortalContext, 305 agNULL, 306 tiIntrEventTypeDeviceChange, 307 tiDeviceRemoval, 308 agNULL 309 ); 310 } 311 } 312 } 313 314 if (agIOStatus == OSSA_IO_ABORTED) 315 { 316 /* 317 free abort IO request itself - agParam; done in ossaSATAEvent() 318 */ 319 } 320 /* just for debugging */ 321 if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL) 322 { 323 TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n")); 324 } 325 if (agIOStatus == OSSA_IO_DS_IN_RECOVERY) 326 { 327 TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_IN_RECOVERY\n")); 328 } 329 330 satIOContext->satCompleteCB( agRoot, 331 agIORequest, 332 agIOStatus, 333 agFirstDword, 334 agIOInfoLen, 335 agParam, 336 satIOContext); 337 ext: 338 TDSA_OUT_LEAVE(tiRoot); 339 } 340 341 /***************************************************************************** 342 *! \brief satPacketCB 343 * 344 * This routine is a callback function called from ossaSATACompleted(). 345 * This CB routine deals with normal Packet command I/O SATA request. 346 * 347 * \param agRoot: Handles for this instance of SAS/SATA hardware 348 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 349 * \param agIOStatus: Status of completed I/O. 350 * \param agFirstDword:Pointer to the four bytes of FIS. 351 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 352 * length. 353 * \param agParam: Additional info based on status. 354 * \param ioContext: Pointer to satIOContext_t. 355 * 356 * \return: none 357 * 358 *****************************************************************************/ 359 360 void satPacketCB( 361 agsaRoot_t *agRoot, 362 agsaIORequest_t *agIORequest, 363 bit32 agIOStatus, 364 agsaFisHeader_t *agFirstDword, 365 bit32 agIOInfoLen, 366 void *agParam, 367 void *ioContext 368 ) 369 { 370 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 371 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 372 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 373 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 374 tdIORequestBody_t *tdIORequestBody; 375 tdIORequestBody_t *tdOrgIORequestBody; 376 satIOContext_t *satIOContext; 377 satIOContext_t *satOrgIOContext; 378 satIOContext_t *satNewIOContext; 379 satInternalIo_t *satIntIo; 380 satInternalIo_t *satNewIntIo = agNULL; 381 satDeviceData_t *satDevData; 382 scsiRspSense_t *pSense; 383 tiIORequest_t *tiOrgIORequest; 384 tiIniScsiCmnd_t *scsiCmnd; 385 bit32 interruptContext = osData->IntContext; 386 bit8 bSenseKey = 0; 387 bit16 bSenseCodeInfo = 0; 388 bit32 status = 0; 389 390 TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 391 392 /* internally generate tiIOContext */ 393 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 394 satIOContext = (satIOContext_t *) ioContext; 395 satIntIo = satIOContext->satIntIoContext; 396 satDevData = satIOContext->pSatDevData; 397 398 /*ttttttthe one */ 399 if (satIntIo == agNULL) 400 { 401 TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n")); 402 satOrgIOContext = satIOContext; 403 tiOrgIORequest = tdIORequestBody->tiIORequest; 404 pSense = satOrgIOContext->pSense; 405 scsiCmnd = satOrgIOContext->pScsiCmnd; 406 } 407 else 408 { 409 TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n")); 410 satOrgIOContext = satIOContext->satOrgIOContext; 411 if (satOrgIOContext == agNULL) 412 { 413 TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n")); 414 return; 415 } 416 else 417 { 418 TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n")); 419 } 420 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 421 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 422 pSense = satOrgIOContext->pSense; 423 scsiCmnd = satOrgIOContext->pScsiCmnd; 424 } 425 426 /* Parse CDB */ 427 switch(scsiCmnd->cdb[0]) 428 { 429 case SCSIOPC_TEST_UNIT_READY: 430 //satTestUnitReadyCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext); 431 //break; 432 case SCSIOPC_GET_EVENT_STATUS_NOTIFICATION: 433 //break; 434 case SCSIOPC_READ_CAPACITY_10: 435 case SCSIOPC_READ_CAPACITY_16: 436 //satPacketReadCapacityCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext); 437 //break; 438 default: 439 break; 440 } 441 442 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 443 444 tdIORequestBody->ioCompleted = agTRUE; 445 tdIORequestBody->ioStarted = agFALSE; 446 447 /* interal structure free */ 448 satFreeIntIoResource( tiRoot, satDevData, satIntIo); 449 450 if( agIOStatus == OSSA_IO_SUCCESS && agFirstDword == agNULL) 451 { 452 TI_DBG1(("satPacketCB: agIOStatus == OSSA_IO_SUCCESS, agFirstDword == agNULL \n")); 453 ostiInitiatorIOCompleted( tiRoot, 454 tdIORequestBody->tiIORequest, 455 tiIOSuccess, 456 SCSI_STAT_GOOD, 457 agNULL, 458 interruptContext); 459 } 460 else if (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL) 461 { 462 TI_DBG1(("satPacketCB: wrong. agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL \n")); 463 satNewIntIo = satAllocIntIoResource( tiRoot, 464 tiOrgIORequest, 465 satDevData, 466 32, 467 satNewIntIo); 468 if (satNewIntIo == agNULL) 469 { 470 /* memory allocation failure */ 471 /* just translate the ATAPI error register to sense information */ 472 satTranslateATAPIErrorsToSCSIErrors( 473 scsiCmnd->cdb[0], 474 agFirstDword->D2H.status, 475 agFirstDword->D2H.error, 476 &bSenseKey, 477 &bSenseCodeInfo 478 ); 479 satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext); 480 ostiInitiatorIOCompleted( tiRoot, 481 tdIORequestBody->tiIORequest, 482 tiIOSuccess, 483 SCSI_STAT_CHECK_CONDITION, 484 satOrgIOContext->pTiSenseData, 485 interruptContext); 486 TI_DBG1(("satPacketCB: momory allocation fails\n")); 487 return; 488 } /* end memory allocation */ 489 490 satNewIOContext = satPrepareNewIO(satNewIntIo, 491 tiOrgIORequest, 492 satDevData, 493 scsiCmnd, 494 satOrgIOContext 495 ); 496 /* sends request sense to ATAPI device for acquiring sense information */ 497 status = satRequestSenseForATAPI(tiRoot, 498 &satNewIntIo->satIntTiIORequest, 499 satNewIOContext->ptiDeviceHandle, 500 &satNewIntIo->satIntTiScsiXchg, 501 satNewIOContext 502 ); 503 if (status != tiSuccess) 504 { 505 satFreeIntIoResource( tiRoot, 506 satDevData, 507 satNewIntIo); 508 /* just translate the ATAPI error register to sense information */ 509 satTranslateATAPIErrorsToSCSIErrors( 510 scsiCmnd->cdb[0], 511 agFirstDword->D2H.status, 512 agFirstDword->D2H.error, 513 &bSenseKey, 514 &bSenseCodeInfo 515 ); 516 satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext); 517 ostiInitiatorIOCompleted( tiRoot, 518 tdIORequestBody->tiIORequest, 519 tiIOSuccess, 520 SCSI_STAT_CHECK_CONDITION, 521 satOrgIOContext->pTiSenseData, 522 interruptContext); 523 TI_DBG1(("satPacketCB: failed to call satRequestSenseForATAPI()\n")); 524 } 525 } 526 else if (agIOStatus != OSSA_IO_SUCCESS) 527 { 528 TI_DBG1(("satPacketCB: wrong. agIOStatus != OSSA_IO_SUCCESS, status %d\n", agIOStatus)); 529 itdsatProcessAbnormalCompletion( 530 agRoot, 531 agIORequest, 532 agIOStatus, 533 agFirstDword, 534 agIOInfoLen, 535 agParam, 536 satIOContext); 537 } 538 else 539 { 540 TI_DBG1(("satPacketCB: Unknown error \n")); 541 ostiInitiatorIOCompleted( tiRoot, 542 tdIORequestBody->tiIORequest, 543 tiIOFailed, 544 tiDetailOtherError, 545 agNULL, 546 interruptContext); 547 } 548 } 549 /***************************************************************************** 550 *! \brief satRequestSenseForATAPICB 551 * 552 * This routine is a callback function called from ossaSATACompleted(). 553 * This CB routine deals with normal non-chained data I/O SATA request. 554 * 555 * \param agRoot: Handles for this instance of SAS/SATA hardware 556 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 557 * \param agIOStatus: Status of completed I/O. 558 * \param agFirstDword:Pointer to the four bytes of FIS. 559 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 560 * length. 561 * \param agParam: Additional info based on status. 562 * \param ioContext: Pointer to satIOContext_t. 563 * 564 * \return: none 565 * 566 *****************************************************************************/ 567 void satRequestSenseForATAPICB( 568 agsaRoot_t *agRoot, 569 agsaIORequest_t *agIORequest, 570 bit32 agIOStatus, 571 agsaFisHeader_t *agFirstDword, 572 bit32 agIOInfoLen, 573 void *agParam, 574 void *ioContext 575 ) 576 { 577 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 578 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 579 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 580 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 581 tdIORequestBody_t *tdIORequestBody; 582 tdIORequestBody_t *tdOrgIORequestBody; 583 satIOContext_t *satIOContext; 584 satIOContext_t *satOrgIOContext; 585 satInternalIo_t *satIntIo; 586 satDeviceData_t *satDevData; 587 tiIORequest_t *tiOrgIORequest; 588 bit32 interruptContext = osData->IntContext; 589 590 TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 591 592 /* internally generate tiIOContext */ 593 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 594 satIOContext = (satIOContext_t *) ioContext; 595 satIntIo = satIOContext->satIntIoContext; 596 satDevData = satIOContext->pSatDevData; 597 598 /*ttttttthe one */ 599 if (satIntIo == agNULL) 600 { 601 TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n")); 602 satOrgIOContext = satIOContext; 603 tiOrgIORequest = tdIORequestBody->tiIORequest; 604 } 605 else 606 { 607 TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n")); 608 satOrgIOContext = satIOContext->satOrgIOContext; 609 if (satOrgIOContext == agNULL) 610 { 611 TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n")); 612 return; 613 } 614 else 615 { 616 TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n")); 617 } 618 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 619 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 620 } 621 622 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 623 624 tdIORequestBody->ioCompleted = agTRUE; 625 tdIORequestBody->ioStarted = agFALSE; 626 627 /* copy the request sense buffer to original IO buffer*/ 628 if (satIntIo != agNULL) 629 { 630 osti_memcpy(satOrgIOContext->pTiSenseData->senseData, satIntIo->satIntDmaMem.virtPtr, SENSE_DATA_LENGTH); 631 satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH; 632 /* interal structure free */ 633 satFreeIntIoResource( tiRoot, satDevData, satIntIo); 634 } 635 636 /* notify the OS to complete this SRB */ 637 ostiInitiatorIOCompleted( tiRoot, 638 tiOrgIORequest, 639 tiIOSuccess, 640 SCSI_STAT_CHECK_CONDITION, 641 satOrgIOContext->pTiSenseData, 642 interruptContext); 643 } 644 /***************************************************************************** 645 *! \brief satSetFeaturesPIOCB 646 * 647 * This routine is a callback function called from ossaSATACompleted(). 648 * This CB routine deals with normal non-chained data I/O SATA request. 649 * 650 * \param agRoot: Handles for this instance of SAS/SATA hardware 651 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 652 * \param agIOStatus: Status of completed I/O. 653 * \param agFirstDword:Pointer to the four bytes of FIS. 654 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 655 * length. 656 * \param agParam: Additional info based on status. 657 * \param ioContext: Pointer to satIOContext_t. 658 * 659 * \return: none 660 * 661 *****************************************************************************/ 662 void satSetFeaturesPIOCB( 663 agsaRoot_t *agRoot, 664 agsaIORequest_t *agIORequest, 665 bit32 agIOStatus, 666 agsaFisHeader_t *agFirstDword, 667 bit32 agIOInfoLen, 668 void *agParam, 669 void *ioContext 670 ) 671 { 672 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 673 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 674 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 675 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 676 tdIORequestBody_t *tdIORequestBody; 677 tdIORequestBody_t *tdOrgIORequestBody; 678 satIOContext_t *satIOContext; 679 satIOContext_t *satOrgIOContext; 680 satIOContext_t *satNewIOContext; 681 satInternalIo_t *satIntIo; 682 satInternalIo_t *satNewIntIo = agNULL; 683 satDeviceData_t *satDevData; 684 tiIORequest_t *tiOrgIORequest; 685 tiIniScsiCmnd_t *scsiCmnd; 686 bit32 status; 687 688 TI_DBG3(("satSetFeaturesPIOCB start\n")); 689 690 /* internally generate tiIOContext */ 691 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 692 satIOContext = (satIOContext_t *) ioContext; 693 satIntIo = satIOContext->satIntIoContext; 694 satDevData = satIOContext->pSatDevData; 695 696 /*ttttttthe one */ 697 if (satIntIo == agNULL) 698 { 699 TI_DBG4(("satSetFeaturesPIOCB: External satInternalIo_t satIntIoContext\n")); 700 satOrgIOContext = satIOContext; 701 tiOrgIORequest = tdIORequestBody->tiIORequest; 702 scsiCmnd = satOrgIOContext->pScsiCmnd; 703 } 704 else 705 { 706 TI_DBG4(("satSetFeaturesPIOCB: Internal satInternalIo_t satIntIoContext\n")); 707 satOrgIOContext = satIOContext->satOrgIOContext; 708 if (satOrgIOContext == agNULL) 709 { 710 TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NULL, wrong\n")); 711 return; 712 } 713 else 714 { 715 TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NOT NULL\n")); 716 } 717 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 718 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 719 scsiCmnd = satOrgIOContext->pScsiCmnd; 720 } 721 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 722 723 tdIORequestBody->ioCompleted = agTRUE; 724 tdIORequestBody->ioStarted = agFALSE; 725 726 /* interal structure free */ 727 satFreeIntIoResource(tiRoot, 728 satDevData, 729 satIntIo); 730 731 /*if the ATAPI device support DMA, then enble this feature*/ 732 if (satDevData->satDMASupport && satDevData->satDMAEnabled) 733 { 734 satNewIntIo = satAllocIntIoResource( tiRoot, 735 tiOrgIORequest, 736 satDevData, 737 0, 738 satNewIntIo); 739 if (satNewIntIo == agNULL) 740 { 741 TI_DBG1(("satSetFeaturesPIOCB: momory allocation fails\n")); 742 return; 743 } /* end memory allocation */ 744 745 satNewIOContext = satPrepareNewIO(satNewIntIo, 746 tiOrgIORequest, 747 satDevData, 748 scsiCmnd, 749 satOrgIOContext 750 ); 751 /* sends either ATA SET FEATURES based on DMA bit */ 752 status = satSetFeatures(tiRoot, 753 &satNewIntIo->satIntTiIORequest, 754 satNewIOContext->ptiDeviceHandle, 755 &satNewIntIo->satIntTiScsiXchg, 756 satNewIOContext, 757 agTRUE 758 ); 759 if (status != tiSuccess) 760 { 761 satFreeIntIoResource( tiRoot, satDevData, satNewIntIo); 762 TI_DBG1(("satSetFeaturesPIOCB: failed to call satSetFeatures()\n")); 763 } 764 } 765 } 766 767 /***************************************************************************** 768 *! \brief satSetFeaturesCB 769 * 770 * This routine is a callback function called from ossaSATACompleted(). 771 * This CB routine deals with normal non-chained data I/O SATA request. 772 * 773 * \param agRoot: Handles for this instance of SAS/SATA hardware 774 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 775 * \param agIOStatus: Status of completed I/O. 776 * \param agFirstDword:Pointer to the four bytes of FIS. 777 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 778 * length. 779 * \param agParam: Additional info based on status. 780 * \param ioContext: Pointer to satIOContext_t. 781 * 782 * \return: none 783 * 784 *****************************************************************************/ 785 void satSetFeaturesCB( 786 agsaRoot_t *agRoot, 787 agsaIORequest_t *agIORequest, 788 bit32 agIOStatus, 789 agsaFisHeader_t *agFirstDword, 790 bit32 agIOInfoLen, 791 void *agParam, 792 void *ioContext 793 ) 794 { 795 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 796 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 797 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 798 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 799 tdIORequestBody_t *tdIORequestBody; 800 tdIORequestBody_t *tdOrgIORequestBody = agNULL; 801 satIOContext_t *satIOContext; 802 satIOContext_t *satOrgIOContext; 803 satInternalIo_t *satIntIo; 804 satDeviceData_t *satDevData; 805 tdsaPortContext_t *onePortContext = agNULL; 806 tiPortalContext_t *tiPortalContext = agNULL; 807 tdsaDeviceData_t *oneDeviceData = agNULL; 808 bit8 PhyID =0; 809 TI_DBG3(("satSetFeaturesCB start\n")); 810 811 /* internally generate tiIOContext */ 812 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 813 satIOContext = (satIOContext_t *) ioContext; 814 satIntIo = satIOContext->satIntIoContext; 815 satDevData = satIOContext->pSatDevData; 816 oneDeviceData = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData; 817 onePortContext = oneDeviceData->tdPortContext; 818 if (onePortContext == agNULL) 819 { 820 TI_DBG4(("satSetFeaturesCB: onePortContext is NULL, wrong\n")); 821 return; 822 } 823 tiPortalContext = onePortContext->tiPortalContext; 824 PhyID = oneDeviceData->phyID; 825 /*ttttttthe one */ 826 if (satIntIo == agNULL) 827 { 828 TI_DBG4(("satSetFeaturesCB: External satInternalIo_t satIntIoContext\n")); 829 satOrgIOContext = satIOContext; 830 } 831 else 832 { 833 TI_DBG4(("satSetFeaturesCB: Internal satInternalIo_t satIntIoContext\n")); 834 satOrgIOContext = satIOContext->satOrgIOContext; 835 if (satOrgIOContext == agNULL) 836 { 837 TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NULL, wrong\n")); 838 return; 839 } 840 else 841 { 842 TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NOT NULL\n")); 843 } 844 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 845 } 846 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 847 848 tdIORequestBody->ioCompleted = agTRUE; 849 tdIORequestBody->ioStarted = agFALSE; 850 851 /* interal structure free */ 852 satFreeIntIoResource(tiRoot, 853 satDevData, 854 satIntIo); 855 856 857 /* clean up TD layer's IORequestBody */ 858 if (tdOrgIORequestBody!= agNULL) 859 { 860 ostiFreeMemory(tiRoot, 861 tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle, 862 sizeof(tdIORequestBody_t) 863 ); 864 } 865 866 if (onePortContext != agNULL) 867 { 868 /* this condition is for tdsaDiscoveryStartIDDevCB routine*/ 869 if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED) 870 { 871 TI_DBG1(("satSetFeaturesCB: ID completed after discovery is done; tiDeviceArrival\n")); 872 /* in case registration is finished after discovery is finished */ 873 ostiInitiatorEvent( 874 tiRoot, 875 tiPortalContext, 876 agNULL, 877 tiIntrEventTypeDeviceChange, 878 tiDeviceArrival, 879 agNULL 880 ); 881 return; 882 } 883 TI_DBG2(("satSetFeaturesCB: pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id)); 884 /* the below codes is for satAddSATAIDDevCB routine*/ 885 /* notifying link up */ 886 ostiPortEvent ( 887 tiRoot, 888 tiPortLinkUp, 889 tiSuccess, 890 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext 891 ); 892 #ifdef INITIATOR_DRIVER 893 /* triggers discovery */ 894 ostiPortEvent( 895 tiRoot, 896 tiPortDiscoveryReady, 897 tiSuccess, 898 (void *) tdsaAllShared->Ports[PhyID].tiPortalContext 899 ); 900 #endif 901 } 902 else 903 { 904 TI_DBG1(("satSetFeaturesCB: onePortContext is NULL, wrong\n")); 905 } 906 } 907 /***************************************************************************** 908 *! \brief satDeviceResetCB 909 * 910 * This routine is a callback function called from ossaSATACompleted(). 911 * This CB routine deals with normal non-chained data I/O SATA request. 912 * 913 * \param agRoot: Handles for this instance of SAS/SATA hardware 914 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 915 * \param agIOStatus: Status of completed I/O. 916 * \param agFirstDword:Pointer to the four bytes of FIS. 917 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 918 * length. 919 * \param agParam: Additional info based on status. 920 * \param ioContext: Pointer to satIOContext_t. 921 * 922 * \return: none 923 * 924 *****************************************************************************/ 925 void satDeviceResetCB( 926 agsaRoot_t *agRoot, 927 agsaIORequest_t *agIORequest, 928 bit32 agIOStatus, 929 agsaFisHeader_t *agFirstDword, 930 bit32 agIOInfoLen, 931 void *agParam, 932 void *ioContext 933 ) 934 { 935 /* callback for satResetDevice */ 936 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 937 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 938 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 939 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 940 tdIORequestBody_t *tdIORequestBody; 941 tdIORequestBody_t *tdOrgIORequestBody = agNULL; 942 satIOContext_t *satIOContext; 943 satIOContext_t *satOrgIOContext; 944 // satIOContext_t *satNewIOContext; 945 satInternalIo_t *satIntIo; 946 // satInternalIo_t *satNewIntIo = agNULL; 947 satDeviceData_t *satDevData; 948 tiIORequest_t *tiOrgIORequest; 949 #ifdef TD_DEBUG_ENABLE 950 bit32 ataStatus = 0; 951 bit32 ataError; 952 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL; 953 #endif 954 // bit32 status; 955 bit32 report = agFALSE; 956 bit32 AbortTM = agFALSE; 957 958 TI_DBG1(("satDeviceResetCB: start\n")); 959 960 TI_DBG6(("satDeviceResetCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 961 962 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 963 satIOContext = (satIOContext_t *) ioContext; 964 satIntIo = satIOContext->satIntIoContext; 965 satDevData = satIOContext->pSatDevData; 966 967 if (satIntIo == agNULL) 968 { 969 TI_DBG6(("satDeviceResetCB: External, OS generated\n")); 970 satOrgIOContext = satIOContext; 971 tiOrgIORequest = tdIORequestBody->tiIORequest; 972 } 973 else 974 { 975 TI_DBG6(("satDeviceResetCB: Internal, TD generated\n")); 976 satOrgIOContext = satIOContext->satOrgIOContext; 977 if (satOrgIOContext == agNULL) 978 { 979 TI_DBG6(("satDeviceResetCB: satOrgIOContext is NULL, wrong\n")); 980 return; 981 } 982 else 983 { 984 TI_DBG6(("satDeviceResetCB: satOrgIOContext is NOT NULL\n")); 985 } 986 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 987 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 988 } 989 990 tdIORequestBody->ioCompleted = agTRUE; 991 tdIORequestBody->ioStarted = agFALSE; 992 993 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 994 { 995 TI_DBG1(("satDeviceResetCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 996 997 if (satOrgIOContext->NotifyOS == agTRUE) 998 { 999 ostiInitiatorEvent( tiRoot, 1000 NULL, 1001 NULL, 1002 tiIntrEventTypeTaskManagement, 1003 tiTMFailed, 1004 tiOrgIORequest ); 1005 } 1006 1007 satDevData->satTmTaskTag = agNULL; 1008 1009 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1010 1011 satFreeIntIoResource( tiRoot, 1012 satDevData, 1013 satIntIo); 1014 return; 1015 } 1016 1017 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED || 1018 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION || 1019 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK || 1020 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS || 1021 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION || 1022 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED || 1023 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION || 1024 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR || 1025 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY 1026 ) 1027 { 1028 TI_DBG1(("satDeviceResetCB: OSSA_IO_OPEN_CNX_ERROR\n")); 1029 1030 if (satOrgIOContext->NotifyOS == agTRUE) 1031 { 1032 ostiInitiatorEvent( tiRoot, 1033 NULL, 1034 NULL, 1035 tiIntrEventTypeTaskManagement, 1036 tiTMFailed, 1037 tiOrgIORequest ); 1038 } 1039 1040 satDevData->satTmTaskTag = agNULL; 1041 1042 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1043 1044 satFreeIntIoResource( tiRoot, 1045 satDevData, 1046 satIntIo); 1047 return; 1048 } 1049 1050 if (agIOStatus != OSSA_IO_SUCCESS) 1051 { 1052 /* only agsaFisPioSetup_t is expected */ 1053 #ifdef TD_DEBUG_ENABLE 1054 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup); 1055 ataStatus = satPIOSetupHeader->status; /* ATA Status register */ 1056 ataError = satPIOSetupHeader->error; /* ATA Eror register */ 1057 #endif 1058 TI_DBG1(("satDeviceResetCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError)); 1059 1060 if (satOrgIOContext->NotifyOS == agTRUE) 1061 { 1062 ostiInitiatorEvent( tiRoot, 1063 NULL, 1064 NULL, 1065 tiIntrEventTypeTaskManagement, 1066 tiTMFailed, 1067 tiOrgIORequest ); 1068 } 1069 1070 satDevData->satTmTaskTag = agNULL; 1071 1072 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1073 1074 satFreeIntIoResource( tiRoot, 1075 satDevData, 1076 satIntIo); 1077 return; 1078 } 1079 1080 /* success */ 1081 if (satOrgIOContext->TMF == AG_ABORT_TASK) 1082 { 1083 AbortTM = agTRUE; 1084 } 1085 1086 if (satOrgIOContext->NotifyOS == agTRUE) 1087 { 1088 report = agTRUE; 1089 } 1090 1091 if (AbortTM == agTRUE) 1092 { 1093 TI_DBG1(("satDeResetDeviceCB: calling satAbort\n")); 1094 satAbort(agRoot, satOrgIOContext->satToBeAbortedIOContext); 1095 } 1096 satDevData->satTmTaskTag = agNULL; 1097 1098 satDevData->satDriveState = SAT_DEV_STATE_NORMAL; 1099 1100 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1101 1102 TI_DBG1(("satDeviceResetCB: satPendingIO %d satNCQMaxIO %d\n", satDevData->satPendingIO, satDevData->satNCQMaxIO )); 1103 TI_DBG1(("satDeviceResetCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", satDevData->satPendingNCQIO, satDevData->satPendingNONNCQIO)); 1104 1105 satFreeIntIoResource( tiRoot, 1106 satDevData, 1107 satIntIo); 1108 1109 /* clean up TD layer's IORequestBody */ 1110 if (tdOrgIORequestBody != agNULL) 1111 { 1112 ostiFreeMemory( 1113 tiRoot, 1114 tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle, 1115 sizeof(tdIORequestBody_t) 1116 ); 1117 } 1118 else 1119 { 1120 TI_DBG1(("satDeviceResetCB: tdOrgIORequestBody is NULL, wrong\n")); 1121 } 1122 1123 1124 if (report) 1125 { 1126 ostiInitiatorEvent( tiRoot, 1127 NULL, 1128 NULL, 1129 tiIntrEventTypeTaskManagement, 1130 tiTMOK, 1131 tiOrgIORequest ); 1132 } 1133 1134 1135 TI_DBG5(("satDeviceResetCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO)); 1136 TI_DBG6(("satDeviceResetCB: end\n")); 1137 return; 1138 } 1139 1140 /***************************************************************************** 1141 *! \brief satExecuteDeviceDiagnosticCB 1142 * 1143 * This routine is a callback function called from ossaSATACompleted(). 1144 * This CB routine deals with normal non-chained data I/O SATA request. 1145 * 1146 * \param agRoot: Handles for this instance of SAS/SATA hardware 1147 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 1148 * \param agIOStatus: Status of completed I/O. 1149 * \param agFirstDword:Pointer to the four bytes of FIS. 1150 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 1151 * length. 1152 * \param agParam: Additional info based on status. 1153 * \param ioContext: Pointer to satIOContext_t. 1154 * 1155 * \return: none 1156 * 1157 *****************************************************************************/ 1158 void satExecuteDeviceDiagnosticCB( 1159 agsaRoot_t *agRoot, 1160 agsaIORequest_t *agIORequest, 1161 bit32 agIOStatus, 1162 agsaFisHeader_t *agFirstDword, 1163 bit32 agIOInfoLen, 1164 void *agParam, 1165 void *ioContext 1166 ) 1167 { 1168 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 1169 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 1170 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 1171 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 1172 tdIORequestBody_t *tdIORequestBody; 1173 satIOContext_t *satIOContext; 1174 satIOContext_t *satOrgIOContext; 1175 satInternalIo_t *satIntIo; 1176 satDeviceData_t *satDevData; 1177 1178 TI_DBG3(("satExecuteDeviceDiagnosticCB start\n")); 1179 1180 /* internally generate tiIOContext */ 1181 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 1182 satIOContext = (satIOContext_t *) ioContext; 1183 satIntIo = satIOContext->satIntIoContext; 1184 satDevData = satIOContext->pSatDevData; 1185 1186 /*ttttttthe one */ 1187 if (satIntIo == agNULL) 1188 { 1189 TI_DBG4(("satExecuteDeviceDiagnosticCB: External satInternalIo_t satIntIoContext\n")); 1190 satOrgIOContext = satIOContext; 1191 } 1192 else 1193 { 1194 TI_DBG4(("satExecuteDeviceDiagnosticCB: Internal satInternalIo_t satIntIoContext\n")); 1195 satOrgIOContext = satIOContext->satOrgIOContext; 1196 if (satOrgIOContext == agNULL) 1197 { 1198 TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NULL, wrong\n")); 1199 return; 1200 } 1201 else 1202 { 1203 TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NOT NULL\n")); 1204 } 1205 } 1206 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1207 1208 tdIORequestBody->ioCompleted = agTRUE; 1209 tdIORequestBody->ioStarted = agFALSE; 1210 1211 /* interal structure free */ 1212 satFreeIntIoResource(tiRoot, 1213 satDevData, 1214 satIntIo); 1215 } 1216 /***************************************************************************** 1217 *! \brief satNonChainedDataIOCB 1218 * 1219 * This routine is a callback function called from ossaSATACompleted(). 1220 * This CB routine deals with normal non-chained data I/O SATA request. 1221 * 1222 * \param agRoot: Handles for this instance of SAS/SATA hardware 1223 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 1224 * \param agIOStatus: Status of completed I/O. 1225 * \param agFirstDword:Pointer to the four bytes of FIS. 1226 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 1227 * length. 1228 * \param agParam: Additional info based on status. 1229 * \param ioContext: Pointer to satIOContext_t. 1230 * 1231 * \return: none 1232 * 1233 *****************************************************************************/ 1234 1235 void satNonChainedDataIOCB( 1236 agsaRoot_t *agRoot, 1237 agsaIORequest_t *agIORequest, 1238 bit32 agIOStatus, 1239 agsaFisHeader_t *agFirstDword, 1240 bit32 agIOInfoLen, 1241 void *agParam, 1242 void *ioContext 1243 ) 1244 { 1245 1246 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 1247 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 1248 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 1249 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 1250 tdIORequestBody_t *tdIORequestBody; 1251 bit32 interruptContext = osData->IntContext; 1252 satIOContext_t *satIOContext; 1253 satInternalIo_t *SatIntIo; 1254 satDeviceData_t *SatDevData; 1255 1256 TI_DBG6(("satNonChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 1257 agIORequest, agIOStatus, agIOInfoLen)); 1258 1259 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 1260 satIOContext = (satIOContext_t *) ioContext; 1261 SatIntIo = satIOContext->satIntIoContext; 1262 SatDevData = satIOContext->pSatDevData; 1263 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1264 tdIORequestBody->ioCompleted = agTRUE; 1265 tdIORequestBody->ioStarted = agFALSE; 1266 1267 /* interal structure free */ 1268 satFreeIntIoResource( tiRoot, 1269 SatDevData, 1270 SatIntIo); 1271 1272 /* Process completion */ 1273 if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0)) 1274 { 1275 TI_DBG5(("satNonChainedDataIOCB: success\n")); 1276 TI_DBG5(("satNonChainedDataIOCB: success agIORequest %p\n", agIORequest)); 1277 /* 1278 * Command was completed OK, this is the normal path. 1279 * Now call the OS-App Specific layer about this completion. 1280 */ 1281 ostiInitiatorIOCompleted( tiRoot, 1282 tdIORequestBody->tiIORequest, 1283 tiIOSuccess, 1284 SCSI_STAT_GOOD, 1285 agNULL, 1286 interruptContext); 1287 } 1288 else 1289 { 1290 TI_DBG1(("satNonChainedDataIOCB: calling itdsatProcessAbnormalCompletion\n")); 1291 /* More checking needed */ 1292 itdsatProcessAbnormalCompletion( agRoot, 1293 agIORequest, 1294 agIOStatus, 1295 agFirstDword, 1296 agIOInfoLen, 1297 agParam, 1298 satIOContext); 1299 } 1300 1301 return; 1302 1303 1304 } 1305 /***************************************************************************** 1306 *! \brief satChainedDataIOCB 1307 * 1308 * This routine is a callback function called from ossaSATACompleted(). 1309 * This CB routine deals with normal chained data I/O SATA request. 1310 * 1311 * \param agRoot: Handles for this instance of SAS/SATA hardware 1312 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 1313 * \param agIOStatus: Status of completed I/O. 1314 * \param agFirstDword:Pointer to the four bytes of FIS. 1315 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 1316 * length. 1317 * \param agParam: Additional info based on status. 1318 * \param ioContext: Pointer to satIOContext_t. 1319 * 1320 * \return: none 1321 * 1322 *****************************************************************************/ 1323 void satChainedDataIOCB( 1324 agsaRoot_t *agRoot, 1325 agsaIORequest_t *agIORequest, 1326 bit32 agIOStatus, 1327 agsaFisHeader_t *agFirstDword, 1328 bit32 agIOInfoLen, 1329 void *agParam, 1330 void *ioContext 1331 ) 1332 { 1333 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 1334 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 1335 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 1336 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 1337 tdIORequestBody_t *tdIORequestBody; 1338 tdIORequestBody_t *tdOrgIORequestBody; 1339 satIOContext_t *satIOContext; 1340 satIOContext_t *satOrgIOContext; 1341 satIOContext_t *satNewIOContext; 1342 satInternalIo_t *satIntIo; 1343 satInternalIo_t *satNewIntIo = agNULL; 1344 satDeviceData_t *satDevData; 1345 scsiRspSense_t *pSense; 1346 tiIniScsiCmnd_t *scsiCmnd; 1347 tiIORequest_t *tiOrgIORequest; 1348 1349 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 1350 bit32 ataStatus = 0; 1351 bit32 status = tiError; 1352 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 1353 bit32 dataLength; 1354 1355 TI_DBG6(("satChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 1356 agIORequest, agIOStatus, agIOInfoLen)); 1357 1358 1359 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 1360 satIOContext = (satIOContext_t *) ioContext; 1361 if (satIOContext == agNULL) 1362 { 1363 TI_DBG1(("satChainedDataIOCB: satIOContext is NULL\n")); 1364 return; 1365 } 1366 satIntIo = satIOContext->satIntIoContext; 1367 satDevData = satIOContext->pSatDevData; 1368 hostToDevFis = satIOContext->pFis; 1369 1370 if (satIntIo == agNULL) 1371 { 1372 TI_DBG5(("satChainedDataIOCB: External satInternalIo_t satIntIoContext\n")); 1373 satOrgIOContext = satIOContext; 1374 tiOrgIORequest = tdIORequestBody->tiIORequest; 1375 pSense = satIOContext->pSense; 1376 scsiCmnd = satIOContext->pScsiCmnd; 1377 } 1378 else 1379 { 1380 TI_DBG5(("satChainedDataIOCB: Internal satInternalIo_t satIntIoContext\n")); 1381 satOrgIOContext = satIOContext->satOrgIOContext; 1382 if (satOrgIOContext == agNULL) 1383 { 1384 TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NULL\n")); 1385 } 1386 else 1387 { 1388 TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NOT NULL\n")); 1389 } 1390 1391 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 1392 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 1393 1394 pSense = satOrgIOContext->pSense; 1395 scsiCmnd = satOrgIOContext->pScsiCmnd; 1396 } 1397 1398 tdIORequestBody->ioCompleted = agTRUE; 1399 tdIORequestBody->ioStarted = agFALSE; 1400 1401 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 1402 { 1403 TI_DBG1(("satChainedDataIOCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 1404 satSetSensePayload( pSense, 1405 SCSI_SNSKEY_NO_SENSE, 1406 0, 1407 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 1408 satOrgIOContext); 1409 1410 ostiInitiatorIOCompleted( tiRoot, 1411 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1412 tiIOSuccess, 1413 SCSI_STAT_CHECK_CONDITION, 1414 satOrgIOContext->pTiSenseData, 1415 satOrgIOContext->interruptContext ); 1416 1417 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1418 1419 satFreeIntIoResource( tiRoot, 1420 satDevData, 1421 satIntIo); 1422 return; 1423 } 1424 1425 /* 1426 checking IO status, FIS type and error status 1427 */ 1428 if (agIOStatus != OSSA_IO_SUCCESS) 1429 { 1430 /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read 1431 agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write 1432 first, assumed to be Reg Device to Host FIS 1433 This is OK to just find fis type 1434 */ 1435 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 1436 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 1437 /* for debugging */ 1438 if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) && 1439 (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) && 1440 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS) 1441 ) 1442 { 1443 TI_DBG1(("satChainedDataIOCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType)); 1444 } 1445 1446 /* for debugging */ 1447 if ( (ataStatus & ERR_ATA_STATUS_MASK) || 1448 (ataStatus & DF_ATA_STATUS_MASK) 1449 ) 1450 { 1451 TI_DBG1(("satChainedDataIOCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command)); 1452 } 1453 1454 /* the function below handles abort case */ 1455 itdsatDelayedProcessAbnormalCompletion(agRoot, 1456 agIORequest, 1457 agIOStatus, 1458 agFirstDword, 1459 agIOInfoLen, 1460 agParam, 1461 satIOContext); 1462 1463 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1464 satFreeIntIoResource( tiRoot, 1465 satDevData, 1466 satIntIo); 1467 return; 1468 } /* end of error */ 1469 1470 switch (hostToDevFis->h.command) 1471 { 1472 case SAT_READ_DMA: /* fall through */ 1473 case SAT_READ_SECTORS: /* fall through */ 1474 case SAT_READ_DMA_EXT: /* fall through */ 1475 case SAT_READ_SECTORS_EXT: /* fall through */ 1476 case SAT_READ_FPDMA_QUEUED: /* fall through */ 1477 case SAT_WRITE_DMA: /* fall through */ 1478 case SAT_WRITE_SECTORS:/* fall through */ 1479 case SAT_WRITE_DMA_FUA_EXT: /* fall through */ 1480 case SAT_WRITE_DMA_EXT: /* fall through */ 1481 case SAT_WRITE_SECTORS_EXT: /* fall through */ 1482 case SAT_WRITE_FPDMA_QUEUED: 1483 1484 TI_DBG5(("satChainedDataIOCB: READ/WRITE success case\n")); 1485 1486 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1487 1488 /* done with internally genereated SAT_SMART_RETURN_STATUS */ 1489 satFreeIntIoResource( tiRoot, 1490 satDevData, 1491 satIntIo); 1492 /* let's loop till TL */ 1493 1494 /* lba = lba + tl 1495 loopnum--; 1496 if (loopnum == 0) done 1497 */ 1498 (satOrgIOContext->LoopNum)--; 1499 if (satOrgIOContext->LoopNum == 0) 1500 { 1501 /* done with read */ 1502 ostiInitiatorIOCompleted( tiRoot, 1503 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1504 tiIOSuccess, 1505 SCSI_STAT_GOOD, 1506 agNULL, 1507 satOrgIOContext->interruptContext ); 1508 return; 1509 } 1510 if (satOrgIOContext->superIOFlag) 1511 { 1512 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 1513 } 1514 else 1515 { 1516 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 1517 } 1518 1519 satNewIntIo = satAllocIntIoResource( tiRoot, 1520 tiOrgIORequest, 1521 satDevData, 1522 dataLength, 1523 satNewIntIo); 1524 if (satNewIntIo == agNULL) 1525 { 1526 /* memory allocation failure */ 1527 satFreeIntIoResource( tiRoot, 1528 satDevData, 1529 satNewIntIo); 1530 ostiInitiatorIOCompleted( tiRoot, 1531 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1532 tiIOFailed, 1533 tiDetailOtherError, 1534 agNULL, 1535 satOrgIOContext->interruptContext ); 1536 1537 TI_DBG1(("satChainedDataIOCB: momory allocation fails\n")); 1538 return; 1539 } /* end of memory allocation failure */ 1540 1541 /* 1542 * Need to initialize all the fields within satIOContext 1543 */ 1544 1545 satNewIOContext = satPrepareNewIO( 1546 satNewIntIo, 1547 tiOrgIORequest, 1548 satDevData, 1549 scsiCmnd, 1550 satOrgIOContext 1551 ); 1552 1553 /* sending another ATA command */ 1554 switch (scsiCmnd->cdb[0]) 1555 { 1556 case SCSIOPC_READ_6: 1557 /* no loop should occur with READ6 since it fits in one ATA command */ 1558 break; 1559 case SCSIOPC_READ_10: /* fall through */ 1560 case SCSIOPC_READ_12: /* fall through */ 1561 case SCSIOPC_READ_16: /* fall through */ 1562 status = satRead_1( tiRoot, 1563 &satNewIntIo->satIntTiIORequest, 1564 satNewIOContext->ptiDeviceHandle, 1565 &satNewIntIo->satIntTiScsiXchg, 1566 satNewIOContext); 1567 break; 1568 case SCSIOPC_WRITE_6: 1569 /* no loop should occur with WRITE6 since it fits in one ATA command */ 1570 break; 1571 case SCSIOPC_WRITE_10: /* fall through */ 1572 case SCSIOPC_WRITE_12: /* fall through */ 1573 case SCSIOPC_WRITE_16: /* fall through */ 1574 status = satWrite_1( tiRoot, 1575 &satNewIntIo->satIntTiIORequest, 1576 satNewIOContext->ptiDeviceHandle, 1577 &satNewIntIo->satIntTiScsiXchg, 1578 satNewIOContext); 1579 break; 1580 default: 1581 TI_DBG1(("satChainedDataIOCB: success but default case scsi cmd 0x%x ata cmd 0x%x\n",scsiCmnd->cdb[0], hostToDevFis->h.command)); 1582 status = tiError; 1583 break; 1584 } 1585 1586 1587 1588 if (status != tiSuccess) 1589 { 1590 satFreeIntIoResource( tiRoot, 1591 satDevData, 1592 satNewIntIo); 1593 ostiInitiatorIOCompleted( tiRoot, 1594 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1595 tiIOFailed, 1596 tiDetailOtherError, 1597 agNULL, 1598 satOrgIOContext->interruptContext ); 1599 TI_DBG1(("satChainedDataIOCB: calling satRead10_1 fails\n")); 1600 return; 1601 } 1602 1603 break; 1604 1605 1606 default: 1607 TI_DBG1(("satChainedDataIOCB: success but default case command 0x%x\n",hostToDevFis->h.command)); 1608 ostiInitiatorIOCompleted( tiRoot, 1609 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1610 tiIOFailed, 1611 tiDetailOtherError, 1612 agNULL, 1613 satOrgIOContext->interruptContext ); 1614 1615 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1616 1617 satFreeIntIoResource( tiRoot, 1618 satDevData, 1619 satIntIo); 1620 1621 break; 1622 } 1623 1624 1625 return; 1626 } 1627 void satNonChainedWriteNVerifyCB( 1628 agsaRoot_t *agRoot, 1629 agsaIORequest_t *agIORequest, 1630 bit32 agIOStatus, 1631 agsaFisHeader_t *agFirstDword, 1632 bit32 agIOInfoLen, 1633 void *agParam, 1634 void *ioContext 1635 ) 1636 { 1637 1638 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 1639 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 1640 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 1641 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 1642 tdIORequestBody_t *tdIORequestBody; 1643 tdIORequestBody_t *tdOrgIORequestBody; 1644 satIOContext_t *satIOContext; 1645 satIOContext_t *satOrgIOContext; 1646 satIOContext_t *satNewIOContext; 1647 satInternalIo_t *satIntIo; 1648 satInternalIo_t *satNewIntIo = agNULL; 1649 satDeviceData_t *satDevData; 1650 scsiRspSense_t *pSense; 1651 tiIniScsiCmnd_t *scsiCmnd; 1652 tiIORequest_t *tiOrgIORequest; 1653 1654 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 1655 bit32 ataStatus = 0; 1656 bit32 status; 1657 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */ 1658 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 1659 agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL; 1660 1661 TI_DBG5(("satNonChainedWriteNVerifyCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 1662 1663 /* internally generate tiIOContext */ 1664 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 1665 satIOContext = (satIOContext_t *) ioContext; 1666 satIntIo = satIOContext->satIntIoContext; 1667 satDevData = satIOContext->pSatDevData; 1668 hostToDevFis = satIOContext->pFis; 1669 1670 /* SPC: Self-Test Result Log page */ 1671 tiScsiRequest = satIOContext->tiScsiXchg; 1672 1673 if (satIntIo == agNULL) 1674 { 1675 TI_DBG4(("satNonChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n")); 1676 satOrgIOContext = satIOContext; 1677 tiOrgIORequest = tdIORequestBody->tiIORequest; 1678 pSense = satOrgIOContext->pSense; 1679 scsiCmnd = satOrgIOContext->pScsiCmnd; 1680 } 1681 else 1682 { 1683 TI_DBG4(("satNonChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n")); 1684 satOrgIOContext = satIOContext->satOrgIOContext; 1685 if (satOrgIOContext == agNULL) 1686 { 1687 TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n")); 1688 return; 1689 } 1690 else 1691 { 1692 TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n")); 1693 } 1694 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 1695 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 1696 1697 pSense = satOrgIOContext->pSense; 1698 scsiCmnd = satOrgIOContext->pScsiCmnd; 1699 } 1700 1701 tdIORequestBody->ioCompleted = agTRUE; 1702 tdIORequestBody->ioStarted = agFALSE; 1703 1704 1705 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 1706 { 1707 TI_DBG1(("satNonChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 1708 ostiInitiatorIOCompleted ( 1709 tiRoot, 1710 tiOrgIORequest, 1711 tiIOFailed, 1712 tiDetailOtherError, 1713 agNULL, 1714 satOrgIOContext->interruptContext 1715 ); 1716 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1717 1718 satFreeIntIoResource( tiRoot, 1719 satDevData, 1720 satIntIo); 1721 return; 1722 } 1723 1724 1725 if (agIOStatus != OSSA_IO_SUCCESS) 1726 { 1727 /* 1728 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS 1729 */ 1730 /* First, assumed to be Reg Device to Host FIS */ 1731 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 1732 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 1733 } 1734 1735 if (agIOStatus != OSSA_IO_SUCCESS) 1736 { 1737 if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS) 1738 { 1739 statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H); 1740 1741 /* Get ATA Status register */ 1742 ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */ 1743 ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */ 1744 1745 /* ATA Eror register */ 1746 } 1747 } 1748 1749 1750 if( agIOStatus != OSSA_IO_SUCCESS) 1751 { 1752 /* 1753 checking IO status, FIS type and error status 1754 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS 1755 Both have fisType in the same location 1756 */ 1757 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) && 1758 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) || 1759 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 1760 ) 1761 { 1762 /* for debugging */ 1763 if( agIOStatus != OSSA_IO_SUCCESS) 1764 { 1765 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, NOT IO_SUCCESS\n")); 1766 } 1767 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 1768 { 1769 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 1770 } 1771 else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS) 1772 { 1773 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 1774 } 1775 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 1776 (ataStatus & DF_ATA_STATUS_MASK) 1777 ) 1778 { 1779 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, FAILED, error status\n")); 1780 } 1781 1782 1783 /* Process abort case */ 1784 if (agIOStatus == OSSA_IO_ABORTED) 1785 { 1786 satProcessAbort(tiRoot, 1787 tiOrgIORequest, 1788 satOrgIOContext 1789 ); 1790 1791 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1792 1793 satFreeIntIoResource( tiRoot, 1794 satDevData, 1795 satIntIo); 1796 return; 1797 } 1798 1799 /* for debugging */ 1800 switch (hostToDevFis->h.command) 1801 { 1802 case SAT_WRITE_DMA_FUA_EXT: 1803 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT\n")); 1804 break; 1805 case SAT_WRITE_DMA_EXT: 1806 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT\n")); 1807 break; 1808 case SAT_WRITE_SECTORS_EXT: 1809 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT\n")); 1810 break; 1811 case SAT_WRITE_FPDMA_QUEUED: 1812 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED\n")); 1813 break; 1814 case SAT_READ_VERIFY_SECTORS: 1815 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS\n")); 1816 break; 1817 case SAT_READ_VERIFY_SECTORS_EXT: 1818 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n")); 1819 break; 1820 default: 1821 TI_DBG1(("satNonChainedWriteNVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command)); 1822 break; 1823 } 1824 1825 satSetSensePayload( pSense, 1826 SCSI_SNSKEY_NO_SENSE, 1827 0, 1828 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 1829 satOrgIOContext); 1830 1831 ostiInitiatorIOCompleted( tiRoot, 1832 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1833 tiIOSuccess, 1834 SCSI_STAT_CHECK_CONDITION, 1835 satOrgIOContext->pTiSenseData, 1836 satOrgIOContext->interruptContext ); 1837 1838 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1839 1840 satFreeIntIoResource( tiRoot, 1841 satDevData, 1842 satIntIo); 1843 return; 1844 } /* end error checking */ 1845 } 1846 1847 /* process success from this point on */ 1848 1849 switch (hostToDevFis->h.command) 1850 { 1851 case SAT_WRITE_DMA_FUA_EXT: 1852 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT success\n")); 1853 break; 1854 case SAT_WRITE_DMA_EXT: 1855 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT success\n")); 1856 break; 1857 case SAT_WRITE_SECTORS_EXT: 1858 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT succes\n")); 1859 1860 break; 1861 case SAT_WRITE_FPDMA_QUEUED: 1862 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED succes\n")); 1863 break; 1864 case SAT_READ_VERIFY_SECTORS: 1865 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS succes\n")); 1866 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1867 1868 /* free */ 1869 satFreeIntIoResource( tiRoot, 1870 satDevData, 1871 satIntIo); 1872 1873 /* return stat_good */ 1874 ostiInitiatorIOCompleted( tiRoot, 1875 tiOrgIORequest, 1876 tiIOSuccess, 1877 SCSI_STAT_GOOD, 1878 agNULL, 1879 satOrgIOContext->interruptContext ); 1880 return; 1881 break; 1882 case SAT_READ_VERIFY_SECTORS_EXT: 1883 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT succes\n")); 1884 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1885 1886 /* free */ 1887 satFreeIntIoResource( tiRoot, 1888 satDevData, 1889 satIntIo); 1890 1891 /* return stat_good */ 1892 ostiInitiatorIOCompleted( tiRoot, 1893 tiOrgIORequest, 1894 tiIOSuccess, 1895 SCSI_STAT_GOOD, 1896 agNULL, 1897 satOrgIOContext->interruptContext ); 1898 return; 1899 break; 1900 default: 1901 TI_DBG1(("satNonChainedWriteNVerifyCB: error default case command 0x%x success\n", hostToDevFis->h.command)); 1902 1903 satSetSensePayload( pSense, 1904 SCSI_SNSKEY_NO_SENSE, 1905 0, 1906 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 1907 satOrgIOContext); 1908 1909 ostiInitiatorIOCompleted( tiRoot, 1910 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1911 tiIOSuccess, 1912 SCSI_STAT_CHECK_CONDITION, 1913 satOrgIOContext->pTiSenseData, 1914 satOrgIOContext->interruptContext ); 1915 1916 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1917 1918 satFreeIntIoResource( tiRoot, 1919 satDevData, 1920 satIntIo); 1921 return; 1922 break; 1923 } 1924 1925 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1926 1927 /* free */ 1928 satFreeIntIoResource( tiRoot, 1929 satDevData, 1930 satIntIo); 1931 1932 satNewIntIo = satAllocIntIoResource( tiRoot, 1933 tiOrgIORequest, 1934 satDevData, 1935 0, 1936 satNewIntIo); 1937 if (satNewIntIo == agNULL) 1938 { 1939 /* memory allocation failure */ 1940 satFreeIntIoResource( tiRoot, 1941 satDevData, 1942 satNewIntIo); 1943 1944 satSetSensePayload( pSense, 1945 SCSI_SNSKEY_NO_SENSE, 1946 0, 1947 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 1948 satOrgIOContext); 1949 1950 ostiInitiatorIOCompleted( tiRoot, 1951 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1952 tiIOSuccess, 1953 SCSI_STAT_CHECK_CONDITION, 1954 satOrgIOContext->pTiSenseData, 1955 satOrgIOContext->interruptContext ); 1956 TI_DBG1(("satNonChainedWriteNVerifyCB: momory allocation fails\n")); 1957 return; 1958 } /* end memory allocation */ 1959 1960 satNewIOContext = satPrepareNewIO( 1961 satNewIntIo, 1962 tiOrgIORequest, 1963 satDevData, 1964 scsiCmnd, 1965 satOrgIOContext 1966 ); 1967 1968 /* sends ATA verify command(READ_VERIFY_SECTORS or READ_VERIFY_SECTORS_EXT) */ 1969 status = satNonChainedWriteNVerify_Verify(tiRoot, 1970 &satNewIntIo->satIntTiIORequest, 1971 satNewIOContext->ptiDeviceHandle, 1972 tiScsiRequest, /* orginal from OS layer */ 1973 satNewIOContext 1974 ); 1975 1976 1977 if (status != tiSuccess) 1978 { 1979 /* sending ATA command fails */ 1980 satFreeIntIoResource( tiRoot, 1981 satDevData, 1982 satNewIntIo); 1983 satSetSensePayload( pSense, 1984 SCSI_SNSKEY_NO_SENSE, 1985 0, 1986 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 1987 satOrgIOContext); 1988 1989 ostiInitiatorIOCompleted( tiRoot, 1990 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1991 tiIOSuccess, 1992 SCSI_STAT_CHECK_CONDITION, 1993 satOrgIOContext->pTiSenseData, 1994 satOrgIOContext->interruptContext ); 1995 TI_DBG1(("satNonChainedWriteNVerifyCB: calling satWriteAndVerify10_1 fails\n")); 1996 return; 1997 } /* end send fails */ 1998 1999 return; 2000 } 2001 2002 2003 void satChainedWriteNVerifyCB( 2004 agsaRoot_t *agRoot, 2005 agsaIORequest_t *agIORequest, 2006 bit32 agIOStatus, 2007 agsaFisHeader_t *agFirstDword, 2008 bit32 agIOInfoLen, 2009 void *agParam, 2010 void *ioContext 2011 ) 2012 { 2013 /* 2014 send write in loop 2015 then, send verify in loop 2016 */ 2017 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2018 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2019 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 2020 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 2021 tdIORequestBody_t *tdIORequestBody; 2022 tdIORequestBody_t *tdOrgIORequestBody; 2023 satIOContext_t *satIOContext; 2024 satIOContext_t *satOrgIOContext; 2025 satIOContext_t *satNewIOContext; 2026 satInternalIo_t *satIntIo; 2027 satInternalIo_t *satNewIntIo = agNULL; 2028 satDeviceData_t *satDevData; 2029 scsiRspSense_t *pSense; 2030 tiIniScsiCmnd_t *scsiCmnd; 2031 tiIORequest_t *tiOrgIORequest; 2032 2033 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 2034 bit32 ataStatus = 0; 2035 bit32 dataLength; 2036 bit32 status = tiError; 2037 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 2038 2039 TI_DBG6(("satChainedWriteNVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 2040 agIORequest, agIOStatus, agIOInfoLen)); 2041 2042 2043 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2044 satIOContext = (satIOContext_t *) ioContext; 2045 satIntIo = satIOContext->satIntIoContext; 2046 satDevData = satIOContext->pSatDevData; 2047 hostToDevFis = satIOContext->pFis; 2048 2049 if (satIntIo == agNULL) 2050 { 2051 TI_DBG5(("satChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n")); 2052 satOrgIOContext = satIOContext; 2053 tiOrgIORequest = tdIORequestBody->tiIORequest; 2054 pSense = satIOContext->pSense; 2055 scsiCmnd = satIOContext->pScsiCmnd; 2056 } 2057 else 2058 { 2059 TI_DBG5(("satChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n")); 2060 satOrgIOContext = satIOContext->satOrgIOContext; 2061 if (satOrgIOContext == agNULL) 2062 { 2063 TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n")); 2064 return; 2065 } 2066 else 2067 { 2068 TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n")); 2069 } 2070 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 2071 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 2072 2073 pSense = satOrgIOContext->pSense; 2074 scsiCmnd = satOrgIOContext->pScsiCmnd; 2075 } 2076 2077 tdIORequestBody->ioCompleted = agTRUE; 2078 tdIORequestBody->ioStarted = agFALSE; 2079 2080 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 2081 { 2082 TI_DBG1(("satChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 2083 satSetSensePayload( pSense, 2084 SCSI_SNSKEY_NO_SENSE, 2085 0, 2086 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 2087 satOrgIOContext); 2088 2089 ostiInitiatorIOCompleted( tiRoot, 2090 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2091 tiIOSuccess, 2092 SCSI_STAT_CHECK_CONDITION, 2093 satOrgIOContext->pTiSenseData, 2094 satOrgIOContext->interruptContext ); 2095 2096 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 2097 2098 satFreeIntIoResource( tiRoot, 2099 satDevData, 2100 satIntIo); 2101 return; 2102 } 2103 2104 /* 2105 checking IO status, FIS type and error status 2106 */ 2107 if (agIOStatus != OSSA_IO_SUCCESS) 2108 { 2109 /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read 2110 agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write 2111 first, assumed to be Reg Device to Host FIS 2112 This is OK to just find fis type 2113 */ 2114 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 2115 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 2116 /* for debugging */ 2117 if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) && 2118 (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) && 2119 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS) 2120 ) 2121 { 2122 TI_DBG1(("satChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType)); 2123 } 2124 2125 /* for debugging */ 2126 if ( (ataStatus & ERR_ATA_STATUS_MASK) || 2127 (ataStatus & DF_ATA_STATUS_MASK) 2128 ) 2129 { 2130 TI_DBG1(("satChainedWriteNVerifyCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command)); 2131 } 2132 2133 /* the function below handles abort case */ 2134 itdsatDelayedProcessAbnormalCompletion(agRoot, 2135 agIORequest, 2136 agIOStatus, 2137 agFirstDword, 2138 agIOInfoLen, 2139 agParam, 2140 satIOContext); 2141 2142 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 2143 satFreeIntIoResource( tiRoot, 2144 satDevData, 2145 satIntIo); 2146 return; 2147 } /* end of error */ 2148 2149 /* process the success case */ 2150 switch (hostToDevFis->h.command) 2151 { 2152 case SAT_WRITE_DMA: /* fall through */ 2153 case SAT_WRITE_SECTORS:/* fall through */ 2154 // case SAT_WRITE_DMA_FUA_EXT: /* fall through */ 2155 case SAT_WRITE_DMA_EXT: /* fall through */ 2156 case SAT_WRITE_SECTORS_EXT: /* fall through */ 2157 case SAT_WRITE_FPDMA_QUEUED: 2158 2159 TI_DBG5(("satChainedWriteNVerifyCB: WRITE success case\n")); 2160 2161 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 2162 2163 /* done with internally genereated SAT_SMART_RETURN_STATUS */ 2164 satFreeIntIoResource( tiRoot, 2165 satDevData, 2166 satIntIo); 2167 /* let's loop till TL */ 2168 2169 2170 (satOrgIOContext->LoopNum)--; 2171 2172 if (satOrgIOContext->superIOFlag) 2173 { 2174 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 2175 } 2176 else 2177 { 2178 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 2179 } 2180 2181 satNewIntIo = satAllocIntIoResource( tiRoot, 2182 tiOrgIORequest, 2183 satDevData, 2184 dataLength, 2185 satNewIntIo); 2186 if (satNewIntIo == agNULL) 2187 { 2188 /* memory allocation failure */ 2189 satFreeIntIoResource( tiRoot, 2190 satDevData, 2191 satNewIntIo); 2192 ostiInitiatorIOCompleted( tiRoot, 2193 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2194 tiIOFailed, 2195 tiDetailOtherError, 2196 agNULL, 2197 satOrgIOContext->interruptContext ); 2198 2199 TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n")); 2200 return; 2201 } /* end of memory allocation failure */ 2202 2203 /* 2204 * Need to initialize all the fields within satIOContext 2205 */ 2206 2207 satNewIOContext = satPrepareNewIO( 2208 satNewIntIo, 2209 tiOrgIORequest, 2210 satDevData, 2211 scsiCmnd, 2212 satOrgIOContext 2213 ); 2214 2215 if (satOrgIOContext->LoopNum == 0) 2216 { 2217 /* 2218 done with write 2219 start with verify 2220 */ 2221 satOrgIOContext->LoopNum = satOrgIOContext->LoopNum2; 2222 status = satChainedWriteNVerify_Start_Verify(tiRoot, 2223 &satNewIntIo->satIntTiIORequest, 2224 satNewIOContext->ptiDeviceHandle, 2225 &satNewIntIo->satIntTiScsiXchg, 2226 satNewIOContext); 2227 } 2228 else 2229 { 2230 status = satChainedWriteNVerify_Write(tiRoot, 2231 &satNewIntIo->satIntTiIORequest, 2232 satNewIOContext->ptiDeviceHandle, 2233 &satNewIntIo->satIntTiScsiXchg, 2234 satNewIOContext); 2235 } 2236 2237 if (status != tiSuccess) 2238 { 2239 satFreeIntIoResource( tiRoot, 2240 satDevData, 2241 satNewIntIo); 2242 ostiInitiatorIOCompleted( tiRoot, 2243 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2244 tiIOFailed, 2245 tiDetailOtherError, 2246 agNULL, 2247 satOrgIOContext->interruptContext ); 2248 TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Write fails\n")); 2249 return; 2250 } 2251 2252 break; 2253 2254 case SAT_READ_VERIFY_SECTORS: /* fall through */ 2255 case SAT_READ_VERIFY_SECTORS_EXT: 2256 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 2257 2258 /* done with internally genereated SAT_SMART_RETURN_STATUS */ 2259 satFreeIntIoResource( tiRoot, 2260 satDevData, 2261 satIntIo); 2262 /* let's loop till TL */ 2263 2264 /* lba = lba + tl 2265 loopnum--; 2266 if (loopnum == 0) done 2267 */ 2268 (satOrgIOContext->LoopNum)--; 2269 if (satOrgIOContext->LoopNum == 0) 2270 { 2271 /* 2272 done with write and verify 2273 */ 2274 ostiInitiatorIOCompleted( tiRoot, 2275 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2276 tiIOSuccess, 2277 SCSI_STAT_GOOD, 2278 agNULL, 2279 satOrgIOContext->interruptContext ); 2280 return; 2281 } 2282 2283 if (satOrgIOContext->superIOFlag) 2284 { 2285 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 2286 } 2287 else 2288 { 2289 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 2290 } 2291 2292 satNewIntIo = satAllocIntIoResource( tiRoot, 2293 tiOrgIORequest, 2294 satDevData, 2295 dataLength, 2296 satNewIntIo); 2297 if (satNewIntIo == agNULL) 2298 { 2299 /* memory allocation failure */ 2300 satFreeIntIoResource( tiRoot, 2301 satDevData, 2302 satNewIntIo); 2303 ostiInitiatorIOCompleted( tiRoot, 2304 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2305 tiIOFailed, 2306 tiDetailOtherError, 2307 agNULL, 2308 satOrgIOContext->interruptContext ); 2309 2310 TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n")); 2311 return; 2312 } /* end of memory allocation failure */ 2313 2314 /* 2315 * Need to initialize all the fields within satIOContext 2316 */ 2317 2318 satNewIOContext = satPrepareNewIO( 2319 satNewIntIo, 2320 tiOrgIORequest, 2321 satDevData, 2322 scsiCmnd, 2323 satOrgIOContext 2324 ); 2325 status = satChainedWriteNVerify_Verify(tiRoot, 2326 &satNewIntIo->satIntTiIORequest, 2327 satNewIOContext->ptiDeviceHandle, 2328 &satNewIntIo->satIntTiScsiXchg, 2329 satNewIOContext); 2330 2331 if (status != tiSuccess) 2332 { 2333 satFreeIntIoResource( tiRoot, 2334 satDevData, 2335 satNewIntIo); 2336 ostiInitiatorIOCompleted( tiRoot, 2337 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2338 tiIOFailed, 2339 tiDetailOtherError, 2340 agNULL, 2341 satOrgIOContext->interruptContext ); 2342 TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Verify fails\n")); 2343 return; 2344 } 2345 2346 break; 2347 2348 default: 2349 TI_DBG1(("satChainedWriteNVerifyCB: success but default case command 0x%x\n",hostToDevFis->h.command)); 2350 ostiInitiatorIOCompleted( tiRoot, 2351 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2352 tiIOFailed, 2353 tiDetailOtherError, 2354 agNULL, 2355 satOrgIOContext->interruptContext ); 2356 2357 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 2358 2359 satFreeIntIoResource( tiRoot, 2360 satDevData, 2361 satIntIo); 2362 2363 break; 2364 } 2365 2366 2367 return; 2368 } 2369 /***************************************************************************** 2370 *! \brief itdsatProcessAbnormalCompletion 2371 * 2372 * This routine is called to complete error case for SATA request previously 2373 * issued to the LL Layer in saSATAStart() 2374 * 2375 * \param agRoot: Handles for this instance of SAS/SATA hardware 2376 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 2377 * \param agIOStatus: Status of completed I/O. 2378 * \param agFirstDword:Pointer to the four bytes of FIS. 2379 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 2380 * length. 2381 * \param agParam: Additional info based on status. 2382 * \param ioContext: Pointer to satIOContext_t. 2383 * 2384 * \return: none 2385 * 2386 *****************************************************************************/ 2387 void itdsatProcessAbnormalCompletion( 2388 agsaRoot_t *agRoot, 2389 agsaIORequest_t *agIORequest, 2390 bit32 agIOStatus, 2391 agsaFisHeader_t *agFirstDword, 2392 bit32 agIOInfoLen, 2393 void *agParam, 2394 satIOContext_t *satIOContext 2395 ) 2396 { 2397 2398 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2399 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2400 bit32 interruptContext = osData->IntContext; 2401 tdIORequestBody_t *tdIORequestBody; 2402 satDeviceData_t *pSatDevData; 2403 tiDeviceHandle_t *tiDeviceHandle; 2404 tdsaDeviceData_t *oneDeviceData = agNULL; 2405 agsaDevHandle_t *agDevHandle = agNULL; 2406 2407 TI_DBG5(("itdsatProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n", 2408 agIORequest, agIOStatus, agIOInfoLen)); 2409 2410 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2411 pSatDevData = satIOContext->pSatDevData; 2412 tiDeviceHandle = satIOContext->ptiDeviceHandle; 2413 2414 /* Get into the detail */ 2415 switch(agIOStatus) 2416 { 2417 case OSSA_IO_SUCCESS: 2418 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS agIOInfoLen %d calling osSatIOCompleted\n", agIOInfoLen)); 2419 /* 2420 * At this point agIOInfoLen should be non-zero and there is valid FIS 2421 * to read. Pass this info to the SAT layer in order to do the ATA status 2422 * to SCSI status translation. 2423 */ 2424 osSatIOCompleted( tiRoot, 2425 tdIORequestBody->tiIORequest, 2426 agFirstDword, 2427 agIOInfoLen, 2428 agParam, 2429 satIOContext, 2430 interruptContext); 2431 break; 2432 2433 2434 case OSSA_IO_ABORTED: 2435 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n")); 2436 2437 ostiInitiatorIOCompleted( tiRoot, 2438 tdIORequestBody->tiIORequest, 2439 tiIOFailed, 2440 tiDetailAborted, 2441 agNULL, 2442 interruptContext); 2443 2444 if ( pSatDevData->satTmTaskTag != agNULL ) 2445 { 2446 TI_DBG1(("itdsatProcessAbnormalCompletion: TM callback\n")); 2447 if (tiDeviceHandle == agNULL) 2448 { 2449 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2450 } 2451 /* TM completed */ 2452 ostiInitiatorEvent( tiRoot, 2453 agNULL, /* portalContext not used */ 2454 tiDeviceHandle, 2455 tiIntrEventTypeTaskManagement, 2456 tiTMOK, 2457 pSatDevData->satTmTaskTag); 2458 /* 2459 * Reset flag 2460 */ 2461 pSatDevData->satTmTaskTag = agNULL; 2462 } 2463 2464 /* 2465 * Check if we are in recovery mode and need to update the recovery flag 2466 */ 2467 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) && 2468 (pSatDevData->satPendingIO == 0 )) 2469 { 2470 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 2471 TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n")); 2472 } 2473 2474 TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState)); 2475 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO )); 2476 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO)); 2477 2478 break; 2479 case OSSA_IO_UNDERFLOW: 2480 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n")); 2481 ostiInitiatorIOCompleted( tiRoot, 2482 tdIORequestBody->tiIORequest, 2483 tiIOUnderRun, 2484 agIOInfoLen, 2485 agNULL, 2486 interruptContext); 2487 break; 2488 2489 2490 case OSSA_IO_FAILED: 2491 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n")); 2492 ostiInitiatorIOCompleted( tiRoot, 2493 tdIORequestBody->tiIORequest, 2494 tiIOFailed, 2495 tiDetailOtherError, 2496 agNULL, 2497 interruptContext); 2498 break; 2499 2500 case OSSA_IO_ABORT_RESET: 2501 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n")); 2502 ostiInitiatorIOCompleted( tiRoot, 2503 tdIORequestBody->tiIORequest, 2504 tiIOFailed, 2505 tiDetailAbortReset, 2506 agNULL, 2507 interruptContext); 2508 /* 2509 * Check if we are in recovery mode and need to update the recovery flag 2510 */ 2511 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) && 2512 (pSatDevData->satPendingIO == 0 )) 2513 { 2514 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 2515 TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n")); 2516 } 2517 2518 TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState)); 2519 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO )); 2520 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO)); 2521 2522 break; 2523 2524 2525 case OSSA_IO_NO_DEVICE: 2526 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n")); 2527 ostiInitiatorIOCompleted( tiRoot, 2528 tdIORequestBody->tiIORequest, 2529 tiIOFailed, 2530 tiDetailNoLogin, 2531 agNULL, 2532 interruptContext); 2533 break; 2534 2535 case OSSA_IO_PROG_ERROR: 2536 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n")); 2537 ostiInitiatorIOCompleted( tiRoot, 2538 tdIORequestBody->tiIORequest, 2539 tiIOFailed, 2540 tiDetailOtherError, 2541 agNULL, 2542 interruptContext); 2543 break; 2544 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */ 2545 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */ 2546 case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */ 2547 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */ 2548 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */ 2549 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */ 2550 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */ 2551 case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */ 2552 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus)); 2553 if (tiDeviceHandle == agNULL) 2554 { 2555 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2556 ostiInitiatorIOCompleted( tiRoot, 2557 tdIORequestBody->tiIORequest, 2558 tiIOFailed, 2559 tiDetailOtherError, 2560 agNULL, 2561 interruptContext); 2562 return; 2563 } 2564 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2565 if (oneDeviceData == agNULL) 2566 { 2567 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2568 } 2569 else 2570 { 2571 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2572 } 2573 2574 ostiInitiatorIOCompleted( tiRoot, 2575 tdIORequestBody->tiIORequest, 2576 tiIOFailed, 2577 tiDetailOtherError, 2578 agNULL, 2579 interruptContext); 2580 break; 2581 2582 case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY: 2583 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n")); 2584 ostiInitiatorIOCompleted( tiRoot, 2585 tdIORequestBody->tiIORequest, 2586 tiIOFailed, 2587 tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted, 2588 agNULL, 2589 interruptContext); 2590 break; 2591 2592 case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */ 2593 case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */ 2594 case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */ 2595 case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */ 2596 case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */ 2597 case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */ 2598 case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */ 2599 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus)); 2600 ostiInitiatorIOCompleted( tiRoot, 2601 tdIORequestBody->tiIORequest, 2602 tiIOFailed, 2603 tiDetailOtherError, 2604 agNULL, 2605 interruptContext); 2606 break; 2607 case OSSA_IO_DS_IN_ERROR: 2608 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n")); 2609 if (tiDeviceHandle == agNULL) 2610 { 2611 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2612 ostiInitiatorIOCompleted( tiRoot, 2613 tdIORequestBody->tiIORequest, 2614 tiIOFailed, 2615 tiDetailOtherError, 2616 agNULL, 2617 interruptContext); 2618 return; 2619 } 2620 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2621 if (oneDeviceData == agNULL) 2622 { 2623 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2624 } 2625 else 2626 { 2627 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2628 } 2629 ostiInitiatorIOCompleted( tiRoot, 2630 tdIORequestBody->tiIORequest, 2631 tiIOFailed, 2632 tiDetailOtherError, 2633 agNULL, 2634 interruptContext); 2635 break; 2636 case OSSA_IO_DS_NON_OPERATIONAL: 2637 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n")); 2638 if (tiDeviceHandle == agNULL) 2639 { 2640 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2641 ostiInitiatorIOCompleted( tiRoot, 2642 tdIORequestBody->tiIORequest, 2643 tiIOFailed, 2644 tiDetailOtherError, 2645 agNULL, 2646 interruptContext); 2647 return; 2648 } 2649 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2650 if (oneDeviceData == agNULL) 2651 { 2652 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2653 } 2654 else 2655 { 2656 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2657 agDevHandle = oneDeviceData->agDevHandle; 2658 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && 2659 oneDeviceData->tdPortContext != agNULL ) 2660 { 2661 saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL); 2662 } 2663 } 2664 2665 ostiInitiatorIOCompleted( tiRoot, 2666 tdIORequestBody->tiIORequest, 2667 tiIOFailed, 2668 tiDetailOtherError, 2669 agNULL, 2670 interruptContext); 2671 break; 2672 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */ 2673 case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH: 2674 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus)); 2675 itdsatEncryptionHandler(agRoot, 2676 agIORequest, 2677 agIOStatus, 2678 agIOInfoLen, 2679 agParam, 2680 0); 2681 break; 2682 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */ 2683 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */ 2684 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH: 2685 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus)); 2686 itdsatDifHandler(agRoot, 2687 agIORequest, 2688 agIOStatus, 2689 agIOInfoLen, 2690 agParam, 2691 0); 2692 break; 2693 default: 2694 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2695 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = unknown 0x%x\n", agIOStatus)); 2696 if (oneDeviceData != agNULL) 2697 { 2698 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2699 } 2700 else 2701 { 2702 TI_DBG1(("itdsatProcessAbnormalCompletion: oneDeviceData is NULL\n")); 2703 } 2704 2705 ostiInitiatorIOCompleted( tiRoot, 2706 tdIORequestBody->tiIORequest, 2707 tiIOFailed, 2708 tiDetailOtherError, 2709 agNULL, 2710 interruptContext); 2711 break; 2712 2713 } /* switch */ 2714 } 2715 2716 2717 /***************************************************************************** 2718 *! \brief itdsatDelayedProcessAbnormalCompletion 2719 * 2720 * This routine is called to complete error case for SATA request previously 2721 * issued to the LL Layer in saSATAStart(). 2722 * This is used when command is chained. 2723 * 2724 * \param agRoot: Handles for this instance of SAS/SATA hardware 2725 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 2726 * \param agIOStatus: Status of completed I/O. 2727 * \param agFirstDword:Pointer to the four bytes of FIS. 2728 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 2729 * length. 2730 * \param agParam: Additional info based on status. 2731 * \param ioContext: Pointer to satIOContext_t. 2732 * 2733 * \return: none 2734 * 2735 *****************************************************************************/ 2736 void itdsatDelayedProcessAbnormalCompletion( 2737 agsaRoot_t *agRoot, 2738 agsaIORequest_t *agIORequest, 2739 bit32 agIOStatus, 2740 agsaFisHeader_t *agFirstDword, 2741 bit32 agIOInfoLen, 2742 void *agParam, 2743 satIOContext_t *satIOContext 2744 ) 2745 { 2746 2747 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2748 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2749 bit32 interruptContext = osData->IntContext; 2750 tdIORequestBody_t *tdIORequestBody; 2751 satDeviceData_t *pSatDevData; 2752 tiDeviceHandle_t *tiDeviceHandle; 2753 tdsaDeviceData_t *oneDeviceData = agNULL; 2754 agsaDevHandle_t *agDevHandle = agNULL; 2755 2756 TI_DBG5(("itdsatDelayedProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n", 2757 agIORequest, agIOStatus, agIOInfoLen)); 2758 2759 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2760 pSatDevData = satIOContext->pSatDevData; 2761 tiDeviceHandle = satIOContext->ptiDeviceHandle; 2762 2763 /* Get into the detail */ 2764 switch(agIOStatus) 2765 { 2766 case OSSA_IO_SUCCESS: 2767 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS calling osSatIOCompleted\n")); 2768 /* do nothing */ 2769 break; 2770 2771 2772 case OSSA_IO_ABORTED: 2773 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n")); 2774 2775 ostiInitiatorIOCompleted( tiRoot, 2776 tdIORequestBody->tiIORequest, 2777 tiIOFailed, 2778 tiDetailAborted, 2779 agNULL, 2780 interruptContext); 2781 2782 if ( pSatDevData->satTmTaskTag != agNULL ) 2783 { 2784 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: TM callback\n")); 2785 if (tiDeviceHandle == agNULL) 2786 { 2787 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2788 } 2789 /* TM completed */ 2790 ostiInitiatorEvent( tiRoot, 2791 agNULL, /* portalContext not used */ 2792 tiDeviceHandle, 2793 tiIntrEventTypeTaskManagement, 2794 tiTMOK, 2795 pSatDevData->satTmTaskTag); 2796 /* 2797 * Reset flag 2798 */ 2799 pSatDevData->satTmTaskTag = agNULL; 2800 } 2801 2802 /* 2803 * Check if we are in recovery mode and need to update the recovery flag 2804 */ 2805 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) && 2806 (pSatDevData->satPendingIO == 0 )) 2807 { 2808 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 2809 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n")); 2810 } 2811 2812 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState)); 2813 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO )); 2814 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO)); 2815 2816 break; 2817 case OSSA_IO_UNDERFLOW: 2818 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n")); 2819 ostiInitiatorIOCompleted( tiRoot, 2820 tdIORequestBody->tiIORequest, 2821 tiIOUnderRun, 2822 agIOInfoLen, 2823 agNULL, 2824 interruptContext); 2825 break; 2826 2827 2828 case OSSA_IO_FAILED: 2829 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n")); 2830 ostiInitiatorIOCompleted( tiRoot, 2831 tdIORequestBody->tiIORequest, 2832 tiIOFailed, 2833 tiDetailOtherError, 2834 agNULL, 2835 interruptContext); 2836 break; 2837 2838 case OSSA_IO_ABORT_RESET: 2839 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n")); 2840 ostiInitiatorIOCompleted( tiRoot, 2841 tdIORequestBody->tiIORequest, 2842 tiIOFailed, 2843 tiDetailAbortReset, 2844 agNULL, 2845 interruptContext); 2846 /* 2847 * Check if we are in recovery mode and need to update the recovery flag 2848 */ 2849 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) && 2850 (pSatDevData->satPendingIO == 0 )) 2851 { 2852 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 2853 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n")); 2854 } 2855 2856 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState)); 2857 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO )); 2858 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO)); 2859 2860 break; 2861 2862 2863 case OSSA_IO_NO_DEVICE: 2864 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n")); 2865 ostiInitiatorIOCompleted( tiRoot, 2866 tdIORequestBody->tiIORequest, 2867 tiIOFailed, 2868 tiDetailNoLogin, 2869 agNULL, 2870 interruptContext); 2871 break; 2872 2873 case OSSA_IO_PROG_ERROR: 2874 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n")); 2875 ostiInitiatorIOCompleted( tiRoot, 2876 tdIORequestBody->tiIORequest, 2877 tiIOFailed, 2878 tiDetailOtherError, 2879 agNULL, 2880 interruptContext); 2881 break; 2882 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */ 2883 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */ 2884 case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */ 2885 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */ 2886 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */ 2887 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */ 2888 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */ 2889 case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */ 2890 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus)); 2891 if (tiDeviceHandle == agNULL) 2892 { 2893 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2894 ostiInitiatorIOCompleted( tiRoot, 2895 tdIORequestBody->tiIORequest, 2896 tiIOFailed, 2897 tiDetailOtherError, 2898 agNULL, 2899 interruptContext); 2900 return; 2901 } 2902 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2903 if (oneDeviceData == agNULL) 2904 { 2905 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2906 } 2907 else 2908 { 2909 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2910 } 2911 ostiInitiatorIOCompleted( tiRoot, 2912 tdIORequestBody->tiIORequest, 2913 tiIOFailed, 2914 tiDetailOtherError, 2915 agNULL, 2916 interruptContext); 2917 break; 2918 2919 case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY: 2920 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n")); 2921 ostiInitiatorIOCompleted( tiRoot, 2922 tdIORequestBody->tiIORequest, 2923 tiIOFailed, 2924 tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted, 2925 agNULL, 2926 interruptContext); 2927 break; 2928 2929 case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */ 2930 case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */ 2931 case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */ 2932 case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */ 2933 case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */ 2934 case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */ 2935 case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */ 2936 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus)); 2937 2938 ostiInitiatorIOCompleted( tiRoot, 2939 tdIORequestBody->tiIORequest, 2940 tiIOFailed, 2941 tiDetailOtherError, 2942 agNULL, 2943 interruptContext); 2944 break; 2945 case OSSA_IO_DS_IN_ERROR: 2946 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n")); 2947 if (tiDeviceHandle == agNULL) 2948 { 2949 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2950 ostiInitiatorIOCompleted( tiRoot, 2951 tdIORequestBody->tiIORequest, 2952 tiIOFailed, 2953 tiDetailOtherError, 2954 agNULL, 2955 interruptContext); 2956 return; 2957 } 2958 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2959 if (oneDeviceData == agNULL) 2960 { 2961 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2962 } 2963 else 2964 { 2965 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2966 } 2967 ostiInitiatorIOCompleted( tiRoot, 2968 tdIORequestBody->tiIORequest, 2969 tiIOFailed, 2970 tiDetailOtherError, 2971 agNULL, 2972 interruptContext); 2973 break; 2974 case OSSA_IO_DS_NON_OPERATIONAL: 2975 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n")); 2976 if (tiDeviceHandle == agNULL) 2977 { 2978 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2979 ostiInitiatorIOCompleted( tiRoot, 2980 tdIORequestBody->tiIORequest, 2981 tiIOFailed, 2982 tiDetailOtherError, 2983 agNULL, 2984 interruptContext); 2985 return; 2986 } 2987 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2988 if (oneDeviceData == agNULL) 2989 { 2990 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2991 } 2992 else 2993 { 2994 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2995 agDevHandle = oneDeviceData->agDevHandle; 2996 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && 2997 oneDeviceData->tdPortContext != agNULL ) 2998 { 2999 saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL); 3000 } 3001 } 3002 ostiInitiatorIOCompleted( tiRoot, 3003 tdIORequestBody->tiIORequest, 3004 tiIOFailed, 3005 tiDetailOtherError, 3006 agNULL, 3007 interruptContext); 3008 break; 3009 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */ 3010 case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH: 3011 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus)); 3012 itdsatEncryptionHandler(agRoot, 3013 agIORequest, 3014 agIOStatus, 3015 agIOInfoLen, 3016 agParam, 3017 0); 3018 break; 3019 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */ 3020 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */ 3021 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH: 3022 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus)); 3023 itdsatDifHandler(agRoot, 3024 agIORequest, 3025 agIOStatus, 3026 agIOInfoLen, 3027 agParam, 3028 0); 3029 break; 3030 default: 3031 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = unknown\n")); 3032 ostiInitiatorIOCompleted( tiRoot, 3033 tdIORequestBody->tiIORequest, 3034 tiIOFailed, 3035 tiDetailOtherError, 3036 agNULL, 3037 interruptContext); 3038 break; 3039 3040 } /* switch */ 3041 } 3042 3043 /***************************************************************************** 3044 *! \brief itdsatEncryptionHandler 3045 * 3046 * Purpose: This function processes I/Os completed and returned by SATA lower 3047 * layer with any encryption specific agIOStatus. 3048 * 3049 * \param agRoot: pointer to port instance 3050 * \param agIORequest: pointer to I/O request 3051 * \param agIOStatus: I/O status given by LL layer 3052 * \param agIOInfoLen: lenth of complete SAS RESP frame 3053 * \param agParam A Handle used to refer to the response frame or handle 3054 * of abort request 3055 * \return: None 3056 * 3057 * 3058 *****************************************************************************/ 3059 osGLOBAL void 3060 itdsatEncryptionHandler( 3061 agsaRoot_t *agRoot, 3062 agsaIORequest_t *agIORequest, 3063 bit32 agIOStatus, 3064 bit32 agIOInfoLen, 3065 void *agParam, 3066 bit32 agOtherInfo 3067 ) 3068 { 3069 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3070 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3071 bit32 intContext = osData->IntContext; 3072 bit32 errorDetail = tiDetailOtherError; 3073 tdIORequestBody_t *tdIORequestBody; 3074 TI_DBG1(("itdsatEncryptionHandler: start\n")); 3075 TI_DBG1(("itdsatEncryptionHandler: agIOStatus 0x%x\n", agIOStatus)); 3076 3077 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3078 3079 switch (agIOStatus) 3080 { 3081 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: 3082 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n")); 3083 errorDetail = tiDetailDekKeyCacheMiss; 3084 break; 3085 case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID: 3086 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n")); 3087 errorDetail = tiDetailCipherModeInvalid; 3088 break; 3089 case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH: 3090 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n")); 3091 errorDetail = tiDetailDekIVMismatch; 3092 break; 3093 case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR: 3094 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n")); 3095 errorDetail = tiDetailDekRamInterfaceError; 3096 break; 3097 default: 3098 TI_DBG1(("itdsatEncryptionHandler: other error!!! 0x%x\n", agIOStatus)); 3099 errorDetail = tiDetailOtherError; 3100 break; 3101 } 3102 3103 ostiInitiatorIOCompleted ( 3104 tiRoot, 3105 tdIORequestBody->tiIORequest, 3106 tiIOEncryptError, 3107 errorDetail, 3108 agNULL, 3109 intContext 3110 ); 3111 return; 3112 } 3113 3114 /***************************************************************************** 3115 *! \brief itdsatDifHandler 3116 * 3117 * Purpose: This function processes I/Os completed and returned by SATA lower 3118 * layer with any DIF specific agIOStatus. 3119 * 3120 * \param agRoot: pointer to port instance 3121 * \param agIORequest: pointer to I/O request 3122 * \param agIOStatus: I/O status given by LL layer 3123 * \param agIOInfoLen: lenth of complete SAS RESP frame 3124 * \param agParam A Handle used to refer to the response frame or handle 3125 * of abort request 3126 * \return: None 3127 * 3128 * 3129 *****************************************************************************/ 3130 osGLOBAL void 3131 itdsatDifHandler( 3132 agsaRoot_t *agRoot, 3133 agsaIORequest_t *agIORequest, 3134 bit32 agIOStatus, 3135 bit32 agIOInfoLen, 3136 void *agParam, 3137 bit32 agOtherInfo 3138 ) 3139 { 3140 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3141 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3142 bit32 intContext = osData->IntContext; 3143 bit32 errorDetail = tiDetailOtherError; 3144 tdIORequestBody_t *tdIORequestBody; 3145 #ifdef TD_DEBUG_ENABLE 3146 agsaDifDetails_t *DifDetail; 3147 #endif 3148 3149 TI_DBG2(("itdsatDifHandler: start\n")); 3150 TI_DBG2(("itdsatDifHandler: agIOStatus 0x%x\n", agIOStatus)); 3151 3152 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3153 #ifdef TD_DEBUG_ENABLE 3154 DifDetail = (agsaDifDetails_t *)agParam; 3155 #endif 3156 switch (agIOStatus) 3157 { 3158 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: 3159 TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n")); 3160 errorDetail = tiDetailDifAppTagMismatch; 3161 break; 3162 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: 3163 TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n")); 3164 errorDetail = tiDetailDifRefTagMismatch; 3165 break; 3166 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH: 3167 TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n")); 3168 errorDetail = tiDetailDifCrcMismatch; 3169 break; 3170 default: 3171 TI_DBG1(("itdsatDifHandler: other error!!! 0x%x\n", agIOStatus)); 3172 errorDetail = tiDetailOtherError; 3173 break; 3174 } 3175 3176 TI_DBG1(("smsatDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA)); 3177 3178 ostiInitiatorIOCompleted ( 3179 tiRoot, 3180 tdIORequestBody->tiIORequest, 3181 tiIODifError, 3182 errorDetail, 3183 agNULL, 3184 intContext 3185 ); 3186 return; 3187 } 3188 3189 /*****************************************************************************/ 3190 /*! \brief satProcessAbort 3191 * 3192 * This function processes abort. 3193 * 3194 * \param tiRoot: Pointer to TISA initiator driver/port instance. 3195 * \param tiIORequest: Pointer to TISA I/O request context for this I/O. 3196 * \param satIOContext_t: Pointer to the SAT IO Context 3197 * 3198 * \return 3199 * None 3200 */ 3201 /*****************************************************************************/ 3202 void satProcessAbort( 3203 tiRoot_t *tiRoot, 3204 tiIORequest_t *tiIORequest, 3205 satIOContext_t *satIOContext 3206 ) 3207 { 3208 satDeviceData_t *pSatDevData; 3209 //tiDeviceHandle_t *tiDeviceHandle; 3210 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 3211 3212 TI_DBG5(("satProcessAbort: start\n")); 3213 3214 pSatDevData = satIOContext->pSatDevData; 3215 //tiDeviceHandle = satIOContext->ptiDeviceHandle; 3216 hostToDevFis = satIOContext->pFis; 3217 if ( (hostToDevFis->h.command == SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE) && 3218 (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02) 3219 ) 3220 { 3221 /* no completion for send diagnotic in background. It is done in satSendDiagnostic() */ 3222 ostiInitiatorIOCompleted( tiRoot, 3223 tiIORequest, 3224 tiIOFailed, 3225 tiDetailAborted, 3226 agNULL, 3227 satIOContext->interruptContext); 3228 } 3229 3230 if ( pSatDevData->satTmTaskTag != agNULL ) 3231 { 3232 TI_DBG1(("satProcessAbort: TM callback\n")); 3233 /* 3234 * Reset flag 3235 */ 3236 pSatDevData->satTmTaskTag = agNULL; 3237 } 3238 3239 /* 3240 * Check if we are in recovery mode and need to update the recovery flag 3241 */ 3242 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) && 3243 (pSatDevData->satPendingIO == 0 )) 3244 { 3245 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 3246 TI_DBG1(("satProcessAbort: STATE NORMAL.\n")); 3247 } 3248 TI_DBG1(("satProcessAbort: satDriveState %d\n", pSatDevData->satDriveState)); 3249 TI_DBG1(("satProcessAbort: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO )); 3250 TI_DBG1(("satProcessAbort: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO)); 3251 3252 3253 3254 return; 3255 } 3256 3257 /***************************************************************************** 3258 *! \brief satNonDataIOCB 3259 * 3260 * This routine is a callback function called from ossaSATACompleted(). 3261 * This CB routine deals with non-data I/O SATA request. 3262 * 3263 * \param agRoot: Handles for this instance of SAS/SATA hardware 3264 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 3265 * \param agIOStatus: Status of completed I/O. 3266 * \param agFirstDword:Pointer to the four bytes of FIS. 3267 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 3268 * length. 3269 * \param agParam: Additional info based on status. 3270 * \param ioContext: Pointer to satIOContext_t. 3271 * 3272 * \return: none 3273 * 3274 *****************************************************************************/ 3275 void satNonDataIOCB( 3276 agsaRoot_t *agRoot, 3277 agsaIORequest_t *agIORequest, 3278 bit32 agIOStatus, 3279 agsaFisHeader_t *agFirstDword, 3280 bit32 agIOInfoLen, 3281 void *agParam, 3282 void *ioContext 3283 ) 3284 { 3285 3286 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3287 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3288 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 3289 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 3290 tdIORequestBody_t *tdIORequestBody; 3291 bit32 interruptContext = osData->IntContext; 3292 satIOContext_t *satIOContext; 3293 3294 TI_DBG5(("satNonDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 3295 agIORequest, agIOStatus, agIOInfoLen)); 3296 3297 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3298 satIOContext = (satIOContext_t *) ioContext; 3299 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 3300 3301 tdIORequestBody->ioCompleted = agTRUE; 3302 tdIORequestBody->ioStarted = agFALSE; 3303 3304 /* Process completion */ 3305 if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen==0)) 3306 { 3307 /* 3308 * !!! We expect that agIOInfoLen should be non-zero !!!!. 3309 * Now call the OS-App Specific layer about this unexpected completion. 3310 */ 3311 TI_DBG1(("satNonDataIOCB: *** ERROR*** agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 3312 agIORequest, agIOStatus, agIOInfoLen)); 3313 3314 ostiInitiatorIOCompleted( tiRoot, 3315 tdIORequestBody->tiIORequest, 3316 tiIOFailed, 3317 tiDetailOtherError, 3318 agNULL, 3319 interruptContext); 3320 } 3321 else 3322 { 3323 /* More checking needed, for non-data IO this should be the normal case */ 3324 itdsatProcessAbnormalCompletion( agRoot, 3325 agIORequest, 3326 agIOStatus, 3327 agFirstDword, 3328 agIOInfoLen, 3329 agParam, 3330 satIOContext); 3331 } 3332 3333 } 3334 3335 /***************************************************************************** 3336 *! \brief tdssSATADeviceTypeDecode 3337 * 3338 * This routine decodes ATA signature 3339 * 3340 * \param pSignature: ATA signature 3341 * 3342 * 3343 * \return: 3344 * TRUE if ATA signature 3345 * FALSE otherwise 3346 * 3347 *****************************************************************************/ 3348 /* 3349 ATA p65 3350 PM p65 3351 SATAII p79, p80 3352 */ 3353 GLOBAL bit32 3354 tdssSATADeviceTypeDecode( 3355 bit8 *pSignature 3356 ) 3357 { 3358 bit32 deviceType = UNKNOWN_DEVICE; 3359 3360 if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01 3361 && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00 3362 && (pSignature)[4] == 0xA0 ) /* this is the signature of a Hitachi SATA HDD*/ 3363 { 3364 deviceType = SATA_ATA_DEVICE; 3365 } 3366 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01 3367 && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00 3368 && (pSignature)[4] == 0x00 ) 3369 { 3370 deviceType = SATA_ATA_DEVICE; 3371 } 3372 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01 3373 && (pSignature)[2] == 0x14 && (pSignature)[3] == 0xEB 3374 && ( (pSignature)[4] == 0x00 || (pSignature)[4] == 0x10) ) 3375 { 3376 deviceType = SATA_ATAPI_DEVICE; 3377 } 3378 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01 3379 && (pSignature)[2] == 0x69 && (pSignature)[3] == 0x96 3380 && (pSignature)[4] == 0x00 ) 3381 { 3382 deviceType = SATA_PM_DEVICE; 3383 } 3384 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01 3385 && (pSignature)[2] == 0x3C && (pSignature)[3] == 0xC3 3386 && (pSignature)[4] == 0x00 ) 3387 { 3388 deviceType = SATA_SEMB_DEVICE; 3389 } 3390 else if ( (pSignature)[0] == 0xFF && (pSignature)[1] == 0xFF 3391 && (pSignature)[2] == 0xFF && (pSignature)[3] == 0xFF 3392 && (pSignature)[4] == 0xFF ) 3393 { 3394 deviceType = SATA_SEMB_WO_SEP_DEVICE; 3395 } 3396 3397 return deviceType; 3398 } 3399 3400 /***************************************************************************** 3401 *! \brief ossaDiscoverSataCB 3402 * 3403 * Purpose: This function is called by lower layer to inform TD layer of 3404 * STP/SATA discovery results 3405 * 3406 * 3407 * \param agRoot Pointer to chip/driver Instance. 3408 * \param agPortContext Pointer to the port context of TD and Lower layer 3409 * \param event event type 3410 * \param pParm1 Pointer to data associated with event 3411 * \param pParm2 Pointer to data associated with event 3412 * 3413 * \return: none 3414 * 3415 * \note - For details, refer to SAS/SATA Low-Level API Specification 3416 * 3417 *****************************************************************************/ 3418 3419 osGLOBAL void ossaDiscoverSataCB( agsaRoot_t *agRoot, 3420 agsaPortContext_t *agPortContext, 3421 bit32 event, 3422 void *pParm1, 3423 void *pParm2 3424 ) 3425 { 3426 tdsaRootOsData_t *osData; 3427 tiRoot_t *tiRoot; 3428 tdsaPortContext_t *onePortContext; 3429 tdsaDeviceData_t *oneDeviceData; 3430 agsaDevHandle_t *agDevHandle; 3431 agsaSATADeviceInfo_t *agSATADeviceInfo; 3432 tiPortalContext_t *tiPortalContext; 3433 3434 bit32 devicetype = UNKNOWN_DEVICE; 3435 3436 osData = (tdsaRootOsData_t *)agRoot->osData; 3437 tiRoot = (tiRoot_t *)osData->tiRoot; 3438 3439 TI_DBG5(("ossaDiscoverSataCB: start\n")); 3440 3441 if (agPortContext == agNULL) 3442 { 3443 TI_DBG1(("ossaDiscoverSataCB: NULL agsaPortContext; wrong\n")); 3444 return; 3445 } 3446 3447 onePortContext = (tdsaPortContext_t *)agPortContext->osData; 3448 tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext; 3449 3450 switch ( event ) 3451 { 3452 case OSSA_DISCOVER_STARTED: 3453 { 3454 TI_DBG5(("ossaDiscoverSataCB: STARTED\n")); 3455 /* Do nothing */ 3456 break; 3457 } 3458 3459 case OSSA_DISCOVER_FOUND_DEVICE: 3460 { 3461 TI_DBG5(("ossaDiscoverSataCB: ***** FOUND DEVICE\n")); 3462 agDevHandle = (agsaDevHandle_t *) pParm1; 3463 agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2; 3464 3465 /* parse the device type */ 3466 devicetype = tdssSATADeviceTypeDecode(agSATADeviceInfo->signature); 3467 3468 3469 /* for now, TD handles only ATA Device or ATAPI Device */ 3470 if (devicetype == SATA_ATA_DEVICE || devicetype == SATA_ATAPI_DEVICE) 3471 { 3472 TI_DBG5(("ossaDiscoverSataCB: ***** adding ....\n")); 3473 /* Add SATA device */ 3474 tdssAddSATAToSharedcontext( onePortContext, 3475 agRoot, 3476 agDevHandle, 3477 agSATADeviceInfo, 3478 agTRUE, 3479 agSATADeviceInfo->stpPhyIdentifier 3480 ); 3481 #ifdef INITIATOR_DRIVER 3482 ostiInitiatorEvent( 3483 tiRoot, 3484 tiPortalContext, 3485 agNULL, 3486 tiIntrEventTypeDeviceChange, 3487 tiDeviceArrival, 3488 agNULL 3489 ); 3490 #endif 3491 } /* end of ATA_ATA_DEVICE or ATA_ATAPI_DEVICE */ 3492 else 3493 { 3494 TI_DBG5(("ossaDiscoverSataCB: ***** not adding ..... devicetype 0x%x\n", devicetype)); 3495 } 3496 break; 3497 } 3498 3499 case OSSA_DISCOVER_REMOVED_DEVICE: 3500 { 3501 TI_DBG1(("ossaDiscoverSataCB: REMOVED_DEVICE\n")); 3502 agDevHandle = (agsaDevHandle_t *) pParm1; 3503 agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2; 3504 3505 oneDeviceData = (tdsaDeviceData_t *) agDevHandle->osData; 3506 3507 TI_DBG1(("ossaDiscoverSataCB: signature: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", 3508 agSATADeviceInfo->signature[0], agSATADeviceInfo->signature[1], 3509 agSATADeviceInfo->signature[2], agSATADeviceInfo->signature[3], 3510 agSATADeviceInfo->signature[4], agSATADeviceInfo->signature[5], 3511 agSATADeviceInfo->signature[6], agSATADeviceInfo->signature[7] )); 3512 3513 if (oneDeviceData == agNULL) 3514 { 3515 TI_DBG1(("ossaDiscoverSataCB: Wrong. DevHandle->osData is NULL but is being removed\n")); 3516 } 3517 tdssRemoveSATAFromSharedcontext( onePortContext, 3518 oneDeviceData, 3519 agRoot 3520 ); 3521 agDevHandle->osData = agNULL; 3522 #ifdef INITIATOR_DRIVER 3523 ostiInitiatorEvent( 3524 tiRoot, 3525 tiPortalContext, 3526 agNULL, 3527 tiIntrEventTypeDeviceChange, 3528 tiDeviceRemoval, 3529 agNULL 3530 ); 3531 #endif 3532 break; 3533 } 3534 3535 case OSSA_DISCOVER_COMPLETE: 3536 { 3537 TI_DBG1(("ossaDiscoverSataCB: COMPLETE\n")); 3538 onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED; 3539 TI_DBG6(("ossaDiscoverSataCB: COMPLETE pid %d\n", onePortContext->id)); 3540 3541 /* Let OS-Apps specific layer know discovery has been successfully complete */ 3542 ostiInitiatorEvent( tiRoot, 3543 tiPortalContext, 3544 agNULL, 3545 tiIntrEventTypeDiscovery, 3546 tiDiscOK, 3547 agNULL ); 3548 break; 3549 } 3550 3551 case OSSA_DISCOVER_ABORT: 3552 { 3553 TI_DBG1(("ossaDiscoverSataCB: OSSA_DISCOVER_ABORT\n")); 3554 /* Let OS-Apps specific layer know discovery has failed */ 3555 ostiInitiatorEvent( tiRoot, 3556 tiPortalContext, 3557 agNULL, 3558 tiIntrEventTypeDiscovery, 3559 tiDiscFailed, 3560 agNULL ); 3561 3562 break; 3563 } 3564 3565 default: 3566 { 3567 TI_DBG1(("ossaDiscoverSataCB: error default event 0x%x\n", event)); 3568 /* Let OS-Apps specific layer know discovery has failed */ 3569 ostiInitiatorEvent( tiRoot, 3570 tiPortalContext, 3571 agNULL, 3572 tiIntrEventTypeDiscovery, 3573 tiDiscFailed, 3574 agNULL ); 3575 break; 3576 } 3577 3578 } /* end of switch */ 3579 3580 return; 3581 } 3582 3583 /***************************************************************************** 3584 *! \brief tdssAddSataToSharedcontext 3585 * 3586 * Purpose: This function adds a discovered SATA device to a device list of 3587 * a port context 3588 * 3589 * \param tsddPortContext_Instance Pointer to the target port context 3590 * \param agRoot Pointer to the root data structure of 3591 * TD and Lower layer 3592 * \param agDevHandle Pointer to a device handle 3593 * \param agSATADeviceInfo Pointer to SATA device info structure 3594 * \param registered indication flag for registration to LL 3595 * 3596 * \Return: none 3597 * 3598 *****************************************************************************/ 3599 /* split into devicedata allocation/registration and sending identify device data */ 3600 osGLOBAL void 3601 tdssAddSATAToSharedcontext( tdsaPortContext_t *tdsaPortContext_Instance, 3602 agsaRoot_t *agRoot, 3603 agsaDevHandle_t *agDevHandle, 3604 agsaSATADeviceInfo_t *agSATADeviceInfo, 3605 bit32 registered, 3606 bit8 phyID 3607 ) 3608 { 3609 tdsaPortContext_t *onePortContext = agNULL; 3610 tdList_t *PortContextList; 3611 tdsaDeviceData_t *oneDeviceData = agNULL; 3612 tdList_t *DeviceListList = agNULL; 3613 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3614 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3615 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 3616 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 3617 satDeviceData_t *pSatDevData; 3618 bit32 Indenom = tdsaAllShared->QueueConfig.numInboundQueues; 3619 bit32 Outdenom = tdsaAllShared->QueueConfig.numOutboundQueues; 3620 bit8 dev_s_rate = 0; 3621 bit8 sasorsata = 1; 3622 bit8 connectionRate; 3623 bit8 flag = 0; 3624 bit8 TLR = 0; 3625 bit32 found = agFALSE; 3626 TI_DBG5(("tdssAddSataToSharedcontext: start\n")); 3627 3628 /* 3629 * Find a right portcontext, then get devicedata from FreeLink in DeviceList. 3630 * Then, add the devicedata to the portcontext. 3631 */ 3632 3633 /* Find a right portcontext */ 3634 PortContextList = tdsaAllShared->MainPortContextList.flink; 3635 while (PortContextList != &(tdsaAllShared->MainPortContextList)) 3636 { 3637 onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList); 3638 if (onePortContext == tdsaPortContext_Instance) 3639 { 3640 TI_DBG5(("tdssAddSataToSharedcontext: found; oneportContext ID %d\n", 3641 onePortContext->id)); 3642 found = agTRUE; 3643 break; 3644 } 3645 PortContextList = PortContextList->flink; 3646 } 3647 3648 if (found == agFALSE) 3649 { 3650 TI_DBG1(("tdssAddSataToSharedcontext: No corressponding tdsaPortContext\n")); 3651 return; 3652 } 3653 3654 /* 3655 1. add the devicedata 3656 2. Send Identify Device Data 3657 3. In CB of Identify Device Data (satAddSATAIDDevCB), finds out the devicedata is new or old 3658 */ 3659 3660 3661 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 3662 if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList))) 3663 { 3664 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 3665 TI_DBG1(("tdssAddSataToSharedcontext: ERROR empty DeviceData FreeLink\n")); 3666 /* notifying link up */ 3667 ostiPortEvent ( 3668 tiRoot, 3669 tiPortLinkUp, 3670 tiSuccess, 3671 (void *)tdsaAllShared->Ports[phyID].tiPortalContext 3672 ); 3673 #ifdef INITIATOR_DRIVER 3674 /* triggers discovery */ 3675 ostiPortEvent( 3676 tiRoot, 3677 tiPortDiscoveryReady, 3678 tiSuccess, 3679 (void *) tdsaAllShared->Ports[phyID].tiPortalContext 3680 ); 3681 #endif 3682 return; 3683 } 3684 3685 TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList)); 3686 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 3687 oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList); 3688 TDLIST_DEQUEUE_THIS(&(oneDeviceData->FreeLink)); 3689 3690 TI_DBG1(("tdssAddSataToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id)); 3691 oneDeviceData->InQID = oneDeviceData->id % Indenom; 3692 oneDeviceData->OutQID = oneDeviceData->id % Outdenom; 3693 3694 pSatDevData = (satDeviceData_t *)&(oneDeviceData->satDevData); 3695 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 3696 pSatDevData->satPendingIO = 0; 3697 pSatDevData->satNCQMaxIO = 0; 3698 pSatDevData->satPendingNCQIO = 0; 3699 pSatDevData->satPendingNONNCQIO = 0; 3700 pSatDevData->IDDeviceValid = agFALSE; 3701 pSatDevData->satDeviceType = tdssSATADeviceTypeDecode(onePortContext->remoteSignature); 3702 3703 osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t)); 3704 3705 onePortContext->Count++; 3706 oneDeviceData->DeviceType = TD_SATA_DEVICE; // either TD_SAS_DEVICE or TD_SATA_DEVICE 3707 oneDeviceData->agRoot = agRoot; 3708 // oneDeviceData->agDevHandle = agDevHandle; 3709 3710 // agDevHandle->osData = oneDeviceData; /* TD layer */ 3711 oneDeviceData->tdPortContext = onePortContext; 3712 oneDeviceData->valid = agTRUE; 3713 3714 oneDeviceData->directlyAttached = agTRUE; 3715 oneDeviceData->initiator_ssp_stp_smp = 0; 3716 oneDeviceData->target_ssp_stp_smp = 0x1; /* setting SATA device bit */ 3717 oneDeviceData->phyID = phyID; 3718 3719 /* parse sasIDframe to fill in agDeviceInfo */ 3720 flag = (bit8)((phyID << 4) | TLR); 3721 DEVINFO_PUT_SMPTO(&oneDeviceData->agDeviceInfo, DEFAULT_SMP_TIMEOUT); 3722 DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->agDeviceInfo, (bit16)tdsaAllShared->itNexusTimeout); 3723 DEVINFO_PUT_FBS(&oneDeviceData->agDeviceInfo, 0); 3724 //temp 3725 //DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, 0); 3726 DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, flag); 3727 3728 sasorsata = SATA_DEVICE_TYPE; /* SATA disk */ 3729 connectionRate = onePortContext->LinkRate; 3730 dev_s_rate = (bit8)(dev_s_rate | (sasorsata << 4)); 3731 dev_s_rate = (bit8)(dev_s_rate | connectionRate); 3732 DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->agDeviceInfo, dev_s_rate); 3733 3734 DEVINFO_PUT_SAS_ADDRESSLO( 3735 &oneDeviceData->agDeviceInfo, 3736 0 3737 ); 3738 DEVINFO_PUT_SAS_ADDRESSHI( 3739 &oneDeviceData->agDeviceInfo, 3740 0 3741 ); 3742 3743 if (pSatDevData->satDeviceType == SATA_ATAPI_DEVICE ) 3744 { 3745 oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG; /* ATAPI device flag*/ 3746 } 3747 3748 oneDeviceData->agContext.osData = oneDeviceData; 3749 oneDeviceData->agContext.sdkData = agNULL; 3750 3751 if (oneDeviceData->registered == agFALSE) 3752 { 3753 saRegisterNewDevice( /* tdssAddSATAToSharedcontext */ 3754 agRoot, 3755 &oneDeviceData->agContext, 3756 0,/*tdsaRotateQnumber(tiRoot, oneDeviceData),*/ 3757 &oneDeviceData->agDeviceInfo, 3758 onePortContext->agPortContext, 3759 0 3760 ); 3761 } 3762 return; 3763 } 3764 /***************************************************************************** 3765 *! \brief tdssRetrySATAID 3766 * 3767 * Purpose: This function retries identify device data to directly attached SATA 3768 * device after device registration 3769 * 3770 * \param tiRoot: Pointer to TISA initiator driver/port instance. 3771 * \param oneDeviceData Pointer to a device data 3772 * \Return: none 3773 * 3774 *****************************************************************************/ 3775 osGLOBAL void 3776 tdssRetrySATAID( tiRoot_t *tiRoot, 3777 tdsaDeviceData_t *oneDeviceData 3778 ) 3779 { 3780 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 3781 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 3782 void *osMemHandle; 3783 tdIORequestBody_t *tdIORequestBody; 3784 bit32 PhysUpper32; 3785 bit32 PhysLower32; 3786 bit32 memAllocStatus; 3787 agsaIORequest_t *agIORequest = agNULL; /* identify device data itself */ 3788 satIOContext_t *satIOContext = agNULL; 3789 bit32 status; 3790 3791 TI_DBG5(("tdssRetrySATAID: start\n")); 3792 /* allocate identify device data and sends it */ 3793 /* allocation tdIORequestBody and pass it to satTM() */ 3794 memAllocStatus = ostiAllocMemory( 3795 tiRoot, 3796 &osMemHandle, 3797 (void **)&tdIORequestBody, 3798 &PhysUpper32, 3799 &PhysLower32, 3800 8, 3801 sizeof(tdIORequestBody_t), 3802 agTRUE 3803 ); 3804 3805 if (memAllocStatus != tiSuccess) 3806 { 3807 TI_DBG1(("tdssRetrySATAID: ostiAllocMemory failed... loc 2\n")); 3808 /* notifying link up */ 3809 ostiPortEvent ( 3810 tiRoot, 3811 tiPortLinkUp, 3812 tiSuccess, 3813 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3814 ); 3815 #ifdef INITIATOR_DRIVER 3816 /* triggers discovery */ 3817 ostiPortEvent( 3818 tiRoot, 3819 tiPortDiscoveryReady, 3820 tiSuccess, 3821 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3822 ); 3823 #endif 3824 3825 return; 3826 } 3827 3828 if (tdIORequestBody == agNULL) 3829 { 3830 TI_DBG1(("tdssRetrySATAID: ostiAllocMemory returned NULL tdIORequestBody loc 2\n")); 3831 /* notifying link up */ 3832 ostiPortEvent ( 3833 tiRoot, 3834 tiPortLinkUp, 3835 tiSuccess, 3836 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3837 ); 3838 #ifdef INITIATOR_DRIVER 3839 /* triggers discovery */ 3840 ostiPortEvent( 3841 tiRoot, 3842 tiPortDiscoveryReady, 3843 tiSuccess, 3844 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3845 ); 3846 #endif 3847 3848 return; 3849 } 3850 3851 /* setup identify device data IO structure */ 3852 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle; 3853 tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL; 3854 tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL; 3855 3856 /* initialize tiDevhandle */ 3857 tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle); 3858 tdIORequestBody->tiDevHandle->tdData = oneDeviceData; 3859 3860 /* initialize tiIORequest */ 3861 tdIORequestBody->tiIORequest = agNULL; 3862 3863 /* initialize agIORequest */ 3864 agIORequest = &(tdIORequestBody->agIORequest); 3865 agIORequest->osData = (void *) tdIORequestBody; 3866 agIORequest->sdkData = agNULL; /* SA takes care of this */ 3867 3868 /* set up satIOContext */ 3869 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext); 3870 satIOContext->pSatDevData = &(oneDeviceData->satDevData); 3871 satIOContext->pFis = 3872 &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev); 3873 3874 3875 satIOContext->tiRequestBody = tdIORequestBody; 3876 satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle); 3877 satIOContext->tiScsiXchg = agNULL; 3878 satIOContext->satIntIoContext = agNULL; 3879 satIOContext->satOrgIOContext = agNULL; 3880 3881 /* followings are used only for internal IO */ 3882 satIOContext->currentLBA = 0; 3883 satIOContext->OrgTL = 0; 3884 3885 3886 satIOContext->satToBeAbortedIOContext = agNULL; 3887 3888 satIOContext->NotifyOS = agFALSE; 3889 3890 satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id; 3891 3892 status = satAddSATAStartIDDev(tiRoot, 3893 agNULL, 3894 &(oneDeviceData->tiDeviceHandle), 3895 agNULL, 3896 satIOContext 3897 ); 3898 3899 /* assumption; always new device data */ 3900 3901 3902 if (status == tiSuccess) 3903 { 3904 TI_DBG6(("tdssRetrySATAID: successfully sent identify device data\n")); 3905 TI_DBG6(("tdssRetrySATAID: one case did %d \n", oneDeviceData->id)); 3906 } 3907 else 3908 { 3909 TI_DBG1(("tdssRetrySATAID: failed in sending identify device data\n")); 3910 /* put onedevicedata back to free list */ 3911 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 3912 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList)); 3913 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 3914 /* notifying link up */ 3915 ostiPortEvent ( 3916 tiRoot, 3917 tiPortLinkUp, 3918 tiSuccess, 3919 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3920 ); 3921 #ifdef INITIATOR_DRIVER 3922 /* triggers discovery */ 3923 ostiPortEvent( 3924 tiRoot, 3925 tiPortDiscoveryReady, 3926 tiSuccess, 3927 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3928 ); 3929 #endif 3930 3931 } 3932 3933 return; 3934 } 3935 3936 /***************************************************************************** 3937 *! \brief tdssSubAddSATAToSharedcontext 3938 * 3939 * Purpose: This function sends identify device data to directly attached SATA 3940 * device after device registration 3941 * 3942 * \param tiRoot: Pointer to TISA initiator driver/port instance. 3943 * \param oneDeviceData Pointer to a device data 3944 * \Return: none 3945 * 3946 *****************************************************************************/ 3947 osGLOBAL void 3948 tdssSubAddSATAToSharedcontext( tiRoot_t *tiRoot, 3949 tdsaDeviceData_t *oneDeviceData 3950 ) 3951 { 3952 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 3953 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 3954 void *osMemHandle; 3955 tdIORequestBody_t *tdIORequestBody; 3956 bit32 PhysUpper32; 3957 bit32 PhysLower32; 3958 bit32 memAllocStatus; 3959 agsaIORequest_t *agIORequest = agNULL; /* identify device data itself */ 3960 satIOContext_t *satIOContext = agNULL; 3961 bit32 status; 3962 3963 TI_DBG1(("tdssSubAddSATAToSharedcontext: start\n")); 3964 /* allocate identify device data and sends it */ 3965 /* allocation tdIORequestBody and pass it to satTM() */ 3966 memAllocStatus = ostiAllocMemory( 3967 tiRoot, 3968 &osMemHandle, 3969 (void **)&tdIORequestBody, 3970 &PhysUpper32, 3971 &PhysLower32, 3972 8, 3973 sizeof(tdIORequestBody_t), 3974 agTRUE 3975 ); 3976 3977 if (memAllocStatus != tiSuccess) 3978 { 3979 TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory failed... loc 2\n")); 3980 /* notifying link up */ 3981 ostiPortEvent ( 3982 tiRoot, 3983 tiPortLinkUp, 3984 tiSuccess, 3985 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3986 ); 3987 #ifdef INITIATOR_DRIVER 3988 /* triggers discovery */ 3989 ostiPortEvent( 3990 tiRoot, 3991 tiPortDiscoveryReady, 3992 tiSuccess, 3993 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3994 ); 3995 #endif 3996 3997 return; 3998 } 3999 4000 if (tdIORequestBody == agNULL) 4001 { 4002 TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory returned NULL tdIORequestBody loc 2\n")); 4003 /* notifying link up */ 4004 ostiPortEvent ( 4005 tiRoot, 4006 tiPortLinkUp, 4007 tiSuccess, 4008 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 4009 ); 4010 #ifdef INITIATOR_DRIVER 4011 /* triggers discovery */ 4012 ostiPortEvent( 4013 tiRoot, 4014 tiPortDiscoveryReady, 4015 tiSuccess, 4016 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 4017 ); 4018 #endif 4019 4020 return; 4021 } 4022 4023 /* setup identify device data IO structure */ 4024 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle; 4025 tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL; 4026 tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL; 4027 4028 /* initialize tiDevhandle */ 4029 tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle); 4030 tdIORequestBody->tiDevHandle->tdData = oneDeviceData; 4031 4032 /* initialize tiIORequest */ 4033 tdIORequestBody->tiIORequest = agNULL; 4034 4035 /* initialize agIORequest */ 4036 agIORequest = &(tdIORequestBody->agIORequest); 4037 agIORequest->osData = (void *) tdIORequestBody; 4038 agIORequest->sdkData = agNULL; /* SA takes care of this */ 4039 4040 /* set up satIOContext */ 4041 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext); 4042 satIOContext->pSatDevData = &(oneDeviceData->satDevData); 4043 satIOContext->pFis = 4044 &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev); 4045 4046 4047 satIOContext->tiRequestBody = tdIORequestBody; 4048 satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle); 4049 satIOContext->tiScsiXchg = agNULL; 4050 satIOContext->satIntIoContext = agNULL; 4051 satIOContext->satOrgIOContext = agNULL; 4052 4053 /* followings are used only for internal IO */ 4054 satIOContext->currentLBA = 0; 4055 satIOContext->OrgTL = 0; 4056 4057 4058 satIOContext->satToBeAbortedIOContext = agNULL; 4059 4060 satIOContext->NotifyOS = agFALSE; 4061 4062 satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id; 4063 4064 status = satAddSATAStartIDDev(tiRoot, 4065 agNULL, 4066 &(oneDeviceData->tiDeviceHandle), 4067 agNULL, 4068 satIOContext 4069 ); 4070 4071 /* assumption; always new device data */ 4072 4073 4074 if (status == tiSuccess) 4075 { 4076 TI_DBG6(("tdssSubAddSATAToSharedcontext: successfully sent identify device data\n")); 4077 4078 /* Add the devicedata to the mainlink */ 4079 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 4080 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList)); 4081 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 4082 TI_DBG6(("tdssSubAddSATAToSharedcontext: one case did %d \n", oneDeviceData->id)); 4083 } 4084 else 4085 { 4086 TI_DBG1(("tdssSubAddSATAToSharedcontext: failed in sending identify device data\n")); 4087 /* put onedevicedata back to free list */ 4088 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 4089 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList)); 4090 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 4091 /* notifying link up */ 4092 ostiPortEvent ( 4093 tiRoot, 4094 tiPortLinkUp, 4095 tiSuccess, 4096 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 4097 ); 4098 #ifdef INITIATOR_DRIVER 4099 /* triggers discovery */ 4100 ostiPortEvent( 4101 tiRoot, 4102 tiPortDiscoveryReady, 4103 tiSuccess, 4104 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 4105 ); 4106 #endif 4107 4108 } 4109 4110 return; 4111 } 4112 4113 4114 /***************************************************************************** 4115 *! \brief tdssRemoveSATAFromSharedcontext 4116 * 4117 * Purpose: This function removes a discovered device from a device list of 4118 * a port context 4119 * 4120 * \param tsddPortContext_Ins Pointer to the target port context 4121 * \param tdsaDeviceData_Ins Pointer to the target device 4122 * \param agRoot Pointer to the root data structure of 4123 * TD and Lower layer 4124 4125 * 4126 * \Return: none 4127 * 4128 *****************************************************************************/ 4129 osGLOBAL void 4130 tdssRemoveSATAFromSharedcontext( 4131 tdsaPortContext_t *tdsaPortContext_Ins, 4132 tdsaDeviceData_t *tdsaDeviceData_ins, 4133 agsaRoot_t *agRoot 4134 ) 4135 { 4136 TI_DBG1(("tdssRemoveSATAFromSharedcontex: start\n")); 4137 return; 4138 } 4139 4140 4141 /***************************************************************************** 4142 *! \brief satSetDevInfo 4143 * 4144 * Purpose: Based on ATA identify device data, this functions sets fields of 4145 * device data maintained in TD layer 4146 * 4147 * \param satDevData Pointer to a device data 4148 * \param SATAIdData Pointer to ATA identify device data 4149 * 4150 * 4151 * \Return: none 4152 * 4153 *****************************************************************************/ 4154 void satSetDevInfo( 4155 satDeviceData_t *satDevData, 4156 agsaSATAIdentifyData_t *SATAIdData 4157 ) 4158 { 4159 TI_DBG3(("satSetDevInfo: start\n")); 4160 4161 satDevData->satDriveState = SAT_DEV_STATE_NORMAL; 4162 satDevData->satFormatState = agFALSE; 4163 satDevData->satDeviceFaultState = agFALSE; 4164 satDevData->satTmTaskTag = agNULL; 4165 satDevData->satAbortAfterReset = agFALSE; 4166 satDevData->satAbortCalled = agFALSE; 4167 satDevData->satSectorDone = 0; 4168 4169 /* Qeueu depth, Word 75 */ 4170 satDevData->satNCQMaxIO = SATAIdData->queueDepth + 1; 4171 TI_DBG3(("satSetDevInfo: max queue depth %d\n",satDevData->satNCQMaxIO)); 4172 4173 /* Support NCQ, if Word 76 bit 8 is set */ 4174 if (SATAIdData->sataCapabilities & 0x100) 4175 { 4176 TI_DBG3(("satSetDevInfo: device supports NCQ\n")); 4177 satDevData->satNCQ = agTRUE; 4178 } 4179 else 4180 { 4181 TI_DBG3(("satSetDevInfo: no NCQ\n")); 4182 satDevData->satNCQ = agFALSE; 4183 } 4184 4185 /* Support 48 bit addressing, if Word 83 bit 10 and Word 86 bit 10 are set */ 4186 if ((SATAIdData->commandSetSupported1 & 0x400) && 4187 (SATAIdData->commandSetFeatureEnabled1 & 0x400) ) 4188 { 4189 TI_DBG3(("satSetDevInfo: support 48 bit addressing\n")); 4190 satDevData->sat48BitSupport = agTRUE; 4191 } 4192 else 4193 { 4194 TI_DBG3(("satSetDevInfo: NO 48 bit addressing\n")); 4195 satDevData->sat48BitSupport = agFALSE; 4196 } 4197 4198 /* Support SMART Self Test, word84 bit 1 */ 4199 if (SATAIdData->commandSetFeatureSupportedExt & 0x02) 4200 { 4201 TI_DBG3(("satSetDevInfo: SMART self-test supported \n")); 4202 satDevData->satSMARTSelfTest = agTRUE; 4203 } 4204 else 4205 { 4206 TI_DBG3(("satSetDevInfo: no SMART self-test suppored\n")); 4207 satDevData->satSMARTSelfTest = agFALSE; 4208 } 4209 4210 4211 4212 /* Support SMART feature set, word82 bit 0 */ 4213 if (SATAIdData->commandSetSupported & 0x01) 4214 { 4215 TI_DBG3(("satSetDevInfo: SMART feature set supported \n")); 4216 satDevData->satSMARTFeatureSet = agTRUE; 4217 } 4218 else 4219 { 4220 TI_DBG3(("satSetDevInfo: no SMART feature set suppored\n")); 4221 satDevData->satSMARTFeatureSet = agFALSE; 4222 } 4223 4224 4225 4226 /* Support SMART enabled, word85 bit 0 */ 4227 if (SATAIdData->commandSetFeatureEnabled & 0x01) 4228 { 4229 TI_DBG3(("satSetDevInfo: SMART enabled \n")); 4230 satDevData->satSMARTEnabled = agTRUE; 4231 } 4232 else 4233 { 4234 TI_DBG3(("satSetDevInfo: no SMART enabled\n")); 4235 satDevData->satSMARTEnabled = agFALSE; 4236 } 4237 4238 satDevData->satVerifyState = 0; 4239 4240 /* Removable Media feature set support, word82 bit 2 */ 4241 if (SATAIdData->commandSetSupported & 0x4) 4242 { 4243 TI_DBG3(("satSetDevInfo: Removable Media supported \n")); 4244 satDevData->satRemovableMedia = agTRUE; 4245 } 4246 else 4247 { 4248 TI_DBG3(("satSetDevInfo: no Removable Media suppored\n")); 4249 satDevData->satRemovableMedia = agFALSE; 4250 } 4251 4252 /* Removable Media feature set enabled, word 85, bit 2 */ 4253 if (SATAIdData->commandSetFeatureEnabled & 0x4) 4254 { 4255 TI_DBG3(("satSetDevInfo: Removable Media enabled\n")); 4256 satDevData->satRemovableMediaEnabled = agTRUE; 4257 } 4258 else 4259 { 4260 TI_DBG3(("satSetDevInfo: no Removable Media enabled\n")); 4261 satDevData->satRemovableMediaEnabled = agFALSE; 4262 } 4263 4264 /* DMA Support, word49 bit8 */ 4265 if (SATAIdData->dma_lba_iod_ios_stimer & 0x100) 4266 { 4267 TI_DBG3(("satSetDevInfo: DMA supported \n")); 4268 satDevData->satDMASupport = agTRUE; 4269 } 4270 else 4271 { 4272 TI_DBG3(("satSetDevInfo: no DMA suppored\n")); 4273 satDevData->satDMASupport = agFALSE; 4274 } 4275 4276 /* DMA Enabled, word88 bit0-6, bit8-14*/ 4277 /* 0x7F7F = 0111 1111 0111 1111*/ 4278 if (SATAIdData->ultraDMAModes & 0x7F7F) 4279 { 4280 TI_DBG3(("satSetDevInfo: DMA enabled \n")); 4281 satDevData->satDMAEnabled = agTRUE; 4282 } 4283 else 4284 { 4285 TI_DBG3(("satSetDevInfo: no DMA enabled\n")); 4286 satDevData->satDMAEnabled = agFALSE; 4287 } 4288 4289 /* 4290 setting MaxUserAddrSectors: max user addressable setctors 4291 word60 - 61, should be 0x 0F FF FF FF 4292 */ 4293 satDevData->satMaxUserAddrSectors 4294 = (SATAIdData->numOfUserAddressableSectorsHi << (8*2) ) 4295 + SATAIdData->numOfUserAddressableSectorsLo; 4296 TI_DBG3(("satSetDevInfo: MaxUserAddrSectors 0x%x decimal %d\n", satDevData->satMaxUserAddrSectors, satDevData->satMaxUserAddrSectors)); 4297 /* Support DMADIR, if Word 62 bit 8 is set */ 4298 if (SATAIdData->word62_74[0] & 0x8000) 4299 { 4300 TI_DBG3(("satSetDevInfo: DMADIR enabled\n")); 4301 satDevData->satDMADIRSupport = agTRUE; 4302 } 4303 else 4304 { 4305 TI_DBG3(("satSetDevInfo: DMADIR disabled\n")); 4306 satDevData->satDMADIRSupport = agFALSE; 4307 } 4308 4309 4310 /* write cache enabled for caching mode page SAT Table 67 p69, word85 bit5 */ 4311 if (SATAIdData->commandSetFeatureEnabled & 0x20) 4312 { 4313 TI_DBG3(("satSetDevInfo: write cache enabled\n")); 4314 satDevData->satWriteCacheEnabled = agTRUE; 4315 } 4316 else 4317 { 4318 TI_DBG3(("satSetDevInfo: no write cache enabled\n")); 4319 satDevData->satWriteCacheEnabled = agFALSE; 4320 } 4321 4322 /* look ahead enabled for caching mode page SAT Table 67 p69, word85 bit6 */ 4323 if (SATAIdData->commandSetFeatureEnabled & 0x40) 4324 { 4325 TI_DBG3(("satSetDevInfo: look ahead enabled\n")); 4326 satDevData->satLookAheadEnabled = agTRUE; 4327 } 4328 else 4329 { 4330 TI_DBG3(("satSetDevInfo: no look ahead enabled\n")); 4331 satDevData->satLookAheadEnabled = agFALSE; 4332 } 4333 4334 /* Support WWN, if Word 87 bit 8 is set */ 4335 if (SATAIdData->commandSetFeatureDefault & 0x100) 4336 { 4337 TI_DBG3(("satSetDevInfo: device supports WWN\n")); 4338 satDevData->satWWNSupport = agTRUE; 4339 } 4340 else 4341 { 4342 TI_DBG3(("satSetDevInfo: no WWN\n")); 4343 satDevData->satWWNSupport = agFALSE; 4344 } 4345 4346 4347 return; 4348 } 4349 4350 /***************************************************************************** 4351 *! \brief satInquiryCB 4352 * 4353 * This routine is a callback function for satInquiry() 4354 * 4355 * \param agRoot: Handles for this instance of SAS/SATA hardware 4356 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 4357 * \param agIOStatus: Status of completed I/O. 4358 * \param agFirstDword:Pointer to the four bytes of FIS. 4359 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 4360 * length. 4361 * \param agParam: Additional info based on status. 4362 * \param ioContext: Pointer to satIOContext_t. 4363 * 4364 * \return: none 4365 * 4366 *****************************************************************************/ 4367 void satInquiryCB( 4368 agsaRoot_t *agRoot, 4369 agsaIORequest_t *agIORequest, 4370 bit32 agIOStatus, 4371 agsaFisHeader_t *agFirstDword, 4372 bit32 agIOInfoLen, 4373 void *agParam, 4374 void *ioContext 4375 ) 4376 { 4377 /* 4378 In the process of Inquiry 4379 Process SAT_IDENTIFY_DEVICE 4380 */ 4381 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4382 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4383 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 4384 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 4385 tdIORequestBody_t *tdIORequestBody; 4386 tdIORequestBody_t *tdOrgIORequestBody; 4387 satIOContext_t *satIOContext; 4388 satIOContext_t *satOrgIOContext; 4389 satInternalIo_t *satIntIo; 4390 satDeviceData_t *satDevData; 4391 #ifdef TD_DEBUG_ENABLE 4392 tdsaDeviceData_t *tdsaDeviceData; 4393 bit32 ataStatus = 0; 4394 bit32 ataError; 4395 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL; 4396 #endif 4397 scsiRspSense_t *pSense; 4398 tiIniScsiCmnd_t *scsiCmnd; 4399 tiIORequest_t *tiOrgIORequest; 4400 tiScsiInitiatorRequest_t *tiScsiRequest; /* TD's tiScsiXchg */ 4401 tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* OS's tiScsiXchg */ 4402 agsaSATAIdentifyData_t *pSATAIdData; 4403 bit8 *pInquiry; 4404 bit8 page = 0xFF; 4405 bit16 *tmpptr,tmpptr_tmp; 4406 bit32 x; 4407 bit32 lenReceived; 4408 bit32 lenNeeded = 0; 4409 4410 TI_DBG6(("satInquiryCB: start\n")); 4411 TI_DBG6(("satInquiryCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 4412 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4413 satIOContext = (satIOContext_t *) ioContext; 4414 satIntIo = satIOContext->satIntIoContext; 4415 satDevData = satIOContext->pSatDevData; 4416 #ifdef TD_DEBUG_ENABLE 4417 tdsaDeviceData = (tdsaDeviceData_t *)satDevData->satSaDeviceData; 4418 #endif 4419 tiScsiRequest = satIOContext->tiScsiXchg; 4420 if (satIntIo == agNULL) 4421 { 4422 TI_DBG6(("satInquiryCB: External, OS generated\n")); 4423 pSense = satIOContext->pSense; 4424 scsiCmnd = satIOContext->pScsiCmnd; 4425 satOrgIOContext = satIOContext; 4426 tiOrgIORequest = tdIORequestBody->tiIORequest; 4427 } 4428 else 4429 { 4430 TI_DBG6(("satInquiryCB: Internal, TD generated\n")); 4431 satOrgIOContext = satIOContext->satOrgIOContext; 4432 if (satOrgIOContext == agNULL) 4433 { 4434 TI_DBG1(("satInquiryCB: satOrgIOContext is NULL, wrong\n")); 4435 return; 4436 } 4437 else 4438 { 4439 TI_DBG6(("satInquiryCB: satOrgIOContext is NOT NULL\n")); 4440 } 4441 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 4442 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 4443 pSense = satOrgIOContext->pSense; 4444 scsiCmnd = satOrgIOContext->pScsiCmnd; 4445 } 4446 4447 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg; 4448 pInquiry = (bit8 *) tiOrgScsiRequest->sglVirtualAddr; 4449 4450 tdIORequestBody->ioCompleted = agTRUE; 4451 tdIORequestBody->ioStarted = agFALSE; 4452 4453 TI_DBG3(("satInquiryCB: did %d\n", tdsaDeviceData->id)); 4454 4455 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 4456 { 4457 TI_DBG1(("satInquiryCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 4458 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY) 4459 { 4460 TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n")); 4461 /* should NOT be retried */ 4462 ostiInitiatorIOCompleted ( 4463 tiRoot, 4464 tiOrgIORequest, 4465 tiIOFailed, 4466 tiDetailNoLogin, 4467 agNULL, 4468 satOrgIOContext->interruptContext 4469 ); 4470 } 4471 else 4472 { 4473 TI_DBG1(("satInquiryCB: NOT OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n")); 4474 ostiInitiatorIOCompleted ( 4475 tiRoot, 4476 tiOrgIORequest, 4477 tiIOFailed, 4478 tiDetailNoLogin, 4479 agNULL, 4480 satOrgIOContext->interruptContext 4481 ); 4482 } 4483 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4484 4485 satFreeIntIoResource( tiRoot, 4486 satDevData, 4487 satIntIo); 4488 return; 4489 } 4490 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED || 4491 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION || 4492 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK || 4493 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS || 4494 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION || 4495 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED || 4496 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION || 4497 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR || 4498 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY 4499 ) 4500 { 4501 TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR\n")); 4502 4503 ostiInitiatorIOCompleted ( 4504 tiRoot, 4505 tiOrgIORequest, 4506 tiIOFailed, 4507 tiDetailNoLogin, 4508 agNULL, 4509 satOrgIOContext->interruptContext 4510 ); 4511 4512 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4513 4514 satFreeIntIoResource( tiRoot, 4515 satDevData, 4516 satIntIo); 4517 return; 4518 } 4519 4520 if ( agIOStatus != OSSA_IO_SUCCESS || 4521 (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0) 4522 ) 4523 { 4524 #ifdef TD_DEBUG_ENABLE 4525 // only agsaFisPioSetup_t is expected 4526 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup); 4527 ataStatus = satPIOSetupHeader->status; // ATA Status register 4528 ataError = satPIOSetupHeader->error; // ATA Eror register 4529 #endif 4530 TI_DBG1(("satInquiryCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError)); 4531 /* Process abort case */ 4532 if (agIOStatus == OSSA_IO_ABORTED) 4533 { 4534 satProcessAbort(tiRoot, 4535 tiOrgIORequest, 4536 satOrgIOContext 4537 ); 4538 4539 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4540 4541 satFreeIntIoResource( tiRoot, 4542 satDevData, 4543 satIntIo); 4544 return; 4545 } 4546 4547 ostiInitiatorIOCompleted ( 4548 tiRoot, 4549 tiOrgIORequest, 4550 tiIOFailed, 4551 tiDetailOtherError, 4552 agNULL, 4553 satOrgIOContext->interruptContext 4554 ); 4555 4556 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4557 4558 satFreeIntIoResource( tiRoot, 4559 satDevData, 4560 satIntIo); 4561 return; 4562 } 4563 4564 /* success */ 4565 4566 4567 /* Convert to host endian */ 4568 tmpptr = (bit16*)(tiScsiRequest->sglVirtualAddr); 4569 for (x=0; x < sizeof(agsaSATAIdentifyData_t)/sizeof(bit16); x++) 4570 { 4571 OSSA_READ_LE_16(AGROOT, &tmpptr_tmp, tmpptr, 0); 4572 *tmpptr = tmpptr_tmp; 4573 tmpptr++; 4574 /*Print tmpptr_tmp here for debugging purpose*/ 4575 } 4576 4577 pSATAIdData = (agsaSATAIdentifyData_t *)(tiScsiRequest->sglVirtualAddr); 4578 4579 TI_DBG5(("satInquiryCB: OS satOrgIOContext %p \n", satOrgIOContext)); 4580 TI_DBG5(("satInquiryCB: TD satIOContext %p \n", satIOContext)); 4581 TI_DBG5(("satInquiryCB: OS tiScsiXchg %p \n", satOrgIOContext->tiScsiXchg)); 4582 TI_DBG5(("satInquiryCB: TD tiScsiXchg %p \n", satIOContext->tiScsiXchg)); 4583 4584 /* copy ID Dev data to satDevData */ 4585 satDevData->satIdentifyData = *pSATAIdData; 4586 satDevData->IDDeviceValid = agTRUE; 4587 #ifdef TD_INTERNAL_DEBUG 4588 tdhexdump("satInquiryCB ID Dev data",(bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t)); 4589 tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t)); 4590 #endif 4591 // tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t)); 4592 4593 /* set satDevData fields from IndentifyData */ 4594 satSetDevInfo(satDevData,pSATAIdData); 4595 4596 lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4]; 4597 4598 /* SPC-4, spec 6.4 p 141 */ 4599 /* EVPD bit == 0 */ 4600 if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK)) 4601 { 4602 /* Returns the standard INQUIRY data */ 4603 lenNeeded = STANDARD_INQUIRY_SIZE; 4604 4605 4606 satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd); 4607 //tdhexdump("satInquiryCB ***standard***", (bit8 *)pInquiry, 36); 4608 4609 } 4610 else 4611 { 4612 /* EVPD bit != 0 && PAGE CODE != 0 */ 4613 /* returns the pages of vital product data information */ 4614 4615 /* we must support page 00h, 83h and 89h */ 4616 page = scsiCmnd->cdb[2]; 4617 if ((page != INQUIRY_SUPPORTED_VPD_PAGE) && 4618 (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) && 4619 (page != INQUIRY_ATA_INFORMATION_VPD_PAGE)) 4620 { 4621 satSetSensePayload( pSense, 4622 SCSI_SNSKEY_ILLEGAL_REQUEST, 4623 0, 4624 SCSI_SNSCODE_INVALID_FIELD_IN_CDB, 4625 satOrgIOContext); 4626 4627 ostiInitiatorIOCompleted( tiRoot, 4628 tiOrgIORequest, 4629 tiIOSuccess, 4630 SCSI_STAT_CHECK_CONDITION, 4631 satOrgIOContext->pTiSenseData, 4632 satOrgIOContext->interruptContext ); 4633 4634 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4635 4636 satFreeIntIoResource( tiRoot, 4637 satDevData, 4638 satIntIo); 4639 TI_DBG1(("satInquiryCB: invalid PAGE CODE 0x%x\n", page)); 4640 return; 4641 } 4642 4643 /* checking length */ 4644 switch (page) 4645 { 4646 case INQUIRY_SUPPORTED_VPD_PAGE: 4647 lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */ 4648 break; 4649 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE: 4650 if (satDevData->satWWNSupport) 4651 { 4652 lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */ 4653 } 4654 else 4655 { 4656 lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */ 4657 } 4658 break; 4659 case INQUIRY_ATA_INFORMATION_VPD_PAGE: 4660 lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */ 4661 break; 4662 default: 4663 TI_DBG1(("satInquiryCB: wrong!!! invalid PAGE CODE 0x%x\n", page)); 4664 break; 4665 } 4666 4667 4668 /* 4669 * Fill in the Inquiry data depending on what Inquiry data we are returning. 4670 */ 4671 switch (page) 4672 { 4673 case INQUIRY_SUPPORTED_VPD_PAGE: 4674 satInquiryPage0(pInquiry, pSATAIdData); 4675 break; 4676 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE: 4677 satInquiryPage83(pInquiry, pSATAIdData, satDevData); 4678 break; 4679 case INQUIRY_ATA_INFORMATION_VPD_PAGE: 4680 satInquiryPage89(pInquiry, pSATAIdData, satDevData); 4681 break; 4682 default: 4683 TI_DBG1(("satInquiryCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page)); 4684 break; 4685 } 4686 } /* else */ 4687 4688 TI_DBG6(("satInquiryCB: calling ostiInitiatorIOCompleted\n")); 4689 4690 if (lenReceived > lenNeeded) 4691 { 4692 TI_DBG6(("satInquiryCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n", 4693 lenNeeded, lenReceived, tiOrgIORequest)); 4694 4695 ostiInitiatorIOCompleted( tiRoot, 4696 tiOrgIORequest, 4697 tiIOUnderRun, 4698 lenReceived - lenNeeded, 4699 agNULL, 4700 satOrgIOContext->interruptContext ); 4701 } 4702 else 4703 { 4704 ostiInitiatorIOCompleted( tiRoot, 4705 tiOrgIORequest, 4706 tiIOSuccess, 4707 SCSI_STAT_GOOD, 4708 agNULL, 4709 satOrgIOContext->interruptContext); 4710 } 4711 4712 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4713 4714 satFreeIntIoResource( tiRoot, 4715 satDevData, 4716 satIntIo); 4717 TI_DBG5(("satInquiryCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO)); 4718 TI_DBG6(("satInquiryCB: end\n")); 4719 return; 4720 } 4721 4722 4723 /*****************************************************************************/ 4724 /*! \brief satInquiryIntCB. 4725 * 4726 * This function is part of INQUIRY SAT implementation. This is called when 4727 * ATA identify device data is available. 4728 * 4729 * \param tiRoot: Pointer to TISA initiator driver/port instance. 4730 * \param tiIORequest: Pointer to TISA I/O request context for this I/O. 4731 * \param tiDeviceHandle: Pointer to TISA device handle for this I/O. 4732 * \param tiScsiRequest: Pointer to TISA SCSI I/O request and SGL list. 4733 * \param satIOContext_t: Pointer to the SAT IO Context 4734 * 4735 * \return If command is started successfully 4736 * - \e tiSuccess: I/O request successfully initiated. 4737 * - \e tiBusy: No resources available, try again later. 4738 * - \e tiIONoDevice: Invalid device handle. 4739 * - \e tiError: Other errors. 4740 */ 4741 /*****************************************************************************/ 4742 void satInquiryIntCB( 4743 tiRoot_t *tiRoot, 4744 tiIORequest_t *tiIORequest, 4745 tiDeviceHandle_t *tiDeviceHandle, 4746 tiScsiInitiatorRequest_t *tiScsiRequest, 4747 satIOContext_t *satIOContext 4748 ) 4749 { 4750 scsiRspSense_t *pSense; 4751 tiIniScsiCmnd_t *scsiCmnd; 4752 satDeviceData_t *satDevData; 4753 agsaSATAIdentifyData_t *pSATAIdData; 4754 4755 bit8 *pInquiry; 4756 bit8 page = 0xFF; 4757 bit32 lenReceived; 4758 bit32 lenNeeded = 0; 4759 4760 TI_DBG6(("satInquiryIntCB: start\n")); 4761 4762 pSense = satIOContext->pSense; 4763 scsiCmnd = &tiScsiRequest->scsiCmnd; 4764 pInquiry = (bit8 *) tiScsiRequest->sglVirtualAddr; 4765 satDevData = satIOContext->pSatDevData; 4766 pSATAIdData = &satDevData->satIdentifyData; 4767 4768 4769 lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4]; 4770 4771 /* SPC-4, spec 6.4 p 141 */ 4772 /* EVPD bit == 0 */ 4773 if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK)) 4774 { 4775 /* Returns the standard INQUIRY data */ 4776 lenNeeded = STANDARD_INQUIRY_SIZE; 4777 4778 satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd); 4779 //tdhexdump("satInquiryIntCB ***standard***", (bit8 *)pInquiry, 36); 4780 4781 } 4782 else 4783 { 4784 /* EVPD bit != 0 && PAGE CODE != 0 */ 4785 /* returns the pages of vital product data information */ 4786 4787 /* we must support page 00h, 83h and 89h */ 4788 page = scsiCmnd->cdb[2]; 4789 if ((page != INQUIRY_SUPPORTED_VPD_PAGE) && 4790 (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) && 4791 (page != INQUIRY_ATA_INFORMATION_VPD_PAGE) && 4792 (page != INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE)) 4793 { 4794 satSetSensePayload( pSense, 4795 SCSI_SNSKEY_ILLEGAL_REQUEST, 4796 0, 4797 SCSI_SNSCODE_INVALID_FIELD_IN_CDB, 4798 satIOContext); 4799 4800 ostiInitiatorIOCompleted( tiRoot, 4801 tiIORequest, 4802 tiIOSuccess, 4803 SCSI_STAT_CHECK_CONDITION, 4804 satIOContext->pTiSenseData, 4805 satIOContext->interruptContext ); 4806 4807 TI_DBG1(("satInquiryIntCB: invalid PAGE CODE 0x%x\n", page)); 4808 return; 4809 } 4810 4811 /* checking length */ 4812 switch (page) 4813 { 4814 case INQUIRY_SUPPORTED_VPD_PAGE: 4815 lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */ 4816 break; 4817 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE: 4818 if (satDevData->satWWNSupport) 4819 { 4820 lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */ 4821 } 4822 else 4823 { 4824 lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */ 4825 } 4826 break; 4827 case INQUIRY_ATA_INFORMATION_VPD_PAGE: 4828 lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */ 4829 break; 4830 case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE: 4831 lenNeeded = SATA_PAGE80_INQUIRY_SIZE; /* 24 */ 4832 break; 4833 4834 default: 4835 TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page)); 4836 break; 4837 } 4838 4839 4840 /* 4841 * Fill in the Inquiry data depending on what Inquiry data we are returning. 4842 */ 4843 switch (page) 4844 { 4845 case INQUIRY_SUPPORTED_VPD_PAGE: 4846 satInquiryPage0(pInquiry, pSATAIdData); 4847 break; 4848 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE: 4849 satInquiryPage83(pInquiry, pSATAIdData, satDevData); 4850 break; 4851 case INQUIRY_ATA_INFORMATION_VPD_PAGE: 4852 satInquiryPage89(pInquiry, pSATAIdData, satDevData); 4853 break; 4854 case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE: 4855 satInquiryPage80(pInquiry, pSATAIdData); 4856 break; 4857 default: 4858 TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page)); 4859 break; 4860 } 4861 } /* else */ 4862 4863 TI_DBG6(("satInquiryIntCB: calling ostiInitiatorIOCompleted\n")); 4864 4865 if (lenReceived > lenNeeded) 4866 { 4867 TI_DBG6(("satInquiryIntCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n", 4868 lenNeeded, lenReceived, tiIORequest)); 4869 4870 ostiInitiatorIOCompleted( tiRoot, 4871 tiIORequest, 4872 tiIOUnderRun, 4873 lenReceived - lenNeeded, 4874 agNULL, 4875 satIOContext->interruptContext ); 4876 } 4877 else 4878 { 4879 ostiInitiatorIOCompleted( tiRoot, 4880 tiIORequest, 4881 tiIOSuccess, 4882 SCSI_STAT_GOOD, 4883 agNULL, 4884 satIOContext->interruptContext); 4885 } 4886 4887 TI_DBG5(("satInquiryIntCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO)); 4888 TI_DBG6(("satInquiryIntCB: end\n")); 4889 return; 4890 } 4891 4892 4893 /***************************************************************************** 4894 *! \brief satVerify10CB 4895 * 4896 * This routine is a callback function called from ossaSATACompleted(). 4897 * This CB routine deals with Verify(10) completion. 4898 * 4899 * \param agRoot: Handles for this instance of SAS/SATA hardware 4900 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 4901 * \param agIOStatus: Status of completed I/O. 4902 * \param agFirstDword:Pointer to the four bytes of FIS. 4903 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 4904 * length. 4905 * \param agParam: Additional info based on status. 4906 * \param ioContext: Pointer to satIOContext_t. 4907 * 4908 * \return: none 4909 * 4910 *****************************************************************************/ 4911 void satVerify10CB( 4912 agsaRoot_t *agRoot, 4913 agsaIORequest_t *agIORequest, 4914 bit32 agIOStatus, 4915 agsaFisHeader_t *agFirstDword, 4916 bit32 agIOInfoLen, 4917 void *agParam, 4918 void *ioContext 4919 ) 4920 { 4921 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4922 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4923 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 4924 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 4925 tdIORequestBody_t *tdIORequestBody; 4926 tdIORequestBody_t *tdOrgIORequestBody; 4927 satIOContext_t *satIOContext; 4928 satIOContext_t *satOrgIOContext; 4929 satInternalIo_t *satIntIo; 4930 satDeviceData_t *satDevData; 4931 scsiRspSense_t *pSense; 4932 tiIORequest_t *tiOrgIORequest; 4933 4934 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 4935 bit32 ataStatus = 0; 4936 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 4937 4938 TI_DBG5(("satVerify10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 4939 4940 /* internally generate tiIOContext */ 4941 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4942 satIOContext = (satIOContext_t *) ioContext; 4943 satIntIo = satIOContext->satIntIoContext; 4944 satDevData = satIOContext->pSatDevData; 4945 hostToDevFis = satIOContext->pFis; 4946 4947 if (satIntIo == agNULL) 4948 { 4949 TI_DBG4(("satVerify10CB: External satInternalIo_t satIntIoContext\n")); 4950 satOrgIOContext = satIOContext; 4951 tiOrgIORequest = tdIORequestBody->tiIORequest; 4952 pSense = satIOContext->pSense; 4953 } 4954 else 4955 { 4956 TI_DBG4(("satVerify10CB: Internal satInternalIo_t satIntIoContext\n")); 4957 satOrgIOContext = satIOContext->satOrgIOContext; 4958 if (satOrgIOContext == agNULL) 4959 { 4960 TI_DBG4(("satVerify10CB: satOrgIOContext is NULL, wrong\n")); 4961 return; 4962 } 4963 else 4964 { 4965 TI_DBG4(("satVerify10CB: satOrgIOContext is NOT NULL\n")); 4966 } 4967 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 4968 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 4969 pSense = satOrgIOContext->pSense; 4970 } 4971 4972 tdIORequestBody->ioCompleted = agTRUE; 4973 tdIORequestBody->ioStarted = agFALSE; 4974 4975 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 4976 { 4977 TI_DBG1(("satVerify10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 4978 satSetSensePayload( pSense, 4979 SCSI_SNSKEY_NO_SENSE, 4980 0, 4981 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 4982 satOrgIOContext); 4983 4984 ostiInitiatorIOCompleted( tiRoot, 4985 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 4986 tiIOSuccess, 4987 SCSI_STAT_CHECK_CONDITION, 4988 satOrgIOContext->pTiSenseData, 4989 satOrgIOContext->interruptContext ); 4990 4991 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4992 4993 satFreeIntIoResource( tiRoot, 4994 satDevData, 4995 satIntIo); 4996 return; 4997 } 4998 4999 if (agIOStatus != OSSA_IO_SUCCESS) 5000 { 5001 /* only agsaFisRegDeviceToHost_t is expected */ 5002 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 5003 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 5004 } 5005 5006 if( agIOStatus != OSSA_IO_SUCCESS) 5007 { 5008 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 5009 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 5010 ) 5011 { 5012 /* for debugging */ 5013 if( agIOStatus != OSSA_IO_SUCCESS) 5014 { 5015 TI_DBG1(("satVerify10CB: FAILED, NOT IO_SUCCESS\n")); 5016 } 5017 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 5018 { 5019 TI_DBG1(("satVerify10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 5020 } 5021 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 5022 (ataStatus & DF_ATA_STATUS_MASK) 5023 ) 5024 { 5025 TI_DBG1(("satVerify10CB: FAILED, FAILED, error status\n")); 5026 } 5027 5028 /* Process abort case */ 5029 if (agIOStatus == OSSA_IO_ABORTED) 5030 { 5031 satProcessAbort(tiRoot, 5032 tiOrgIORequest, 5033 satOrgIOContext 5034 ); 5035 5036 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5037 5038 satFreeIntIoResource( tiRoot, 5039 satDevData, 5040 satIntIo); 5041 return; 5042 } 5043 5044 /* for debugging */ 5045 switch (hostToDevFis->h.command) 5046 { 5047 case SAT_READ_VERIFY_SECTORS_EXT: 5048 TI_DBG1(("satVerify10CB: SAT_READ_VERIFY_SECTORS_EXT\n")); 5049 break; 5050 default: 5051 TI_DBG1(("satVerify10CB: error default case command 0x%x\n", hostToDevFis->h.command)); 5052 break; 5053 } 5054 5055 satSetSensePayload( pSense, 5056 SCSI_SNSKEY_NO_SENSE, 5057 0, 5058 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5059 satOrgIOContext); 5060 5061 ostiInitiatorIOCompleted( tiRoot, 5062 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5063 tiIOSuccess, 5064 SCSI_STAT_CHECK_CONDITION, 5065 satOrgIOContext->pTiSenseData, 5066 satOrgIOContext->interruptContext ); 5067 5068 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5069 5070 satFreeIntIoResource( tiRoot, 5071 satDevData, 5072 satIntIo); 5073 return; 5074 } /* end error checking */ 5075 } 5076 5077 /* process success from this point on */ 5078 switch (hostToDevFis->h.command) 5079 { 5080 case SAT_READ_VERIFY_SECTORS_EXT: 5081 TI_DBG5(("satVerify10CB: SAT_WRITE_DMA_EXT success \n")); 5082 5083 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5084 5085 satFreeIntIoResource( tiRoot, 5086 satDevData, 5087 satIntIo); 5088 5089 ostiInitiatorIOCompleted( tiRoot, 5090 tiOrgIORequest, 5091 tiIOSuccess, 5092 SCSI_STAT_GOOD, 5093 agNULL, 5094 satOrgIOContext->interruptContext); 5095 break; 5096 default: 5097 TI_DBG1(("satVerify10CB: success but error default case command 0x%x\n", hostToDevFis->h.command)); 5098 5099 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5100 5101 satFreeIntIoResource( tiRoot, 5102 satDevData, 5103 satIntIo); 5104 5105 satSetSensePayload( pSense, 5106 SCSI_SNSKEY_NO_SENSE, 5107 0, 5108 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5109 satOrgIOContext); 5110 5111 ostiInitiatorIOCompleted( tiRoot, 5112 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5113 tiIOSuccess, 5114 SCSI_STAT_CHECK_CONDITION, 5115 satOrgIOContext->pTiSenseData, 5116 satOrgIOContext->interruptContext ); 5117 5118 break; 5119 } 5120 5121 return; 5122 } 5123 5124 /* similar to satVerify10CB */ 5125 void satNonChainedVerifyCB( 5126 agsaRoot_t *agRoot, 5127 agsaIORequest_t *agIORequest, 5128 bit32 agIOStatus, 5129 agsaFisHeader_t *agFirstDword, 5130 bit32 agIOInfoLen, 5131 agsaFrameHandle_t agFrameHandle, 5132 void *ioContext 5133 ) 5134 { 5135 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5136 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5137 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 5138 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 5139 tdIORequestBody_t *tdIORequestBody; 5140 tdIORequestBody_t *tdOrgIORequestBody; 5141 satIOContext_t *satIOContext; 5142 satIOContext_t *satOrgIOContext; 5143 satInternalIo_t *satIntIo; 5144 satDeviceData_t *satDevData; 5145 scsiRspSense_t *pSense; 5146 tiIORequest_t *tiOrgIORequest; 5147 5148 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 5149 bit32 ataStatus = 0; 5150 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 5151 5152 TI_DBG5(("satNonChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 5153 5154 /* internally generate tiIOContext */ 5155 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5156 satIOContext = (satIOContext_t *) ioContext; 5157 satIntIo = satIOContext->satIntIoContext; 5158 satDevData = satIOContext->pSatDevData; 5159 hostToDevFis = satIOContext->pFis; 5160 5161 if (satIntIo == agNULL) 5162 { 5163 TI_DBG4(("satNonChainedVerifyCB: External satInternalIo_t satIntIoContext\n")); 5164 satOrgIOContext = satIOContext; 5165 tiOrgIORequest = tdIORequestBody->tiIORequest; 5166 pSense = satIOContext->pSense; 5167 } 5168 else 5169 { 5170 TI_DBG4(("satNonChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n")); 5171 satOrgIOContext = satIOContext->satOrgIOContext; 5172 if (satOrgIOContext == agNULL) 5173 { 5174 TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NULL, wrong\n")); 5175 return; 5176 } 5177 else 5178 { 5179 TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NOT NULL\n")); 5180 } 5181 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 5182 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 5183 pSense = satOrgIOContext->pSense; 5184 } 5185 5186 tdIORequestBody->ioCompleted = agTRUE; 5187 tdIORequestBody->ioStarted = agFALSE; 5188 5189 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 5190 { 5191 TI_DBG1(("satNonChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 5192 satSetSensePayload( pSense, 5193 SCSI_SNSKEY_NO_SENSE, 5194 0, 5195 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5196 satOrgIOContext); 5197 5198 ostiInitiatorIOCompleted( tiRoot, 5199 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5200 tiIOSuccess, 5201 SCSI_STAT_CHECK_CONDITION, 5202 satOrgIOContext->pTiSenseData, 5203 satOrgIOContext->interruptContext ); 5204 5205 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5206 5207 satFreeIntIoResource( tiRoot, 5208 satDevData, 5209 satIntIo); 5210 return; 5211 } 5212 5213 if (agIOStatus != OSSA_IO_SUCCESS) 5214 { 5215 /* only agsaFisRegDeviceToHost_t is expected */ 5216 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 5217 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 5218 } 5219 5220 if( agIOStatus != OSSA_IO_SUCCESS) 5221 { 5222 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 5223 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 5224 ) 5225 { 5226 /* for debugging */ 5227 if( agIOStatus != OSSA_IO_SUCCESS) 5228 { 5229 TI_DBG1(("satNonChainedVerifyCB: FAILED, NOT IO_SUCCESS\n")); 5230 } 5231 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 5232 { 5233 TI_DBG1(("satNonChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 5234 } 5235 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 5236 (ataStatus & DF_ATA_STATUS_MASK) 5237 ) 5238 { 5239 TI_DBG1(("satNonChainedVerifyCB: FAILED, FAILED, error status\n")); 5240 } 5241 5242 /* Process abort case */ 5243 if (agIOStatus == OSSA_IO_ABORTED) 5244 { 5245 satProcessAbort(tiRoot, 5246 tiOrgIORequest, 5247 satOrgIOContext 5248 ); 5249 5250 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5251 5252 satFreeIntIoResource( tiRoot, 5253 satDevData, 5254 satIntIo); 5255 return; 5256 } 5257 5258 /* for debugging */ 5259 switch (hostToDevFis->h.command) 5260 { 5261 case SAT_READ_VERIFY_SECTORS: 5262 TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n")); 5263 break; 5264 case SAT_READ_VERIFY_SECTORS_EXT: 5265 TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n")); 5266 break; 5267 default: 5268 TI_DBG1(("satNonChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command)); 5269 break; 5270 } 5271 5272 satSetSensePayload( pSense, 5273 SCSI_SNSKEY_NO_SENSE, 5274 0, 5275 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5276 satOrgIOContext); 5277 5278 ostiInitiatorIOCompleted( tiRoot, 5279 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5280 tiIOSuccess, 5281 SCSI_STAT_CHECK_CONDITION, 5282 satOrgIOContext->pTiSenseData, 5283 satOrgIOContext->interruptContext ); 5284 5285 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5286 5287 satFreeIntIoResource( tiRoot, 5288 satDevData, 5289 satIntIo); 5290 return; 5291 } /* end error checking */ 5292 } 5293 5294 /* process success from this point on */ 5295 switch (hostToDevFis->h.command) 5296 { 5297 case SAT_READ_VERIFY_SECTORS: /* fall through */ 5298 case SAT_READ_VERIFY_SECTORS_EXT: 5299 TI_DBG5(("satNonChainedVerifyCB: SAT_WRITE_DMA_EXT success \n")); 5300 5301 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5302 5303 satFreeIntIoResource( tiRoot, 5304 satDevData, 5305 satIntIo); 5306 5307 ostiInitiatorIOCompleted( tiRoot, 5308 tiOrgIORequest, 5309 tiIOSuccess, 5310 SCSI_STAT_GOOD, 5311 agNULL, 5312 satOrgIOContext->interruptContext); 5313 break; 5314 default: 5315 TI_DBG1(("satNonChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command)); 5316 5317 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5318 5319 satFreeIntIoResource( tiRoot, 5320 satDevData, 5321 satIntIo); 5322 5323 satSetSensePayload( pSense, 5324 SCSI_SNSKEY_NO_SENSE, 5325 0, 5326 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5327 satOrgIOContext); 5328 5329 ostiInitiatorIOCompleted( tiRoot, 5330 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5331 tiIOSuccess, 5332 SCSI_STAT_CHECK_CONDITION, 5333 satOrgIOContext->pTiSenseData, 5334 satOrgIOContext->interruptContext ); 5335 5336 break; 5337 } 5338 5339 return; 5340 } 5341 5342 void satChainedVerifyCB( 5343 agsaRoot_t *agRoot, 5344 agsaIORequest_t *agIORequest, 5345 bit32 agIOStatus, 5346 agsaFisHeader_t *agFirstDword, 5347 bit32 agIOInfoLen, 5348 agsaFrameHandle_t agFrameHandle, 5349 void *ioContext 5350 ) 5351 { 5352 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5353 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5354 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 5355 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 5356 tdIORequestBody_t *tdIORequestBody; 5357 tdIORequestBody_t *tdOrgIORequestBody; 5358 satIOContext_t *satIOContext; 5359 satIOContext_t *satOrgIOContext; 5360 satIOContext_t *satNewIOContext; 5361 satInternalIo_t *satIntIo; 5362 satInternalIo_t *satNewIntIo = agNULL; 5363 satDeviceData_t *satDevData; 5364 scsiRspSense_t *pSense; 5365 tiIniScsiCmnd_t *scsiCmnd; 5366 tiIORequest_t *tiOrgIORequest; 5367 5368 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 5369 bit32 ataStatus = 0; 5370 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 5371 bit32 status = tiError; 5372 bit32 dataLength; 5373 5374 TI_DBG5(("satChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 5375 5376 /* internally generate tiIOContext */ 5377 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5378 satIOContext = (satIOContext_t *) ioContext; 5379 satIntIo = satIOContext->satIntIoContext; 5380 satDevData = satIOContext->pSatDevData; 5381 hostToDevFis = satIOContext->pFis; 5382 5383 if (satIntIo == agNULL) 5384 { 5385 TI_DBG4(("satChainedVerifyCB: External satInternalIo_t satIntIoContext\n")); 5386 satOrgIOContext = satIOContext; 5387 tiOrgIORequest = tdIORequestBody->tiIORequest; 5388 pSense = satIOContext->pSense; 5389 scsiCmnd = satIOContext->pScsiCmnd; 5390 } 5391 else 5392 { 5393 TI_DBG4(("satChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n")); 5394 satOrgIOContext = satIOContext->satOrgIOContext; 5395 if (satOrgIOContext == agNULL) 5396 { 5397 TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NULL, wrong\n")); 5398 return; 5399 } 5400 else 5401 { 5402 TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NOT NULL\n")); 5403 } 5404 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 5405 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 5406 pSense = satOrgIOContext->pSense; 5407 scsiCmnd = satOrgIOContext->pScsiCmnd; 5408 } 5409 5410 tdIORequestBody->ioCompleted = agTRUE; 5411 tdIORequestBody->ioStarted = agFALSE; 5412 5413 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 5414 { 5415 TI_DBG1(("satChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 5416 satSetSensePayload( pSense, 5417 SCSI_SNSKEY_NO_SENSE, 5418 0, 5419 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5420 satOrgIOContext); 5421 5422 ostiInitiatorIOCompleted( tiRoot, 5423 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5424 tiIOSuccess, 5425 SCSI_STAT_CHECK_CONDITION, 5426 satOrgIOContext->pTiSenseData, 5427 satOrgIOContext->interruptContext ); 5428 5429 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5430 5431 satFreeIntIoResource( tiRoot, 5432 satDevData, 5433 satIntIo); 5434 return; 5435 } 5436 5437 if (agIOStatus != OSSA_IO_SUCCESS) 5438 { 5439 /* only agsaFisRegDeviceToHost_t is expected */ 5440 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 5441 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 5442 } 5443 5444 if( agIOStatus != OSSA_IO_SUCCESS) 5445 { 5446 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 5447 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 5448 ) 5449 { 5450 /* for debugging */ 5451 if( agIOStatus != OSSA_IO_SUCCESS) 5452 { 5453 TI_DBG1(("satChainedVerifyCB: FAILED, NOT IO_SUCCESS\n")); 5454 } 5455 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 5456 { 5457 TI_DBG1(("satChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 5458 } 5459 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 5460 (ataStatus & DF_ATA_STATUS_MASK) 5461 ) 5462 { 5463 TI_DBG1(("satChainedVerifyCB: FAILED, FAILED, error status\n")); 5464 } 5465 5466 /* Process abort case */ 5467 if (agIOStatus == OSSA_IO_ABORTED) 5468 { 5469 satProcessAbort(tiRoot, 5470 tiOrgIORequest, 5471 satOrgIOContext 5472 ); 5473 5474 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5475 5476 satFreeIntIoResource( tiRoot, 5477 satDevData, 5478 satIntIo); 5479 return; 5480 } 5481 5482 /* for debugging */ 5483 switch (hostToDevFis->h.command) 5484 { 5485 case SAT_READ_VERIFY_SECTORS: 5486 TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n")); 5487 break; 5488 case SAT_READ_VERIFY_SECTORS_EXT: 5489 TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n")); 5490 break; 5491 default: 5492 TI_DBG1(("satChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command)); 5493 break; 5494 } 5495 5496 satSetSensePayload( pSense, 5497 SCSI_SNSKEY_NO_SENSE, 5498 0, 5499 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5500 satOrgIOContext); 5501 5502 ostiInitiatorIOCompleted( tiRoot, 5503 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5504 tiIOSuccess, 5505 SCSI_STAT_CHECK_CONDITION, 5506 satOrgIOContext->pTiSenseData, 5507 satOrgIOContext->interruptContext ); 5508 5509 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5510 5511 satFreeIntIoResource( tiRoot, 5512 satDevData, 5513 satIntIo); 5514 return; 5515 } /* end error checking */ 5516 } 5517 5518 /* process success from this point on */ 5519 switch (hostToDevFis->h.command) 5520 { 5521 case SAT_READ_VERIFY_SECTORS: /* fall through */ 5522 case SAT_READ_VERIFY_SECTORS_EXT: 5523 TI_DBG5(("satChainedVerifyCB: SAT_WRITE_DMA_EXT success \n")); 5524 5525 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5526 5527 satFreeIntIoResource( tiRoot, 5528 satDevData, 5529 satIntIo); 5530 5531 /* let's loop till TL */ 5532 5533 /* lba = lba + tl 5534 loopnum--; 5535 if (loopnum == 0) done 5536 */ 5537 (satOrgIOContext->LoopNum)--; 5538 if (satOrgIOContext->LoopNum == 0) 5539 { 5540 /* 5541 done with write and verify 5542 */ 5543 ostiInitiatorIOCompleted( tiRoot, 5544 5545 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5546 tiIOSuccess, 5547 SCSI_STAT_GOOD, 5548 agNULL, 5549 satOrgIOContext->interruptContext ); 5550 return; 5551 } 5552 5553 if (satOrgIOContext->superIOFlag) 5554 { 5555 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 5556 } 5557 else 5558 { 5559 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 5560 } 5561 5562 satNewIntIo = satAllocIntIoResource( tiRoot, 5563 tiOrgIORequest, 5564 satDevData, 5565 dataLength, 5566 satNewIntIo); 5567 if (satNewIntIo == agNULL) 5568 { 5569 /* memory allocation failure */ 5570 satFreeIntIoResource( tiRoot, 5571 satDevData, 5572 satNewIntIo); 5573 ostiInitiatorIOCompleted( tiRoot, 5574 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5575 tiIOFailed, 5576 tiDetailOtherError, 5577 agNULL, 5578 satOrgIOContext->interruptContext ); 5579 5580 TI_DBG1(("satChainedVerifyCB: momory allocation fails\n")); 5581 return; 5582 } /* end of memory allocation failure */ 5583 5584 /* 5585 * Need to initialize all the fields within satIOContext 5586 */ 5587 5588 satNewIOContext = satPrepareNewIO( 5589 satNewIntIo, 5590 tiOrgIORequest, 5591 satDevData, 5592 scsiCmnd, 5593 satOrgIOContext 5594 ); 5595 status = satChainedVerify(tiRoot, 5596 &satNewIntIo->satIntTiIORequest, 5597 satNewIOContext->ptiDeviceHandle, 5598 &satNewIntIo->satIntTiScsiXchg, 5599 satNewIOContext); 5600 5601 if (status != tiSuccess) 5602 { 5603 satFreeIntIoResource( tiRoot, 5604 satDevData, 5605 satNewIntIo); 5606 ostiInitiatorIOCompleted( tiRoot, 5607 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5608 tiIOFailed, 5609 tiDetailOtherError, 5610 agNULL, 5611 satOrgIOContext->interruptContext ); 5612 TI_DBG1(("satChainedVerifyCB: calling satChainedVerify fails\n")); 5613 return; 5614 } 5615 5616 break; 5617 default: 5618 TI_DBG1(("satChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command)); 5619 5620 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5621 5622 satFreeIntIoResource( tiRoot, 5623 satDevData, 5624 satIntIo); 5625 5626 satSetSensePayload( pSense, 5627 SCSI_SNSKEY_NO_SENSE, 5628 0, 5629 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5630 satOrgIOContext); 5631 5632 ostiInitiatorIOCompleted( tiRoot, 5633 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5634 tiIOSuccess, 5635 SCSI_STAT_CHECK_CONDITION, 5636 satOrgIOContext->pTiSenseData, 5637 satOrgIOContext->interruptContext ); 5638 5639 break; 5640 } 5641 return; 5642 } 5643 5644 /***************************************************************************** 5645 *! \brief satTestUnitReadyCB 5646 * 5647 * This routine is a callback function for satTestUnitReady() 5648 * 5649 * \param agRoot: Handles for this instance of SAS/SATA hardware 5650 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 5651 * \param agIOStatus: Status of completed I/O. 5652 * \param agFirstDword:Pointer to the four bytes of FIS. 5653 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 5654 * length. 5655 * \param agParam: Additional info based on status. 5656 * \param ioContext: Pointer to satIOContext_t. 5657 * 5658 * \return: none 5659 * 5660 *****************************************************************************/ 5661 void satTestUnitReadyCB( 5662 agsaRoot_t *agRoot, 5663 agsaIORequest_t *agIORequest, 5664 bit32 agIOStatus, 5665 agsaFisHeader_t *agFirstDword, 5666 bit32 agIOInfoLen, 5667 void *agParam, 5668 void *ioContext 5669 ) 5670 { 5671 /* 5672 In the process of TestUnitReady 5673 Process SAT_GET_MEDIA_STATUS 5674 Process SAT_CHECK_POWER_MODE 5675 */ 5676 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5677 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5678 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 5679 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 5680 tdIORequestBody_t *tdIORequestBody; 5681 tdIORequestBody_t *tdOrgIORequestBody; 5682 satIOContext_t *satIOContext; 5683 satIOContext_t *satOrgIOContext; 5684 satIOContext_t *satNewIOContext; 5685 satInternalIo_t *satIntIo; 5686 satInternalIo_t *satNewIntIo = agNULL; 5687 satDeviceData_t *satDevData; 5688 scsiRspSense_t *pSense; 5689 tiIniScsiCmnd_t *scsiCmnd; 5690 tiIORequest_t *tiOrgIORequest; 5691 5692 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 5693 bit32 ataStatus = 0; 5694 bit32 ataError; 5695 5696 bit32 status; 5697 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 5698 5699 TI_DBG6(("satTestUnitReadyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 5700 5701 /* internally generate tiIOContext */ 5702 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5703 satIOContext = (satIOContext_t *) ioContext; 5704 satIntIo = satIOContext->satIntIoContext; 5705 satDevData = satIOContext->pSatDevData; 5706 hostToDevFis = satIOContext->pFis; 5707 5708 if (satIntIo == agNULL) 5709 { 5710 TI_DBG5(("satTestUnitReadyCB: no internal satInternalIo_t satIntIoContext\n")); 5711 pSense = satIOContext->pSense; 5712 scsiCmnd = satIOContext->pScsiCmnd; 5713 satOrgIOContext = satIOContext; 5714 tiOrgIORequest = tdIORequestBody->tiIORequest; 5715 } 5716 else 5717 { 5718 TI_DBG5(("satTestUnitReadyCB: yes internal satInternalIo_t satIntIoContext\n")); 5719 5720 /* orginal tiIOContext */ 5721 tiOrgIORequest = (tiIORequest_t *)satIOContext->satIntIoContext->satOrgTiIORequest; 5722 tdOrgIORequestBody = (tdIORequestBody_t *)tiOrgIORequest->tdData; 5723 satOrgIOContext = &(tdOrgIORequestBody->transport.SATA.satIOContext); 5724 5725 pSense = satOrgIOContext->pSense; 5726 scsiCmnd = satOrgIOContext->pScsiCmnd; 5727 } 5728 5729 tdIORequestBody->ioCompleted = agTRUE; 5730 tdIORequestBody->ioStarted = agFALSE; 5731 5732 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 5733 { 5734 TI_DBG1(("satTestUnitReadyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 5735 satSetSensePayload( pSense, 5736 SCSI_SNSKEY_NOT_READY, 5737 0, 5738 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5739 satOrgIOContext); 5740 5741 ostiInitiatorIOCompleted( tiRoot, 5742 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5743 tiIOSuccess, 5744 SCSI_STAT_CHECK_CONDITION, 5745 satOrgIOContext->pTiSenseData, 5746 satOrgIOContext->interruptContext ); 5747 5748 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5749 5750 satFreeIntIoResource( tiRoot, 5751 satDevData, 5752 satIntIo); 5753 5754 return; 5755 } 5756 /* 5757 HW checks an error for us and the results is agIOStatus 5758 */ 5759 if (agIOStatus != OSSA_IO_SUCCESS) 5760 { 5761 /* only agsaFisRegDeviceToHost_t is expected */ 5762 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 5763 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 5764 ataError = statDevToHostFisHeader->error; /* ATA Eror register */ 5765 5766 if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 5767 { 5768 TI_DBG1(("satTestUnitReadyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 5769 } 5770 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 5771 (ataStatus & DF_ATA_STATUS_MASK) 5772 ) 5773 { 5774 TI_DBG1(("satTestUnitReadyCB: FAILED, FAILED, error status\n")); 5775 } 5776 5777 /* Process abort case */ 5778 if (agIOStatus == OSSA_IO_ABORTED) 5779 { 5780 satProcessAbort(tiRoot, 5781 tiOrgIORequest, 5782 satOrgIOContext 5783 ); 5784 5785 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5786 5787 satFreeIntIoResource( tiRoot, 5788 satDevData, 5789 satIntIo); 5790 return; 5791 } 5792 5793 switch (hostToDevFis->h.command) 5794 { 5795 case SAT_GET_MEDIA_STATUS: 5796 TI_DBG1(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS failed \n")); 5797 5798 /* checking NM bit */ 5799 if (ataError & SCSI_NM_MASK) 5800 { 5801 satSetSensePayload( pSense, 5802 SCSI_SNSKEY_NOT_READY, 5803 0, 5804 SCSI_SNSCODE_MEDIUM_NOT_PRESENT, 5805 satOrgIOContext); 5806 } 5807 else 5808 { 5809 satSetSensePayload( pSense, 5810 SCSI_SNSKEY_NOT_READY, 5811 0, 5812 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5813 satOrgIOContext); 5814 } 5815 5816 ostiInitiatorIOCompleted( tiRoot, 5817 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5818 tiIOSuccess, 5819 SCSI_STAT_CHECK_CONDITION, 5820 satOrgIOContext->pTiSenseData, 5821 satOrgIOContext->interruptContext ); 5822 5823 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5824 5825 satFreeIntIoResource( tiRoot, 5826 satDevData, 5827 satIntIo); 5828 break; 5829 case SAT_CHECK_POWER_MODE: 5830 TI_DBG1(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE failed \n")); 5831 satSetSensePayload( pSense, 5832 SCSI_SNSKEY_NOT_READY, 5833 0, 5834 SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION, 5835 satOrgIOContext); 5836 5837 ostiInitiatorIOCompleted( tiRoot, 5838 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5839 tiIOSuccess, 5840 SCSI_STAT_CHECK_CONDITION, 5841 satOrgIOContext->pTiSenseData, 5842 satOrgIOContext->interruptContext ); 5843 5844 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5845 5846 satFreeIntIoResource( tiRoot, 5847 satDevData, 5848 satIntIo); 5849 break; 5850 default: 5851 TI_DBG1(("satTestUnitReadyCB: default failed command %d\n", hostToDevFis->h.command)); 5852 5853 satSetSensePayload( pSense, 5854 SCSI_SNSKEY_NOT_READY, 5855 0, 5856 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5857 satOrgIOContext); 5858 5859 ostiInitiatorIOCompleted( tiRoot, 5860 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5861 tiIOSuccess, 5862 SCSI_STAT_CHECK_CONDITION, 5863 satOrgIOContext->pTiSenseData, 5864 satOrgIOContext->interruptContext ); 5865 5866 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5867 5868 satFreeIntIoResource( tiRoot, 5869 satDevData, 5870 satIntIo); 5871 break; 5872 5873 } 5874 return; 5875 }/* end error */ 5876 5877 /* ATA command completes sucessfully */ 5878 switch (hostToDevFis->h.command) 5879 { 5880 case SAT_GET_MEDIA_STATUS: 5881 5882 TI_DBG5(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS success\n")); 5883 5884 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5885 5886 satFreeIntIoResource( tiRoot, 5887 satDevData, 5888 satIntIo); 5889 5890 satNewIntIo = satAllocIntIoResource( tiRoot, 5891 tiOrgIORequest, 5892 satDevData, 5893 0, 5894 satNewIntIo); 5895 if (satNewIntIo == agNULL) 5896 { 5897 /* memory allocation failure */ 5898 satFreeIntIoResource( tiRoot, 5899 satDevData, 5900 satNewIntIo); 5901 satSetSensePayload( pSense, 5902 SCSI_SNSKEY_NOT_READY, 5903 0, 5904 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5905 satOrgIOContext); 5906 5907 ostiInitiatorIOCompleted( tiRoot, 5908 tiOrgIORequest, 5909 tiIOSuccess, 5910 SCSI_STAT_CHECK_CONDITION, 5911 satOrgIOContext->pTiSenseData, 5912 satOrgIOContext->interruptContext ); 5913 5914 TI_DBG1(("satTestUnitReadyCB: momory allocation fails\n")); 5915 return; 5916 } 5917 5918 /* 5919 * Need to initialize all the fields within satIOContext 5920 */ 5921 5922 satNewIOContext = satPrepareNewIO( 5923 satNewIntIo, 5924 tiOrgIORequest, 5925 satDevData, 5926 scsiCmnd, 5927 satOrgIOContext 5928 ); 5929 5930 /* sends SAT_CHECK_POWER_MODE */ 5931 status = satTestUnitReady_1( tiRoot, 5932 &satNewIntIo->satIntTiIORequest, 5933 satNewIOContext->ptiDeviceHandle, 5934 &satNewIntIo->satIntTiScsiXchg, 5935 satNewIOContext); 5936 5937 if (status != tiSuccess) 5938 { 5939 /* sending SAT_CHECK_POWER_MODE fails */ 5940 satFreeIntIoResource( tiRoot, 5941 satDevData, 5942 satNewIntIo); 5943 satSetSensePayload( pSense, 5944 SCSI_SNSKEY_NOT_READY, 5945 0, 5946 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5947 satOrgIOContext); 5948 5949 ostiInitiatorIOCompleted( tiRoot, 5950 tiOrgIORequest, 5951 tiIOSuccess, 5952 SCSI_STAT_CHECK_CONDITION, 5953 satOrgIOContext->pTiSenseData, 5954 satOrgIOContext->interruptContext ); 5955 5956 TI_DBG1(("satTestUnitReadyCB: calling satTestUnitReady_1 fails\n")); 5957 return; 5958 } 5959 5960 break; 5961 case SAT_CHECK_POWER_MODE: 5962 TI_DBG5(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE success\n")); 5963 5964 5965 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5966 5967 satFreeIntIoResource( tiRoot, 5968 satDevData, 5969 satIntIo); 5970 5971 /* returns good status */ 5972 ostiInitiatorIOCompleted( tiRoot, 5973 tiOrgIORequest, 5974 tiIOSuccess, 5975 SCSI_STAT_GOOD, 5976 agNULL, 5977 satOrgIOContext->interruptContext ); 5978 5979 break; 5980 default: 5981 TI_DBG1(("satTestUnitReadyCB: default success command %d\n", hostToDevFis->h.command)); 5982 satSetSensePayload( pSense, 5983 SCSI_SNSKEY_NOT_READY, 5984 0, 5985 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5986 satOrgIOContext); 5987 5988 ostiInitiatorIOCompleted( tiRoot, 5989 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5990 tiIOSuccess, 5991 SCSI_STAT_CHECK_CONDITION, 5992 satOrgIOContext->pTiSenseData, 5993 satOrgIOContext->interruptContext ); 5994 5995 5996 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5997 5998 satFreeIntIoResource( tiRoot, 5999 satDevData, 6000 satIntIo); 6001 break; 6002 } 6003 6004 return; 6005 } 6006 6007 /***************************************************************************** 6008 *! \brief satWriteSame10CB 6009 * 6010 * This routine is a callback function for satWriteSame10() 6011 * 6012 * \param agRoot: Handles for this instance of SAS/SATA hardware 6013 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 6014 * \param agIOStatus: Status of completed I/O. 6015 * \param agFirstDword:Pointer to the four bytes of FIS. 6016 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 6017 * length. 6018 * \param agParam: Additional info based on status. 6019 * \param ioContext: Pointer to satIOContext_t. 6020 * 6021 * \return: none 6022 * 6023 *****************************************************************************/ 6024 void satWriteSame10CB( 6025 agsaRoot_t *agRoot, 6026 agsaIORequest_t *agIORequest, 6027 bit32 agIOStatus, 6028 agsaFisHeader_t *agFirstDword, 6029 bit32 agIOInfoLen, 6030 void *agParam, 6031 void *ioContext 6032 ) 6033 { 6034 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 6035 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 6036 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 6037 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 6038 tdIORequestBody_t *tdIORequestBody; 6039 tdIORequestBody_t *tdOrgIORequestBody; 6040 tdIORequestBody_t *tdNewIORequestBody; 6041 satIOContext_t *satIOContext; 6042 satIOContext_t *satOrgIOContext; 6043 satIOContext_t *satNewIOContext; 6044 satInternalIo_t *satIntIo; 6045 satInternalIo_t *satNewIntIo = agNULL; 6046 satDeviceData_t *satDevData; 6047 scsiRspSense_t *pSense; 6048 tiIniScsiCmnd_t *scsiCmnd; 6049 tiIORequest_t *tiOrgIORequest; 6050 6051 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 6052 bit32 ataStatus = 0; 6053 bit32 status; 6054 6055 bit32 sectorcount = 0; 6056 bit32 lba = 0, tl = 0; 6057 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 6058 agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL; 6059 6060 TI_DBG5(("satWriteSame10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 6061 6062 /* internally generate tiIOContext */ 6063 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 6064 satIOContext = (satIOContext_t *) ioContext; 6065 satIntIo = satIOContext->satIntIoContext; 6066 satDevData = satIOContext->pSatDevData; 6067 hostToDevFis = satIOContext->pFis; 6068 6069 if (satIntIo == agNULL) 6070 { 6071 TI_DBG4(("satWriteSame10CB: External satInternalIo_t satIntIoContext\n")); 6072 satOrgIOContext = satIOContext; 6073 tiOrgIORequest = tdIORequestBody->tiIORequest; 6074 pSense = satIOContext->pSense; 6075 scsiCmnd = satIOContext->pScsiCmnd; 6076 } 6077 else 6078 { 6079 TI_DBG4(("satWriteSame10CB: Internal satInternalIo_t satIntIoContext\n")); 6080 satOrgIOContext = satIOContext->satOrgIOContext; 6081 if (satOrgIOContext == agNULL) 6082 { 6083 TI_DBG4(("satWriteSame10CB: satOrgIOContext is NULL, wrong\n")); 6084 return; 6085 } 6086 else 6087 { 6088 TI_DBG4(("satWriteSame10CB: satOrgIOContext is NOT NULL\n")); 6089 } 6090 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 6091 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 6092 6093 pSense = satOrgIOContext->pSense; 6094 scsiCmnd = satOrgIOContext->pScsiCmnd; 6095 } 6096 6097 6098 tdIORequestBody->ioCompleted = agTRUE; 6099 tdIORequestBody->ioStarted = agFALSE; 6100 6101 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 6102 { 6103 TI_DBG1(("satWriteSame10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 6104 satSetSensePayload( pSense, 6105 SCSI_SNSKEY_NO_SENSE, 6106 0, 6107 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6108 satOrgIOContext); 6109 6110 ostiInitiatorIOCompleted( tiRoot, 6111 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6112 tiIOSuccess, 6113 SCSI_STAT_CHECK_CONDITION, 6114 satOrgIOContext->pTiSenseData, 6115 satOrgIOContext->interruptContext ); 6116 6117 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6118 6119 satFreeIntIoResource( tiRoot, 6120 satDevData, 6121 satIntIo); 6122 return; 6123 } 6124 6125 if (agIOStatus != OSSA_IO_SUCCESS) 6126 { 6127 /* FP, DMA and PIO write */ 6128 /* First, assumed to be Reg Device to Host FIS */ 6129 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 6130 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 6131 } 6132 6133 if (agIOStatus != OSSA_IO_SUCCESS) 6134 { 6135 if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS) 6136 { 6137 statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H); 6138 6139 /* Get ATA Status register */ 6140 ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */ 6141 ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */ 6142 6143 /* ATA Eror register */ 6144 6145 } 6146 } 6147 6148 if( agIOStatus != OSSA_IO_SUCCESS) 6149 { 6150 /* 6151 checking IO status, FIS type and error status 6152 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS 6153 */ 6154 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) && 6155 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) || 6156 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 6157 ) 6158 { 6159 /* for debugging */ 6160 if( agIOStatus != OSSA_IO_SUCCESS) 6161 { 6162 TI_DBG1(("satWriteSame10CB: FAILED, NOT IO_SUCCESS\n")); 6163 } 6164 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 6165 { 6166 TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 6167 } 6168 else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS) 6169 { 6170 TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 6171 } 6172 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 6173 (ataStatus & DF_ATA_STATUS_MASK) 6174 ) 6175 { 6176 TI_DBG1(("satWriteSame10CB: FAILED, FAILED, error status\n")); 6177 } 6178 6179 /* Process abort case */ 6180 if (agIOStatus == OSSA_IO_ABORTED) 6181 { 6182 satProcessAbort(tiRoot, 6183 tiOrgIORequest, 6184 satOrgIOContext 6185 ); 6186 6187 6188 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6189 6190 satFreeIntIoResource( tiRoot, 6191 satDevData, 6192 satIntIo); 6193 return; 6194 } 6195 6196 /* for debugging */ 6197 switch (hostToDevFis->h.command) 6198 { 6199 case SAT_WRITE_DMA_EXT: 6200 TI_DBG1(("satWriteSame10CB: SAT_WRITE_DMA_EXT\n")); 6201 break; 6202 case SAT_WRITE_SECTORS_EXT: 6203 TI_DBG1(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT\n")); 6204 break; 6205 case SAT_WRITE_FPDMA_QUEUED: 6206 TI_DBG1(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED\n")); 6207 break; 6208 default: 6209 TI_DBG1(("satWriteSame10CB: error default case command 0x%x\n", hostToDevFis->h.command)); 6210 break; 6211 } 6212 6213 satSetSensePayload( pSense, 6214 SCSI_SNSKEY_NO_SENSE, 6215 0, 6216 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6217 satOrgIOContext); 6218 6219 ostiInitiatorIOCompleted( tiRoot, 6220 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6221 tiIOSuccess, 6222 SCSI_STAT_CHECK_CONDITION, 6223 satOrgIOContext->pTiSenseData, 6224 satOrgIOContext->interruptContext ); 6225 6226 6227 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6228 6229 satFreeIntIoResource( tiRoot, 6230 satDevData, 6231 satIntIo); 6232 return; 6233 } /* end error */ 6234 } 6235 6236 /* process success from this point on */ 6237 /* 6238 note: inefficient implementation until a single block can be manipulated 6239 */ 6240 6241 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT) 6242 { 6243 TI_DBG5(("satWriteSame10CB: SAT_WRITE_DMA_EXT success\n")); 6244 } 6245 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT) 6246 { 6247 TI_DBG5(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT success\n")); 6248 } 6249 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED) 6250 { 6251 TI_DBG5(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED success\n")); 6252 } 6253 else 6254 { 6255 TI_DBG1(("satWriteSame10CB: error case command 0x%x success\n", hostToDevFis->h.command)); 6256 satSetSensePayload( pSense, 6257 SCSI_SNSKEY_NO_SENSE, 6258 0, 6259 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6260 satOrgIOContext); 6261 6262 ostiInitiatorIOCompleted( tiRoot, 6263 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6264 tiIOSuccess, 6265 SCSI_STAT_CHECK_CONDITION, 6266 satOrgIOContext->pTiSenseData, 6267 satOrgIOContext->interruptContext ); 6268 6269 6270 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6271 6272 satFreeIntIoResource( tiRoot, 6273 satDevData, 6274 satIntIo); 6275 return; 6276 } 6277 6278 6279 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6280 6281 /* free */ 6282 satFreeIntIoResource( tiRoot, 6283 satDevData, 6284 satIntIo); 6285 6286 /* 6287 increment LBA by one, keeping the same sector count(1) 6288 sends another ATA command with the changed parameters 6289 */ 6290 6291 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK); 6292 satDevData->satSectorDone++; 6293 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK); 6294 6295 TI_DBG1(("satWriteSame10CB: sectordone %d\n", satDevData->satSectorDone)); 6296 6297 lba = (scsiCmnd->cdb[2] << (8*3)) + (scsiCmnd->cdb[3] << (8*2)) 6298 + (scsiCmnd->cdb[4] << 8) + scsiCmnd->cdb[5]; 6299 tl = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8]; 6300 6301 TI_DBG5(("satWriteSame10CB: lba 0x%x tl 0x%x\n", lba, tl)); 6302 6303 if (tl == 0) 6304 { 6305 /* (satDevData->satMaxUserAddrSectors - 1) - lba*/ 6306 sectorcount = (0x0FFFFFFF - 1) - lba; 6307 } 6308 else 6309 { 6310 sectorcount = tl; 6311 } 6312 6313 if (sectorcount <= 0) 6314 { 6315 satSetSensePayload( pSense, 6316 SCSI_SNSKEY_NO_SENSE, 6317 0, 6318 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6319 satOrgIOContext); 6320 6321 ostiInitiatorIOCompleted( tiRoot, 6322 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6323 tiIOSuccess, 6324 SCSI_STAT_CHECK_CONDITION, 6325 satOrgIOContext->pTiSenseData, 6326 satOrgIOContext->interruptContext ); 6327 TI_DBG1(("satWriteSame10CB: incorrect sectorcount 0x%x\n", sectorcount)); 6328 return; 6329 } 6330 6331 if (sectorcount == satDevData->satSectorDone) 6332 { 6333 /* 6334 done with writesame 6335 */ 6336 TI_DBG1(("satWriteSame10CB: return writesame done\n")); 6337 satDevData->satSectorDone = 0; 6338 6339 ostiInitiatorIOCompleted( tiRoot, 6340 tiOrgIORequest, 6341 tiIOSuccess, 6342 SCSI_STAT_GOOD, 6343 agNULL, 6344 satOrgIOContext->interruptContext ); 6345 } 6346 else 6347 { 6348 /* sends another ATA command */ 6349 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT) 6350 { 6351 TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_DMA_EXT\n")); 6352 } 6353 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT) 6354 { 6355 TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_SECTORS_EXT\n")); 6356 } 6357 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED) 6358 { 6359 TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_FPDMA_QUEUED\n")); 6360 } 6361 6362 satNewIntIo = satAllocIntIoResource( tiRoot, 6363 tiOrgIORequest, 6364 satDevData, 6365 0, 6366 satNewIntIo); 6367 if (satNewIntIo == agNULL) 6368 { 6369 /* memory allocation failure */ 6370 satFreeIntIoResource( tiRoot, 6371 satDevData, 6372 satNewIntIo); 6373 6374 satSetSensePayload( pSense, 6375 SCSI_SNSKEY_NO_SENSE, 6376 0, 6377 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6378 satOrgIOContext); 6379 6380 ostiInitiatorIOCompleted( tiRoot, 6381 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6382 tiIOSuccess, 6383 SCSI_STAT_CHECK_CONDITION, 6384 satOrgIOContext->pTiSenseData, 6385 satOrgIOContext->interruptContext ); 6386 TI_DBG1(("satWriteSame10CB: momory allocation fails\n")); 6387 return; 6388 } /* end memory allocation */ 6389 6390 /* the one to be used */ 6391 tdNewIORequestBody = satNewIntIo->satIntRequestBody; 6392 satNewIOContext = &tdNewIORequestBody->transport.SATA.satIOContext; 6393 6394 satNewIOContext->pSatDevData = satDevData; 6395 satNewIOContext->pFis = &tdNewIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev; 6396 satNewIOContext->pScsiCmnd = &satNewIntIo->satIntTiScsiXchg.scsiCmnd; 6397 /* saves scsi command for LBA and number of blocks */ 6398 osti_memcpy(satNewIOContext->pScsiCmnd, scsiCmnd, sizeof(tiIniScsiCmnd_t)); 6399 satNewIOContext->pSense = &tdNewIORequestBody->transport.SATA.sensePayload; 6400 satNewIOContext->pTiSenseData = &tdNewIORequestBody->transport.SATA.tiSenseData; 6401 satNewIOContext->pTiSenseData->senseData = satNewIOContext->pSense; 6402 satNewIOContext->tiRequestBody = satNewIntIo->satIntRequestBody; 6403 satNewIOContext->interruptContext = satNewIOContext->interruptContext; 6404 satNewIOContext->satIntIoContext = satNewIntIo; 6405 satNewIOContext->ptiDeviceHandle = satIOContext->ptiDeviceHandle; 6406 /* saves tiScsiXchg; only for writesame10() */ 6407 satNewIOContext->tiScsiXchg = satOrgIOContext->tiScsiXchg; 6408 6409 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT) 6410 { 6411 status = satWriteSame10_1( tiRoot, 6412 &satNewIntIo->satIntTiIORequest, 6413 satNewIOContext->ptiDeviceHandle, 6414 &satNewIntIo->satIntTiScsiXchg, 6415 satNewIOContext, 6416 lba + satDevData->satSectorDone 6417 ); 6418 } 6419 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT) 6420 { 6421 status = satWriteSame10_2( tiRoot, 6422 &satNewIntIo->satIntTiIORequest, 6423 satNewIOContext->ptiDeviceHandle, 6424 &satNewIntIo->satIntTiScsiXchg, 6425 satNewIOContext, 6426 lba + satDevData->satSectorDone 6427 ); 6428 } 6429 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED) 6430 { 6431 status = satWriteSame10_3( tiRoot, 6432 &satNewIntIo->satIntTiIORequest, 6433 satNewIOContext->ptiDeviceHandle, 6434 &satNewIntIo->satIntTiScsiXchg, 6435 satNewIOContext, 6436 lba + satDevData->satSectorDone 6437 ); 6438 } 6439 else 6440 { 6441 status = tiError; 6442 TI_DBG1(("satWriteSame10CB: sucess but error in command 0x%x\n", hostToDevFis->h.command)); 6443 } 6444 6445 if (status != tiSuccess) 6446 { 6447 /* sending ATA command fails */ 6448 satFreeIntIoResource( tiRoot, 6449 satDevData, 6450 satNewIntIo); 6451 satSetSensePayload( pSense, 6452 SCSI_SNSKEY_NO_SENSE, 6453 0, 6454 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6455 satOrgIOContext); 6456 6457 ostiInitiatorIOCompleted( tiRoot, 6458 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6459 tiIOSuccess, 6460 SCSI_STAT_CHECK_CONDITION, 6461 satOrgIOContext->pTiSenseData, 6462 satOrgIOContext->interruptContext ); 6463 TI_DBG1(("satWriteSame10CB:calling satWriteSame10_1 fails\n")); 6464 return; 6465 } /* end send fails */ 6466 6467 } /* end sends another ATA command */ 6468 6469 return; 6470 } 6471 /***************************************************************************** 6472 *! \brief satStartStopUnitCB 6473 * 6474 * This routine is a callback function called from ossaSATACompleted(). 6475 * This CB routine deals with Send Diagnostic completion. 6476 * 6477 * \param agRoot: Handles for this instance of SAS/SATA hardware 6478 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 6479 * \param agIOStatus: Status of completed I/O. 6480 * \param agFirstDword:Pointer to the four bytes of FIS. 6481 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 6482 * length. 6483 * \param agParam: Additional info based on status. 6484 * \param ioContext: Pointer to satIOContext_t. 6485 * 6486 * \return: none 6487 * 6488 *****************************************************************************/ 6489 void satStartStopUnitCB( 6490 agsaRoot_t *agRoot, 6491 agsaIORequest_t *agIORequest, 6492 bit32 agIOStatus, 6493 agsaFisHeader_t *agFirstDword, 6494 bit32 agIOInfoLen, 6495 void *agParam, 6496 void *ioContext 6497 ) 6498 { 6499 /* 6500 In the process of StartStopUnit 6501 Process FLUSH CACHE (EXT) 6502 Process STANDBY 6503 Process READ VERIFY SECTOR(S) EXT 6504 Process MEDIA EJECT 6505 */ 6506 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 6507 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 6508 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 6509 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 6510 tdIORequestBody_t *tdIORequestBody; 6511 tdIORequestBody_t *tdOrgIORequestBody; 6512 satIOContext_t *satIOContext; 6513 satIOContext_t *satOrgIOContext; 6514 satIOContext_t *satNewIOContext; 6515 satInternalIo_t *satIntIo; 6516 satInternalIo_t *satNewIntIo = agNULL; 6517 satDeviceData_t *satDevData; 6518 scsiRspSense_t *pSense; 6519 tiIniScsiCmnd_t *scsiCmnd; 6520 tiIORequest_t *tiOrgIORequest; 6521 6522 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 6523 bit32 ataStatus = 0; 6524 bit32 status; 6525 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 6526 6527 TI_DBG5(("satStartStopUnitCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 6528 6529 /* internally generate tiIOContext */ 6530 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 6531 satIOContext = (satIOContext_t *) ioContext; 6532 satIntIo = satIOContext->satIntIoContext; 6533 satDevData = satIOContext->pSatDevData; 6534 hostToDevFis = satIOContext->pFis; 6535 6536 if (satIntIo == agNULL) 6537 { 6538 TI_DBG4(("satStartStopUnitCB: External satInternalIo_t satIntIoContext\n")); 6539 satOrgIOContext = satIOContext; 6540 tiOrgIORequest = tdIORequestBody->tiIORequest; 6541 pSense = satIOContext->pSense; 6542 scsiCmnd = satIOContext->pScsiCmnd; 6543 } 6544 else 6545 { 6546 TI_DBG4(("satStartStopUnitCB: Internal satInternalIo_t satIntIoContext\n")); 6547 satOrgIOContext = satIOContext->satOrgIOContext; 6548 if (satOrgIOContext == agNULL) 6549 { 6550 TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NULL, wrong\n")); 6551 return; 6552 } 6553 else 6554 { 6555 TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NOT NULL\n")); 6556 } 6557 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 6558 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 6559 6560 pSense = satOrgIOContext->pSense; 6561 scsiCmnd = satOrgIOContext->pScsiCmnd; 6562 } 6563 6564 tdIORequestBody->ioCompleted = agTRUE; 6565 tdIORequestBody->ioStarted = agFALSE; 6566 6567 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 6568 { 6569 TI_DBG1(("satStartStopUnitCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 6570 6571 /* IMMED == 0 */ 6572 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6573 { 6574 TI_DBG1(("satStartStopUnitCB: immed bit 0\n")); 6575 satSetSensePayload( pSense, 6576 SCSI_SNSKEY_ABORTED_COMMAND, 6577 0, 6578 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6579 satOrgIOContext); 6580 6581 ostiInitiatorIOCompleted( tiRoot, 6582 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6583 tiIOSuccess, 6584 SCSI_STAT_CHECK_CONDITION, 6585 satOrgIOContext->pTiSenseData, 6586 satOrgIOContext->interruptContext ); 6587 6588 6589 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6590 satFreeIntIoResource( tiRoot, 6591 satDevData, 6592 satIntIo); 6593 } 6594 /* IMMED == 1 */ 6595 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK) 6596 { 6597 TI_DBG1(("satStartStopUnitCB: immed bit 1\n")); 6598 satSetDeferredSensePayload( pSense, 6599 SCSI_SNSKEY_ABORTED_COMMAND, 6600 0, 6601 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6602 satOrgIOContext); 6603 6604 ostiInitiatorIOCompleted( tiRoot, 6605 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6606 tiIOSuccess, 6607 SCSI_STAT_CHECK_CONDITION, 6608 satOrgIOContext->pTiSenseData, 6609 satOrgIOContext->interruptContext ); 6610 6611 6612 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6613 satFreeIntIoResource( tiRoot, 6614 satDevData, 6615 satIntIo); 6616 } 6617 6618 6619 6620 return; 6621 } 6622 6623 if (agIOStatus != OSSA_IO_SUCCESS) 6624 { 6625 /* only agsaFisRegDeviceToHost_t is expected */ 6626 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 6627 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 6628 } 6629 /* 6630 checking IO status, FIS type and error status 6631 */ 6632 if( agIOStatus != OSSA_IO_SUCCESS) 6633 { 6634 if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 6635 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 6636 ) 6637 { 6638 /* for debugging */ 6639 if( agIOStatus != OSSA_IO_SUCCESS) 6640 { 6641 TI_DBG1(("satStartStopUnitCB: FAILED, NOT IO_SUCCESS\n")); 6642 } 6643 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 6644 { 6645 TI_DBG1(("satStartStopUnitCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 6646 } 6647 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 6648 (ataStatus & DF_ATA_STATUS_MASK) 6649 ) 6650 { 6651 TI_DBG1(("satStartStopUnitCB: FAILED, FAILED, error status\n")); 6652 } 6653 6654 6655 /* Process abort case */ 6656 if (agIOStatus == OSSA_IO_ABORTED) 6657 { 6658 satProcessAbort(tiRoot, 6659 tiOrgIORequest, 6660 satOrgIOContext 6661 ); 6662 6663 6664 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6665 6666 satFreeIntIoResource( tiRoot, 6667 satDevData, 6668 satIntIo); 6669 return; 6670 } 6671 6672 switch (hostToDevFis->h.command) 6673 { 6674 case SAT_FLUSH_CACHE: /* fall through */ 6675 case SAT_FLUSH_CACHE_EXT: 6676 TI_DBG1(("satStartStopUnitCB: SAT_FLUSH_CACHE(_EXT)\n")); 6677 /* check immed bit in scsi command */ 6678 /* IMMED == 0 */ 6679 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6680 { 6681 satSetSensePayload( pSense, 6682 SCSI_SNSKEY_ABORTED_COMMAND, 6683 0, 6684 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6685 satOrgIOContext); 6686 6687 ostiInitiatorIOCompleted( tiRoot, 6688 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6689 tiIOSuccess, 6690 SCSI_STAT_CHECK_CONDITION, 6691 satOrgIOContext->pTiSenseData, 6692 satOrgIOContext->interruptContext ); 6693 6694 6695 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6696 6697 satFreeIntIoResource( tiRoot, 6698 satDevData, 6699 satIntIo); 6700 } 6701 /* IMMED == 1 */ 6702 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK) 6703 { 6704 satSetDeferredSensePayload( pSense, 6705 SCSI_SNSKEY_ABORTED_COMMAND, 6706 0, 6707 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6708 satOrgIOContext); 6709 6710 ostiInitiatorIOCompleted( tiRoot, 6711 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6712 tiIOSuccess, 6713 SCSI_STAT_CHECK_CONDITION, 6714 satOrgIOContext->pTiSenseData, 6715 satOrgIOContext->interruptContext ); 6716 6717 6718 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6719 6720 satFreeIntIoResource( tiRoot, 6721 satDevData, 6722 satIntIo); 6723 } 6724 break; 6725 case SAT_STANDBY: 6726 TI_DBG5(("satStartStopUnitCB: SAT_STANDBY\n")); 6727 /* check immed bit in scsi command */ 6728 /* IMMED == 0 */ 6729 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6730 { 6731 satSetSensePayload( pSense, 6732 SCSI_SNSKEY_ABORTED_COMMAND, 6733 0, 6734 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6735 satOrgIOContext); 6736 6737 ostiInitiatorIOCompleted( tiRoot, 6738 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6739 tiIOSuccess, 6740 SCSI_STAT_CHECK_CONDITION, 6741 satOrgIOContext->pTiSenseData, 6742 satOrgIOContext->interruptContext ); 6743 6744 6745 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6746 6747 satFreeIntIoResource( tiRoot, 6748 satDevData, 6749 satIntIo); 6750 } 6751 /* IMMED == 1 */ 6752 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK) 6753 { 6754 satSetDeferredSensePayload( pSense, 6755 SCSI_SNSKEY_ABORTED_COMMAND, 6756 0, 6757 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6758 satOrgIOContext); 6759 6760 ostiInitiatorIOCompleted( tiRoot, 6761 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6762 tiIOSuccess, 6763 SCSI_STAT_CHECK_CONDITION, 6764 satOrgIOContext->pTiSenseData, 6765 satOrgIOContext->interruptContext ); 6766 6767 6768 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6769 6770 satFreeIntIoResource( tiRoot, 6771 satDevData, 6772 satIntIo); 6773 } 6774 break; 6775 case SAT_READ_VERIFY_SECTORS: /* fall through */ 6776 case SAT_READ_VERIFY_SECTORS_EXT: 6777 TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT)\n")); 6778 /* IMMED == 0 */ 6779 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6780 { 6781 satSetSensePayload( pSense, 6782 SCSI_SNSKEY_ABORTED_COMMAND, 6783 0, 6784 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6785 satOrgIOContext); 6786 6787 ostiInitiatorIOCompleted( tiRoot, 6788 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6789 tiIOSuccess, 6790 SCSI_STAT_CHECK_CONDITION, 6791 satOrgIOContext->pTiSenseData, 6792 satOrgIOContext->interruptContext ); 6793 6794 6795 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6796 6797 satFreeIntIoResource( tiRoot, 6798 satDevData, 6799 satIntIo); 6800 } 6801 /* IMMED == 1 */ 6802 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK) 6803 { 6804 satSetDeferredSensePayload( pSense, 6805 SCSI_SNSKEY_ABORTED_COMMAND, 6806 0, 6807 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6808 satOrgIOContext); 6809 6810 ostiInitiatorIOCompleted( tiRoot, 6811 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6812 tiIOSuccess, 6813 SCSI_STAT_CHECK_CONDITION, 6814 satOrgIOContext->pTiSenseData, 6815 satOrgIOContext->interruptContext ); 6816 6817 6818 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6819 6820 satFreeIntIoResource( tiRoot, 6821 satDevData, 6822 satIntIo); 6823 } 6824 break; 6825 case SAT_MEDIA_EJECT: 6826 TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT\n")); 6827 /* IMMED == 0 */ 6828 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6829 { 6830 satSetSensePayload( pSense, 6831 SCSI_SNSKEY_ABORTED_COMMAND, 6832 0, 6833 SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED, 6834 satOrgIOContext); 6835 6836 ostiInitiatorIOCompleted( tiRoot, 6837 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6838 tiIOSuccess, 6839 SCSI_STAT_CHECK_CONDITION, 6840 satOrgIOContext->pTiSenseData, 6841 satOrgIOContext->interruptContext ); 6842 6843 6844 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6845 6846 satFreeIntIoResource( tiRoot, 6847 satDevData, 6848 satIntIo); 6849 } 6850 /* IMMED == 1 */ 6851 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK) 6852 { 6853 satSetDeferredSensePayload( pSense, 6854 SCSI_SNSKEY_ABORTED_COMMAND, 6855 0, 6856 SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED, 6857 satOrgIOContext); 6858 6859 ostiInitiatorIOCompleted( tiRoot, 6860 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6861 tiIOSuccess, 6862 SCSI_STAT_CHECK_CONDITION, 6863 satOrgIOContext->pTiSenseData, 6864 satOrgIOContext->interruptContext ); 6865 6866 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6867 6868 satFreeIntIoResource( tiRoot, 6869 satDevData, 6870 satIntIo); 6871 } 6872 break; 6873 default: 6874 /* unspecified case, return no sense and no addition info */ 6875 TI_DBG5(("satStartStopUnitCB: default command %d\n", hostToDevFis->h.command)); 6876 satSetSensePayload( pSense, 6877 SCSI_SNSKEY_NO_SENSE, 6878 0, 6879 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6880 satOrgIOContext); 6881 6882 ostiInitiatorIOCompleted( tiRoot, 6883 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6884 tiIOSuccess, 6885 SCSI_STAT_CHECK_CONDITION, 6886 satOrgIOContext->pTiSenseData, 6887 satOrgIOContext->interruptContext ); 6888 6889 6890 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6891 6892 satFreeIntIoResource( tiRoot, 6893 satDevData, 6894 satIntIo); 6895 break; 6896 } /* switch */ 6897 6898 return; 6899 } /* error check */ 6900 } 6901 6902 /* ATA command completes sucessfully */ 6903 switch (hostToDevFis->h.command) 6904 { 6905 case SAT_FLUSH_CACHE: /* fall through */ 6906 case SAT_FLUSH_CACHE_EXT: 6907 TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n")); 6908 6909 6910 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6911 6912 /* done with SAT_FLUSH_CACHE(_EXT) */ 6913 satFreeIntIoResource( tiRoot, 6914 satDevData, 6915 satIntIo); 6916 6917 /* at this point, successful SAT_READ_VERIFY_SECTORS(_EXT) 6918 send SAT_SATNDBY 6919 */ 6920 satNewIntIo = satAllocIntIoResource( tiRoot, 6921 tiOrgIORequest, 6922 satDevData, 6923 0, 6924 satNewIntIo); 6925 if (satNewIntIo == agNULL) 6926 { 6927 /* memory allocation failure */ 6928 satFreeIntIoResource( tiRoot, 6929 satDevData, 6930 satNewIntIo); 6931 /* IMMED == 0 */ 6932 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6933 { 6934 satSetSensePayload( pSense, 6935 SCSI_SNSKEY_ABORTED_COMMAND, 6936 0, 6937 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6938 satOrgIOContext); 6939 } 6940 else /* IMMED == 1 */ 6941 { 6942 satSetDeferredSensePayload( pSense, 6943 SCSI_SNSKEY_ABORTED_COMMAND, 6944 0, 6945 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6946 satOrgIOContext); 6947 } 6948 ostiInitiatorIOCompleted( tiRoot, 6949 tiOrgIORequest, 6950 tiIOSuccess, 6951 SCSI_STAT_CHECK_CONDITION, 6952 satOrgIOContext->pTiSenseData, 6953 satOrgIOContext->interruptContext ); 6954 6955 TI_DBG1(("satStartStopUnitCB: momory allocation fails\n")); 6956 return; 6957 } /* end of memory allocation failure */ 6958 6959 /* 6960 * Need to initialize all the fields within satIOContext 6961 */ 6962 6963 satNewIOContext = satPrepareNewIO( 6964 satNewIntIo, 6965 tiOrgIORequest, 6966 satDevData, 6967 scsiCmnd, 6968 satOrgIOContext 6969 ); 6970 6971 /* sending SAT_STANDBY */ 6972 status = satStartStopUnit_1( tiRoot, 6973 &satNewIntIo->satIntTiIORequest, 6974 satNewIOContext->ptiDeviceHandle, 6975 &satNewIntIo->satIntTiScsiXchg, 6976 satNewIOContext); 6977 6978 if (status != tiSuccess) 6979 { 6980 /* sending SAT_CHECK_POWER_MODE fails */ 6981 satFreeIntIoResource( tiRoot, 6982 satDevData, 6983 satNewIntIo); 6984 6985 /* IMMED == 0 */ 6986 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6987 { 6988 satSetSensePayload( pSense, 6989 SCSI_SNSKEY_ABORTED_COMMAND, 6990 0, 6991 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6992 satOrgIOContext); 6993 } 6994 else /* IMMED == 1 */ 6995 { 6996 satSetDeferredSensePayload( pSense, 6997 SCSI_SNSKEY_ABORTED_COMMAND, 6998 0, 6999 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 7000 satOrgIOContext); 7001 } 7002 ostiInitiatorIOCompleted( tiRoot, 7003 tiOrgIORequest, 7004 tiIOSuccess, 7005 SCSI_STAT_CHECK_CONDITION, 7006 satOrgIOContext->pTiSenseData, 7007 satOrgIOContext->interruptContext ); 7008 7009 TI_DBG1(("satStartStopUnitCB: calling satStartStopUnit_1 fails\n")); 7010 return; 7011 } 7012 break; 7013 case SAT_STANDBY: 7014 TI_DBG5(("satStartStopUnitCB: SAT_STANDBY success case\n")); 7015 7016 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7017 7018 /* done with SAT_STANDBY */ 7019 satFreeIntIoResource( tiRoot, 7020 satDevData, 7021 satIntIo); 7022 /* 7023 if immed == 0, return good status 7024 */ 7025 /* IMMED == 0 */ 7026 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 7027 { 7028 ostiInitiatorIOCompleted( tiRoot, 7029 tiOrgIORequest, 7030 tiIOSuccess, 7031 SCSI_STAT_GOOD, 7032 agNULL, 7033 satOrgIOContext->interruptContext ); 7034 } 7035 satDevData->satStopState = agTRUE; 7036 break; 7037 case SAT_READ_VERIFY_SECTORS: /* fall through */ 7038 case SAT_READ_VERIFY_SECTORS_EXT: 7039 TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n")); 7040 7041 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7042 7043 /* done with SAT_READ_VERIFY_SECTORS(_EXT) */ 7044 satFreeIntIoResource( tiRoot, 7045 satDevData, 7046 satIntIo); 7047 /* 7048 if immed == 0, return good status 7049 */ 7050 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 7051 { 7052 ostiInitiatorIOCompleted( tiRoot, 7053 tiOrgIORequest, 7054 tiIOSuccess, 7055 SCSI_STAT_GOOD, 7056 agNULL, 7057 satOrgIOContext->interruptContext ); 7058 } 7059 /* 7060 if immed == 0, return good status 7061 */ 7062 /* 7063 don't forget to check and set driver state; Active power state 7064 */ 7065 satDevData->satStopState = agFALSE; 7066 break; 7067 case SAT_MEDIA_EJECT: 7068 TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT success case\n")); 7069 7070 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7071 7072 /* done with SAT_READ_VERIFY_SECTORS(_EXT) */ 7073 satFreeIntIoResource( tiRoot, 7074 satDevData, 7075 satIntIo); 7076 /* 7077 if immed == 0, return good status 7078 */ 7079 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 7080 { 7081 ostiInitiatorIOCompleted( tiRoot, 7082 tiOrgIORequest, 7083 tiIOSuccess, 7084 SCSI_STAT_GOOD, 7085 agNULL, 7086 satOrgIOContext->interruptContext ); 7087 } 7088 break; 7089 default: 7090 TI_DBG1(("satStartStopUnitCB:success but error default case command 0x%x\n", hostToDevFis->h.command)); 7091 7092 /* unspecified case, return no sense and no addition info */ 7093 satSetSensePayload( pSense, 7094 SCSI_SNSKEY_NO_SENSE, 7095 0, 7096 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 7097 satOrgIOContext); 7098 7099 ostiInitiatorIOCompleted( tiRoot, 7100 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7101 tiIOSuccess, 7102 SCSI_STAT_CHECK_CONDITION, 7103 satOrgIOContext->pTiSenseData, 7104 satOrgIOContext->interruptContext ); 7105 7106 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7107 7108 satFreeIntIoResource( tiRoot, 7109 satDevData, 7110 satIntIo); 7111 break; 7112 } 7113 return; 7114 } 7115 7116 /***************************************************************************** 7117 *! \brief satSendDiagnosticCB 7118 * 7119 * This routine is a callback function called from ossaSATACompleted(). 7120 * This CB routine deals with Send Diagnostic completion. 7121 * 7122 * \param agRoot: Handles for this instance of SAS/SATA hardware 7123 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 7124 * \param agIOStatus: Status of completed I/O. 7125 * \param agFirstDword:Pointer to the four bytes of FIS. 7126 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 7127 * length. 7128 * \param agParam: Additional info based on status. 7129 * \param ioContext: Pointer to satIOContext_t. 7130 * 7131 * \return: none 7132 * 7133 *****************************************************************************/ 7134 void satSendDiagnosticCB( 7135 agsaRoot_t *agRoot, 7136 agsaIORequest_t *agIORequest, 7137 bit32 agIOStatus, 7138 agsaFisHeader_t *agFirstDword, 7139 bit32 agIOInfoLen, 7140 void *agParam, 7141 void *ioContext 7142 ) 7143 { 7144 /* 7145 In the process of SendDiagnotic 7146 Process READ VERIFY SECTOR(S) EXT two time 7147 Process SMART ECECUTE OFF-LINE IMMEDIATE 7148 */ 7149 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 7150 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 7151 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 7152 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 7153 tdIORequestBody_t *tdIORequestBody; 7154 tdIORequestBody_t *tdOrgIORequestBody; 7155 satIOContext_t *satIOContext; 7156 satIOContext_t *satOrgIOContext; 7157 satIOContext_t *satNewIOContext; 7158 satInternalIo_t *satIntIo; 7159 satInternalIo_t *satNewIntIo = agNULL; 7160 satDeviceData_t *satDevData; 7161 scsiRspSense_t *pSense; 7162 tiIniScsiCmnd_t *scsiCmnd; 7163 tiIORequest_t *tiOrgIORequest; 7164 7165 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 7166 bit32 ataStatus = 0; 7167 bit32 status; 7168 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 7169 7170 7171 TI_DBG5(("satSendDiagnosticCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 7172 7173 /* internally generate tiIOContext */ 7174 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 7175 satIOContext = (satIOContext_t *) ioContext; 7176 satIntIo = satIOContext->satIntIoContext; 7177 satDevData = satIOContext->pSatDevData; 7178 hostToDevFis = satIOContext->pFis; 7179 7180 if (satIntIo == agNULL) 7181 { 7182 TI_DBG4(("satSendDiagnosticCB: External satInternalIo_t satIntIoContext\n")); 7183 satOrgIOContext = satIOContext; 7184 tiOrgIORequest = tdIORequestBody->tiIORequest; 7185 pSense = satOrgIOContext->pSense; 7186 scsiCmnd = satOrgIOContext->pScsiCmnd; 7187 } 7188 else 7189 { 7190 TI_DBG4(("satSendDiagnosticCB: Internal satInternalIo_t satIntIoContext\n")); 7191 satOrgIOContext = satIOContext->satOrgIOContext; 7192 if (satOrgIOContext == agNULL) 7193 { 7194 TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NULL, wrong\n")); 7195 return; 7196 } 7197 else 7198 { 7199 TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NOT NULL\n")); 7200 } 7201 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 7202 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 7203 pSense = satOrgIOContext->pSense; 7204 scsiCmnd = satOrgIOContext->pScsiCmnd; 7205 } 7206 7207 tdIORequestBody->ioCompleted = agTRUE; 7208 tdIORequestBody->ioStarted = agFALSE; 7209 7210 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 7211 { 7212 TI_DBG1(("satSendDiagnosticCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 7213 satDevData->satVerifyState = 0; 7214 satDevData->satBGPendingDiag = agFALSE; 7215 7216 if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02) 7217 { 7218 /* no completion for background send diagnotic. It is done in satSendDiagnostic() */ 7219 ostiInitiatorIOCompleted ( 7220 tiRoot, 7221 tiOrgIORequest, 7222 tiIOFailed, 7223 tiDetailOtherError, 7224 agNULL, 7225 satOrgIOContext->interruptContext 7226 ); 7227 } 7228 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7229 7230 satFreeIntIoResource( tiRoot, 7231 satDevData, 7232 satIntIo); 7233 return; 7234 7235 } 7236 7237 if (agIOStatus != OSSA_IO_SUCCESS) 7238 { 7239 /* only agsaFisRegDeviceToHost_t is expected */ 7240 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 7241 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 7242 } 7243 7244 TI_DBG5(("satSendDiagnosticCB: fis command 0x%x\n", hostToDevFis->h.command)); 7245 7246 if( agIOStatus != OSSA_IO_SUCCESS) 7247 { 7248 /* 7249 checking IO status, FIS type and error status 7250 */ 7251 satDevData->satVerifyState = 0; 7252 satDevData->satBGPendingDiag = agFALSE; 7253 7254 if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 7255 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 7256 ) 7257 { 7258 7259 /* for debugging */ 7260 if( agIOStatus != OSSA_IO_SUCCESS) 7261 { 7262 if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) || 7263 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) ) 7264 { 7265 TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_READ_VERIFY_SECTORS(_EXT)\n")); 7266 } 7267 else 7268 { 7269 TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n")); 7270 } 7271 } 7272 7273 /* for debugging */ 7274 if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 7275 { 7276 if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) || 7277 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) ) 7278 { 7279 TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_READ_VERIFY_SECTORS(_EXT)\n", statDevToHostFisHeader->fisType)); 7280 } 7281 else 7282 { 7283 TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n",statDevToHostFisHeader->fisType)); 7284 } 7285 } 7286 7287 /* for debugging */ 7288 if ( (ataStatus & ERR_ATA_STATUS_MASK) || 7289 (ataStatus & DF_ATA_STATUS_MASK) 7290 ) 7291 { 7292 if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) || 7293 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) ) 7294 { 7295 TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_READ_VERIFY_SECTORS(_EXT)\n")); 7296 } 7297 else 7298 { 7299 TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n")); 7300 } 7301 } 7302 7303 /* Process abort case */ 7304 if (agIOStatus == OSSA_IO_ABORTED) 7305 { 7306 satProcessAbort(tiRoot, 7307 tiOrgIORequest, 7308 satOrgIOContext 7309 ); 7310 7311 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7312 7313 satFreeIntIoResource( tiRoot, 7314 satDevData, 7315 satIntIo); 7316 return; 7317 } 7318 7319 if ( (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS) || 7320 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) ) 7321 { 7322 /* report using the original tiIOrequst */ 7323 /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */ 7324 satSetSensePayload( pSense, 7325 SCSI_SNSKEY_HARDWARE_ERROR, 7326 0, 7327 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST, 7328 satOrgIOContext); 7329 7330 ostiInitiatorIOCompleted( tiRoot, 7331 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7332 tiIOSuccess, 7333 SCSI_STAT_CHECK_CONDITION, 7334 satOrgIOContext->pTiSenseData, 7335 satOrgIOContext->interruptContext ); 7336 7337 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7338 7339 satFreeIntIoResource( tiRoot, 7340 satDevData, 7341 satIntIo); 7342 return; 7343 } 7344 else 7345 { 7346 /* report using the original tiIOrequst */ 7347 /* failed during sending SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */ 7348 satSetSensePayload( pSense, 7349 SCSI_SNSKEY_HARDWARE_ERROR, 7350 0, 7351 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST, 7352 satOrgIOContext); 7353 7354 if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02) 7355 { 7356 /* no completion for background send diagnotic. It is done in satSendDiagnostic() */ 7357 ostiInitiatorIOCompleted( tiRoot, 7358 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7359 tiIOSuccess, 7360 SCSI_STAT_CHECK_CONDITION, 7361 satOrgIOContext->pTiSenseData, 7362 satOrgIOContext->interruptContext ); 7363 7364 } 7365 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7366 7367 satFreeIntIoResource( tiRoot, 7368 satDevData, 7369 satIntIo); 7370 return; 7371 } 7372 } 7373 } 7374 7375 /* processing success case */ 7376 switch (hostToDevFis->h.command) 7377 { 7378 case SAT_READ_VERIFY_SECTORS: /* fall through */ 7379 case SAT_READ_VERIFY_SECTORS_EXT: 7380 TI_DBG5(("satSendDiagnosticCB: SAT_READ_VERIFY_SECTORS(_EXT) case\n")); 7381 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK); 7382 satDevData->satVerifyState++; 7383 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK); 7384 TI_DBG5(("satSendDiagnosticCB: satVerifyState %d\n",satDevData->satVerifyState)); 7385 7386 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7387 7388 /* done with internally genereated AT_READ_VERIFY_SECTORS(_EXT) */ 7389 satFreeIntIoResource( tiRoot, 7390 satDevData, 7391 satIntIo); 7392 7393 if (satDevData->satVerifyState == 3) 7394 { 7395 /* reset satVerifyState */ 7396 satDevData->satVerifyState = 0; 7397 /* return GOOD status */ 7398 TI_DBG5(("satSendDiagnosticCB: return GOOD status\n")); 7399 ostiInitiatorIOCompleted( tiRoot, 7400 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7401 tiIOSuccess, 7402 SCSI_STAT_GOOD, 7403 agNULL, 7404 satOrgIOContext->interruptContext ); 7405 return; 7406 } 7407 else 7408 { 7409 7410 /* prepare SAT_READ_VERIFY_SECTORS(_EXT) */ 7411 satNewIntIo = satAllocIntIoResource( tiRoot, 7412 tiOrgIORequest, 7413 satDevData, 7414 0, 7415 satNewIntIo); 7416 if (satNewIntIo == agNULL) 7417 { 7418 /* reset satVerifyState */ 7419 satDevData->satVerifyState = 0; 7420 /* memory allocation failure */ 7421 satFreeIntIoResource( tiRoot, 7422 satDevData, 7423 satNewIntIo); 7424 7425 /* failed as a part of sending SAT_READ_VERIFY_SECTORS(_EXT) */ 7426 satSetSensePayload( pSense, 7427 SCSI_SNSKEY_HARDWARE_ERROR, 7428 0, 7429 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST, 7430 satOrgIOContext); 7431 7432 ostiInitiatorIOCompleted( tiRoot, 7433 tiOrgIORequest, 7434 tiIOSuccess, 7435 SCSI_STAT_CHECK_CONDITION, 7436 satOrgIOContext->pTiSenseData, 7437 satOrgIOContext->interruptContext ); 7438 7439 TI_DBG1(("satSendDiagnosticCB: momory allocation fails\n")); 7440 return; 7441 } /* end of memory allocation failure */ 7442 7443 /* 7444 * Need to initialize all the fields within satIOContext 7445 */ 7446 7447 satNewIOContext = satPrepareNewIO( 7448 satNewIntIo, 7449 tiOrgIORequest, 7450 satDevData, 7451 scsiCmnd, 7452 satOrgIOContext 7453 ); 7454 7455 if (satDevData->satVerifyState == 1) 7456 { 7457 /* sending SAT_CHECK_POWER_MODE */ 7458 status = satSendDiagnostic_1( tiRoot, 7459 &satNewIntIo->satIntTiIORequest, 7460 satNewIOContext->ptiDeviceHandle, 7461 &satNewIntIo->satIntTiScsiXchg, 7462 satNewIOContext); 7463 } 7464 else 7465 { 7466 /* satDevData->satVerifyState == 2 */ 7467 status = satSendDiagnostic_2( tiRoot, 7468 &satNewIntIo->satIntTiIORequest, 7469 satNewIOContext->ptiDeviceHandle, 7470 &satNewIntIo->satIntTiScsiXchg, 7471 satNewIOContext); 7472 } 7473 7474 if (status != tiSuccess) 7475 { 7476 /* sending SAT_READ_VERIFY_SECTORS(_EXT) fails */ 7477 satFreeIntIoResource( tiRoot, 7478 satDevData, 7479 satNewIntIo); 7480 7481 /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */ 7482 satSetSensePayload( pSense, 7483 SCSI_SNSKEY_HARDWARE_ERROR, 7484 0, 7485 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST, 7486 satOrgIOContext); 7487 7488 ostiInitiatorIOCompleted( tiRoot, 7489 tiOrgIORequest, 7490 tiIOSuccess, 7491 SCSI_STAT_CHECK_CONDITION, 7492 satOrgIOContext->pTiSenseData, 7493 satOrgIOContext->interruptContext ); 7494 7495 /* reset satVerifyState */ 7496 satDevData->satVerifyState = 0; 7497 TI_DBG1(("satSendDiagnosticCB: calling satSendDiagnostic_1 or _2 fails\n")); 7498 return; 7499 } 7500 } /* satDevData->satVerifyState == 1 or 2 */ 7501 7502 break; 7503 case SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE: 7504 TI_DBG5(("satSendDiagnosticCB: SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE case\n")); 7505 7506 satDevData->satBGPendingDiag = agFALSE; 7507 7508 if (hostToDevFis->d.lbaLow == 0x01 || hostToDevFis->d.lbaLow == 0x02) 7509 { 7510 /* for background send diagnostic, no completion here. It is done already. */ 7511 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7512 7513 /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */ 7514 satFreeIntIoResource( tiRoot, 7515 satDevData, 7516 satIntIo); 7517 TI_DBG5(("satSendDiagnosticCB: returning but no IOCompleted\n")); 7518 } 7519 else 7520 { 7521 TI_DBG5(("satSendDiagnosticCB: returning good status for senddiagnostic\n")); 7522 ostiInitiatorIOCompleted( tiRoot, 7523 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7524 tiIOSuccess, 7525 SCSI_STAT_GOOD, 7526 agNULL, 7527 satOrgIOContext->interruptContext ); 7528 7529 7530 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7531 7532 /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */ 7533 satFreeIntIoResource( tiRoot, 7534 satDevData, 7535 satIntIo); 7536 } 7537 7538 break; 7539 default: 7540 TI_DBG1(("satSendDiagnosticCB: success but error default case command 0x%x\n", hostToDevFis->h.command)); 7541 /* unspecified case, return no sense and no addition info */ 7542 satSetSensePayload( pSense, 7543 SCSI_SNSKEY_NO_SENSE, 7544 0, 7545 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 7546 satOrgIOContext); 7547 7548 ostiInitiatorIOCompleted( tiRoot, 7549 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7550 tiIOSuccess, 7551 SCSI_STAT_CHECK_CONDITION, 7552 satOrgIOContext->pTiSenseData, 7553 satOrgIOContext->interruptContext ); 7554 7555 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7556 7557 satFreeIntIoResource( tiRoot, 7558 satDevData, 7559 satIntIo); 7560 break; 7561 } 7562 return; 7563 } 7564 /***************************************************************************** 7565 *! \brief satRequestSenseCB 7566 * 7567 * This routine is a callback function called from ossaSATACompleted(). 7568 * This CB routine deals with Request Sense completion. 7569 * 7570 * \param agRoot: Handles for this instance of SAS/SATA hardware 7571 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 7572 * \param agIOStatus: Status of completed I/O. 7573 * \param agFirstDword:Pointer to the four bytes of FIS. 7574 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 7575 * length. 7576 * \param agParam: Additional info based on status. 7577 * \param ioContext: Pointer to satIOContext_t. 7578 * 7579 * \return: none 7580 * 7581 *****************************************************************************/ 7582 /* 7583 CB for internnaly generated SMART_RETURN_STATUS and SAT_CHECK_POWER_MODE 7584 in the process of RequestSense 7585 7586 */ 7587 void satRequestSenseCB( 7588 agsaRoot_t *agRoot, 7589 agsaIORequest_t *agIORequest, 7590 bit32 agIOStatus, 7591 agsaFisHeader_t *agFirstDword, 7592 bit32 agIOInfoLen, 7593 void *agParam, 7594 void *ioContext 7595 ) 7596 { 7597 /* ATA Vol 1, p299 SAT_SMART_RETURN_STATUS */ 7598 /* 7599 if threshold exceeds, return SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE 7600 else call satRequestSense_1 to send CHECK_POWER_MODE 7601 */ 7602 7603 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 7604 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 7605 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 7606 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 7607 tdIORequestBody_t *tdIORequestBody; 7608 tdIORequestBody_t *tdOrgIORequestBody; 7609 satIOContext_t *satIOContext; 7610 satIOContext_t *satOrgIOContext; 7611 satIOContext_t *satNewIOContext; 7612 satInternalIo_t *satIntIo; 7613 satInternalIo_t *satNewIntIo = agNULL; 7614 satDeviceData_t *satDevData; 7615 scsiRspSense_t *pSense; 7616 tiIORequest_t *tiOrgIORequest; 7617 tiIniScsiCmnd_t *scsiCmnd; 7618 7619 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 7620 bit32 ataStatus = 0; 7621 bit32 status; 7622 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 7623 agsaFisRegD2HData_t statDevToHostFisData; 7624 bit32 lenReceived = 0; 7625 bit32 dataLength; 7626 7627 TI_DBG4(("satRequestSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 7628 7629 /* internally generate tiIOContext */ 7630 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 7631 satIOContext = (satIOContext_t *) ioContext; 7632 satIntIo = satIOContext->satIntIoContext; 7633 satDevData = satIOContext->pSatDevData; 7634 hostToDevFis = satIOContext->pFis; 7635 7636 /*ttttttthe one */ 7637 if (satIntIo == agNULL) 7638 { 7639 TI_DBG4(("satRequestSenseCB: External satInternalIo_t satIntIoContext\n")); 7640 satOrgIOContext = satIOContext; 7641 tiOrgIORequest = tdIORequestBody->tiIORequest; 7642 if (satOrgIOContext->superIOFlag) 7643 { 7644 pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense; 7645 } 7646 else 7647 { 7648 pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense; 7649 } 7650 scsiCmnd = satOrgIOContext->pScsiCmnd; 7651 } 7652 else 7653 { 7654 TI_DBG4(("satRequestSenseCB: Internal satInternalIo_t satIntIoContext\n")); 7655 satOrgIOContext = satIOContext->satOrgIOContext; 7656 if (satOrgIOContext == agNULL) 7657 { 7658 TI_DBG4(("satRequestSenseCB: satOrgIOContext is NULL, wrong\n")); 7659 return; 7660 } 7661 else 7662 { 7663 TI_DBG4(("satRequestSenseCB: satOrgIOContext is NOT NULL\n")); 7664 } 7665 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 7666 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 7667 7668 if (satOrgIOContext->superIOFlag) 7669 { 7670 pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense; 7671 } 7672 else 7673 { 7674 pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense; 7675 } 7676 scsiCmnd = satOrgIOContext->pScsiCmnd; 7677 } 7678 7679 tdIORequestBody->ioCompleted = agTRUE; 7680 tdIORequestBody->ioStarted = agFALSE; 7681 7682 TI_DBG4(("satRequestSenseCB: fis command 0x%x\n", hostToDevFis->h.command)); 7683 7684 lenReceived = scsiCmnd->cdb[4]; 7685 TI_DBG1(("satRequestSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived)); 7686 7687 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 7688 { 7689 TI_DBG1(("satRequestSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 7690 ostiInitiatorIOCompleted ( 7691 tiRoot, 7692 tiOrgIORequest, 7693 tiIOFailed, 7694 tiDetailOtherError, 7695 agNULL, 7696 satOrgIOContext->interruptContext 7697 ); 7698 7699 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7700 7701 satFreeIntIoResource( tiRoot, 7702 satDevData, 7703 satIntIo); 7704 7705 return; 7706 } 7707 7708 /* 7709 checking IO status, FIS type and error status 7710 */ 7711 if (agIOStatus != OSSA_IO_SUCCESS) 7712 { 7713 /* only agsaFisRegDeviceToHost_t is expected */ 7714 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 7715 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 7716 7717 /* for debugging */ 7718 if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 7719 { 7720 if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) 7721 { 7722 TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_RETURN_STATU\n", statDevToHostFisHeader->fisType)); 7723 } 7724 else 7725 { 7726 TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_CHECK_POWER_MODE\n",statDevToHostFisHeader->fisType)); 7727 } 7728 } 7729 7730 /* for debugging */ 7731 if ( (ataStatus & ERR_ATA_STATUS_MASK) || 7732 (ataStatus & DF_ATA_STATUS_MASK) 7733 ) 7734 { 7735 if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) 7736 { 7737 TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_SMART_RETURN_STATU\n")); 7738 } 7739 else 7740 { 7741 TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_CHECK_POWER_MODE\n")); 7742 } 7743 } 7744 7745 /* Process abort case */ 7746 if (agIOStatus == OSSA_IO_ABORTED) 7747 { 7748 satProcessAbort(tiRoot, 7749 tiOrgIORequest, 7750 satOrgIOContext 7751 ); 7752 7753 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7754 7755 satFreeIntIoResource( tiRoot, 7756 satDevData, 7757 satIntIo); 7758 return; 7759 } 7760 7761 if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) 7762 { 7763 /* report using the original tiIOrequst */ 7764 /* failed during sending SMART RETURN STATUS */ 7765 satSetSensePayload( pSense, 7766 SCSI_SNSKEY_NO_SENSE, 7767 0, 7768 SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE, 7769 satOrgIOContext); 7770 7771 if (SENSE_DATA_LENGTH < lenReceived) 7772 { 7773 /* underrun */ 7774 ostiInitiatorIOCompleted( tiRoot, 7775 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7776 tiIOUnderRun, 7777 lenReceived - SENSE_DATA_LENGTH, 7778 agNULL, 7779 satOrgIOContext->interruptContext ); 7780 } 7781 else 7782 { 7783 ostiInitiatorIOCompleted( tiRoot, 7784 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7785 tiIOSuccess, 7786 SCSI_STAT_GOOD, 7787 agNULL, 7788 satOrgIOContext->interruptContext ); 7789 } 7790 } 7791 else 7792 { 7793 /* report using the original tiIOrequst */ 7794 /* failed during sending SAT_CHECK_POWER_MODE */ 7795 satSetSensePayload( pSense, 7796 SCSI_SNSKEY_NO_SENSE, 7797 0, 7798 SCSI_SNSCODE_LOW_POWER_CONDITION_ON, 7799 satOrgIOContext); 7800 7801 if (SENSE_DATA_LENGTH < lenReceived) 7802 { 7803 /* underrun */ 7804 ostiInitiatorIOCompleted( tiRoot, 7805 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7806 tiIOUnderRun, 7807 lenReceived - SENSE_DATA_LENGTH, 7808 agNULL, 7809 satOrgIOContext->interruptContext ); 7810 } 7811 else 7812 { 7813 ostiInitiatorIOCompleted( tiRoot, 7814 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7815 tiIOSuccess, 7816 SCSI_STAT_GOOD, 7817 agNULL, 7818 satOrgIOContext->interruptContext ); 7819 } 7820 } 7821 7822 7823 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7824 7825 satFreeIntIoResource( tiRoot, 7826 satDevData, 7827 satIntIo); 7828 return; 7829 } 7830 7831 saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t)); 7832 7833 switch (hostToDevFis->h.command) 7834 { 7835 case SAT_SMART_RETURN_STATUS: 7836 TI_DBG4(("satRequestSenseCB: SAT_SMART_RETURN_STATUS case\n")); 7837 if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C) 7838 { 7839 /* threshold exceeds */ 7840 TI_DBG1(("satRequestSenseCB: threshold exceeds\n")); 7841 7842 7843 /* report using the original tiIOrequst */ 7844 /* failed during sending SMART RETURN STATUS */ 7845 satSetSensePayload( pSense, 7846 SCSI_SNSKEY_NO_SENSE, 7847 0, 7848 SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE, 7849 satOrgIOContext); 7850 7851 if (SENSE_DATA_LENGTH < lenReceived) 7852 { 7853 /* underrun */ 7854 ostiInitiatorIOCompleted( tiRoot, 7855 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7856 tiIOUnderRun, 7857 lenReceived - SENSE_DATA_LENGTH, 7858 agNULL, 7859 satOrgIOContext->interruptContext ); } 7860 else 7861 { 7862 ostiInitiatorIOCompleted( tiRoot, 7863 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7864 tiIOSuccess, 7865 SCSI_STAT_GOOD, 7866 agNULL, 7867 satOrgIOContext->interruptContext ); } 7868 7869 7870 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7871 7872 satFreeIntIoResource( tiRoot, 7873 satDevData, 7874 satIntIo); 7875 return; 7876 } 7877 7878 7879 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7880 7881 /* done with internally genereated SAT_SMART_RETURN_STATUS */ 7882 satFreeIntIoResource( tiRoot, 7883 satDevData, 7884 satIntIo); 7885 7886 /* at this point, successful SMART_RETURN_STATUS 7887 xmit SAT_CHECK_POWER_MODE 7888 */ 7889 if (satOrgIOContext->superIOFlag) 7890 { 7891 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 7892 } 7893 else 7894 { 7895 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 7896 } 7897 7898 satNewIntIo = satAllocIntIoResource( tiRoot, 7899 tiOrgIORequest, 7900 satDevData, 7901 dataLength, 7902 satNewIntIo); 7903 if (satNewIntIo == agNULL) 7904 { 7905 /* memory allocation failure */ 7906 satFreeIntIoResource( tiRoot, 7907 satDevData, 7908 satNewIntIo); 7909 7910 /* failed as a part of sending SMART RETURN STATUS */ 7911 satSetSensePayload( pSense, 7912 SCSI_SNSKEY_NO_SENSE, 7913 0, 7914 SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE, 7915 satOrgIOContext); 7916 7917 if (SENSE_DATA_LENGTH < lenReceived) 7918 { 7919 /* underrun */ 7920 ostiInitiatorIOCompleted( tiRoot, 7921 tiOrgIORequest, 7922 tiIOUnderRun, 7923 lenReceived - SENSE_DATA_LENGTH, 7924 agNULL, 7925 satOrgIOContext->interruptContext ); 7926 } 7927 else 7928 { 7929 ostiInitiatorIOCompleted( tiRoot, 7930 tiOrgIORequest, 7931 tiIOSuccess, 7932 SCSI_STAT_GOOD, 7933 agNULL, 7934 satOrgIOContext->interruptContext ); 7935 } 7936 7937 TI_DBG1(("satRequestSenseCB: momory allocation fails\n")); 7938 return; 7939 } /* end of memory allocation failure */ 7940 7941 7942 /* 7943 * Need to initialize all the fields within satIOContext 7944 */ 7945 7946 satNewIOContext = satPrepareNewIO( 7947 satNewIntIo, 7948 tiOrgIORequest, 7949 satDevData, 7950 scsiCmnd, 7951 satOrgIOContext 7952 ); 7953 7954 /* sending SAT_CHECK_POWER_MODE */ 7955 status = satRequestSense_1( tiRoot, 7956 &satNewIntIo->satIntTiIORequest, 7957 satNewIOContext->ptiDeviceHandle, 7958 &satNewIntIo->satIntTiScsiXchg, 7959 satNewIOContext); 7960 7961 if (status != tiSuccess) 7962 { 7963 /* sending SAT_CHECK_POWER_MODE fails */ 7964 satFreeIntIoResource( tiRoot, 7965 satDevData, 7966 satNewIntIo); 7967 7968 /* failed during sending SAT_CHECK_POWER_MODE */ 7969 satSetSensePayload( pSense, 7970 SCSI_SNSKEY_NO_SENSE, 7971 0, 7972 SCSI_SNSCODE_LOW_POWER_CONDITION_ON, 7973 satOrgIOContext); 7974 7975 if (SENSE_DATA_LENGTH < lenReceived) 7976 { 7977 /* underrun */ 7978 ostiInitiatorIOCompleted( tiRoot, 7979 tiOrgIORequest, 7980 tiIOUnderRun, 7981 lenReceived - SENSE_DATA_LENGTH, 7982 agNULL, 7983 satOrgIOContext->interruptContext ); 7984 } 7985 else 7986 { 7987 ostiInitiatorIOCompleted( tiRoot, 7988 tiOrgIORequest, 7989 tiIOSuccess, 7990 SCSI_STAT_GOOD, 7991 agNULL, 7992 satOrgIOContext->interruptContext ); 7993 } 7994 7995 TI_DBG1(("satRequestSenseCB: calling satRequestSense_1 fails\n")); 7996 return; 7997 } 7998 7999 break; 8000 case SAT_CHECK_POWER_MODE: 8001 TI_DBG4(("satRequestSenseCB: SAT_CHECK_POWER_MODE case\n")); 8002 8003 /* check ATA STANDBY state */ 8004 if (statDevToHostFisData.sectorCount == 0x00) 8005 { 8006 /* in STANDBY */ 8007 TI_DBG1(("satRequestSenseCB: in standby\n")); 8008 8009 8010 /* report using the original tiIOrequst */ 8011 /* failed during sending SAT_CHECK_POWER_MODE */ 8012 satSetSensePayload( pSense, 8013 SCSI_SNSKEY_NO_SENSE, 8014 0, 8015 SCSI_SNSCODE_LOW_POWER_CONDITION_ON, 8016 satOrgIOContext); 8017 8018 if (SENSE_DATA_LENGTH < lenReceived) 8019 { 8020 /* underrun */ 8021 ostiInitiatorIOCompleted( tiRoot, 8022 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8023 tiIOUnderRun, 8024 lenReceived - SENSE_DATA_LENGTH, 8025 agNULL, 8026 satOrgIOContext->interruptContext ); 8027 } 8028 else 8029 { 8030 ostiInitiatorIOCompleted( tiRoot, 8031 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8032 tiIOSuccess, 8033 SCSI_STAT_GOOD, 8034 agNULL, 8035 satOrgIOContext->interruptContext ); 8036 } 8037 8038 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8039 8040 satFreeIntIoResource( tiRoot, 8041 satDevData, 8042 satIntIo); 8043 return; 8044 } 8045 8046 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8047 8048 /* done with internnaly generated SAT_CHECK_POWER_MODE */ 8049 satFreeIntIoResource( tiRoot, 8050 satDevData, 8051 satIntIo); 8052 8053 if (satDevData->satFormatState == agTRUE) 8054 { 8055 TI_DBG1(("satRequestSenseCB: in format\n")); 8056 8057 8058 /* report using the original tiIOrequst */ 8059 satSetSensePayload( pSense, 8060 SCSI_SNSKEY_NOT_READY, 8061 0, 8062 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS, 8063 satOrgIOContext); 8064 8065 if (SENSE_DATA_LENGTH < lenReceived) 8066 { 8067 /* underrun */ 8068 ostiInitiatorIOCompleted( tiRoot, 8069 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8070 tiIOUnderRun, 8071 lenReceived - SENSE_DATA_LENGTH, 8072 agNULL, 8073 satOrgIOContext->interruptContext ); 8074 } 8075 else 8076 { 8077 ostiInitiatorIOCompleted( tiRoot, 8078 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8079 tiIOSuccess, 8080 SCSI_STAT_GOOD, 8081 agNULL, 8082 satOrgIOContext->interruptContext ); 8083 } 8084 8085 return; 8086 } 8087 8088 /* normal: returns good status for requestsense */ 8089 /* report using the original tiIOrequst */ 8090 satSetSensePayload( pSense, 8091 SCSI_SNSKEY_NO_SENSE, 8092 0, 8093 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8094 satOrgIOContext); 8095 TI_DBG4(("satRequestSenseCB: returning good status for requestsense\n")); 8096 if (SENSE_DATA_LENGTH < lenReceived) 8097 { 8098 /* underrun */ 8099 TI_DBG6(("satRequestSenseCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n", 8100 SENSE_DATA_LENGTH, lenReceived, tiOrgIORequest)); 8101 ostiInitiatorIOCompleted( tiRoot, 8102 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8103 tiIOUnderRun, 8104 lenReceived - SENSE_DATA_LENGTH, 8105 agNULL, 8106 satOrgIOContext->interruptContext ); 8107 8108 } 8109 else 8110 { 8111 ostiInitiatorIOCompleted( tiRoot, 8112 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8113 tiIOSuccess, 8114 SCSI_STAT_GOOD, 8115 agNULL, 8116 satOrgIOContext->interruptContext ); 8117 } 8118 8119 break; 8120 default: 8121 TI_DBG1(("satRequestSenseCB: success but error default case command 0x%x\n", hostToDevFis->h.command)); 8122 /* pSense here is a part of satOrgIOContext */ 8123 pSense = satOrgIOContext->pTiSenseData->senseData; 8124 satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH; 8125 /* unspecified case, return no sense and no addition info */ 8126 satSetSensePayload( pSense, 8127 SCSI_SNSKEY_NO_SENSE, 8128 0, 8129 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8130 satOrgIOContext); 8131 8132 ostiInitiatorIOCompleted( tiRoot, 8133 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8134 tiIOSuccess, 8135 SCSI_STAT_CHECK_CONDITION, 8136 satOrgIOContext->pTiSenseData, 8137 satOrgIOContext->interruptContext ); 8138 8139 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8140 8141 satFreeIntIoResource( tiRoot, 8142 satDevData, 8143 satIntIo); 8144 break; 8145 } /* switch */ 8146 8147 return; 8148 } 8149 8150 /***************************************************************************** 8151 *! \brief satSynchronizeCache10n16CB 8152 * 8153 * This routine is a callback function for satSynchronizeCache10 and 8154 * satSynchronizeCache1016() 8155 * 8156 * \param agRoot: Handles for this instance of SAS/SATA hardware 8157 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 8158 * \param agIOStatus: Status of completed I/O. 8159 * \param agFirstDword:Pointer to the four bytes of FIS. 8160 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 8161 * length. 8162 * \param agParam: Additional info based on status. 8163 * \param ioContext: Pointer to satIOContext_t. 8164 * 8165 * \return: none 8166 * 8167 *****************************************************************************/ 8168 void satSynchronizeCache10n16CB( 8169 agsaRoot_t *agRoot, 8170 agsaIORequest_t *agIORequest, 8171 bit32 agIOStatus, 8172 agsaFisHeader_t *agFirstDword, 8173 bit32 agIOInfoLen, 8174 void *agParam, 8175 void *ioContext 8176 ) 8177 { 8178 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 8179 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 8180 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 8181 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 8182 tdIORequestBody_t *tdIORequestBody; 8183 tdIORequestBody_t *tdOrgIORequestBody; 8184 satIOContext_t *satIOContext; 8185 satIOContext_t *satOrgIOContext; 8186 satInternalIo_t *satIntIo; 8187 satDeviceData_t *satDevData; 8188 8189 scsiRspSense_t *pSense; 8190 tiIniScsiCmnd_t *scsiCmnd; 8191 tiIORequest_t *tiOrgIORequest; 8192 8193 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 8194 bit32 ataStatus = 0; 8195 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 8196 8197 TI_DBG5(("satSynchronizeCache10n16CB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 8198 8199 /* internally generate tiIOContext */ 8200 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 8201 satIOContext = (satIOContext_t *) ioContext; 8202 satIntIo = satIOContext->satIntIoContext; 8203 satDevData = satIOContext->pSatDevData; 8204 hostToDevFis = satIOContext->pFis; 8205 8206 /* SPC: Self-Test Result Log page */ 8207 8208 if (satIntIo == agNULL) 8209 { 8210 TI_DBG4(("satSynchronizeCache10n16CB: External satInternalIo_t satIntIoContext\n")); 8211 satOrgIOContext = satIOContext; 8212 tiOrgIORequest = tdIORequestBody->tiIORequest; 8213 pSense = satIOContext->pSense; 8214 scsiCmnd = satIOContext->pScsiCmnd; 8215 } 8216 else 8217 { 8218 TI_DBG4(("satSynchronizeCache10n16CB: Internal satInternalIo_t satIntIoContext\n")); 8219 satOrgIOContext = satIOContext->satOrgIOContext; 8220 if (satOrgIOContext == agNULL) 8221 { 8222 TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NULL, wrong\n")); 8223 return; 8224 } 8225 else 8226 { 8227 TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NOT NULL\n")); 8228 } 8229 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 8230 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 8231 8232 pSense = satOrgIOContext->pSense; 8233 scsiCmnd = satOrgIOContext->pScsiCmnd; 8234 } 8235 8236 tdIORequestBody->ioCompleted = agTRUE; 8237 tdIORequestBody->ioStarted = agFALSE; 8238 8239 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 8240 { 8241 TI_DBG1(("satSynchronizeCache10n16CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 8242 8243 ostiInitiatorIOCompleted ( 8244 tiRoot, 8245 tiOrgIORequest, 8246 tiIOFailed, 8247 tiDetailOtherError, 8248 agNULL, 8249 satOrgIOContext->interruptContext 8250 ); 8251 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8252 8253 satFreeIntIoResource( tiRoot, 8254 satDevData, 8255 satIntIo); 8256 return; 8257 } 8258 8259 if( agIOStatus != OSSA_IO_SUCCESS) 8260 { 8261 /* only agsaFisRegDeviceToHost_t is expected */ 8262 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 8263 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 8264 } 8265 8266 if( agIOStatus != OSSA_IO_SUCCESS) 8267 { 8268 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 8269 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 8270 ) 8271 { 8272 /* for debugging */ 8273 if( agIOStatus != OSSA_IO_SUCCESS) 8274 { 8275 TI_DBG1(("satSynchronizeCache10n16CB: FAILED, NOT IO_SUCCESS\n")); 8276 } 8277 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 8278 { 8279 TI_DBG1(("satSynchronizeCache10n16CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 8280 } 8281 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 8282 (ataStatus & DF_ATA_STATUS_MASK) 8283 ) 8284 { 8285 TI_DBG1(("satSynchronizeCache10n16CB: FAILED, FAILED, error status\n")); 8286 } 8287 8288 8289 /* Process abort case */ 8290 if (agIOStatus == OSSA_IO_ABORTED) 8291 { 8292 satProcessAbort(tiRoot, 8293 tiOrgIORequest, 8294 satOrgIOContext 8295 ); 8296 8297 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8298 8299 satFreeIntIoResource( tiRoot, 8300 satDevData, 8301 satIntIo); 8302 return; 8303 } 8304 8305 switch (hostToDevFis->h.command) 8306 { 8307 case SAT_FLUSH_CACHE: 8308 TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE failed\n")); 8309 /* checking IMMED bit */ 8310 if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK) 8311 { 8312 satSetDeferredSensePayload( pSense, 8313 SCSI_SNSKEY_NO_SENSE, 8314 0, 8315 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8316 satOrgIOContext); 8317 } 8318 else 8319 { 8320 satSetDeferredSensePayload( pSense, 8321 SCSI_SNSKEY_NO_SENSE, 8322 0, 8323 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8324 satOrgIOContext); 8325 } 8326 8327 8328 ostiInitiatorIOCompleted( tiRoot, 8329 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8330 tiIOSuccess, 8331 SCSI_STAT_CHECK_CONDITION, 8332 satOrgIOContext->pTiSenseData, 8333 satOrgIOContext->interruptContext ); 8334 8335 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8336 8337 satFreeIntIoResource( tiRoot, 8338 satDevData, 8339 satIntIo); 8340 return; 8341 break; 8342 case SAT_FLUSH_CACHE_EXT: 8343 TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT failed\n")); 8344 /* checking IMMED bit */ 8345 if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK) 8346 { 8347 satSetDeferredSensePayload( pSense, 8348 SCSI_SNSKEY_NO_SENSE, 8349 0, 8350 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8351 satOrgIOContext); 8352 } 8353 else 8354 { 8355 satSetDeferredSensePayload( pSense, 8356 SCSI_SNSKEY_NO_SENSE, 8357 0, 8358 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8359 satOrgIOContext); 8360 } 8361 8362 8363 ostiInitiatorIOCompleted( tiRoot, 8364 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8365 tiIOSuccess, 8366 SCSI_STAT_CHECK_CONDITION, 8367 satOrgIOContext->pTiSenseData, 8368 satOrgIOContext->interruptContext ); 8369 8370 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8371 8372 satFreeIntIoResource( tiRoot, 8373 satDevData, 8374 satIntIo); 8375 return; 8376 break; 8377 default: 8378 TI_DBG1(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command)); 8379 satSetSensePayload( pSense, 8380 SCSI_SNSKEY_NO_SENSE, 8381 0, 8382 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8383 satOrgIOContext); 8384 8385 8386 ostiInitiatorIOCompleted( tiRoot, 8387 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8388 tiIOSuccess, 8389 SCSI_STAT_CHECK_CONDITION, 8390 satOrgIOContext->pTiSenseData, 8391 satOrgIOContext->interruptContext ); 8392 8393 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8394 8395 satFreeIntIoResource( tiRoot, 8396 satDevData, 8397 satIntIo); 8398 return; 8399 break; 8400 } 8401 8402 return; 8403 } /* end of error checking */ 8404 } 8405 8406 /* prcessing the success case */ 8407 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8408 8409 satFreeIntIoResource( tiRoot, 8410 satDevData, 8411 satIntIo); 8412 8413 8414 switch (hostToDevFis->h.command) 8415 { 8416 case SAT_FLUSH_CACHE: 8417 TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE success\n")); 8418 8419 /* checking IMMED bit */ 8420 if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)) 8421 { 8422 ostiInitiatorIOCompleted( tiRoot, 8423 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8424 tiIOSuccess, 8425 SCSI_STAT_GOOD, 8426 agNULL, 8427 satOrgIOContext->interruptContext ); 8428 return; 8429 } 8430 8431 8432 break; 8433 case SAT_FLUSH_CACHE_EXT: 8434 TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT success\n")); 8435 8436 /* checking IMMED bit */ 8437 if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)) 8438 { 8439 ostiInitiatorIOCompleted( tiRoot, 8440 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8441 tiIOSuccess, 8442 SCSI_STAT_GOOD, 8443 agNULL, 8444 satOrgIOContext->interruptContext ); 8445 return; 8446 } 8447 8448 break; 8449 default: 8450 TI_DBG5(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command)); 8451 satSetSensePayload( pSense, 8452 SCSI_SNSKEY_NO_SENSE, 8453 0, 8454 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8455 satOrgIOContext); 8456 8457 8458 ostiInitiatorIOCompleted( tiRoot, 8459 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8460 tiIOSuccess, 8461 SCSI_STAT_CHECK_CONDITION, 8462 satOrgIOContext->pTiSenseData, 8463 satOrgIOContext->interruptContext ); 8464 8465 return; 8466 break; 8467 } 8468 8469 return; 8470 } 8471 8472 /***************************************************************************** 8473 *! \brief satModeSelect6n10CB 8474 * 8475 * This routine is a callback function for satModeSelect6() and 8476 * satModeSelect10() 8477 * 8478 * \param agRoot: Handles for this instance of SAS/SATA hardware 8479 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 8480 * \param agIOStatus: Status of completed I/O. 8481 * \param agFirstDword:Pointer to the four bytes of FIS. 8482 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 8483 * length. 8484 * \param agParam: Additional info based on status. 8485 * \param ioContext: Pointer to satIOContext_t. 8486 * 8487 * \return: none 8488 * 8489 *****************************************************************************/ 8490 void satModeSelect6n10CB( 8491 agsaRoot_t *agRoot, 8492 agsaIORequest_t *agIORequest, 8493 bit32 agIOStatus, 8494 agsaFisHeader_t *agFirstDword, 8495 bit32 agIOInfoLen, 8496 void *agParam, 8497 void *ioContext 8498 ) 8499 { 8500 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 8501 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 8502 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 8503 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 8504 tdIORequestBody_t *tdIORequestBody; 8505 tdIORequestBody_t *tdOrgIORequestBody; 8506 satIOContext_t *satIOContext; 8507 satIOContext_t *satOrgIOContext; 8508 satIOContext_t *satNewIOContext; 8509 satInternalIo_t *satIntIo; 8510 satInternalIo_t *satNewIntIo = agNULL; 8511 satDeviceData_t *satDevData; 8512 scsiRspSense_t *pSense; 8513 tiIniScsiCmnd_t *scsiCmnd; 8514 tiIORequest_t *tiOrgIORequest; 8515 8516 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 8517 bit32 ataStatus = 0; 8518 bit32 status; 8519 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */ 8520 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 8521 8522 TI_DBG5(("satModeSelect6n10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 8523 8524 /* internally generate tiIOContext */ 8525 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 8526 satIOContext = (satIOContext_t *) ioContext; 8527 satIntIo = satIOContext->satIntIoContext; 8528 satDevData = satIOContext->pSatDevData; 8529 hostToDevFis = satIOContext->pFis; 8530 8531 if (satIntIo == agNULL) 8532 { 8533 TI_DBG4(("satModeSelect6n10CB: External satInternalIo_t satIntIoContext\n")); 8534 satOrgIOContext = satIOContext; 8535 tiOrgIORequest = tdIORequestBody->tiIORequest; 8536 tiScsiRequest = satOrgIOContext->tiScsiXchg; 8537 pSense = satOrgIOContext->pSense; 8538 scsiCmnd = satOrgIOContext->pScsiCmnd; 8539 } 8540 else 8541 { 8542 TI_DBG4(("satModeSelect6n10CB: Internal satInternalIo_t satIntIoContext\n")); 8543 satOrgIOContext = satIOContext->satOrgIOContext; 8544 if (satOrgIOContext == agNULL) 8545 { 8546 TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NULL, wrong\n")); 8547 return; 8548 } 8549 else 8550 { 8551 TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NOT NULL\n")); 8552 } 8553 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 8554 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 8555 8556 tiScsiRequest = satOrgIOContext->tiScsiXchg; 8557 pSense = satOrgIOContext->pSense; 8558 scsiCmnd = satOrgIOContext->pScsiCmnd; 8559 } 8560 8561 tdIORequestBody->ioCompleted = agTRUE; 8562 tdIORequestBody->ioStarted = agFALSE; 8563 8564 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 8565 { 8566 TI_DBG1(("satModeSelect6n10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 8567 ostiInitiatorIOCompleted ( 8568 tiRoot, 8569 tiOrgIORequest, 8570 tiIOFailed, 8571 tiDetailOtherError, 8572 agNULL, 8573 satOrgIOContext->interruptContext 8574 ); 8575 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8576 8577 satFreeIntIoResource( tiRoot, 8578 satDevData, 8579 satIntIo); 8580 return; 8581 } 8582 8583 if (agIOStatus != OSSA_IO_SUCCESS) 8584 { 8585 /* only agsaFisRegDeviceToHost_t is expected */ 8586 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 8587 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 8588 } 8589 8590 if (agIOStatus != OSSA_IO_SUCCESS) 8591 { 8592 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 8593 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 8594 ) 8595 { 8596 /* for debugging */ 8597 if( agIOStatus != OSSA_IO_SUCCESS) 8598 { 8599 TI_DBG1(("satModeSelect6n10CB FAILED, NOT IO_SUCCESS\n")); 8600 } 8601 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 8602 { 8603 TI_DBG1(("satModeSelect6n10CB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 8604 } 8605 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 8606 (ataStatus & DF_ATA_STATUS_MASK) 8607 ) 8608 { 8609 TI_DBG1(("satModeSelect6n10CB FAILED, FAILED, error status\n")); 8610 } 8611 8612 /* Process abort case */ 8613 if (agIOStatus == OSSA_IO_ABORTED) 8614 { 8615 satProcessAbort(tiRoot, 8616 tiOrgIORequest, 8617 satOrgIOContext 8618 ); 8619 8620 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8621 8622 satFreeIntIoResource( tiRoot, 8623 satDevData, 8624 satIntIo); 8625 return; 8626 } 8627 8628 /* for debugging */ 8629 if (hostToDevFis->h.command == SAT_SET_FEATURES) 8630 { 8631 if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02)) 8632 { 8633 TI_DBG1(("satModeSelect6n10CB 1 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features)); 8634 } 8635 else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55)) 8636 { 8637 TI_DBG1(("ssatModeSelect6n10CB 2 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features)); 8638 } 8639 else 8640 { 8641 TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 8642 } 8643 } 8644 else if (hostToDevFis->h.command == SAT_SMART) 8645 { 8646 if ((hostToDevFis->h.features == SAT_SMART_ENABLE_OPERATIONS) || (hostToDevFis->h.features == SAT_SMART_DISABLE_OPERATIONS)) 8647 { 8648 TI_DBG1(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS failed, feature 0x%x\n", hostToDevFis->h.features)); 8649 } 8650 else 8651 { 8652 TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 8653 } 8654 } 8655 else 8656 { 8657 TI_DBG1(("satModeSelect6n10CB error default case command 0x%x\n", hostToDevFis->h.command)); 8658 } 8659 8660 8661 satSetSensePayload( pSense, 8662 SCSI_SNSKEY_NO_SENSE, 8663 0, 8664 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8665 satOrgIOContext); 8666 8667 ostiInitiatorIOCompleted( tiRoot, 8668 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8669 tiIOSuccess, 8670 SCSI_STAT_CHECK_CONDITION, 8671 satOrgIOContext->pTiSenseData, 8672 satOrgIOContext->interruptContext ); 8673 8674 8675 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8676 8677 satFreeIntIoResource( tiRoot, 8678 satDevData, 8679 satIntIo); 8680 return; 8681 } /* error checking */ 8682 } 8683 8684 8685 /* prcessing the success case */ 8686 8687 8688 if (hostToDevFis->h.command == SAT_SET_FEATURES) 8689 { 8690 if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02)) 8691 { 8692 TI_DBG5(("satModeSelect6n10CB 1 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features)); 8693 8694 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8695 8696 satFreeIntIoResource( tiRoot, 8697 satDevData, 8698 satIntIo); 8699 8700 satNewIntIo = satAllocIntIoResource( tiRoot, 8701 tiOrgIORequest, 8702 satDevData, 8703 0, 8704 satNewIntIo); 8705 if (satNewIntIo == agNULL) 8706 { 8707 /* memory allocation failure */ 8708 satFreeIntIoResource( tiRoot, 8709 satDevData, 8710 satNewIntIo); 8711 8712 satSetSensePayload( pSense, 8713 SCSI_SNSKEY_NO_SENSE, 8714 0, 8715 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8716 satOrgIOContext); 8717 8718 ostiInitiatorIOCompleted( tiRoot, 8719 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8720 tiIOSuccess, 8721 SCSI_STAT_CHECK_CONDITION, 8722 satOrgIOContext->pTiSenseData, 8723 satOrgIOContext->interruptContext ); 8724 TI_DBG1(("satModeSelect6n10CB: momory allocation fails\n")); 8725 return; 8726 } /* end memory allocation */ 8727 8728 satNewIOContext = satPrepareNewIO( 8729 satNewIntIo, 8730 tiOrgIORequest, 8731 satDevData, 8732 scsiCmnd, 8733 satOrgIOContext 8734 ); 8735 /* sends either ATA SET FEATURES based on DRA bit */ 8736 status = satModeSelect6n10_1( tiRoot, 8737 &satNewIntIo->satIntTiIORequest, 8738 satNewIOContext->ptiDeviceHandle, 8739 tiScsiRequest, /* orginal from OS layer */ 8740 satNewIOContext 8741 ); 8742 8743 if (status != tiSuccess) 8744 { 8745 /* sending ATA command fails */ 8746 satFreeIntIoResource( tiRoot, 8747 satDevData, 8748 satNewIntIo); 8749 satSetSensePayload( pSense, 8750 SCSI_SNSKEY_NO_SENSE, 8751 0, 8752 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8753 satOrgIOContext); 8754 8755 ostiInitiatorIOCompleted( tiRoot, 8756 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8757 tiIOSuccess, 8758 SCSI_STAT_CHECK_CONDITION, 8759 satOrgIOContext->pTiSenseData, 8760 satOrgIOContext->interruptContext ); 8761 TI_DBG1(("satModeSelect6n10CB calling satModeSelect6_1 fails\n")); 8762 return; 8763 } /* end send fails */ 8764 return; 8765 } 8766 else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55)) 8767 { 8768 TI_DBG5(("satModeSelect6n10CB 2 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features)); 8769 8770 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8771 8772 satFreeIntIoResource( tiRoot, 8773 satDevData, 8774 satIntIo); 8775 8776 /* return stat_good */ 8777 ostiInitiatorIOCompleted( tiRoot, 8778 tiOrgIORequest, 8779 tiIOSuccess, 8780 SCSI_STAT_GOOD, 8781 agNULL, 8782 satOrgIOContext->interruptContext ); 8783 return; 8784 } 8785 else 8786 { 8787 TI_DBG1(("satModeSelect6n10CB error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 8788 8789 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8790 8791 satFreeIntIoResource( tiRoot, 8792 satDevData, 8793 satIntIo); 8794 satSetSensePayload( pSense, 8795 SCSI_SNSKEY_NO_SENSE, 8796 0, 8797 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8798 satOrgIOContext); 8799 8800 ostiInitiatorIOCompleted( tiRoot, 8801 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8802 tiIOSuccess, 8803 SCSI_STAT_CHECK_CONDITION, 8804 satOrgIOContext->pTiSenseData, 8805 satOrgIOContext->interruptContext ); 8806 return; 8807 } 8808 } 8809 else if (hostToDevFis->h.command == SAT_SMART_ENABLE_OPERATIONS || 8810 hostToDevFis->h.command == SAT_SMART_DISABLE_OPERATIONS 8811 ) 8812 { 8813 if ((hostToDevFis->h.features == 0xD8) || (hostToDevFis->h.features == 0xD9)) 8814 { 8815 TI_DBG5(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS success, feature 0x%x\n", hostToDevFis->h.features)); 8816 8817 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8818 8819 satFreeIntIoResource( tiRoot, 8820 satDevData, 8821 satIntIo); 8822 /* return stat_good */ 8823 ostiInitiatorIOCompleted( tiRoot, 8824 tiOrgIORequest, 8825 tiIOSuccess, 8826 SCSI_STAT_GOOD, 8827 agNULL, 8828 satOrgIOContext->interruptContext ); 8829 return; 8830 } 8831 else 8832 { 8833 TI_DBG1(("satModeSelect6n10CB error unknown command failed 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 8834 8835 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8836 8837 satFreeIntIoResource( tiRoot, 8838 satDevData, 8839 satIntIo); 8840 satSetSensePayload( pSense, 8841 SCSI_SNSKEY_NO_SENSE, 8842 0, 8843 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8844 satOrgIOContext); 8845 8846 ostiInitiatorIOCompleted( tiRoot, 8847 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8848 tiIOSuccess, 8849 SCSI_STAT_CHECK_CONDITION, 8850 satOrgIOContext->pTiSenseData, 8851 satOrgIOContext->interruptContext ); 8852 return; 8853 } 8854 } 8855 8856 else 8857 { 8858 TI_DBG1(("satModeSelect6n10CB error default case command success 0x%x\n", hostToDevFis->h.command)); 8859 8860 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8861 8862 satFreeIntIoResource( tiRoot, 8863 satDevData, 8864 satIntIo); 8865 8866 satSetSensePayload( pSense, 8867 SCSI_SNSKEY_NO_SENSE, 8868 0, 8869 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8870 satOrgIOContext); 8871 8872 ostiInitiatorIOCompleted( tiRoot, 8873 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8874 tiIOSuccess, 8875 SCSI_STAT_CHECK_CONDITION, 8876 satOrgIOContext->pTiSenseData, 8877 satOrgIOContext->interruptContext ); 8878 return; 8879 } 8880 8881 return; 8882 } 8883 8884 /***************************************************************************** 8885 *! \brief satSMARTEnableCB 8886 * 8887 * This routine is a callback function for satSMARTEnable() 8888 * 8889 * \param agRoot: Handles for this instance of SAS/SATA hardware 8890 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 8891 * \param agIOStatus: Status of completed I/O. 8892 * \param agFirstDword:Pointer to the four bytes of FIS. 8893 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 8894 * length. 8895 * \param agParam: Additional info based on status. 8896 * \param ioContext: Pointer to satIOContext_t. 8897 * 8898 * \return: none 8899 * 8900 *****************************************************************************/ 8901 void satSMARTEnableCB( 8902 agsaRoot_t *agRoot, 8903 agsaIORequest_t *agIORequest, 8904 bit32 agIOStatus, 8905 agsaFisHeader_t *agFirstDword, 8906 bit32 agIOInfoLen, 8907 void *agParam, 8908 void *ioContext 8909 ) 8910 { 8911 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 8912 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 8913 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 8914 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 8915 tdIORequestBody_t *tdIORequestBody; 8916 tdIORequestBody_t *tdOrgIORequestBody; 8917 satIOContext_t *satIOContext; 8918 satIOContext_t *satOrgIOContext; 8919 satIOContext_t *satNewIOContext; 8920 satInternalIo_t *satIntIo; 8921 satInternalIo_t *satNewIntIo = agNULL; 8922 satDeviceData_t *satDevData; 8923 tiIORequest_t *tiOrgIORequest; 8924 tiIniScsiCmnd_t *scsiCmnd; 8925 bit32 status; 8926 8927 TI_DBG4(("satSMARTEnableCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 8928 8929 /* internally generate tiIOContext */ 8930 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 8931 satIOContext = (satIOContext_t *) ioContext; 8932 satIntIo = satIOContext->satIntIoContext; 8933 satDevData = satIOContext->pSatDevData; 8934 8935 /*ttttttthe one */ 8936 if (satIntIo == agNULL) 8937 { 8938 TI_DBG4(("satSMARTEnableCB: External satInternalIo_t satIntIoContext\n")); 8939 satOrgIOContext = satIOContext; 8940 tiOrgIORequest = tdIORequestBody->tiIORequest; 8941 scsiCmnd = satOrgIOContext->pScsiCmnd; 8942 } 8943 else 8944 { 8945 TI_DBG4(("satSMARTEnableCB: Internal satInternalIo_t satIntIoContext\n")); 8946 satOrgIOContext = satIOContext->satOrgIOContext; 8947 if (satOrgIOContext == agNULL) 8948 { 8949 TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NULL, wrong\n")); 8950 return; 8951 } 8952 else 8953 { 8954 TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NOT NULL\n")); 8955 } 8956 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 8957 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 8958 8959 scsiCmnd = satOrgIOContext->pScsiCmnd; 8960 } 8961 8962 tdIORequestBody->ioCompleted = agTRUE; 8963 tdIORequestBody->ioStarted = agFALSE; 8964 8965 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 8966 { 8967 TI_DBG1(("satSMARTEnableCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 8968 ostiInitiatorIOCompleted ( 8969 tiRoot, 8970 tiOrgIORequest, 8971 tiIOFailed, 8972 tiDetailOtherError, 8973 agNULL, 8974 satOrgIOContext->interruptContext 8975 ); 8976 8977 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8978 8979 satFreeIntIoResource( tiRoot, 8980 satDevData, 8981 satIntIo); 8982 8983 return; 8984 } 8985 8986 /* 8987 checking IO status, FIS type and error status 8988 */ 8989 if (agIOStatus != OSSA_IO_SUCCESS) 8990 { 8991 TI_DBG1(("satSMARTEnableCB: not success status, status %d\n", agIOStatus)); 8992 ostiInitiatorIOCompleted ( 8993 tiRoot, 8994 tiOrgIORequest, 8995 tiIOFailed, 8996 tiDetailOtherError, 8997 agNULL, 8998 satOrgIOContext->interruptContext 8999 ); 9000 9001 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9002 9003 satFreeIntIoResource( tiRoot, 9004 satDevData, 9005 satIntIo); 9006 9007 return; 9008 } 9009 9010 /* process success case */ 9011 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9012 9013 satFreeIntIoResource( tiRoot, 9014 satDevData, 9015 satIntIo); 9016 9017 satNewIntIo = satAllocIntIoResource( tiRoot, 9018 tiOrgIORequest, 9019 satDevData, 9020 512, 9021 satNewIntIo); 9022 9023 if (satNewIntIo == agNULL) 9024 { 9025 /* memory allocation failure */ 9026 satFreeIntIoResource( tiRoot, 9027 satDevData, 9028 satNewIntIo); 9029 9030 ostiInitiatorIOCompleted ( 9031 tiRoot, 9032 tiOrgIORequest, 9033 tiIOFailed, 9034 tiDetailOtherError, 9035 agNULL, 9036 satOrgIOContext->interruptContext 9037 ); 9038 return; 9039 } 9040 9041 satNewIOContext = satPrepareNewIO( 9042 satNewIntIo, 9043 tiOrgIORequest, 9044 satDevData, 9045 scsiCmnd, 9046 satOrgIOContext 9047 ); 9048 9049 status = satLogSense_1(tiRoot, 9050 &satNewIntIo->satIntTiIORequest, 9051 satNewIOContext->ptiDeviceHandle, 9052 &satNewIntIo->satIntTiScsiXchg, 9053 satNewIOContext); 9054 9055 if (status != tiSuccess) 9056 { 9057 /* sending SAT_CHECK_POWER_MODE fails */ 9058 satFreeIntIoResource( tiRoot, 9059 satDevData, 9060 satNewIntIo); 9061 9062 ostiInitiatorIOCompleted ( 9063 tiRoot, 9064 tiOrgIORequest, 9065 tiIOFailed, 9066 tiDetailOtherError, 9067 agNULL, 9068 satOrgIOContext->interruptContext 9069 ); 9070 9071 return; 9072 } 9073 9074 return; 9075 } 9076 9077 9078 /***************************************************************************** 9079 *! \brief satLogSenseCB 9080 * 9081 * This routine is a callback function for satLogSense() 9082 * 9083 * \param agRoot: Handles for this instance of SAS/SATA hardware 9084 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 9085 * \param agIOStatus: Status of completed I/O. 9086 * \param agFirstDword:Pointer to the four bytes of FIS. 9087 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 9088 * length. 9089 * \param agParam: Additional info based on status. 9090 * \param ioContext: Pointer to satIOContext_t. 9091 * 9092 * \return: none 9093 * 9094 *****************************************************************************/ 9095 void satLogSenseCB( 9096 agsaRoot_t *agRoot, 9097 agsaIORequest_t *agIORequest, 9098 bit32 agIOStatus, 9099 agsaFisHeader_t *agFirstDword, 9100 bit32 agIOInfoLen, 9101 void *agParam, 9102 void *ioContext 9103 ) 9104 { 9105 9106 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 9107 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 9108 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 9109 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 9110 tdIORequestBody_t *tdIORequestBody; 9111 tdIORequestBody_t *tdOrgIORequestBody; 9112 satIOContext_t *satIOContext; 9113 satIOContext_t *satOrgIOContext; 9114 satInternalIo_t *satIntIo; 9115 satDeviceData_t *satDevData; 9116 9117 scsiRspSense_t *pSense; 9118 tiIORequest_t *tiOrgIORequest; 9119 9120 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 9121 bit32 ataStatus = 0; 9122 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */ 9123 tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */ 9124 satReadLogExtSelfTest_t *virtAddr1; 9125 satSmartReadLogSelfTest_t *virtAddr2; 9126 bit8 *pLogPage; 9127 bit8 SelfTestExecutionStatus = 0; 9128 bit32 i = 0; 9129 9130 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 9131 agsaFisRegD2HData_t statDevToHostFisData; 9132 tiIniScsiCmnd_t *scsiCmnd; 9133 bit32 lenReceived = 0; 9134 9135 TI_DBG5(("satLogSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 9136 9137 /* internally generate tiIOContext */ 9138 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 9139 satIOContext = (satIOContext_t *) ioContext; 9140 if (satIOContext == agNULL) 9141 { 9142 TI_DBG1(("satLogSenseCB: satIOContext is NULL\n")); 9143 return; 9144 } 9145 satIntIo = satIOContext->satIntIoContext; 9146 satDevData = satIOContext->pSatDevData; 9147 hostToDevFis = satIOContext->pFis; 9148 9149 if (satIntIo == agNULL) 9150 { 9151 TI_DBG4(("satLogSenseCB: External satInternalIo_t satIntIoContext\n")); 9152 satOrgIOContext = satIOContext; 9153 tiOrgIORequest = tdIORequestBody->tiIORequest; 9154 pSense = satOrgIOContext->pSense; 9155 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg; 9156 /* SCSI command response payload to OS layer */ 9157 pLogPage = (bit8 *) tiOrgScsiRequest->sglVirtualAddr; 9158 /* ATA command response payload */ 9159 tiScsiRequest = satOrgIOContext->tiScsiXchg; 9160 scsiCmnd = satOrgIOContext->pScsiCmnd; 9161 } 9162 else 9163 { 9164 TI_DBG4(("satLogSenseCB: Internal satInternalIo_t satIntIoContext\n")); 9165 satOrgIOContext = satIOContext->satOrgIOContext; 9166 if (satOrgIOContext == agNULL) 9167 { 9168 TI_DBG4(("satLogSenseCB: satOrgIOContext is NULL\n")); 9169 } 9170 else 9171 { 9172 TI_DBG4(("satLogSenseCB: satOrgIOContext is NOT NULL\n")); 9173 } 9174 9175 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 9176 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 9177 9178 pSense = satOrgIOContext->pSense; 9179 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg; 9180 /* SCSI command response payload to OS layer */ 9181 pLogPage = (bit8 *) tiOrgScsiRequest->sglVirtualAddr; 9182 /* ATA command response payload */ 9183 tiScsiRequest = (tiScsiInitiatorRequest_t *)&(satIntIo->satIntTiScsiXchg); 9184 scsiCmnd = satOrgIOContext->pScsiCmnd; 9185 } 9186 9187 tdIORequestBody->ioCompleted = agTRUE; 9188 tdIORequestBody->ioStarted = agFALSE; 9189 9190 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 9191 { 9192 TI_DBG1(("satLogSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 9193 ostiInitiatorIOCompleted ( 9194 tiRoot, 9195 tiOrgIORequest, 9196 tiIOFailed, 9197 tiDetailOtherError, 9198 agNULL, 9199 satOrgIOContext->interruptContext 9200 ); 9201 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9202 9203 satFreeIntIoResource( tiRoot, 9204 satDevData, 9205 satIntIo); 9206 return; 9207 } 9208 9209 if (agIOStatus != OSSA_IO_SUCCESS) 9210 { 9211 /* non-data and pio read -> device to host and pio setup fis are expected */ 9212 /* 9213 first, assumed to be Reg Device to Host FIS 9214 This is OK to just find fis type 9215 */ 9216 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 9217 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 9218 } 9219 9220 if( agIOStatus != OSSA_IO_SUCCESS) 9221 { 9222 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) && 9223 (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)) || 9224 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 9225 ) 9226 { 9227 /* for debugging */ 9228 if( agIOStatus != OSSA_IO_SUCCESS) 9229 { 9230 TI_DBG1(("satLogSenseCB: FAILED, NOT IO_SUCCESS\n")); 9231 } 9232 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 9233 { 9234 TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 9235 } 9236 else if (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) 9237 { 9238 TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 9239 } 9240 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 9241 (ataStatus & DF_ATA_STATUS_MASK) 9242 ) 9243 { 9244 TI_DBG1(("satLogSenseCB: FAILED, FAILED, error status\n")); 9245 } 9246 9247 /* Process abort case */ 9248 if (agIOStatus == OSSA_IO_ABORTED) 9249 { 9250 satProcessAbort(tiRoot, 9251 tiOrgIORequest, 9252 satOrgIOContext 9253 ); 9254 9255 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9256 9257 satFreeIntIoResource( tiRoot, 9258 satDevData, 9259 satIntIo); 9260 return; 9261 } 9262 9263 /* for debugging */ 9264 if (hostToDevFis->h.command == SAT_READ_LOG_EXT) 9265 { 9266 TI_DBG1(("satLogSenseCB: SAT_READ_LOG_EXT failed\n")); 9267 } 9268 else if (hostToDevFis->h.command == SAT_SMART) 9269 { 9270 if (hostToDevFis->h.features == SAT_SMART_READ_LOG) 9271 { 9272 TI_DBG1(("satLogSenseCB: SAT_SMART_READ_LOG failed\n")); 9273 } 9274 else if (hostToDevFis->h.features == SAT_SMART_RETURN_STATUS) 9275 { 9276 TI_DBG1(("satLogSenseCB: SAT_SMART_RETURN_STATUS failed\n")); 9277 } 9278 else 9279 { 9280 TI_DBG1(("satLogSenseCB: error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 9281 } 9282 } 9283 else 9284 { 9285 TI_DBG1(("satLogSenseCB: error default case command 0x%x\n", hostToDevFis->h.command)); 9286 } 9287 9288 satSetSensePayload( pSense, 9289 SCSI_SNSKEY_NO_SENSE, 9290 0, 9291 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9292 satOrgIOContext); 9293 9294 ostiInitiatorIOCompleted( tiRoot, 9295 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9296 tiIOSuccess, 9297 SCSI_STAT_CHECK_CONDITION, 9298 satOrgIOContext->pTiSenseData, 9299 satOrgIOContext->interruptContext ); 9300 9301 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9302 9303 satFreeIntIoResource( tiRoot, 9304 satDevData, 9305 satIntIo); 9306 return; 9307 9308 } /* error checking */ 9309 } 9310 9311 /* prcessing the success case */ 9312 saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t)); 9313 9314 lenReceived = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8]; 9315 TI_DBG5(("satLogSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived)); 9316 9317 9318 if (hostToDevFis->h.command == SAT_READ_LOG_EXT) 9319 { 9320 TI_DBG5(("satLogSenseCB: SAT_READ_LOG_EXT success\n")); 9321 9322 /* process log data and sends it to upper */ 9323 9324 /* ATA: Extended Self-Test Log */ 9325 virtAddr1 = (satReadLogExtSelfTest_t *)(tiScsiRequest->sglVirtualAddr); 9326 /* 9327 ATA/ATAPI VOLII, p197, 287 9328 self-test execution status (4 bits); ((virtAddr1->byte[5] & 0xF0) >> 4) 9329 */ 9330 SelfTestExecutionStatus = (bit8)(((virtAddr1->byte[5] & 0xF0) >> 4)); 9331 9332 /* fills in the log page from ATA log page */ 9333 /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */ 9334 pLogPage[0] = 0x10; /* page code */ 9335 pLogPage[1] = 0; 9336 pLogPage[2] = 0x01; /* 0x190, page length */ 9337 pLogPage[3] = 0x90; 9338 9339 /* SPC-4, Table 217 */ 9340 pLogPage[4] = 0; /* Parameter Code */ 9341 pLogPage[5] = 0x01; /* Parameter Code, unspecfied but ... */ 9342 pLogPage[6] = 3; /* unspecified but ... */ 9343 pLogPage[7] = 0x10; /* Parameter Length */ 9344 pLogPage[8] = (bit8)(0 | ((virtAddr1->byte[5] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */ 9345 pLogPage[9] = 0; /* self test number */ 9346 pLogPage[10] = virtAddr1->byte[7]; /* time stamp, MSB */ 9347 pLogPage[11] = virtAddr1->byte[6]; /* time stamp, LSB */ 9348 9349 pLogPage[12] = 0; /* address of first failure MSB*/ 9350 pLogPage[13] = 0; /* address of first failure */ 9351 pLogPage[14] = virtAddr1->byte[14]; /* address of first failure */ 9352 pLogPage[15] = virtAddr1->byte[13]; /* address of first failure */ 9353 pLogPage[16] = virtAddr1->byte[12]; /* address of first failure */ 9354 pLogPage[17] = virtAddr1->byte[11]; /* address of first failure */ 9355 pLogPage[18] = virtAddr1->byte[10]; /* address of first failure */ 9356 pLogPage[19] = virtAddr1->byte[9]; /* address of first failure LSB */ 9357 9358 /* SAT rev8 Table75, p 76 */ 9359 switch (SelfTestExecutionStatus) 9360 { 9361 case 0: 9362 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9363 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9364 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9365 break; 9366 case 1: 9367 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9368 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9369 pLogPage[22] = 0x81; 9370 break; 9371 case 2: 9372 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9373 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9374 pLogPage[22] = 0x82; 9375 break; 9376 case 3: 9377 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9378 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9379 pLogPage[22] = 0x83; 9380 break; 9381 case 4: 9382 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9383 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9384 pLogPage[22] = 0x84; 9385 break; 9386 case 5: 9387 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9388 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9389 pLogPage[22] = 0x85; 9390 break; 9391 case 6: 9392 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9393 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9394 pLogPage[22] = 0x86; 9395 break; 9396 case 7: 9397 pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR; 9398 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9399 pLogPage[22] = 0x87; 9400 break; 9401 case 8: 9402 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9403 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9404 pLogPage[22] = 0x88; 9405 break; 9406 case 9: /* fall through */ 9407 case 10:/* fall through */ 9408 case 11:/* fall through */ 9409 case 12:/* fall through */ 9410 case 13:/* fall through */ 9411 case 14: 9412 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9413 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9414 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9415 break; 9416 case 15: 9417 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9418 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9419 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9420 break; 9421 default: 9422 TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus)); 9423 9424 satSetSensePayload( pSense, 9425 SCSI_SNSKEY_NO_SENSE, 9426 0, 9427 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9428 satOrgIOContext); 9429 9430 ostiInitiatorIOCompleted( tiRoot, 9431 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9432 tiIOSuccess, 9433 SCSI_STAT_CHECK_CONDITION, 9434 satOrgIOContext->pTiSenseData, 9435 satOrgIOContext->interruptContext ); 9436 9437 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9438 9439 satFreeIntIoResource( tiRoot, 9440 satDevData, 9441 satIntIo); 9442 9443 return; 9444 } 9445 9446 pLogPage[23] = 0; /* vendor specific */ 9447 9448 /* the rest of Self-test results log */ 9449 /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/ 9450 for (i=24;i<=403;i++) 9451 { 9452 pLogPage[i] = 0; /* vendor specific */ 9453 } 9454 9455 if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived) 9456 { 9457 TI_DBG6(("satLogSenseCB: 1st underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH)); 9458 9459 /* underrun */ 9460 ostiInitiatorIOCompleted( tiRoot, 9461 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 9462 tiIOUnderRun, 9463 lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH, 9464 agNULL, 9465 satOrgIOContext->interruptContext ); 9466 9467 } 9468 else 9469 { 9470 ostiInitiatorIOCompleted( tiRoot, 9471 tiOrgIORequest, 9472 tiIOSuccess, 9473 SCSI_STAT_GOOD, 9474 agNULL, 9475 satOrgIOContext->interruptContext); 9476 } 9477 9478 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9479 9480 satFreeIntIoResource( tiRoot, 9481 satDevData, 9482 satIntIo); 9483 9484 return; 9485 } 9486 else if (hostToDevFis->h.command == SAT_SMART_READ_LOG 9487 || hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) 9488 { 9489 if (hostToDevFis->h.features == 0xd5) 9490 { 9491 TI_DBG5(("satLogSenseCB: SAT_SMART_READ_LOG success\n")); 9492 /* process log data and sends it to upper */ 9493 9494 /* ATA: Extended Self-Test Log */ 9495 virtAddr2 = (satSmartReadLogSelfTest_t *)(tiScsiRequest->sglVirtualAddr); 9496 /* 9497 SPC-4, p197, 287 9498 self-test execution status (4 bits); ((virtAddr2->byte[3] & 0xF0) >> 4) 9499 */ 9500 SelfTestExecutionStatus = (bit8)(((virtAddr2->byte[3] & 0xF0) >> 4)); 9501 9502 /* fills in the log page from ATA log page */ 9503 /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */ 9504 pLogPage[0] = 0x10; /* page code */ 9505 pLogPage[1] = 0; 9506 pLogPage[2] = 0x01; /* 0x190, page length */ 9507 pLogPage[3] = 0x90; /* 0x190, page length */ 9508 9509 /* SPC-4, Table 217 */ 9510 pLogPage[4] = 0; /* Parameter Code */ 9511 pLogPage[5] = 0x01; /* Parameter Code unspecfied but ... */ 9512 pLogPage[6] = 3; /* unspecified but ... */ 9513 pLogPage[7] = 0x10; /* Parameter Length */ 9514 pLogPage[8] = (bit8)(0 | ((virtAddr2->byte[3] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */ 9515 pLogPage[9] = 0; /* self test number */ 9516 pLogPage[10] = virtAddr2->byte[5]; /* time stamp, MSB */ 9517 pLogPage[11] = virtAddr2->byte[4]; /* time stamp, LSB */ 9518 9519 pLogPage[12] = 0; /* address of first failure MSB*/ 9520 pLogPage[13] = 0; /* address of first failure */ 9521 pLogPage[14] = 0; /* address of first failure */ 9522 pLogPage[15] = 0; /* address of first failure */ 9523 pLogPage[16] = virtAddr2->byte[10]; /* address of first failure */ 9524 pLogPage[17] = virtAddr2->byte[9]; /* address of first failure */ 9525 pLogPage[18] = virtAddr2->byte[8]; /* address of first failure */ 9526 pLogPage[19] = virtAddr2->byte[7]; /* address of first failure LSB */ 9527 9528 /* SAT rev8 Table75, p 76 */ 9529 switch (SelfTestExecutionStatus) 9530 { 9531 case 0: 9532 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9533 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9534 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9535 break; 9536 case 1: 9537 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9538 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9539 pLogPage[22] = 0x81; 9540 break; 9541 case 2: 9542 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9543 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9544 pLogPage[22] = 0x82; 9545 break; 9546 case 3: 9547 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9548 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9549 pLogPage[22] = 0x83; 9550 break; 9551 case 4: 9552 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9553 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9554 pLogPage[22] = 0x84; 9555 break; 9556 case 5: 9557 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9558 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9559 pLogPage[22] = 0x85; 9560 break; 9561 case 6: 9562 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9563 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9564 pLogPage[22] = 0x86; 9565 break; 9566 case 7: 9567 pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR; 9568 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9569 pLogPage[22] = 0x87; 9570 break; 9571 case 8: 9572 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9573 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9574 pLogPage[22] = 0x88; 9575 break; 9576 case 9: /* fall through */ 9577 case 10:/* fall through */ 9578 case 11:/* fall through */ 9579 case 12:/* fall through */ 9580 case 13:/* fall through */ 9581 case 14: 9582 /* unspecified */ 9583 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9584 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9585 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9586 break; 9587 case 15: 9588 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9589 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9590 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9591 break; 9592 default: 9593 TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus)); 9594 9595 satSetSensePayload( pSense, 9596 SCSI_SNSKEY_NO_SENSE, 9597 0, 9598 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9599 satOrgIOContext); 9600 9601 ostiInitiatorIOCompleted( tiRoot, 9602 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9603 tiIOSuccess, 9604 SCSI_STAT_CHECK_CONDITION, 9605 satOrgIOContext->pTiSenseData, 9606 satOrgIOContext->interruptContext ); 9607 9608 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9609 9610 satFreeIntIoResource( tiRoot, 9611 satDevData, 9612 satIntIo); 9613 9614 return; 9615 } 9616 9617 pLogPage[23] = 0; /* vendor specific */ 9618 9619 /* the rest of Self-test results log */ 9620 /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/ 9621 for (i=24;i<=403;i++) 9622 { 9623 pLogPage[i] = 0; /* vendor specific */ 9624 } 9625 9626 if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived) 9627 { 9628 TI_DBG6(("satLogSenseCB: 2nd underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH)); 9629 9630 /* underrun */ 9631 ostiInitiatorIOCompleted( tiRoot, 9632 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 9633 tiIOUnderRun, 9634 lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH, 9635 agNULL, 9636 satOrgIOContext->interruptContext ); 9637 9638 } 9639 else 9640 { 9641 ostiInitiatorIOCompleted( tiRoot, 9642 tiOrgIORequest, 9643 tiIOSuccess, 9644 SCSI_STAT_GOOD, 9645 agNULL, 9646 satOrgIOContext->interruptContext); 9647 } 9648 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9649 9650 satFreeIntIoResource( tiRoot, 9651 satDevData, 9652 satIntIo); 9653 9654 return; 9655 } 9656 else if (hostToDevFis->h.features == 0xda) 9657 { 9658 TI_DBG5(("satLogSenseCB: SAT_SMART_RETURN_STATUS success\n")); 9659 9660 /* fills in the log page from ATA output */ 9661 /* SPC-4, 7.2.5, Table 209, 211, p 255 */ 9662 pLogPage[0] = 0x2F; /* page code unspecified */ 9663 pLogPage[1] = 0; /* reserved */ 9664 pLogPage[2] = 0; /* page length */ 9665 pLogPage[3] = 0x07; /* page length */ 9666 9667 /* 9668 SPC-4, 7.2.5, Table 211, p 255 9669 no vendor specific field 9670 */ 9671 pLogPage[4] = 0; /* Parameter Code */ 9672 pLogPage[5] = 0; /* Parameter Code unspecfied but to do: */ 9673 pLogPage[6] = 0; /* unspecified */ 9674 pLogPage[7] = 0x03; /* Parameter length, unspecified */ 9675 9676 /* SAT rev8, 10.2.3.1 Table 72, p 73 */ 9677 if (statDevToHostFisData.lbaMid == 0x4F || statDevToHostFisData.lbaHigh == 0xC2) 9678 { 9679 pLogPage[8] = 0; /* Sense code */ 9680 pLogPage[9] = 0; /* Sense code qualifier */ 9681 } 9682 else if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C) 9683 { 9684 pLogPage[8] = 0x5D; /* Sense code */ 9685 pLogPage[9] = 0x10; /* Sense code qualifier */ 9686 } 9687 9688 /* Assumption: No support for SCT */ 9689 pLogPage[10] = 0xFF; /* Most Recent Temperature Reading */ 9690 9691 if (INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH < lenReceived) 9692 { 9693 TI_DBG6(("satLogSenseCB: 3rd underrun lenReceived %d len %d \n", lenReceived, INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH)); 9694 9695 /* underrun */ 9696 ostiInitiatorIOCompleted( tiRoot, 9697 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 9698 tiIOUnderRun, 9699 lenReceived - INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH, 9700 agNULL, 9701 satOrgIOContext->interruptContext ); 9702 9703 } 9704 else 9705 { 9706 ostiInitiatorIOCompleted( tiRoot, 9707 tiOrgIORequest, 9708 tiIOSuccess, 9709 SCSI_STAT_GOOD, 9710 agNULL, 9711 satOrgIOContext->interruptContext); 9712 } 9713 9714 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9715 9716 satFreeIntIoResource( tiRoot, 9717 satDevData, 9718 satIntIo); 9719 9720 9721 return; 9722 } 9723 else 9724 { 9725 TI_DBG1(("satLogSenseCB: error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 9726 satSetSensePayload( pSense, 9727 SCSI_SNSKEY_NO_SENSE, 9728 0, 9729 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9730 satOrgIOContext); 9731 9732 ostiInitiatorIOCompleted( tiRoot, 9733 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9734 tiIOSuccess, 9735 SCSI_STAT_CHECK_CONDITION, 9736 satOrgIOContext->pTiSenseData, 9737 satOrgIOContext->interruptContext ); 9738 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9739 9740 satFreeIntIoResource( tiRoot, 9741 satDevData, 9742 satIntIo); 9743 9744 return; 9745 } 9746 } 9747 else 9748 { 9749 TI_DBG1(("satLogSenseCB: error unknown command success 0x%x\n", hostToDevFis->h.command)); 9750 satSetSensePayload( pSense, 9751 SCSI_SNSKEY_NO_SENSE, 9752 0, 9753 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9754 satOrgIOContext); 9755 9756 ostiInitiatorIOCompleted( tiRoot, 9757 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9758 tiIOSuccess, 9759 SCSI_STAT_CHECK_CONDITION, 9760 satOrgIOContext->pTiSenseData, 9761 satOrgIOContext->interruptContext ); 9762 9763 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9764 9765 satFreeIntIoResource( tiRoot, 9766 satDevData, 9767 satIntIo); 9768 9769 return; 9770 } 9771 9772 return; 9773 } 9774 9775 /***************************************************************************** 9776 *! \brief satReadMediaSerialNumberCB 9777 * 9778 * This routine is a callback function called from ossaSATACompleted(). 9779 * This CB routine deals with Read Media Serial Number completion. 9780 * 9781 * \param agRoot: Handles for this instance of SAS/SATA hardware 9782 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 9783 * \param agIOStatus: Status of completed I/O. 9784 * \param agSATAParm1: Additional info based on status. 9785 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 9786 * length. 9787 * \param ioContext: Pointer to satIOContext_t. 9788 * 9789 * \return: none 9790 * 9791 *****************************************************************************/ 9792 void satReadMediaSerialNumberCB( 9793 agsaRoot_t *agRoot, 9794 agsaIORequest_t *agIORequest, 9795 bit32 agIOStatus, 9796 agsaFisHeader_t *agFirstDword, 9797 bit32 agIOInfoLen, 9798 agsaFrameHandle_t agFrameHandle, 9799 void *ioContext 9800 ) 9801 { 9802 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 9803 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 9804 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 9805 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 9806 tdIORequestBody_t *tdIORequestBody; 9807 tdIORequestBody_t *tdOrgIORequestBody; 9808 satIOContext_t *satIOContext; 9809 satIOContext_t *satOrgIOContext; 9810 satInternalIo_t *satIntIo; 9811 satDeviceData_t *satDevData; 9812 9813 scsiRspSense_t *pSense; 9814 tiIORequest_t *tiOrgIORequest; 9815 9816 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 9817 tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */ 9818 bit8 *pMediaSerialNumber; 9819 9820 tiIniScsiCmnd_t *scsiCmnd; 9821 bit32 lenReceived = 0; 9822 9823 TI_DBG4(("satReadMediaSerialNumberCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 9824 9825 /* internally generate tiIOContext */ 9826 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 9827 satIOContext = (satIOContext_t *) ioContext; 9828 satIntIo = satIOContext->satIntIoContext; 9829 satDevData = satIOContext->pSatDevData; 9830 hostToDevFis = satIOContext->pFis; 9831 9832 if (satIntIo == agNULL) 9833 { 9834 TI_DBG4(("satReadMediaSerialNumberCB: External satInternalIo_t satIntIoContext\n")); 9835 satOrgIOContext = satIOContext; 9836 tiOrgIORequest = tdIORequestBody->tiIORequest; 9837 pSense = satOrgIOContext->pSense; 9838 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg; 9839 /* SCSI command response payload to OS layer */ 9840 pMediaSerialNumber = (bit8 *) tiOrgScsiRequest->sglVirtualAddr; 9841 /* ATA command response payload */ 9842 scsiCmnd = satOrgIOContext->pScsiCmnd; 9843 9844 9845 } 9846 else 9847 { 9848 TI_DBG4(("satReadMediaSerialNumberCB: Internal satInternalIo_t satIntIoContext\n")); 9849 satOrgIOContext = satIOContext->satOrgIOContext; 9850 if (satOrgIOContext == agNULL) 9851 { 9852 TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NULL, wrong\n")); 9853 return; 9854 } 9855 else 9856 { 9857 TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NOT NULL\n")); 9858 } 9859 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 9860 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 9861 9862 pSense = satOrgIOContext->pSense; 9863 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg; 9864 /* SCSI command response payload to OS layer */ 9865 pMediaSerialNumber = (bit8 *) tiOrgScsiRequest->sglVirtualAddr; 9866 /* ATA command response payload */ 9867 scsiCmnd = satOrgIOContext->pScsiCmnd; 9868 } 9869 9870 tdIORequestBody->ioCompleted = agTRUE; 9871 tdIORequestBody->ioStarted = agFALSE; 9872 9873 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 9874 { 9875 TI_DBG1(("satReadMediaSerialNumberCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 9876 ostiInitiatorIOCompleted ( 9877 tiRoot, 9878 tiOrgIORequest, 9879 tiIOFailed, 9880 tiDetailOtherError, 9881 agNULL, 9882 satOrgIOContext->interruptContext 9883 ); 9884 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9885 9886 satFreeIntIoResource( tiRoot, 9887 satDevData, 9888 satIntIo); 9889 return; 9890 } 9891 9892 if( agIOStatus != OSSA_IO_SUCCESS) 9893 { 9894 /* Process abort case */ 9895 if (agIOStatus == OSSA_IO_ABORTED) 9896 { 9897 satProcessAbort(tiRoot, 9898 tiOrgIORequest, 9899 satOrgIOContext 9900 ); 9901 9902 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9903 9904 satFreeIntIoResource( tiRoot, 9905 satDevData, 9906 satIntIo); 9907 return; 9908 } 9909 satSetSensePayload( pSense, 9910 SCSI_SNSKEY_NOT_READY, 9911 0, 9912 SCSI_SNSCODE_MEDIUM_NOT_PRESENT, 9913 satOrgIOContext); 9914 9915 ostiInitiatorIOCompleted( tiRoot, 9916 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9917 tiIOSuccess, 9918 SCSI_STAT_CHECK_CONDITION, 9919 satOrgIOContext->pTiSenseData, 9920 satOrgIOContext->interruptContext ); 9921 9922 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9923 9924 satFreeIntIoResource( tiRoot, 9925 satDevData, 9926 satIntIo); 9927 return; 9928 } 9929 9930 /* process success case */ 9931 lenReceived = (scsiCmnd->cdb[6] << (8*3)) + (scsiCmnd->cdb[7] << (8*2)) 9932 + (scsiCmnd->cdb[8] << 8) + scsiCmnd->cdb[9]; 9933 TI_DBG5(("satReadMediaSerialNumberCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived)); 9934 9935 if (hostToDevFis->h.command == SAT_READ_SECTORS || 9936 hostToDevFis->h.command == SAT_READ_SECTORS_EXT 9937 ) 9938 { 9939 pMediaSerialNumber[0] = 0; 9940 pMediaSerialNumber[1] = 0; 9941 pMediaSerialNumber[2] = 0; 9942 pMediaSerialNumber[3] = 4; 9943 pMediaSerialNumber[4] = 0; 9944 pMediaSerialNumber[5] = 0; 9945 pMediaSerialNumber[6] = 0; 9946 pMediaSerialNumber[7] = 0; 9947 9948 if (ZERO_MEDIA_SERIAL_NUMBER_LENGTH < lenReceived) 9949 { 9950 TI_DBG1(("satReadMediaSerialNumberCB: 1st underrun lenReceived %d len %d \n", lenReceived, ZERO_MEDIA_SERIAL_NUMBER_LENGTH)); 9951 9952 /* underrun */ 9953 ostiInitiatorIOCompleted( tiRoot, 9954 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 9955 tiIOUnderRun, 9956 lenReceived - ZERO_MEDIA_SERIAL_NUMBER_LENGTH, 9957 agNULL, 9958 satOrgIOContext->interruptContext ); 9959 9960 } 9961 else 9962 { 9963 ostiInitiatorIOCompleted( tiRoot, 9964 tiOrgIORequest, 9965 tiIOSuccess, 9966 SCSI_STAT_GOOD, 9967 agNULL, 9968 satOrgIOContext->interruptContext); 9969 } 9970 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9971 9972 satFreeIntIoResource( tiRoot, 9973 satDevData, 9974 satIntIo); 9975 return; 9976 } 9977 else 9978 { 9979 TI_DBG1(("satReadMediaSerialNumberCB: error unknown command success 0x%x\n", hostToDevFis->h.command)); 9980 satSetSensePayload( pSense, 9981 SCSI_SNSKEY_NO_SENSE, 9982 0, 9983 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9984 satOrgIOContext); 9985 9986 ostiInitiatorIOCompleted( tiRoot, 9987 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9988 tiIOSuccess, 9989 SCSI_STAT_CHECK_CONDITION, 9990 satOrgIOContext->pTiSenseData, 9991 satOrgIOContext->interruptContext ); 9992 9993 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9994 9995 satFreeIntIoResource( tiRoot, 9996 satDevData, 9997 satIntIo); 9998 9999 return; 10000 } 10001 return; 10002 } 10003 10004 /***************************************************************************** 10005 *! \brief satReadBufferCB 10006 * 10007 * This routine is a callback function called from ossaSATACompleted(). 10008 * This CB routine deals with Read Buffer. 10009 * 10010 * \param agRoot: Handles for this instance of SAS/SATA hardware 10011 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 10012 * \param agIOStatus: Status of completed I/O. 10013 * \param agSATAParm1: Additional info based on status. 10014 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 10015 * length. 10016 * \param ioContext: Pointer to satIOContext_t. 10017 * 10018 * \return: none 10019 * 10020 *****************************************************************************/ 10021 void satReadBufferCB( 10022 agsaRoot_t *agRoot, 10023 agsaIORequest_t *agIORequest, 10024 bit32 agIOStatus, 10025 agsaFisHeader_t *agFirstDword, 10026 bit32 agIOInfoLen, 10027 agsaFrameHandle_t agFrameHandle, 10028 void *ioContext 10029 ) 10030 { 10031 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 10032 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 10033 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 10034 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 10035 tdIORequestBody_t *tdIORequestBody; 10036 tdIORequestBody_t *tdOrgIORequestBody; 10037 satIOContext_t *satIOContext; 10038 satIOContext_t *satOrgIOContext; 10039 satInternalIo_t *satIntIo; 10040 satDeviceData_t *satDevData; 10041 scsiRspSense_t *pSense; 10042 tiIORequest_t *tiOrgIORequest; 10043 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 10044 10045 TI_DBG4(("satReadBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 10046 10047 /* internally generate tiIOContext */ 10048 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 10049 satIOContext = (satIOContext_t *) ioContext; 10050 satIntIo = satIOContext->satIntIoContext; 10051 satDevData = satIOContext->pSatDevData; 10052 hostToDevFis = satIOContext->pFis; 10053 10054 10055 if (satIntIo == agNULL) 10056 { 10057 TI_DBG4(("satReadBufferCB: External satInternalIo_t satIntIoContext\n")); 10058 satOrgIOContext = satIOContext; 10059 tiOrgIORequest = tdIORequestBody->tiIORequest; 10060 pSense = satOrgIOContext->pSense; 10061 10062 /* SCSI command response payload to OS layer */ 10063 10064 /* ATA command response payload */ 10065 10066 } 10067 else 10068 { 10069 TI_DBG4(("satReadBufferCB: Internal satInternalIo_t satIntIoContext\n")); 10070 satOrgIOContext = satIOContext->satOrgIOContext; 10071 if (satOrgIOContext == agNULL) 10072 { 10073 TI_DBG4(("satReadBufferCB: satOrgIOContext is NULL, wrong\n")); 10074 return; 10075 } 10076 else 10077 { 10078 TI_DBG4(("satReadBufferCB: satOrgIOContext is NOT NULL\n")); 10079 } 10080 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 10081 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 10082 10083 pSense = satOrgIOContext->pSense; 10084 10085 /* SCSI command response payload to OS layer */ 10086 10087 /* ATA command response payload */ 10088 10089 } 10090 10091 tdIORequestBody->ioCompleted = agTRUE; 10092 tdIORequestBody->ioStarted = agFALSE; 10093 10094 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 10095 { 10096 TI_DBG1(("satReadBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 10097 ostiInitiatorIOCompleted ( 10098 tiRoot, 10099 tiOrgIORequest, 10100 tiIOFailed, 10101 tiDetailOtherError, 10102 agNULL, 10103 satOrgIOContext->interruptContext 10104 ); 10105 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10106 10107 satFreeIntIoResource( tiRoot, 10108 satDevData, 10109 satIntIo); 10110 return; 10111 } 10112 10113 if( agIOStatus != OSSA_IO_SUCCESS) 10114 { 10115 /* Process abort case */ 10116 if (agIOStatus == OSSA_IO_ABORTED) 10117 { 10118 satProcessAbort(tiRoot, 10119 tiOrgIORequest, 10120 satOrgIOContext 10121 ); 10122 10123 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10124 10125 satFreeIntIoResource( tiRoot, 10126 satDevData, 10127 satIntIo); 10128 return; 10129 } 10130 satSetSensePayload( pSense, 10131 SCSI_SNSKEY_NOT_READY, 10132 0, 10133 SCSI_SNSCODE_MEDIUM_NOT_PRESENT, 10134 satOrgIOContext); 10135 10136 ostiInitiatorIOCompleted( tiRoot, 10137 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10138 tiIOSuccess, 10139 SCSI_STAT_CHECK_CONDITION, 10140 satOrgIOContext->pTiSenseData, 10141 satOrgIOContext->interruptContext ); 10142 10143 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10144 10145 satFreeIntIoResource( tiRoot, 10146 satDevData, 10147 satIntIo); 10148 return; 10149 } 10150 10151 /* process success case */ 10152 if (hostToDevFis->h.command == SAT_READ_BUFFER ) 10153 { 10154 10155 ostiInitiatorIOCompleted( tiRoot, 10156 tiOrgIORequest, 10157 tiIOSuccess, 10158 SCSI_STAT_GOOD, 10159 agNULL, 10160 satOrgIOContext->interruptContext); 10161 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10162 10163 satFreeIntIoResource( tiRoot, 10164 satDevData, 10165 satIntIo); 10166 return; 10167 } 10168 else 10169 { 10170 TI_DBG1(("satReadBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command)); 10171 satSetSensePayload( pSense, 10172 SCSI_SNSKEY_NO_SENSE, 10173 0, 10174 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 10175 satOrgIOContext); 10176 10177 ostiInitiatorIOCompleted( tiRoot, 10178 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10179 tiIOSuccess, 10180 SCSI_STAT_CHECK_CONDITION, 10181 satOrgIOContext->pTiSenseData, 10182 satOrgIOContext->interruptContext ); 10183 10184 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10185 10186 satFreeIntIoResource( tiRoot, 10187 satDevData, 10188 satIntIo); 10189 10190 return; 10191 } 10192 10193 return; 10194 } 10195 10196 /***************************************************************************** 10197 *! \brief satWriteBufferCB 10198 * 10199 * This routine is a callback function called from ossaSATACompleted(). 10200 * This CB routine deals with Write Buffer. 10201 * 10202 * \param agRoot: Handles for this instance of SAS/SATA hardware 10203 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 10204 * \param agIOStatus: Status of completed I/O. 10205 * \param agSATAParm1: Additional info based on status. 10206 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 10207 * length. 10208 * \param ioContext: Pointer to satIOContext_t. 10209 * 10210 * \return: none 10211 * 10212 *****************************************************************************/ 10213 void satWriteBufferCB( 10214 agsaRoot_t *agRoot, 10215 agsaIORequest_t *agIORequest, 10216 bit32 agIOStatus, 10217 agsaFisHeader_t *agFirstDword, 10218 bit32 agIOInfoLen, 10219 agsaFrameHandle_t agFrameHandle, 10220 void *ioContext 10221 ) 10222 { 10223 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 10224 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 10225 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 10226 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 10227 tdIORequestBody_t *tdIORequestBody; 10228 tdIORequestBody_t *tdOrgIORequestBody; 10229 satIOContext_t *satIOContext; 10230 satIOContext_t *satOrgIOContext; 10231 satInternalIo_t *satIntIo; 10232 satDeviceData_t *satDevData; 10233 scsiRspSense_t *pSense; 10234 tiIORequest_t *tiOrgIORequest; 10235 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 10236 10237 TI_DBG4(("satWriteBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 10238 10239 /* internally generate tiIOContext */ 10240 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 10241 satIOContext = (satIOContext_t *) ioContext; 10242 satIntIo = satIOContext->satIntIoContext; 10243 satDevData = satIOContext->pSatDevData; 10244 hostToDevFis = satIOContext->pFis; 10245 10246 10247 if (satIntIo == agNULL) 10248 { 10249 TI_DBG4(("satWriteBufferCB: External satInternalIo_t satIntIoContext\n")); 10250 satOrgIOContext = satIOContext; 10251 tiOrgIORequest = tdIORequestBody->tiIORequest; 10252 pSense = satOrgIOContext->pSense; 10253 /* SCSI command response payload to OS layer */ 10254 10255 /* ATA command response payload */ 10256 10257 } 10258 else 10259 { 10260 TI_DBG4(("satWriteBufferCB: Internal satInternalIo_t satIntIoContext\n")); 10261 satOrgIOContext = satIOContext->satOrgIOContext; 10262 if (satOrgIOContext == agNULL) 10263 { 10264 TI_DBG4(("satWriteBufferCB: satOrgIOContext is NULL, wrong\n")); 10265 return; 10266 } 10267 else 10268 { 10269 TI_DBG4(("satWriteBufferCB: satOrgIOContext is NOT NULL\n")); 10270 } 10271 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 10272 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 10273 10274 pSense = satOrgIOContext->pSense; 10275 /* SCSI command response payload to OS layer */ 10276 10277 /* ATA command response payload */ 10278 10279 } 10280 10281 tdIORequestBody->ioCompleted = agTRUE; 10282 tdIORequestBody->ioStarted = agFALSE; 10283 10284 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 10285 { 10286 TI_DBG1(("satWriteBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 10287 ostiInitiatorIOCompleted ( 10288 tiRoot, 10289 tiOrgIORequest, 10290 tiIOFailed, 10291 tiDetailOtherError, 10292 agNULL, 10293 satOrgIOContext->interruptContext 10294 ); 10295 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10296 10297 satFreeIntIoResource( tiRoot, 10298 satDevData, 10299 satIntIo); 10300 return; 10301 } 10302 10303 if( agIOStatus != OSSA_IO_SUCCESS) 10304 { 10305 /* Process abort case */ 10306 if (agIOStatus == OSSA_IO_ABORTED) 10307 { 10308 satProcessAbort(tiRoot, 10309 tiOrgIORequest, 10310 satOrgIOContext 10311 ); 10312 10313 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10314 10315 satFreeIntIoResource( tiRoot, 10316 satDevData, 10317 satIntIo); 10318 return; 10319 } 10320 satSetSensePayload( pSense, 10321 SCSI_SNSKEY_NOT_READY, 10322 0, 10323 SCSI_SNSCODE_MEDIUM_NOT_PRESENT, 10324 satOrgIOContext); 10325 10326 ostiInitiatorIOCompleted( tiRoot, 10327 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10328 tiIOSuccess, 10329 SCSI_STAT_CHECK_CONDITION, 10330 satOrgIOContext->pTiSenseData, 10331 satOrgIOContext->interruptContext ); 10332 10333 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10334 10335 satFreeIntIoResource( tiRoot, 10336 satDevData, 10337 satIntIo); 10338 return; 10339 } 10340 /* process success case */ 10341 if (hostToDevFis->h.command == SAT_WRITE_BUFFER ) 10342 { 10343 10344 ostiInitiatorIOCompleted( tiRoot, 10345 tiOrgIORequest, 10346 tiIOSuccess, 10347 SCSI_STAT_GOOD, 10348 agNULL, 10349 satOrgIOContext->interruptContext); 10350 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10351 10352 satFreeIntIoResource( tiRoot, 10353 satDevData, 10354 satIntIo); 10355 return; 10356 } 10357 else 10358 { 10359 TI_DBG1(("satWriteBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command)); 10360 satSetSensePayload( pSense, 10361 SCSI_SNSKEY_NO_SENSE, 10362 0, 10363 SCSI_SNSCODE_NO_ADDITIONAL_INFO, 10364 satOrgIOContext); 10365 10366 ostiInitiatorIOCompleted( tiRoot, 10367 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10368 tiIOSuccess, 10369 SCSI_STAT_CHECK_CONDITION, 10370 satOrgIOContext->pTiSenseData, 10371 satOrgIOContext->interruptContext ); 10372 10373 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10374 10375 satFreeIntIoResource( tiRoot, 10376 satDevData, 10377 satIntIo); 10378 10379 return; 10380 } 10381 10382 return; 10383 } 10384 10385 /***************************************************************************** 10386 *! \brief satReassignBlocksCB 10387 * 10388 * This routine is a callback function called from ossaSATACompleted(). 10389 * This CB routine deals with Reassign Blocks. 10390 * 10391 * \param agRoot: Handles for this instance of SAS/SATA hardware 10392 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 10393 * \param agIOStatus: Status of completed I/O. 10394 * \param agSATAParm1: Additional info based on status. 10395 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 10396 * length. 10397 * \param ioContext: Pointer to satIOContext_t. 10398 * 10399 * \return: none 10400 * 10401 *****************************************************************************/ 10402 void satReassignBlocksCB( 10403 agsaRoot_t *agRoot, 10404 agsaIORequest_t *agIORequest, 10405 bit32 agIOStatus, 10406 agsaFisHeader_t *agFirstDword, 10407 bit32 agIOInfoLen, 10408 agsaFrameHandle_t agFrameHandle, 10409 void *ioContext 10410 ) 10411 { 10412 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 10413 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 10414 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 10415 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 10416 tdIORequestBody_t *tdIORequestBody; 10417 tdIORequestBody_t *tdOrgIORequestBody; 10418 satIOContext_t *satIOContext; 10419 satIOContext_t *satOrgIOContext; 10420 satIOContext_t *satNewIOContext; 10421 satInternalIo_t *satIntIo; 10422 satInternalIo_t *satNewIntIo = agNULL; 10423 satDeviceData_t *satDevData; 10424 10425 scsiRspSense_t *pSense; 10426 tiIniScsiCmnd_t *scsiCmnd; 10427 tiIORequest_t *tiOrgIORequest; 10428 10429 agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 10430 bit32 ataStatus = 0; 10431 bit32 status; 10432 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */ 10433 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 10434 10435 TI_DBG5(("satReassignBlocksCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 10436 10437 /* internally generate tiIOContext */ 10438 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 10439 satIOContext = (satIOContext_t *) ioContext; 10440 satIntIo = satIOContext->satIntIoContext; 10441 satDevData = satIOContext->pSatDevData; 10442 hostToDevFis = satIOContext->pFis; 10443 10444 if (satIntIo == agNULL) 10445 { 10446 TI_DBG4(("satReassignBlocksCB: External satInternalIo_t satIntIoContext\n")); 10447 satOrgIOContext = satIOContext; 10448 tiOrgIORequest = tdIORequestBody->tiIORequest; 10449 tiScsiRequest = satOrgIOContext->tiScsiXchg; 10450 pSense = satOrgIOContext->pSense; 10451 scsiCmnd = satOrgIOContext->pScsiCmnd; 10452 } 10453 else 10454 { 10455 TI_DBG4(("satReassignBlocksCB: Internal satInternalIo_t satIntIoContext\n")); 10456 satOrgIOContext = satIOContext->satOrgIOContext; 10457 if (satOrgIOContext == agNULL) 10458 { 10459 TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NULL, Wrong\n")); 10460 return; 10461 } 10462 else 10463 { 10464 TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NOT NULL, Wrong\n")); 10465 } 10466 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 10467 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 10468 10469 tiScsiRequest = satOrgIOContext->tiScsiXchg; 10470 pSense = satOrgIOContext->pSense; 10471 scsiCmnd = satOrgIOContext->pScsiCmnd; 10472 } 10473 10474 tdIORequestBody->ioCompleted = agTRUE; 10475 tdIORequestBody->ioStarted = agFALSE; 10476 10477 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 10478 { 10479 TI_DBG1(("satReassignBlocksCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 10480 ostiInitiatorIOCompleted ( 10481 tiRoot, 10482 tiOrgIORequest, 10483 tiIOFailed, 10484 tiDetailOtherError, 10485 agNULL, 10486 satOrgIOContext->interruptContext 10487 ); 10488 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10489 10490 satFreeIntIoResource( tiRoot, 10491 satDevData, 10492 satIntIo); 10493 return; 10494 } 10495 10496 if (agIOStatus != OSSA_IO_SUCCESS) 10497 { 10498 /* only agsaFisRegDeviceToHost_t is expected */ 10499 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 10500 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 10501 } 10502 10503 if (agIOStatus != OSSA_IO_SUCCESS) 10504 { 10505 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 10506 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 10507 ) 10508 { 10509 /* for debugging */ 10510 if( agIOStatus != OSSA_IO_SUCCESS) 10511 { 10512 TI_DBG1(("satReassignBlocksCB FAILED, NOT IO_SUCCESS\n")); 10513 } 10514 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 10515 { 10516 TI_DBG1(("satReassignBlocksCB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 10517 } 10518 else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 10519 (ataStatus & DF_ATA_STATUS_MASK) 10520 ) 10521 { 10522 TI_DBG1(("satReassignBlocksCB FAILED, FAILED, error status\n")); 10523 } 10524 10525 /* Process abort case */ 10526 if (agIOStatus == OSSA_IO_ABORTED) 10527 { 10528 satProcessAbort(tiRoot, 10529 tiOrgIORequest, 10530 satOrgIOContext 10531 ); 10532 10533 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10534 10535 satFreeIntIoResource( tiRoot, 10536 satDevData, 10537 satIntIo); 10538 return; 10539 } 10540 10541 /* for debugging */ 10542 if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS || 10543 hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT 10544 ) 10545 { 10546 TI_DBG1(("satReassignBlocksCB SAT_READ_VERIFY_SECTORS(_EXT) failed\n")); 10547 /* Verify failed; send Write with same LBA */ 10548 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10549 10550 satFreeIntIoResource( tiRoot, 10551 satDevData, 10552 satIntIo); 10553 10554 satNewIntIo = satAllocIntIoResource( tiRoot, 10555 tiOrgIORequest, 10556 satDevData, 10557 512, /* writing 1 sector */ 10558 satNewIntIo); 10559 if (satNewIntIo == agNULL) 10560 { 10561 /* memory allocation failure */ 10562 satFreeIntIoResource( tiRoot, 10563 satDevData, 10564 satNewIntIo); 10565 10566 satSetSensePayload( pSense, 10567 SCSI_SNSKEY_HARDWARE_ERROR, 10568 0, 10569 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10570 satOrgIOContext); 10571 10572 ostiInitiatorIOCompleted( tiRoot, 10573 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10574 tiIOSuccess, 10575 SCSI_STAT_CHECK_CONDITION, 10576 satOrgIOContext->pTiSenseData, 10577 satOrgIOContext->interruptContext ); 10578 TI_DBG1(("satReassignBlocksCB: momory allocation fails\n")); 10579 return; 10580 } /* end memory allocation */ 10581 10582 satNewIOContext = satPrepareNewIO( 10583 satNewIntIo, 10584 tiOrgIORequest, 10585 satDevData, 10586 scsiCmnd, 10587 satOrgIOContext 10588 ); 10589 10590 /* send Write with same LBA */ 10591 status = satReassignBlocks_2( 10592 tiRoot, 10593 &satNewIntIo->satIntTiIORequest, 10594 satNewIOContext->ptiDeviceHandle, 10595 &satNewIntIo->satIntTiScsiXchg, 10596 satNewIOContext, 10597 satOrgIOContext->LBA 10598 ); 10599 10600 if (status != tiSuccess) 10601 { 10602 /* sending ATA command fails */ 10603 satFreeIntIoResource( tiRoot, 10604 satDevData, 10605 satNewIntIo); 10606 satSetSensePayload( pSense, 10607 SCSI_SNSKEY_HARDWARE_ERROR, 10608 0, 10609 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10610 satOrgIOContext); 10611 10612 ostiInitiatorIOCompleted( tiRoot, 10613 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10614 tiIOSuccess, 10615 SCSI_STAT_CHECK_CONDITION, 10616 satOrgIOContext->pTiSenseData, 10617 satOrgIOContext->interruptContext ); 10618 TI_DBG1(("satReassignBlocksCB calling fail 1\n")); 10619 return; 10620 } /* end send fails */ 10621 10622 return; 10623 } 10624 else if (hostToDevFis->h.command == SAT_WRITE_DMA || 10625 hostToDevFis->h.command == SAT_WRITE_SECTORS || 10626 hostToDevFis->h.command == SAT_WRITE_DMA_EXT || 10627 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT || 10628 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED 10629 ) 10630 { 10631 TI_DBG1(("satReassignBlocksCB SAT_WRITE failed\n")); 10632 /* fall through */ 10633 } 10634 else 10635 { 10636 TI_DBG1(("satReassignBlocksCB error default case unexpected command 0x%x\n", hostToDevFis->h.command)); 10637 } 10638 10639 10640 satSetSensePayload( pSense, 10641 SCSI_SNSKEY_HARDWARE_ERROR, 10642 0, 10643 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10644 satOrgIOContext); 10645 10646 ostiInitiatorIOCompleted( tiRoot, 10647 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10648 tiIOSuccess, 10649 SCSI_STAT_CHECK_CONDITION, 10650 satOrgIOContext->pTiSenseData, 10651 satOrgIOContext->interruptContext ); 10652 10653 10654 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10655 10656 satFreeIntIoResource( tiRoot, 10657 satDevData, 10658 satIntIo); 10659 return; 10660 } /* error checking */ 10661 } 10662 10663 10664 /* prcessing the success case */ 10665 if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS || 10666 hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT || 10667 hostToDevFis->h.command == SAT_WRITE_DMA || 10668 hostToDevFis->h.command == SAT_WRITE_SECTORS || 10669 hostToDevFis->h.command == SAT_WRITE_DMA_EXT || 10670 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT || 10671 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED 10672 ) 10673 { 10674 /* next LBA; verify */ 10675 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10676 10677 satFreeIntIoResource( tiRoot, 10678 satDevData, 10679 satIntIo); 10680 10681 if (satOrgIOContext->ParmIndex >= satOrgIOContext->ParmLen) 10682 { 10683 TI_DBG5(("satReassignBlocksCB: GOOD status\n")); 10684 /* return stat_good */ 10685 ostiInitiatorIOCompleted( tiRoot, 10686 tiOrgIORequest, 10687 tiIOSuccess, 10688 SCSI_STAT_GOOD, 10689 agNULL, 10690 satOrgIOContext->interruptContext ); 10691 return; 10692 } 10693 else 10694 { 10695 TI_DBG5(("satReassignBlocksCB: processing next LBA\n")); 10696 satNewIntIo = satAllocIntIoResource( tiRoot, 10697 tiOrgIORequest, 10698 satDevData, 10699 0, 10700 satNewIntIo); 10701 if (satNewIntIo == agNULL) 10702 { 10703 /* memory allocation failure */ 10704 satFreeIntIoResource( tiRoot, 10705 satDevData, 10706 satNewIntIo); 10707 10708 satSetSensePayload( pSense, 10709 SCSI_SNSKEY_HARDWARE_ERROR, 10710 0, 10711 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10712 satOrgIOContext); 10713 10714 ostiInitiatorIOCompleted( tiRoot, 10715 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10716 tiIOSuccess, 10717 SCSI_STAT_CHECK_CONDITION, 10718 satOrgIOContext->pTiSenseData, 10719 satOrgIOContext->interruptContext ); 10720 TI_DBG1(("satReassignBlocksCB: momory allocation fails\n")); 10721 return; 10722 } /* end memory allocation */ 10723 10724 satNewIOContext = satPrepareNewIO( 10725 satNewIntIo, 10726 tiOrgIORequest, 10727 satDevData, 10728 scsiCmnd, 10729 satOrgIOContext 10730 ); 10731 10732 /* send Verify with the next LBA */ 10733 status = satReassignBlocks_1( 10734 tiRoot, 10735 &satNewIntIo->satIntTiIORequest, 10736 satNewIOContext->ptiDeviceHandle, 10737 tiScsiRequest, /* orginal from OS layer */ 10738 satNewIOContext, 10739 satOrgIOContext 10740 ); 10741 10742 if (status != tiSuccess) 10743 { 10744 /* sending ATA command fails */ 10745 satFreeIntIoResource( tiRoot, 10746 satDevData, 10747 satNewIntIo); 10748 satSetSensePayload( pSense, 10749 SCSI_SNSKEY_HARDWARE_ERROR, 10750 0, 10751 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10752 satOrgIOContext); 10753 10754 ostiInitiatorIOCompleted( tiRoot, 10755 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10756 tiIOSuccess, 10757 SCSI_STAT_CHECK_CONDITION, 10758 satOrgIOContext->pTiSenseData, 10759 satOrgIOContext->interruptContext ); 10760 TI_DBG1(("satReassignBlocksCB calling satModeSelect6_1 fails\n")); 10761 return; 10762 } /* end send fails */ 10763 } /* else */ 10764 return; 10765 10766 } 10767 else if (hostToDevFis->h.command == SAT_WRITE_DMA || 10768 hostToDevFis->h.command == SAT_WRITE_SECTORS || 10769 hostToDevFis->h.command == SAT_WRITE_DMA_EXT || 10770 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT || 10771 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED 10772 ) 10773 { 10774 /* next LBA; verify */ 10775 } 10776 else 10777 { 10778 TI_DBG1(("satReassignBlocksCB error unknown command success 0x%x \n", hostToDevFis->h.command)); 10779 10780 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10781 10782 satFreeIntIoResource( tiRoot, 10783 satDevData, 10784 satIntIo); 10785 satSetSensePayload( pSense, 10786 SCSI_SNSKEY_HARDWARE_ERROR, 10787 0, 10788 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10789 satOrgIOContext); 10790 10791 ostiInitiatorIOCompleted( tiRoot, 10792 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10793 tiIOSuccess, 10794 SCSI_STAT_CHECK_CONDITION, 10795 satOrgIOContext->pTiSenseData, 10796 satOrgIOContext->interruptContext ); 10797 return; 10798 } 10799 return; 10800 } 10801 /***************************************************************************** 10802 *! \brief satReadLogExtCB 10803 * 10804 * This routine is a callback function called from ossaSATACompleted(). 10805 * This CB routine deals READ LOG EXT completion. 10806 * 10807 * \param agRoot: Handles for this instance of SAS/SATA hardware 10808 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 10809 * \param agIOStatus: Status of completed I/O. 10810 * \param agFirstDword:Pointer to the four bytes of FIS. 10811 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 10812 * length. 10813 * \param agParam: Additional info based on status. 10814 * \param ioContext: Pointer to satIOContext_t. 10815 * 10816 * \return: none 10817 * 10818 *****************************************************************************/ 10819 /* 10820 SATAII spec p42 10821 10822 */ 10823 void satReadLogExtCB( 10824 agsaRoot_t *agRoot, 10825 agsaIORequest_t *agIORequest, 10826 bit32 agIOStatus, 10827 agsaFisHeader_t *agFirstDword, 10828 bit32 agIOInfoLen, 10829 void *agParam, 10830 void *ioContext 10831 ) 10832 10833 { 10834 10835 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 10836 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 10837 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 10838 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 10839 tdIORequestBody_t *tdIORequestBody; 10840 satIOContext_t *satReadLogExtIOContext; 10841 satInternalIo_t *satIntIo; 10842 satDeviceData_t *satDevData; 10843 tdsaDeviceData_t *tdsaDeviceData; 10844 agsaIORequest_t *agAbortIORequest; 10845 tdIORequestBody_t *tdAbortIORequestBody; 10846 bit32 PhysUpper32; 10847 bit32 PhysLower32; 10848 bit32 memAllocStatus; 10849 void *osMemHandle; 10850 10851 TI_DBG1(("satReadLogExtCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 10852 agIORequest, agIOStatus, agIOInfoLen)); 10853 10854 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 10855 satReadLogExtIOContext = (satIOContext_t *) ioContext; 10856 satIntIo = satReadLogExtIOContext->satIntIoContext; 10857 satDevData = satReadLogExtIOContext->pSatDevData; 10858 tdsaDeviceData = (tdsaDeviceData_t *)satDevData->satSaDeviceData; 10859 10860 TI_DBG1(("satReadLogExtCB: did %d\n", tdsaDeviceData->id)); 10861 satDecrementPendingIO(tiRoot, tdsaAllShared, satReadLogExtIOContext); 10862 10863 10864 tdIORequestBody->ioCompleted = agTRUE; 10865 tdIORequestBody->ioStarted = agFALSE; 10866 10867 /* 10868 * If READ LOG EXT failed, we issue device reset. 10869 */ 10870 if ( agIOStatus != OSSA_IO_SUCCESS || 10871 (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0) 10872 ) 10873 { 10874 TI_DBG1(("satReadLogExtCB: FAILED.\n")); 10875 10876 satFreeIntIoResource( tiRoot, 10877 satDevData, 10878 satIntIo); 10879 /* Abort I/O after completion of device reset */ 10880 satDevData->satAbortAfterReset = agTRUE; 10881 #ifdef NOT_YET 10882 /* needs to investigate this case */ 10883 /* no report to OS layer */ 10884 satSubTM(tiRoot, 10885 satReadLogExtIOContext->ptiDeviceHandle, 10886 TD_INTERNAL_TM_RESET, 10887 agNULL, 10888 agNULL, 10889 agNULL, 10890 agFALSE); 10891 #endif 10892 return; 10893 } 10894 10895 10896 /*************************************************************************** 10897 * The following steps take place when READ LOG EXT successfully completed. 10898 ***************************************************************************/ 10899 10900 /************************************************************************ 10901 * 10902 * 1. Issue abort to LL layer to all other pending I/Os for the same SATA 10903 * drive. 10904 * 10905 * 2. Free resource allocated for the internally generated READ LOG EXT. 10906 * 10907 * 3. At the completion of abort, in the context of ossaSATACompleted(), 10908 * return the I/O with error status to the OS-App Specific layer. 10909 * When all I/O aborts are completed, clear SATA device flag to 10910 * indicate ready to process new request. 10911 * 10912 ***********************************************************************/ 10913 10914 /* 10915 * Issue abort to LL layer to all other pending I/Os for the same SATA drive 10916 */ 10917 /* 10918 replace the single IO abort with device abort 10919 */ 10920 10921 TI_DBG1(("satReadLogExtCB: issuing saSATAAbort. Device Abort\n")); 10922 /* do not deregister this device */ 10923 tdsaDeviceData->OSAbortAll = agTRUE; 10924 10925 /* allocating agIORequest for abort itself */ 10926 memAllocStatus = ostiAllocMemory( 10927 tiRoot, 10928 &osMemHandle, 10929 (void **)&tdAbortIORequestBody, 10930 &PhysUpper32, 10931 &PhysLower32, 10932 8, 10933 sizeof(tdIORequestBody_t), 10934 agTRUE 10935 ); 10936 10937 if (memAllocStatus != tiSuccess) 10938 { 10939 /* let os process IO */ 10940 TI_DBG1(("satReadLogExtCB: ostiAllocMemory failed...\n")); 10941 return; 10942 } 10943 10944 if (tdAbortIORequestBody == agNULL) 10945 { 10946 /* let os process IO */ 10947 TI_DBG1(("satReadLogExtCB: ostiAllocMemory returned NULL tdAbortIORequestBody\n")); 10948 return; 10949 } 10950 10951 /* setup task management structure */ 10952 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle; 10953 tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(tdsaDeviceData->tiDeviceHandle); 10954 /* initialize agIORequest */ 10955 agAbortIORequest = &(tdAbortIORequestBody->agIORequest); 10956 agAbortIORequest->osData = (void *) tdAbortIORequestBody; 10957 agAbortIORequest->sdkData = agNULL; /* LL takes care of this */ 10958 10959 /* 10960 * Issue abort 10961 */ 10962 saSATAAbort( agRoot, agAbortIORequest, 0, tdsaDeviceData->agDevHandle, 1, agNULL, agNULL); 10963 10964 10965 /* 10966 * Free resource allocated for the internally generated READ LOG EXT. 10967 */ 10968 satFreeIntIoResource( tiRoot, 10969 satDevData, 10970 satIntIo); 10971 10972 /* 10973 * Sequence of recovery continue at some other context: 10974 * At the completion of abort, in the context of ossaSATACompleted(), 10975 * return the I/O with error status to the OS-App Specific layer. 10976 * When all I/O aborts are completed, clear SATA device flag to 10977 * indicate ready to process new request. 10978 */ 10979 10980 satDevData->satDriveState = SAT_DEV_STATE_NORMAL; 10981 10982 TI_DBG1(("satReadLogExtCB: end return\n")); 10983 return; 10984 } 10985 10986 #ifndef FDS_SM 10987 /***************************************************************************** 10988 *! \brief ossaSATAEvent 10989 * 10990 * This routine is called to notify the OS Layer of an event associated with 10991 * SATA port or SATA device 10992 * 10993 * \param agRoot: Handles for this instance of SAS/SATA hardware 10994 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 10995 * \param agPortContext Pointer to the port context of TD and Lower layer 10996 * \param agDevHandle: Pointer to a device handle 10997 * \param event: event type 10998 * 10999 * \return: none 11000 * 11001 *****************************************************************************/ 11002 osGLOBAL void ossaSATAEvent( 11003 agsaRoot_t *agRoot, 11004 agsaIORequest_t *agIORequest, 11005 agsaPortContext_t *agPortContext, 11006 agsaDevHandle_t *agDevHandle, 11007 bit32 event, 11008 bit32 agIOInfoLen, 11009 void *agParam 11010 ) 11011 { 11012 11013 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 11014 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 11015 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 11016 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 11017 bit32 interruptContext = osData->IntContext; 11018 tdsaDeviceData_t *pDeviceData; 11019 satDeviceData_t *pSatDevData; 11020 satInternalIo_t *satIntIo = agNULL; 11021 bit32 status; 11022 satIOContext_t *satIOContext2; 11023 tdIORequestBody_t *tdIORequestBody; 11024 tiDeviceHandle_t *tiDeviceHandle; 11025 tiIORequest_t tiIORequestTMP; 11026 agsaDifDetails_t agDifDetails; 11027 bit8 framePayload[256]; 11028 bit16 frameOffset = 0; 11029 bit16 frameLen = 0; 11030 11031 /* new */ 11032 tdsaDeviceData_t *tdsaDeviceData = agNULL; 11033 satIOContext_t *satIOContext; 11034 tdsaPortContext_t *onePortContext; 11035 11036 if (event == OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE) 11037 { 11038 11039 /************************************************************************** 11040 * 11041 * !!!! See Section 13.5.2.4 of SATA 2.5 specs. !!!! 11042 * !!!! If the NCQ error ends up here, it means that the device sent !!!! 11043 * !!!! Register Device To Host FIS (which does not have SActive !!!! 11044 * !!!! register) instead of Set Device Bit FIS (which has SActive !!!! 11045 * !!!! register). The routine osSatIOCompleted() deals with the case !!!! 11046 * !!!! where Set Device Bit FIS was sent by the device. !!!! 11047 * 11048 * For NCQ we need to issue READ LOG EXT command with log page 10h 11049 * to get the error and to allow other I/Os to continue. 11050 * 11051 * Here is the basic flow or sequence of error recovery, this sequence is 11052 * similar to the one described in SATA 2.5: 11053 * 11054 * 1. Set SATA device flag to indicate error condition and returning busy 11055 * for all new request. 11056 * 11057 * 2. Prepare READ LOG EXT page 10h command. Set flag to indicate that 11058 * the failed I/O has NOT been returned to the OS Layer. Send command. 11059 * 11060 * 3. When the device receives READ LOG EXT page 10h request all other 11061 * pending I/O are implicitly aborted. No completion (aborted) status 11062 * will be sent to the host for these aborted commands. 11063 * 11064 * 4. SATL receives the completion for READ LOG EXT command in 11065 * satReadLogExtCB(). Steps 5,6,7,8 below are the step 1,2,3,4 in 11066 * satReadLogExtCB(). 11067 * 11068 * 5. Check flag that indicates whether the failed I/O has been returned 11069 * to the OS Layer. If not, search the I/O context in device data 11070 * looking for a matched tag. Then return the completion of the failed 11071 * NCQ command with the appopriate/trasnlated SCSI status. 11072 * 11073 * 6. Issue abort to LL layer to all other pending I/Os for the same SATA 11074 * drive. 11075 * 11076 * 7. Free resource allocated for the internally generated READ LOG EXT. 11077 * 11078 * 8. At the completion of abort, in the context of ossaSATACompleted(), 11079 * return the I/O with error status to the OS-App Specific layer. 11080 * When all I/O aborts are completed, clear SATA device flag to 11081 * indicate ready to process new request. 11082 * 11083 *************************************************************************/ 11084 11085 pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData; 11086 pSatDevData = &pDeviceData->satDevData; 11087 tiDeviceHandle = &((tdsaDeviceData_t *)(pSatDevData->satSaDeviceData))->tiDeviceHandle; 11088 11089 TI_DBG1(("ossaSATAEvent: did %d\n", pDeviceData->id)); 11090 11091 if (pSatDevData->satDriveState == SAT_DEV_STATE_NORMAL) 11092 { 11093 TI_DBG1(("ossaSATAEvent: NCQ ERROR agDevHandle=%p.\n", agDevHandle )); 11094 11095 /* Set flag to indicate we are in recovery */ 11096 pSatDevData->satDriveState = SAT_DEV_STATE_IN_RECOVERY; 11097 11098 /* 11099 * Allocate resource for READ LOG EXIT page 10h 11100 */ 11101 satIntIo = satAllocIntIoResource( tiRoot, 11102 &(tiIORequestTMP), /* anything but NULL */ 11103 pSatDevData, 11104 sizeof (satReadLogExtPage10h_t), 11105 satIntIo); 11106 11107 /* 11108 * If we cannot allocate resource to do the normal NCQ recovery, we 11109 * will do SATA device reset. 11110 */ 11111 if (satIntIo == agNULL) 11112 { 11113 /* Abort I/O after completion of device reset */ 11114 pSatDevData->satAbortAfterReset = agTRUE; 11115 TI_DBG1(("ossaSATAEvent: can't send RLE due to resource lack\n")); 11116 11117 #ifdef NOT_YET 11118 /* needs to investigate this case */ 11119 /* no report to OS layer */ 11120 satSubTM(tiRoot, 11121 tiDeviceHandle, 11122 TD_INTERNAL_TM_RESET, 11123 agNULL, 11124 agNULL, 11125 agNULL, 11126 agFALSE); 11127 #endif 11128 11129 return; 11130 } 11131 11132 11133 /* 11134 * Clear flag to indicate that the failed I/O has NOT been returned to the 11135 * OS-App specific Layer. 11136 */ 11137 satIntIo->satIntFlag = 0; 11138 11139 /* compare to satPrepareNewIO() */ 11140 /* Send READ LOG EXIT page 10h command */ 11141 11142 /* 11143 * Need to initialize all the fields within satIOContext except 11144 * reqType and satCompleteCB which will be set depending on cmd. 11145 */ 11146 11147 tdIORequestBody = (tdIORequestBody_t *)satIntIo->satIntRequestBody; 11148 satIOContext2 = &(tdIORequestBody->transport.SATA.satIOContext); 11149 11150 satIOContext2->pSatDevData = pSatDevData; 11151 satIOContext2->pFis = &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev); 11152 satIOContext2->pScsiCmnd = &(satIntIo->satIntTiScsiXchg.scsiCmnd); 11153 satIOContext2->pSense = &(tdIORequestBody->transport.SATA.sensePayload); 11154 satIOContext2->pTiSenseData = &(tdIORequestBody->transport.SATA.tiSenseData); 11155 satIOContext2->pTiSenseData->senseData = satIOContext2->pSense; 11156 11157 satIOContext2->tiRequestBody = satIntIo->satIntRequestBody; 11158 satIOContext2->interruptContext = interruptContext; 11159 satIOContext2->satIntIoContext = satIntIo; 11160 11161 satIOContext2->ptiDeviceHandle = tiDeviceHandle; 11162 satIOContext2->satOrgIOContext = agNULL; 11163 satIOContext2->tiScsiXchg = agNULL; 11164 11165 status = satSendReadLogExt( tiRoot, 11166 &satIntIo->satIntTiIORequest, 11167 tiDeviceHandle, 11168 &satIntIo->satIntTiScsiXchg, 11169 satIOContext2); 11170 11171 if (status !=tiSuccess) 11172 { 11173 TI_DBG1(("ossaSATAEvent: can't send RLE due to LL api failure\n")); 11174 satFreeIntIoResource( tiRoot, 11175 pSatDevData, 11176 satIntIo); 11177 /* Abort I/O after completion of device reset */ 11178 pSatDevData->satAbortAfterReset = agTRUE; 11179 #ifdef NOT_YET 11180 /* needs to investigate this case */ 11181 /* no report to OS layer */ 11182 satSubTM(tiRoot, 11183 tiDeviceHandle, 11184 TD_INTERNAL_TM_RESET, 11185 agNULL, 11186 agNULL, 11187 agNULL, 11188 agFALSE); 11189 #endif 11190 11191 return; 11192 } 11193 } 11194 else 11195 { 11196 TI_DBG1(("ossaSATAEvent: NCQ ERROR but recovery in progress\n")); 11197 } 11198 11199 } 11200 else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED) 11201 { 11202 TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n")); 11203 } 11204 else if (event == OSSA_IO_XFER_PIO_SETUP_ERROR) 11205 { 11206 TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR\n")); 11207 11208 } 11209 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED) 11210 { 11211 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n")); 11212 } 11213 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO) 11214 { 11215 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n")); 11216 } 11217 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST) 11218 { 11219 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n")); 11220 } 11221 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE) 11222 { 11223 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n")); 11224 } 11225 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED) 11226 { 11227 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n")); 11228 } 11229 else if (event == OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH) 11230 { 11231 TI_DBG1(("ossaSATAEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n")); 11232 } 11233 else if (event == OSSA_IO_XFR_ERROR_DIF_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH || 11234 event == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH) 11235 { 11236 TI_DBG1(("ossaSSPEvent: DIF related, event 0x%x\n", event)); 11237 /* process DIF detail information */ 11238 TI_DBG2(("ossaSSPEvent: agIOInfoLen %d\n", agIOInfoLen)); 11239 if (agParam == agNULL) 11240 { 11241 TI_DBG2(("ossaSSPEvent: agParam is NULL!!!\n")); 11242 return; 11243 } 11244 if (agIOInfoLen < sizeof(agsaDifDetails_t)) 11245 { 11246 TI_DBG2(("ossaSSPEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, sizeof(agsaDifDetails_t))); 11247 return; 11248 } 11249 /* reads agsaDifDetails_t */ 11250 saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t)); 11251 frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF); 11252 frameLen = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16; 11253 11254 TI_DBG2(("ossaSSPEvent: UpperLBA 0x%08x LowerLBA 0x%08x\n", agDifDetails.UpperLBA, agDifDetails.LowerLBA)); 11255 TI_DBG2(("ossaSSPEvent: SASAddrHI 0x%08x SASAddrLO 0x%08x\n", 11256 TD_GET_SAS_ADDRESSHI(agDifDetails.sasAddressHi), TD_GET_SAS_ADDRESSLO(agDifDetails.sasAddressLo))); 11257 TI_DBG2(("ossaSSPEvent: DIF error mask 0x%x Device ID 0x%x\n", 11258 (agDifDetails.DIFErrDevID) & 0xFF, (agDifDetails.DIFErrDevID & 0xFFFF0000) >> 16)); 11259 if (frameLen != 0 && frameLen <= 256) 11260 { 11261 saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen); 11262 tdhexdump("ossaSSPEvent frame", framePayload, frameLen); 11263 } 11264 } 11265 else 11266 { 11267 TI_DBG1(("ossaSATAEvent: ERROR event %d agDevHandle=%p.\n", event, agDevHandle )); 11268 11269 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 11270 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext); 11271 pSatDevData = satIOContext->pSatDevData; 11272 tdsaDeviceData = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData; 11273 onePortContext = tdsaDeviceData->tdPortContext; 11274 TI_DBG1(("ossaSATAEvent: did %d\n", tdsaDeviceData->id)); 11275 11276 /* send SMP_PHY_CONTROL_HARD_RESET */ 11277 if (event == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA) 11278 { 11279 if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */ 11280 { 11281 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n")); 11282 pSatDevData->NumOfFCA++; 11283 tdsaPhyControlSend(tiRoot, 11284 tdsaDeviceData, 11285 SMP_PHY_CONTROL_HARD_RESET, 11286 agNULL); 11287 } 11288 else 11289 { 11290 /* given up after one time of SMP HARD RESET; */ 11291 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n")); 11292 if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0) 11293 { 11294 /* 11295 1. remove this device 11296 2. device removal event 11297 */ 11298 tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData); 11299 tdsaDeviceData->valid = agFALSE; 11300 tdsaDeviceData->valid2 = agFALSE; 11301 tdsaDeviceData->registered = agFALSE; 11302 ostiInitiatorEvent( 11303 tiRoot, 11304 onePortContext->tiPortalContext, 11305 agNULL, 11306 tiIntrEventTypeDeviceChange, 11307 tiDeviceRemoval, 11308 agNULL 11309 ); 11310 } 11311 } 11312 } 11313 11314 } 11315 } 11316 #endif /* FDS_SM */ 11317 11318 /***************************************************************************** 11319 *! \brief itdsatErrorSATAEventHandle 11320 * 11321 * This routine is called to handle SATA error event 11322 * 11323 * \param agRoot: Handles for this instance of SAS/SATA hardware 11324 * \param agIORequest: Pointer to the LL I/O request context for this I/O. 11325 * \param agPortContext Pointer to the port context of TD and Lower layer 11326 * \param agDevHandle: Pointer to a device handle 11327 * \param event: event type 11328 * \param ioContext: Pointer to satIOContext_t 11329 * 11330 * \return: none 11331 * 11332 *****************************************************************************/ 11333 osGLOBAL void itdsatErrorSATAEventHandle( 11334 agsaRoot_t *agRoot, 11335 agsaIORequest_t *agIORequest, 11336 agsaPortContext_t *agPortContext, 11337 agsaDevHandle_t *agDevHandle, 11338 bit32 event, 11339 satIOContext_t *ioContext 11340 ) 11341 { 11342 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 11343 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 11344 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 11345 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 11346 tdIORequestBody_t *tdOrgIORequestBody; 11347 satIOContext_t *satIOContext; 11348 satIOContext_t *satOrgIOContext; 11349 satInternalIo_t *satIntIo; 11350 satDeviceData_t *satDevData; 11351 bit32 interruptContext = osData->IntContext; 11352 11353 TI_DBG1(("itdsatErrorSATAEventHandle: start\n")); 11354 satIOContext = (satIOContext_t *) ioContext; 11355 satIntIo = satIOContext->satIntIoContext; 11356 satDevData = satIOContext->pSatDevData; 11357 11358 11359 TI_DBG1(("itdsatErrorSATAEventHandle: event 0x%x\n", event)); 11360 11361 if (satIntIo == agNULL) 11362 { 11363 TI_DBG1(("itdsatErrorSATAEventHandle: External, OS generated\n")); 11364 satOrgIOContext = satIOContext; 11365 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 11366 11367 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 11368 11369 satFreeIntIoResource( tiRoot, 11370 satDevData, 11371 satIntIo); 11372 11373 if (event == OSSA_IO_OVERFLOW) 11374 { 11375 TI_DBG1(("itdsatErrorSATAEventHandle: tiIOOverRun\n")); 11376 ostiInitiatorIOCompleted( tiRoot, 11377 tdOrgIORequestBody->tiIORequest, 11378 tiIOOverRun, 11379 0, 11380 agNULL, 11381 interruptContext); 11382 } 11383 else 11384 { 11385 TI_DBG1(("itdsatErrorSATAEventHandle: else\n")); 11386 ostiInitiatorIOCompleted( tiRoot, 11387 tdOrgIORequestBody->tiIORequest, 11388 tiIOFailed, 11389 tiDetailOtherError, 11390 agNULL, 11391 interruptContext); 11392 } 11393 } 11394 else 11395 { 11396 TI_DBG1(("itdsatErrorSATAEventHandle: Internal, TD generated\n")); 11397 satOrgIOContext = satIOContext->satOrgIOContext; 11398 if (satOrgIOContext == agNULL) 11399 { 11400 TI_DBG1(("itdsatErrorSATAEventHandle: satOrgIOContext is NULL, wrong\n")); 11401 return; 11402 } 11403 else 11404 { 11405 TI_DBG6(("itdsatErrorSATAEventHandle: satOrgIOContext is NOT NULL\n")); 11406 } 11407 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 11408 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 11409 11410 satFreeIntIoResource( tiRoot, 11411 satDevData, 11412 satIntIo); 11413 11414 /* clean up TD layer's IORequestBody */ 11415 ostiFreeMemory( 11416 tiRoot, 11417 tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11418 sizeof(tdIORequestBody_t) 11419 ); 11420 11421 } 11422 return; 11423 } 11424 11425 osGLOBAL void ossaSATAAbortCB( 11426 agsaRoot_t *agRoot, 11427 agsaIORequest_t *agIORequest, 11428 bit32 flag, 11429 bit32 status) 11430 { 11431 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 11432 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 11433 tdIORequestBody_t *tdAbortIORequestBody = agNULL; 11434 tdsaDeviceData_t *oneDeviceData = agNULL; 11435 tiDeviceHandle_t *tiDeviceHandle = agNULL; 11436 tiIORequest_t *taskTag = agNULL; 11437 11438 TI_DBG1(("ossaSATAAbortCB: start\n")); 11439 11440 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 11441 if (tdAbortIORequestBody == agNULL) 11442 { 11443 TI_DBG1(("ossaSATAAbortCB: tdAbortIORequestBody is NULL warning!!!!\n")); 11444 return; 11445 } 11446 11447 if (flag == 2) 11448 { 11449 /* abort per port */ 11450 TI_DBG1(("ossaSATAAbortCB: abort per port\n")); 11451 } 11452 else if (flag == 1) 11453 { 11454 TI_DBG1(("ossaSATAAbortCB: abort all\n")); 11455 tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle; 11456 if (tiDeviceHandle == agNULL) 11457 { 11458 TI_DBG1(("ossaSATAAbortCB: tiDeviceHandle is NULL warning!!!!\n")); 11459 ostiFreeMemory( 11460 tiRoot, 11461 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11462 sizeof(tdIORequestBody_t) 11463 ); 11464 return; 11465 } 11466 11467 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 11468 if (oneDeviceData == agNULL) 11469 { 11470 TI_DBG1(("ossaSATAAbortCB: oneDeviceData is NULL warning!!!!\n")); 11471 ostiFreeMemory( 11472 tiRoot, 11473 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11474 sizeof(tdIORequestBody_t) 11475 ); 11476 return; 11477 } 11478 11479 if (status == OSSA_IO_SUCCESS) 11480 { 11481 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n")); 11482 /* clean up TD layer's IORequestBody */ 11483 if (oneDeviceData->OSAbortAll == agTRUE) 11484 { 11485 oneDeviceData->OSAbortAll = agFALSE; 11486 ostiInitiatorEvent( tiRoot, 11487 agNULL, 11488 tiDeviceHandle, 11489 tiIntrEventTypeLocalAbort, 11490 tiAbortOK, 11491 agNULL); 11492 } 11493 else 11494 { 11495 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id)); 11496 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 11497 } 11498 /* callback to OS layer here ??? */ 11499 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id)); 11500 ostiFreeMemory( 11501 tiRoot, 11502 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11503 sizeof(tdIORequestBody_t) 11504 ); 11505 11506 } 11507 else if (status == OSSA_IO_NOT_VALID) 11508 { 11509 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n")); 11510 /* 11511 Nothing is reproted to OS layer 11512 */ 11513 if (oneDeviceData->OSAbortAll == agTRUE) 11514 { 11515 oneDeviceData->OSAbortAll = agFALSE; 11516 ostiInitiatorEvent( tiRoot, 11517 agNULL, 11518 tiDeviceHandle, 11519 tiIntrEventTypeLocalAbort, 11520 tiAbortFailed, 11521 agNULL ); 11522 } 11523 else 11524 { 11525 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id)); 11526 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 11527 } 11528 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id)); 11529 ostiFreeMemory( 11530 tiRoot, 11531 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11532 sizeof(tdIORequestBody_t) 11533 ); 11534 } 11535 else if (status == OSSA_IO_NO_DEVICE) 11536 { 11537 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n")); 11538 /* 11539 Nothing is reproted to OS layer 11540 */ 11541 if (oneDeviceData->OSAbortAll == agTRUE) 11542 { 11543 oneDeviceData->OSAbortAll = agFALSE; 11544 ostiInitiatorEvent( tiRoot, 11545 agNULL, 11546 tiDeviceHandle, 11547 tiIntrEventTypeLocalAbort, 11548 tiAbortInProgress, 11549 agNULL ); 11550 } 11551 else 11552 { 11553 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id)); 11554 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 11555 } 11556 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id)); 11557 ostiFreeMemory( 11558 tiRoot, 11559 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11560 sizeof(tdIORequestBody_t) 11561 ); 11562 } 11563 else if (status == OSSA_IO_ABORT_IN_PROGRESS) 11564 { 11565 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n")); 11566 /* 11567 Nothing is reproted to OS layer 11568 */ 11569 if (oneDeviceData->OSAbortAll == agTRUE) 11570 { 11571 oneDeviceData->OSAbortAll = agFALSE; 11572 ostiInitiatorEvent( tiRoot, 11573 agNULL, 11574 tiDeviceHandle, 11575 tiIntrEventTypeLocalAbort, 11576 tiAbortInProgress, 11577 agNULL ); 11578 } 11579 else 11580 { 11581 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id)); 11582 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 11583 } 11584 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id)); 11585 ostiFreeMemory( 11586 tiRoot, 11587 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11588 sizeof(tdIORequestBody_t) 11589 ); 11590 } 11591 else 11592 { 11593 TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status )); 11594 /* 11595 Nothing is reproted to OS layer 11596 */ 11597 if (oneDeviceData->OSAbortAll == agTRUE) 11598 { 11599 oneDeviceData->OSAbortAll = agFALSE; 11600 ostiInitiatorEvent( tiRoot, 11601 agNULL, 11602 tiDeviceHandle, 11603 tiIntrEventTypeLocalAbort, 11604 tiAbortInProgress, 11605 agNULL ); 11606 } 11607 else 11608 { 11609 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id)); 11610 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 11611 } 11612 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id)); 11613 ostiFreeMemory( 11614 tiRoot, 11615 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11616 sizeof(tdIORequestBody_t) 11617 ); 11618 } 11619 } 11620 else if (flag == 0) 11621 { 11622 TI_DBG1(("ossaSATAAbortCB: abort one\n")); 11623 taskTag = tdAbortIORequestBody->tiIOToBeAbortedRequest; 11624 11625 if (status == OSSA_IO_SUCCESS) 11626 { 11627 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n")); 11628 11629 ostiInitiatorEvent( tiRoot, 11630 agNULL, 11631 agNULL, 11632 tiIntrEventTypeLocalAbort, 11633 tiAbortOK, 11634 taskTag ); 11635 ostiFreeMemory( 11636 tiRoot, 11637 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11638 sizeof(tdIORequestBody_t) 11639 ); 11640 11641 } 11642 else if (status == OSSA_IO_NOT_VALID) 11643 { 11644 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n")); 11645 11646 ostiInitiatorEvent( tiRoot, 11647 agNULL, 11648 agNULL, 11649 tiIntrEventTypeLocalAbort, 11650 tiAbortFailed, 11651 taskTag ); 11652 11653 ostiFreeMemory( 11654 tiRoot, 11655 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11656 sizeof(tdIORequestBody_t) 11657 ); 11658 } 11659 else if (status == OSSA_IO_NO_DEVICE) 11660 { 11661 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n")); 11662 11663 ostiInitiatorEvent( tiRoot, 11664 agNULL, 11665 agNULL, 11666 tiIntrEventTypeLocalAbort, 11667 tiAbortInProgress, 11668 taskTag ); 11669 11670 ostiFreeMemory( 11671 tiRoot, 11672 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11673 sizeof(tdIORequestBody_t) 11674 ); 11675 } 11676 else if (status == OSSA_IO_ABORT_IN_PROGRESS) 11677 { 11678 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n")); 11679 11680 ostiInitiatorEvent( tiRoot, 11681 agNULL, 11682 agNULL, 11683 tiIntrEventTypeLocalAbort, 11684 tiAbortInProgress, 11685 taskTag ); 11686 11687 ostiFreeMemory( 11688 tiRoot, 11689 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11690 sizeof(tdIORequestBody_t) 11691 ); 11692 } 11693 else 11694 { 11695 TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status )); 11696 11697 ostiInitiatorEvent( tiRoot, 11698 agNULL, 11699 agNULL, 11700 tiIntrEventTypeLocalAbort, 11701 tiAbortFailed, 11702 taskTag ); 11703 11704 ostiFreeMemory( 11705 tiRoot, 11706 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11707 sizeof(tdIORequestBody_t) 11708 ); 11709 } 11710 } 11711 else 11712 { 11713 TI_DBG1(("ossaSATAAbortCB: wrong flag %d\n", flag)); 11714 } 11715 return; 11716 } 11717 11718 /***************************************************************************** 11719 *! \brief ossaSATADeviceResetCB 11720 * 11721 * This routine is called to complete a SATA device reset request previously 11722 * issued to the LL Layer in saSATADeviceReset(). 11723 * 11724 * \param agRoot: Handles for this instance of SAS/SATA hardware 11725 * \param agDevHandle: Pointer to a device handle 11726 * \param resetStatus: Reset status: 11727 * OSSA_SUCCESS: The reset operation completed successfully. 11728 * OSSA_FAILURE: The reset operation failed. 11729 * \param resetparm: Pointer to the Device-To-Host FIS received from the device. 11730 * 11731 * \return: none 11732 * 11733 *****************************************************************************/ 11734 osGLOBAL void 11735 ossaSATADeviceResetCB( 11736 agsaRoot_t *agRoot, 11737 agsaDevHandle_t *agDevHandle, 11738 bit32 resetStatus, 11739 void *resetparm) 11740 { 11741 bit32 tiResetStatus; 11742 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 11743 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 11744 tdsaDeviceData_t *pDeviceData; 11745 tiDeviceHandle_t *tiDeviceHandle; 11746 11747 TI_DBG1(("ossaSATADeviceResetCB: agDevHandle=%p resetStatus=0x%x\n", 11748 agDevHandle, resetStatus )); 11749 11750 pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData; 11751 tiDeviceHandle = &(pDeviceData->tiDeviceHandle); 11752 11753 if (resetStatus == OSSA_SUCCESS ) 11754 tiResetStatus = tiSuccess; 11755 else 11756 tiResetStatus = tiError; 11757 11758 osSatResetCB( tiRoot, 11759 tiDeviceHandle, 11760 tiResetStatus, 11761 resetparm); 11762 11763 } 11764 11765 11766 /*****************************************************************************/ 11767 /*! \brief satDecrementPendingIO 11768 * 11769 * This function decrements the number of pending IO's 11770 * 11771 * \param tiRoot: Pointer to TISA initiator driver/port instance. 11772 * \param tdsaAllShared: Pointer to TD context. 11773 * \param satIOContext_t: Pointer to the SAT IO Context 11774 * 11775 * \return 11776 * None 11777 */ 11778 /*****************************************************************************/ 11779 GLOBAL void 11780 satDecrementPendingIO( 11781 tiRoot_t *tiRoot, 11782 tdsaContext_t *tdsaAllShared, 11783 satIOContext_t *satIOContext 11784 ) 11785 { 11786 satDeviceData_t *satDevData; 11787 11788 TI_DBG4(("satDecrementPendingIO: start\n")); 11789 11790 satDevData = satIOContext->pSatDevData; 11791 11792 if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) || 11793 (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) ) 11794 { 11795 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK); 11796 satDevData->satPendingNCQIO--; 11797 satIOContext->pSatDevData->satPendingIO--; 11798 TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink); 11799 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK); 11800 } 11801 else 11802 { 11803 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK); 11804 satDevData->satPendingNONNCQIO--; 11805 satIOContext->pSatDevData->satPendingIO--; 11806 TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink); 11807 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK); 11808 } 11809 11810 return; 11811 } 11812 11813 GLOBAL void 11814 satTranslateATAPIErrorsToSCSIErrors( 11815 bit8 bCommand, 11816 bit8 bATAStatus, 11817 bit8 bATAError, 11818 bit8 *pSenseKey, 11819 bit16 *pSenseCodeInfo 11820 ) 11821 { 11822 if (pSenseKey == agNULL || pSenseCodeInfo == agNULL) 11823 { 11824 TI_DBG0(("TranslateATAErrorsToSCSIErros: pSenseKey == agNULL || pSenseCodeInfo == agNULL\n")); 11825 return; 11826 } 11827 11828 if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & NM_ATA_ERROR_MASK)) 11829 { 11830 *pSenseKey = SCSI_SNSKEY_NOT_READY; 11831 *pSenseCodeInfo = 0x3a00; 11832 } 11833 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ABRT_ATA_ERROR_MASK)) 11834 { 11835 *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND; 11836 *pSenseCodeInfo = 0; 11837 } 11838 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MCR_ATA_ERROR_MASK)) 11839 { 11840 *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION; 11841 *pSenseCodeInfo = 0x5a01; 11842 } 11843 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & IDNF_ATA_ERROR_MASK)) 11844 { 11845 *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR; 11846 *pSenseCodeInfo = 0x1401; 11847 } 11848 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MC_ATA_ERROR_MASK)) 11849 { 11850 *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION; 11851 *pSenseCodeInfo = 0x2800; 11852 } 11853 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & UNC_ATA_ERROR_MASK)) 11854 { 11855 /*READ*/ 11856 *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR; 11857 *pSenseCodeInfo = 0x1100; 11858 11859 /*add WRITE here */ 11860 } 11861 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ICRC_ATA_ERROR_MASK)) 11862 { 11863 *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND; 11864 *pSenseCodeInfo = 0x4703; 11865 } 11866 else if((bATAStatus & DF_ATA_STATUS_MASK)) 11867 { 11868 *pSenseKey = SCSI_SNSKEY_HARDWARE_ERROR; 11869 *pSenseCodeInfo = 0x4400; 11870 } 11871 else 11872 { 11873 TI_DBG0(("unhandled ata error: bATAStatus = 0x%x, bATAError = 0x%x\n", 11874 bATAStatus, bATAError)); 11875 } 11876 11877 } 11878 11879 #endif /* #ifdef SATA_ENABLE */ 11880 11881