1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
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
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.
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
21 ********************************************************************************/
22 /*****************************************************************************/
25 * The file implementing SCSI/ATA Translation (SAT) for LL Layer callback
28 /*****************************************************************************/
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 #include <dev/pms/config.h>
33 #include <dev/pms/freebsd/driver/common/osenv.h>
34 #include <dev/pms/freebsd/driver/common/ostypes.h>
35 #include <dev/pms/freebsd/driver/common/osdebug.h>
39 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
40 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
41 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
43 #include <dev/pms/RefTisa/tisa/api/titypes.h>
44 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
45 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
46 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
49 #include <dev/pms/RefTisa/sat/api/sm.h>
50 #include <dev/pms/RefTisa/sat/api/smapi.h>
51 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
55 #include <dev/pms/RefTisa/discovery/api/dm.h>
56 #include <dev/pms/RefTisa/discovery/api/dmapi.h>
57 #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
60 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
61 #include <dev/pms/freebsd/driver/common/osstring.h>
62 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
64 #ifdef INITIATOR_DRIVER
65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
66 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
67 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
72 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
73 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
76 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
77 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
79 #include <dev/pms/RefTisa/tisa/sassata/sata/host/sat.h>
80 #include <dev/pms/RefTisa/tisa/sassata/sata/host/satproto.h>
82 /*****************************************************************************
83 *! \brief ossaSATACompleted
85 * This routine is called to complete a SATA request previously issued to the
86 * LL Layer in saSATAStart()
88 * \param agRoot: Handles for this instance of SAS/SATA hardware
89 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
90 * \param agIOStatus: Status of completed I/O.
91 * \param agFirstDword:Pointer to the four bytes of FIS.
92 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
94 * \param agParam: Additional info based on status.
98 *****************************************************************************/
102 agsaIORequest_t *agIORequest,
110 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
111 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
112 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
113 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
114 tdIORequestBody_t *tdIORequestBody;
115 satIOContext_t *satIOContext;
116 satDeviceData_t *pSatDevData;
117 tdsaDeviceData_t *tdsaDeviceData = agNULL;
118 tdsaPortContext_t *onePortContext;
119 tiDeviceHandle_t *tiDeviceHandle = agNULL;
120 agsaDevHandle_t *agDevHandle = agNULL;
122 tdsaDeviceData_t *oneDeviceData = agNULL;
124 TDSA_OUT_ENTER(tiRoot);
126 TI_DBG6(("ossaSATACompleted: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
127 agIORequest, agIOStatus, agIOInfoLen));
129 if (agIORequest == agNULL)
131 TI_DBG1(("ossaSATACompleted: agIORequest is NULL!!!!\n"));
135 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
137 if (tdIORequestBody == agNULL)
139 TI_DBG1(("ossaSATACompleted: tdIORequestBody is NULL!!!!\n"));
143 if (tdIORequestBody->ioCompleted == agTRUE)
145 tiDeviceHandle = tdIORequestBody->tiDevHandle;
146 if (tiDeviceHandle == agNULL)
148 TI_DBG1(("ossaSATACompleted: tiDeviceHandle is NULL!!!!\n"));
151 tdsaDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
152 TI_DBG1(("ossaSATACompleted: Error!!!!!! double completion\n"));
153 if (tdsaDeviceData == agNULL)
155 TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n"));
158 TI_DBG1(("ossaSATACompleted: did %d \n", tdsaDeviceData->id));
162 tdIORequestBody->ioCompleted = agTRUE;
163 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
165 if (satIOContext == agNULL)
167 TI_DBG1(("ossaSATACompleted: satIOContext is NULL!!!!\n"));
171 pSatDevData = satIOContext->pSatDevData;
173 if (tdIORequestBody->tiDevHandle != agNULL)
175 oneDeviceData = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData;
178 if (pSatDevData == agNULL && oneDeviceData != agNULL)
180 TI_DBG1(("ossaSATACompleted: pSatDevData is NULL, loc 1, wrong\n"));
181 pSatDevData = &(oneDeviceData->satDevData);
184 if (pSatDevData == agNULL)
186 TI_DBG1(("ossaSATACompleted: pSatDevData is NULL loc 2, wrong\n"));
187 if (satIOContext->satOrgIOContext == agNULL)
189 TI_DBG1(("ossaSATACompleted: external command\n"));
193 TI_DBG1(("ossaSATACompleted: internal command\n"));
198 tdsaDeviceData = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData;
199 if (oneDeviceData != tdsaDeviceData)
201 if (satIOContext->satOrgIOContext == agNULL)
203 TI_DBG1(("ossaSATACompleted: diff device handle; external command\n"));
207 TI_DBG1(("ossaSATACompleted: diff device handle; internal command\n"));
211 if (tdsaDeviceData == agNULL)
213 TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n"));
217 onePortContext = tdsaDeviceData->tdPortContext;
219 /* retries in OSSA_IO_XFER_OPEN_RETRY_TIMEOUT */
220 if (agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT)
222 if (tdsaDeviceData->valid == agTRUE && tdsaDeviceData->registered == agTRUE &&
223 tdsaDeviceData->tdPortContext != agNULL )
225 if (tdIORequestBody->reTries <= OPEN_RETRY_RETRIES) /* 10 */
227 agDevHandle = tdsaDeviceData->agDevHandle;
228 status = saSATAStart( agRoot,
230 tdsaRotateQnumber(tiRoot, tdsaDeviceData),
232 satIOContext->reqType,
233 &(tdIORequestBody->transport.SATA.agSATARequestBody),
234 satIOContext->sataTag,
237 if (status == AGSA_RC_SUCCESS)
239 TI_DBG1(("ossaSATACompleted: retried\n"));
240 tdIORequestBody->ioStarted = agTRUE;
241 tdIORequestBody->ioCompleted = agFALSE;
242 tdIORequestBody->reTries++;
247 TI_DBG1(("ossaSATACompleted: retry failed\n"));
248 tdIORequestBody->ioStarted = agFALSE;
249 tdIORequestBody->ioCompleted = agTRUE;
250 tdIORequestBody->reTries = 0;
255 /* retries is over, do nothing */
256 TI_DBG1(("ossaSATACompleted: retry is over and fail\n"));
257 tdIORequestBody->reTries = 0;
262 TI_DBG1(("ossaSATACompleted: incorrect device state or no portcontext\n"));
263 tdIORequestBody->reTries = 0;
265 } /* if OSSA_IO_XFER_OPEN_RETRY_TIMEOUT*/
267 /* release tag value for SATA */
268 if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
269 (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
271 satTagRelease(tiRoot, pSatDevData, satIOContext->sataTag);
274 /* send SMP_PHY_CONTROL_HARD_RESET */
275 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA)
277 if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
279 TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
280 pSatDevData->NumOfFCA++;
281 tdsaPhyControlSend(tiRoot,
283 SMP_PHY_CONTROL_HARD_RESET,
285 tdsaRotateQnumber(tiRoot, tdsaDeviceData)
290 /* given up after one time of SMP HARD RESET; */
291 TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n"));
292 if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0)
295 1. remove this device
296 2. device removal event
298 tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData);
299 tdsaDeviceData->valid = agFALSE;
300 tdsaDeviceData->valid2 = agFALSE;
301 tdsaDeviceData->registered = agFALSE;
302 // pSatDevData->NumOfFCA = 0;
305 onePortContext->tiPortalContext,
307 tiIntrEventTypeDeviceChange,
315 if (agIOStatus == OSSA_IO_ABORTED)
318 free abort IO request itself - agParam; done in ossaSATAEvent()
321 /* just for debugging */
322 if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL)
324 TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n"));
326 if (agIOStatus == OSSA_IO_DS_IN_RECOVERY)
328 TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_IN_RECOVERY\n"));
331 satIOContext->satCompleteCB( agRoot,
339 TDSA_OUT_LEAVE(tiRoot);
342 /*****************************************************************************
343 *! \brief satPacketCB
345 * This routine is a callback function called from ossaSATACompleted().
346 * This CB routine deals with normal Packet command I/O SATA request.
348 * \param agRoot: Handles for this instance of SAS/SATA hardware
349 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
350 * \param agIOStatus: Status of completed I/O.
351 * \param agFirstDword:Pointer to the four bytes of FIS.
352 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
354 * \param agParam: Additional info based on status.
355 * \param ioContext: Pointer to satIOContext_t.
359 *****************************************************************************/
363 agsaIORequest_t *agIORequest,
365 agsaFisHeader_t *agFirstDword,
371 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
372 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
373 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
374 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
375 tdIORequestBody_t *tdIORequestBody;
376 tdIORequestBody_t *tdOrgIORequestBody;
377 satIOContext_t *satIOContext;
378 satIOContext_t *satOrgIOContext;
379 satIOContext_t *satNewIOContext;
380 satInternalIo_t *satIntIo;
381 satInternalIo_t *satNewIntIo = agNULL;
382 satDeviceData_t *satDevData;
383 scsiRspSense_t *pSense;
384 tiIORequest_t *tiOrgIORequest;
385 tiIniScsiCmnd_t *scsiCmnd;
386 bit32 interruptContext = osData->IntContext;
388 bit16 bSenseCodeInfo = 0;
391 TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
393 /* internally generate tiIOContext */
394 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
395 satIOContext = (satIOContext_t *) ioContext;
396 satIntIo = satIOContext->satIntIoContext;
397 satDevData = satIOContext->pSatDevData;
400 if (satIntIo == agNULL)
402 TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n"));
403 satOrgIOContext = satIOContext;
404 tiOrgIORequest = tdIORequestBody->tiIORequest;
405 pSense = satOrgIOContext->pSense;
406 scsiCmnd = satOrgIOContext->pScsiCmnd;
410 TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n"));
411 satOrgIOContext = satIOContext->satOrgIOContext;
412 if (satOrgIOContext == agNULL)
414 TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n"));
419 TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n"));
421 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
422 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
423 pSense = satOrgIOContext->pSense;
424 scsiCmnd = satOrgIOContext->pScsiCmnd;
428 switch(scsiCmnd->cdb[0])
430 case SCSIOPC_TEST_UNIT_READY:
431 //satTestUnitReadyCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext);
433 case SCSIOPC_GET_EVENT_STATUS_NOTIFICATION:
435 case SCSIOPC_READ_CAPACITY_10:
436 case SCSIOPC_READ_CAPACITY_16:
437 //satPacketReadCapacityCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext);
443 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
445 tdIORequestBody->ioCompleted = agTRUE;
446 tdIORequestBody->ioStarted = agFALSE;
448 /* interal structure free */
449 satFreeIntIoResource( tiRoot, satDevData, satIntIo);
451 if( agIOStatus == OSSA_IO_SUCCESS && agFirstDword == agNULL)
453 TI_DBG1(("satPacketCB: agIOStatus == OSSA_IO_SUCCESS, agFirstDword == agNULL \n"));
454 ostiInitiatorIOCompleted( tiRoot,
455 tdIORequestBody->tiIORequest,
461 else if (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL)
463 TI_DBG1(("satPacketCB: wrong. agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL \n"));
464 satNewIntIo = satAllocIntIoResource( tiRoot,
469 if (satNewIntIo == agNULL)
471 /* memory allocation failure */
472 /* just translate the ATAPI error register to sense information */
473 satTranslateATAPIErrorsToSCSIErrors(
475 agFirstDword->D2H.status,
476 agFirstDword->D2H.error,
480 satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
481 ostiInitiatorIOCompleted( tiRoot,
482 tdIORequestBody->tiIORequest,
484 SCSI_STAT_CHECK_CONDITION,
485 satOrgIOContext->pTiSenseData,
487 TI_DBG1(("satPacketCB: momory allocation fails\n"));
489 } /* end memory allocation */
491 satNewIOContext = satPrepareNewIO(satNewIntIo,
497 /* sends request sense to ATAPI device for acquiring sense information */
498 status = satRequestSenseForATAPI(tiRoot,
499 &satNewIntIo->satIntTiIORequest,
500 satNewIOContext->ptiDeviceHandle,
501 &satNewIntIo->satIntTiScsiXchg,
504 if (status != tiSuccess)
506 satFreeIntIoResource( tiRoot,
509 /* just translate the ATAPI error register to sense information */
510 satTranslateATAPIErrorsToSCSIErrors(
512 agFirstDword->D2H.status,
513 agFirstDword->D2H.error,
517 satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
518 ostiInitiatorIOCompleted( tiRoot,
519 tdIORequestBody->tiIORequest,
521 SCSI_STAT_CHECK_CONDITION,
522 satOrgIOContext->pTiSenseData,
524 TI_DBG1(("satPacketCB: failed to call satRequestSenseForATAPI()\n"));
527 else if (agIOStatus != OSSA_IO_SUCCESS)
529 TI_DBG1(("satPacketCB: wrong. agIOStatus != OSSA_IO_SUCCESS, status %d\n", agIOStatus));
530 itdsatProcessAbnormalCompletion(
541 TI_DBG1(("satPacketCB: Unknown error \n"));
542 ostiInitiatorIOCompleted( tiRoot,
543 tdIORequestBody->tiIORequest,
550 /*****************************************************************************
551 *! \brief satRequestSenseForATAPICB
553 * This routine is a callback function called from ossaSATACompleted().
554 * This CB routine deals with normal non-chained data I/O SATA request.
556 * \param agRoot: Handles for this instance of SAS/SATA hardware
557 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
558 * \param agIOStatus: Status of completed I/O.
559 * \param agFirstDword:Pointer to the four bytes of FIS.
560 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
562 * \param agParam: Additional info based on status.
563 * \param ioContext: Pointer to satIOContext_t.
567 *****************************************************************************/
568 void satRequestSenseForATAPICB(
570 agsaIORequest_t *agIORequest,
572 agsaFisHeader_t *agFirstDword,
578 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
579 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
580 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
581 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
582 tdIORequestBody_t *tdIORequestBody;
583 tdIORequestBody_t *tdOrgIORequestBody;
584 satIOContext_t *satIOContext;
585 satIOContext_t *satOrgIOContext;
586 satInternalIo_t *satIntIo;
587 satDeviceData_t *satDevData;
588 tiIORequest_t *tiOrgIORequest;
589 bit32 interruptContext = osData->IntContext;
591 TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
593 /* internally generate tiIOContext */
594 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
595 satIOContext = (satIOContext_t *) ioContext;
596 satIntIo = satIOContext->satIntIoContext;
597 satDevData = satIOContext->pSatDevData;
600 if (satIntIo == agNULL)
602 TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n"));
603 satOrgIOContext = satIOContext;
604 tiOrgIORequest = tdIORequestBody->tiIORequest;
608 TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n"));
609 satOrgIOContext = satIOContext->satOrgIOContext;
610 if (satOrgIOContext == agNULL)
612 TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n"));
617 TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n"));
619 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
620 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
623 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
625 tdIORequestBody->ioCompleted = agTRUE;
626 tdIORequestBody->ioStarted = agFALSE;
628 /* copy the request sense buffer to original IO buffer*/
629 if (satIntIo != agNULL)
631 osti_memcpy(satOrgIOContext->pTiSenseData->senseData, satIntIo->satIntDmaMem.virtPtr, SENSE_DATA_LENGTH);
632 satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH;
633 /* interal structure free */
634 satFreeIntIoResource( tiRoot, satDevData, satIntIo);
637 /* notify the OS to complete this SRB */
638 ostiInitiatorIOCompleted( tiRoot,
641 SCSI_STAT_CHECK_CONDITION,
642 satOrgIOContext->pTiSenseData,
645 /*****************************************************************************
646 *! \brief satSetFeaturesPIOCB
648 * This routine is a callback function called from ossaSATACompleted().
649 * This CB routine deals with normal non-chained data I/O SATA request.
651 * \param agRoot: Handles for this instance of SAS/SATA hardware
652 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
653 * \param agIOStatus: Status of completed I/O.
654 * \param agFirstDword:Pointer to the four bytes of FIS.
655 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
657 * \param agParam: Additional info based on status.
658 * \param ioContext: Pointer to satIOContext_t.
662 *****************************************************************************/
663 void satSetFeaturesPIOCB(
665 agsaIORequest_t *agIORequest,
667 agsaFisHeader_t *agFirstDword,
673 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
674 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
675 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
676 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
677 tdIORequestBody_t *tdIORequestBody;
678 tdIORequestBody_t *tdOrgIORequestBody;
679 satIOContext_t *satIOContext;
680 satIOContext_t *satOrgIOContext;
681 satIOContext_t *satNewIOContext;
682 satInternalIo_t *satIntIo;
683 satInternalIo_t *satNewIntIo = agNULL;
684 satDeviceData_t *satDevData;
685 tiIORequest_t *tiOrgIORequest;
686 tiIniScsiCmnd_t *scsiCmnd;
689 TI_DBG3(("satSetFeaturesPIOCB start\n"));
691 /* internally generate tiIOContext */
692 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
693 satIOContext = (satIOContext_t *) ioContext;
694 satIntIo = satIOContext->satIntIoContext;
695 satDevData = satIOContext->pSatDevData;
698 if (satIntIo == agNULL)
700 TI_DBG4(("satSetFeaturesPIOCB: External satInternalIo_t satIntIoContext\n"));
701 satOrgIOContext = satIOContext;
702 tiOrgIORequest = tdIORequestBody->tiIORequest;
703 scsiCmnd = satOrgIOContext->pScsiCmnd;
707 TI_DBG4(("satSetFeaturesPIOCB: Internal satInternalIo_t satIntIoContext\n"));
708 satOrgIOContext = satIOContext->satOrgIOContext;
709 if (satOrgIOContext == agNULL)
711 TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NULL, wrong\n"));
716 TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NOT NULL\n"));
718 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
719 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
720 scsiCmnd = satOrgIOContext->pScsiCmnd;
722 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
724 tdIORequestBody->ioCompleted = agTRUE;
725 tdIORequestBody->ioStarted = agFALSE;
727 /* interal structure free */
728 satFreeIntIoResource(tiRoot,
732 /*if the ATAPI device support DMA, then enble this feature*/
733 if (satDevData->satDMASupport && satDevData->satDMAEnabled)
735 satNewIntIo = satAllocIntIoResource( tiRoot,
740 if (satNewIntIo == agNULL)
742 TI_DBG1(("satSetFeaturesPIOCB: momory allocation fails\n"));
744 } /* end memory allocation */
746 satNewIOContext = satPrepareNewIO(satNewIntIo,
752 /* sends either ATA SET FEATURES based on DMA bit */
753 status = satSetFeatures(tiRoot,
754 &satNewIntIo->satIntTiIORequest,
755 satNewIOContext->ptiDeviceHandle,
756 &satNewIntIo->satIntTiScsiXchg,
760 if (status != tiSuccess)
762 satFreeIntIoResource( tiRoot, satDevData, satNewIntIo);
763 TI_DBG1(("satSetFeaturesPIOCB: failed to call satSetFeatures()\n"));
768 /*****************************************************************************
769 *! \brief satSetFeaturesCB
771 * This routine is a callback function called from ossaSATACompleted().
772 * This CB routine deals with normal non-chained data I/O SATA request.
774 * \param agRoot: Handles for this instance of SAS/SATA hardware
775 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
776 * \param agIOStatus: Status of completed I/O.
777 * \param agFirstDword:Pointer to the four bytes of FIS.
778 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
780 * \param agParam: Additional info based on status.
781 * \param ioContext: Pointer to satIOContext_t.
785 *****************************************************************************/
786 void satSetFeaturesCB(
788 agsaIORequest_t *agIORequest,
790 agsaFisHeader_t *agFirstDword,
796 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
797 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
798 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
799 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
800 tdIORequestBody_t *tdIORequestBody;
801 tdIORequestBody_t *tdOrgIORequestBody = agNULL;
802 satIOContext_t *satIOContext;
803 satIOContext_t *satOrgIOContext;
804 satInternalIo_t *satIntIo;
805 satDeviceData_t *satDevData;
806 tdsaPortContext_t *onePortContext = agNULL;
807 tiPortalContext_t *tiPortalContext = agNULL;
808 tdsaDeviceData_t *oneDeviceData = agNULL;
810 TI_DBG3(("satSetFeaturesCB start\n"));
812 /* internally generate tiIOContext */
813 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
814 satIOContext = (satIOContext_t *) ioContext;
815 satIntIo = satIOContext->satIntIoContext;
816 satDevData = satIOContext->pSatDevData;
817 oneDeviceData = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData;
818 onePortContext = oneDeviceData->tdPortContext;
819 if (onePortContext == agNULL)
821 TI_DBG4(("satSetFeaturesCB: onePortContext is NULL, wrong\n"));
824 tiPortalContext = onePortContext->tiPortalContext;
825 PhyID = oneDeviceData->phyID;
827 if (satIntIo == agNULL)
829 TI_DBG4(("satSetFeaturesCB: External satInternalIo_t satIntIoContext\n"));
830 satOrgIOContext = satIOContext;
834 TI_DBG4(("satSetFeaturesCB: Internal satInternalIo_t satIntIoContext\n"));
835 satOrgIOContext = satIOContext->satOrgIOContext;
836 if (satOrgIOContext == agNULL)
838 TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NULL, wrong\n"));
843 TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NOT NULL\n"));
845 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
847 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
849 tdIORequestBody->ioCompleted = agTRUE;
850 tdIORequestBody->ioStarted = agFALSE;
852 /* interal structure free */
853 satFreeIntIoResource(tiRoot,
858 /* clean up TD layer's IORequestBody */
859 if (tdOrgIORequestBody!= agNULL)
861 ostiFreeMemory(tiRoot,
862 tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
863 sizeof(tdIORequestBody_t)
867 if (onePortContext != agNULL)
869 /* this condition is for tdsaDiscoveryStartIDDevCB routine*/
870 if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
872 TI_DBG1(("satSetFeaturesCB: ID completed after discovery is done; tiDeviceArrival\n"));
873 /* in case registration is finished after discovery is finished */
878 tiIntrEventTypeDeviceChange,
884 TI_DBG2(("satSetFeaturesCB: pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id));
885 /* the below codes is for satAddSATAIDDevCB routine*/
886 /* notifying link up */
891 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
893 #ifdef INITIATOR_DRIVER
894 /* triggers discovery */
897 tiPortDiscoveryReady,
899 (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
905 TI_DBG1(("satSetFeaturesCB: onePortContext is NULL, wrong\n"));
908 /*****************************************************************************
909 *! \brief satDeviceResetCB
911 * This routine is a callback function called from ossaSATACompleted().
912 * This CB routine deals with normal non-chained data I/O SATA request.
914 * \param agRoot: Handles for this instance of SAS/SATA hardware
915 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
916 * \param agIOStatus: Status of completed I/O.
917 * \param agFirstDword:Pointer to the four bytes of FIS.
918 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
920 * \param agParam: Additional info based on status.
921 * \param ioContext: Pointer to satIOContext_t.
925 *****************************************************************************/
926 void satDeviceResetCB(
928 agsaIORequest_t *agIORequest,
930 agsaFisHeader_t *agFirstDword,
936 /* callback for satResetDevice */
937 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
938 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
939 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
940 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
941 tdIORequestBody_t *tdIORequestBody;
942 tdIORequestBody_t *tdOrgIORequestBody = agNULL;
943 satIOContext_t *satIOContext;
944 satIOContext_t *satOrgIOContext;
945 // satIOContext_t *satNewIOContext;
946 satInternalIo_t *satIntIo;
947 // satInternalIo_t *satNewIntIo = agNULL;
948 satDeviceData_t *satDevData;
949 tiIORequest_t *tiOrgIORequest;
950 #ifdef TD_DEBUG_ENABLE
953 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
956 bit32 report = agFALSE;
957 bit32 AbortTM = agFALSE;
959 TI_DBG1(("satDeviceResetCB: start\n"));
961 TI_DBG6(("satDeviceResetCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
963 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
964 satIOContext = (satIOContext_t *) ioContext;
965 satIntIo = satIOContext->satIntIoContext;
966 satDevData = satIOContext->pSatDevData;
968 if (satIntIo == agNULL)
970 TI_DBG6(("satDeviceResetCB: External, OS generated\n"));
971 satOrgIOContext = satIOContext;
972 tiOrgIORequest = tdIORequestBody->tiIORequest;
976 TI_DBG6(("satDeviceResetCB: Internal, TD generated\n"));
977 satOrgIOContext = satIOContext->satOrgIOContext;
978 if (satOrgIOContext == agNULL)
980 TI_DBG6(("satDeviceResetCB: satOrgIOContext is NULL, wrong\n"));
985 TI_DBG6(("satDeviceResetCB: satOrgIOContext is NOT NULL\n"));
987 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
988 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
991 tdIORequestBody->ioCompleted = agTRUE;
992 tdIORequestBody->ioStarted = agFALSE;
994 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
996 TI_DBG1(("satDeviceResetCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
998 if (satOrgIOContext->NotifyOS == agTRUE)
1000 ostiInitiatorEvent( tiRoot,
1003 tiIntrEventTypeTaskManagement,
1008 satDevData->satTmTaskTag = agNULL;
1010 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1012 satFreeIntIoResource( tiRoot,
1018 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED ||
1019 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION ||
1020 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
1021 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
1022 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION ||
1023 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED ||
1024 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION ||
1025 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR ||
1026 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
1029 TI_DBG1(("satDeviceResetCB: OSSA_IO_OPEN_CNX_ERROR\n"));
1031 if (satOrgIOContext->NotifyOS == agTRUE)
1033 ostiInitiatorEvent( tiRoot,
1036 tiIntrEventTypeTaskManagement,
1041 satDevData->satTmTaskTag = agNULL;
1043 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1045 satFreeIntIoResource( tiRoot,
1051 if (agIOStatus != OSSA_IO_SUCCESS)
1053 /* only agsaFisPioSetup_t is expected */
1054 #ifdef TD_DEBUG_ENABLE
1055 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
1056 ataStatus = satPIOSetupHeader->status; /* ATA Status register */
1057 ataError = satPIOSetupHeader->error; /* ATA Eror register */
1059 TI_DBG1(("satDeviceResetCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError));
1061 if (satOrgIOContext->NotifyOS == agTRUE)
1063 ostiInitiatorEvent( tiRoot,
1066 tiIntrEventTypeTaskManagement,
1071 satDevData->satTmTaskTag = agNULL;
1073 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1075 satFreeIntIoResource( tiRoot,
1082 if (satOrgIOContext->TMF == AG_ABORT_TASK)
1087 if (satOrgIOContext->NotifyOS == agTRUE)
1092 if (AbortTM == agTRUE)
1094 TI_DBG1(("satDeResetDeviceCB: calling satAbort\n"));
1095 satAbort(agRoot, satOrgIOContext->satToBeAbortedIOContext);
1097 satDevData->satTmTaskTag = agNULL;
1099 satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
1101 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1103 TI_DBG1(("satDeviceResetCB: satPendingIO %d satNCQMaxIO %d\n", satDevData->satPendingIO, satDevData->satNCQMaxIO ));
1104 TI_DBG1(("satDeviceResetCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", satDevData->satPendingNCQIO, satDevData->satPendingNONNCQIO));
1106 satFreeIntIoResource( tiRoot,
1110 /* clean up TD layer's IORequestBody */
1111 if (tdOrgIORequestBody != agNULL)
1115 tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
1116 sizeof(tdIORequestBody_t)
1121 TI_DBG1(("satDeviceResetCB: tdOrgIORequestBody is NULL, wrong\n"));
1127 ostiInitiatorEvent( tiRoot,
1130 tiIntrEventTypeTaskManagement,
1136 TI_DBG5(("satDeviceResetCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
1137 TI_DBG6(("satDeviceResetCB: end\n"));
1141 /*****************************************************************************
1142 *! \brief satExecuteDeviceDiagnosticCB
1144 * This routine is a callback function called from ossaSATACompleted().
1145 * This CB routine deals with normal non-chained data I/O SATA request.
1147 * \param agRoot: Handles for this instance of SAS/SATA hardware
1148 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
1149 * \param agIOStatus: Status of completed I/O.
1150 * \param agFirstDword:Pointer to the four bytes of FIS.
1151 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1153 * \param agParam: Additional info based on status.
1154 * \param ioContext: Pointer to satIOContext_t.
1158 *****************************************************************************/
1159 void satExecuteDeviceDiagnosticCB(
1161 agsaIORequest_t *agIORequest,
1163 agsaFisHeader_t *agFirstDword,
1169 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1170 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1171 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1172 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1173 tdIORequestBody_t *tdIORequestBody;
1174 satIOContext_t *satIOContext;
1175 satIOContext_t *satOrgIOContext;
1176 satInternalIo_t *satIntIo;
1177 satDeviceData_t *satDevData;
1179 TI_DBG3(("satExecuteDeviceDiagnosticCB start\n"));
1181 /* internally generate tiIOContext */
1182 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
1183 satIOContext = (satIOContext_t *) ioContext;
1184 satIntIo = satIOContext->satIntIoContext;
1185 satDevData = satIOContext->pSatDevData;
1188 if (satIntIo == agNULL)
1190 TI_DBG4(("satExecuteDeviceDiagnosticCB: External satInternalIo_t satIntIoContext\n"));
1191 satOrgIOContext = satIOContext;
1195 TI_DBG4(("satExecuteDeviceDiagnosticCB: Internal satInternalIo_t satIntIoContext\n"));
1196 satOrgIOContext = satIOContext->satOrgIOContext;
1197 if (satOrgIOContext == agNULL)
1199 TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NULL, wrong\n"));
1204 TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NOT NULL\n"));
1207 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1209 tdIORequestBody->ioCompleted = agTRUE;
1210 tdIORequestBody->ioStarted = agFALSE;
1212 /* interal structure free */
1213 satFreeIntIoResource(tiRoot,
1217 /*****************************************************************************
1218 *! \brief satNonChainedDataIOCB
1220 * This routine is a callback function called from ossaSATACompleted().
1221 * This CB routine deals with normal non-chained data I/O SATA request.
1223 * \param agRoot: Handles for this instance of SAS/SATA hardware
1224 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
1225 * \param agIOStatus: Status of completed I/O.
1226 * \param agFirstDword:Pointer to the four bytes of FIS.
1227 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1229 * \param agParam: Additional info based on status.
1230 * \param ioContext: Pointer to satIOContext_t.
1234 *****************************************************************************/
1236 void satNonChainedDataIOCB(
1238 agsaIORequest_t *agIORequest,
1240 agsaFisHeader_t *agFirstDword,
1247 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1248 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1249 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1250 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1251 tdIORequestBody_t *tdIORequestBody;
1252 bit32 interruptContext = osData->IntContext;
1253 satIOContext_t *satIOContext;
1254 satInternalIo_t *SatIntIo;
1255 satDeviceData_t *SatDevData;
1257 TI_DBG6(("satNonChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
1258 agIORequest, agIOStatus, agIOInfoLen));
1260 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
1261 satIOContext = (satIOContext_t *) ioContext;
1262 SatIntIo = satIOContext->satIntIoContext;
1263 SatDevData = satIOContext->pSatDevData;
1264 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1265 tdIORequestBody->ioCompleted = agTRUE;
1266 tdIORequestBody->ioStarted = agFALSE;
1268 /* interal structure free */
1269 satFreeIntIoResource( tiRoot,
1273 /* Process completion */
1274 if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0))
1276 TI_DBG5(("satNonChainedDataIOCB: success\n"));
1277 TI_DBG5(("satNonChainedDataIOCB: success agIORequest %p\n", agIORequest));
1279 * Command was completed OK, this is the normal path.
1280 * Now call the OS-App Specific layer about this completion.
1282 ostiInitiatorIOCompleted( tiRoot,
1283 tdIORequestBody->tiIORequest,
1291 TI_DBG1(("satNonChainedDataIOCB: calling itdsatProcessAbnormalCompletion\n"));
1292 /* More checking needed */
1293 itdsatProcessAbnormalCompletion( agRoot,
1306 /*****************************************************************************
1307 *! \brief satChainedDataIOCB
1309 * This routine is a callback function called from ossaSATACompleted().
1310 * This CB routine deals with normal chained data I/O SATA request.
1312 * \param agRoot: Handles for this instance of SAS/SATA hardware
1313 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
1314 * \param agIOStatus: Status of completed I/O.
1315 * \param agFirstDword:Pointer to the four bytes of FIS.
1316 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1318 * \param agParam: Additional info based on status.
1319 * \param ioContext: Pointer to satIOContext_t.
1323 *****************************************************************************/
1324 void satChainedDataIOCB(
1326 agsaIORequest_t *agIORequest,
1328 agsaFisHeader_t *agFirstDword,
1334 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1335 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1336 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1337 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1338 tdIORequestBody_t *tdIORequestBody;
1339 tdIORequestBody_t *tdOrgIORequestBody;
1340 satIOContext_t *satIOContext;
1341 satIOContext_t *satOrgIOContext;
1342 satIOContext_t *satNewIOContext;
1343 satInternalIo_t *satIntIo;
1344 satInternalIo_t *satNewIntIo = agNULL;
1345 satDeviceData_t *satDevData;
1346 scsiRspSense_t *pSense;
1347 tiIniScsiCmnd_t *scsiCmnd;
1348 tiIORequest_t *tiOrgIORequest;
1350 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
1351 bit32 ataStatus = 0;
1352 bit32 status = tiError;
1353 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
1356 TI_DBG6(("satChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
1357 agIORequest, agIOStatus, agIOInfoLen));
1360 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
1361 satIOContext = (satIOContext_t *) ioContext;
1362 if (satIOContext == agNULL)
1364 TI_DBG1(("satChainedDataIOCB: satIOContext is NULL\n"));
1367 satIntIo = satIOContext->satIntIoContext;
1368 satDevData = satIOContext->pSatDevData;
1369 hostToDevFis = satIOContext->pFis;
1371 if (satIntIo == agNULL)
1373 TI_DBG5(("satChainedDataIOCB: External satInternalIo_t satIntIoContext\n"));
1374 satOrgIOContext = satIOContext;
1375 tiOrgIORequest = tdIORequestBody->tiIORequest;
1376 pSense = satIOContext->pSense;
1377 scsiCmnd = satIOContext->pScsiCmnd;
1381 TI_DBG5(("satChainedDataIOCB: Internal satInternalIo_t satIntIoContext\n"));
1382 satOrgIOContext = satIOContext->satOrgIOContext;
1383 if (satOrgIOContext == agNULL)
1385 TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NULL\n"));
1389 TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NOT NULL\n"));
1392 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
1393 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
1395 pSense = satOrgIOContext->pSense;
1396 scsiCmnd = satOrgIOContext->pScsiCmnd;
1399 tdIORequestBody->ioCompleted = agTRUE;
1400 tdIORequestBody->ioStarted = agFALSE;
1402 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1404 TI_DBG1(("satChainedDataIOCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
1405 satSetSensePayload( pSense,
1406 SCSI_SNSKEY_NO_SENSE,
1408 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1411 ostiInitiatorIOCompleted( tiRoot,
1412 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1414 SCSI_STAT_CHECK_CONDITION,
1415 satOrgIOContext->pTiSenseData,
1416 satOrgIOContext->interruptContext );
1418 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1420 satFreeIntIoResource( tiRoot,
1427 checking IO status, FIS type and error status
1429 if (agIOStatus != OSSA_IO_SUCCESS)
1431 /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read
1432 agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write
1433 first, assumed to be Reg Device to Host FIS
1434 This is OK to just find fis type
1436 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1437 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
1439 if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) &&
1440 (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
1441 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
1444 TI_DBG1(("satChainedDataIOCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType));
1448 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1449 (ataStatus & DF_ATA_STATUS_MASK)
1452 TI_DBG1(("satChainedDataIOCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command));
1455 /* the function below handles abort case */
1456 itdsatDelayedProcessAbnormalCompletion(agRoot,
1464 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1465 satFreeIntIoResource( tiRoot,
1469 } /* end of error */
1471 switch (hostToDevFis->h.command)
1473 case SAT_READ_DMA: /* fall through */
1474 case SAT_READ_SECTORS: /* fall through */
1475 case SAT_READ_DMA_EXT: /* fall through */
1476 case SAT_READ_SECTORS_EXT: /* fall through */
1477 case SAT_READ_FPDMA_QUEUED: /* fall through */
1478 case SAT_WRITE_DMA: /* fall through */
1479 case SAT_WRITE_SECTORS:/* fall through */
1480 case SAT_WRITE_DMA_FUA_EXT: /* fall through */
1481 case SAT_WRITE_DMA_EXT: /* fall through */
1482 case SAT_WRITE_SECTORS_EXT: /* fall through */
1483 case SAT_WRITE_FPDMA_QUEUED:
1485 TI_DBG5(("satChainedDataIOCB: READ/WRITE success case\n"));
1487 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1489 /* done with internally genereated SAT_SMART_RETURN_STATUS */
1490 satFreeIntIoResource( tiRoot,
1493 /* let's loop till TL */
1497 if (loopnum == 0) done
1499 (satOrgIOContext->LoopNum)--;
1500 if (satOrgIOContext->LoopNum == 0)
1502 /* done with read */
1503 ostiInitiatorIOCompleted( tiRoot,
1504 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1508 satOrgIOContext->interruptContext );
1511 if (satOrgIOContext->superIOFlag)
1513 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
1517 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
1520 satNewIntIo = satAllocIntIoResource( tiRoot,
1525 if (satNewIntIo == agNULL)
1527 /* memory allocation failure */
1528 satFreeIntIoResource( tiRoot,
1531 ostiInitiatorIOCompleted( tiRoot,
1532 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1536 satOrgIOContext->interruptContext );
1538 TI_DBG1(("satChainedDataIOCB: momory allocation fails\n"));
1540 } /* end of memory allocation failure */
1543 * Need to initialize all the fields within satIOContext
1546 satNewIOContext = satPrepareNewIO(
1554 /* sending another ATA command */
1555 switch (scsiCmnd->cdb[0])
1557 case SCSIOPC_READ_6:
1558 /* no loop should occur with READ6 since it fits in one ATA command */
1560 case SCSIOPC_READ_10: /* fall through */
1561 case SCSIOPC_READ_12: /* fall through */
1562 case SCSIOPC_READ_16: /* fall through */
1563 status = satRead_1( tiRoot,
1564 &satNewIntIo->satIntTiIORequest,
1565 satNewIOContext->ptiDeviceHandle,
1566 &satNewIntIo->satIntTiScsiXchg,
1569 case SCSIOPC_WRITE_6:
1570 /* no loop should occur with WRITE6 since it fits in one ATA command */
1572 case SCSIOPC_WRITE_10: /* fall through */
1573 case SCSIOPC_WRITE_12: /* fall through */
1574 case SCSIOPC_WRITE_16: /* fall through */
1575 status = satWrite_1( tiRoot,
1576 &satNewIntIo->satIntTiIORequest,
1577 satNewIOContext->ptiDeviceHandle,
1578 &satNewIntIo->satIntTiScsiXchg,
1582 TI_DBG1(("satChainedDataIOCB: success but default case scsi cmd 0x%x ata cmd 0x%x\n",scsiCmnd->cdb[0], hostToDevFis->h.command));
1589 if (status != tiSuccess)
1591 satFreeIntIoResource( tiRoot,
1594 ostiInitiatorIOCompleted( tiRoot,
1595 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1599 satOrgIOContext->interruptContext );
1600 TI_DBG1(("satChainedDataIOCB: calling satRead10_1 fails\n"));
1608 TI_DBG1(("satChainedDataIOCB: success but default case command 0x%x\n",hostToDevFis->h.command));
1609 ostiInitiatorIOCompleted( tiRoot,
1610 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1614 satOrgIOContext->interruptContext );
1616 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1618 satFreeIntIoResource( tiRoot,
1628 void satNonChainedWriteNVerifyCB(
1630 agsaIORequest_t *agIORequest,
1632 agsaFisHeader_t *agFirstDword,
1639 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1640 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1641 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1642 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1643 tdIORequestBody_t *tdIORequestBody;
1644 tdIORequestBody_t *tdOrgIORequestBody;
1645 satIOContext_t *satIOContext;
1646 satIOContext_t *satOrgIOContext;
1647 satIOContext_t *satNewIOContext;
1648 satInternalIo_t *satIntIo;
1649 satInternalIo_t *satNewIntIo = agNULL;
1650 satDeviceData_t *satDevData;
1651 scsiRspSense_t *pSense;
1652 tiIniScsiCmnd_t *scsiCmnd;
1653 tiIORequest_t *tiOrgIORequest;
1655 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
1656 bit32 ataStatus = 0;
1658 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
1659 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
1660 agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
1662 TI_DBG5(("satNonChainedWriteNVerifyCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
1664 /* internally generate tiIOContext */
1665 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
1666 satIOContext = (satIOContext_t *) ioContext;
1667 satIntIo = satIOContext->satIntIoContext;
1668 satDevData = satIOContext->pSatDevData;
1669 hostToDevFis = satIOContext->pFis;
1671 /* SPC: Self-Test Result Log page */
1672 tiScsiRequest = satIOContext->tiScsiXchg;
1674 if (satIntIo == agNULL)
1676 TI_DBG4(("satNonChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n"));
1677 satOrgIOContext = satIOContext;
1678 tiOrgIORequest = tdIORequestBody->tiIORequest;
1679 pSense = satOrgIOContext->pSense;
1680 scsiCmnd = satOrgIOContext->pScsiCmnd;
1684 TI_DBG4(("satNonChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
1685 satOrgIOContext = satIOContext->satOrgIOContext;
1686 if (satOrgIOContext == agNULL)
1688 TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n"));
1693 TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n"));
1695 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
1696 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
1698 pSense = satOrgIOContext->pSense;
1699 scsiCmnd = satOrgIOContext->pScsiCmnd;
1702 tdIORequestBody->ioCompleted = agTRUE;
1703 tdIORequestBody->ioStarted = agFALSE;
1706 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1708 TI_DBG1(("satNonChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
1709 ostiInitiatorIOCompleted (
1715 satOrgIOContext->interruptContext
1717 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1719 satFreeIntIoResource( tiRoot,
1726 if (agIOStatus != OSSA_IO_SUCCESS)
1729 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
1731 /* First, assumed to be Reg Device to Host FIS */
1732 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1733 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
1736 if (agIOStatus != OSSA_IO_SUCCESS)
1738 if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
1740 statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
1742 /* Get ATA Status register */
1743 ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */
1744 ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */
1746 /* ATA Eror register */
1751 if( agIOStatus != OSSA_IO_SUCCESS)
1754 checking IO status, FIS type and error status
1755 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
1756 Both have fisType in the same location
1758 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
1759 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) ||
1760 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
1764 if( agIOStatus != OSSA_IO_SUCCESS)
1766 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, NOT IO_SUCCESS\n"));
1768 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
1770 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
1772 else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
1774 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
1776 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1777 (ataStatus & DF_ATA_STATUS_MASK)
1780 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, FAILED, error status\n"));
1784 /* Process abort case */
1785 if (agIOStatus == OSSA_IO_ABORTED)
1787 satProcessAbort(tiRoot,
1792 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1794 satFreeIntIoResource( tiRoot,
1801 switch (hostToDevFis->h.command)
1803 case SAT_WRITE_DMA_FUA_EXT:
1804 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT\n"));
1806 case SAT_WRITE_DMA_EXT:
1807 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT\n"));
1809 case SAT_WRITE_SECTORS_EXT:
1810 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT\n"));
1812 case SAT_WRITE_FPDMA_QUEUED:
1813 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED\n"));
1815 case SAT_READ_VERIFY_SECTORS:
1816 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
1818 case SAT_READ_VERIFY_SECTORS_EXT:
1819 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
1822 TI_DBG1(("satNonChainedWriteNVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
1826 satSetSensePayload( pSense,
1827 SCSI_SNSKEY_NO_SENSE,
1829 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1832 ostiInitiatorIOCompleted( tiRoot,
1833 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1835 SCSI_STAT_CHECK_CONDITION,
1836 satOrgIOContext->pTiSenseData,
1837 satOrgIOContext->interruptContext );
1839 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1841 satFreeIntIoResource( tiRoot,
1845 } /* end error checking */
1848 /* process success from this point on */
1850 switch (hostToDevFis->h.command)
1852 case SAT_WRITE_DMA_FUA_EXT:
1853 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT success\n"));
1855 case SAT_WRITE_DMA_EXT:
1856 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT success\n"));
1858 case SAT_WRITE_SECTORS_EXT:
1859 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT succes\n"));
1862 case SAT_WRITE_FPDMA_QUEUED:
1863 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED succes\n"));
1865 case SAT_READ_VERIFY_SECTORS:
1866 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS succes\n"));
1867 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1870 satFreeIntIoResource( tiRoot,
1874 /* return stat_good */
1875 ostiInitiatorIOCompleted( tiRoot,
1880 satOrgIOContext->interruptContext );
1883 case SAT_READ_VERIFY_SECTORS_EXT:
1884 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT succes\n"));
1885 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1888 satFreeIntIoResource( tiRoot,
1892 /* return stat_good */
1893 ostiInitiatorIOCompleted( tiRoot,
1898 satOrgIOContext->interruptContext );
1902 TI_DBG1(("satNonChainedWriteNVerifyCB: error default case command 0x%x success\n", hostToDevFis->h.command));
1904 satSetSensePayload( pSense,
1905 SCSI_SNSKEY_NO_SENSE,
1907 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1910 ostiInitiatorIOCompleted( tiRoot,
1911 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1913 SCSI_STAT_CHECK_CONDITION,
1914 satOrgIOContext->pTiSenseData,
1915 satOrgIOContext->interruptContext );
1917 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1919 satFreeIntIoResource( tiRoot,
1926 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1929 satFreeIntIoResource( tiRoot,
1933 satNewIntIo = satAllocIntIoResource( tiRoot,
1938 if (satNewIntIo == agNULL)
1940 /* memory allocation failure */
1941 satFreeIntIoResource( tiRoot,
1945 satSetSensePayload( pSense,
1946 SCSI_SNSKEY_NO_SENSE,
1948 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1951 ostiInitiatorIOCompleted( tiRoot,
1952 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1954 SCSI_STAT_CHECK_CONDITION,
1955 satOrgIOContext->pTiSenseData,
1956 satOrgIOContext->interruptContext );
1957 TI_DBG1(("satNonChainedWriteNVerifyCB: momory allocation fails\n"));
1959 } /* end memory allocation */
1961 satNewIOContext = satPrepareNewIO(
1969 /* sends ATA verify command(READ_VERIFY_SECTORS or READ_VERIFY_SECTORS_EXT) */
1970 status = satNonChainedWriteNVerify_Verify(tiRoot,
1971 &satNewIntIo->satIntTiIORequest,
1972 satNewIOContext->ptiDeviceHandle,
1973 tiScsiRequest, /* orginal from OS layer */
1978 if (status != tiSuccess)
1980 /* sending ATA command fails */
1981 satFreeIntIoResource( tiRoot,
1984 satSetSensePayload( pSense,
1985 SCSI_SNSKEY_NO_SENSE,
1987 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1990 ostiInitiatorIOCompleted( tiRoot,
1991 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1993 SCSI_STAT_CHECK_CONDITION,
1994 satOrgIOContext->pTiSenseData,
1995 satOrgIOContext->interruptContext );
1996 TI_DBG1(("satNonChainedWriteNVerifyCB: calling satWriteAndVerify10_1 fails\n"));
1998 } /* end send fails */
2004 void satChainedWriteNVerifyCB(
2006 agsaIORequest_t *agIORequest,
2008 agsaFisHeader_t *agFirstDword,
2016 then, send verify in loop
2018 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2019 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2020 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2021 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2022 tdIORequestBody_t *tdIORequestBody;
2023 tdIORequestBody_t *tdOrgIORequestBody;
2024 satIOContext_t *satIOContext;
2025 satIOContext_t *satOrgIOContext;
2026 satIOContext_t *satNewIOContext;
2027 satInternalIo_t *satIntIo;
2028 satInternalIo_t *satNewIntIo = agNULL;
2029 satDeviceData_t *satDevData;
2030 scsiRspSense_t *pSense;
2031 tiIniScsiCmnd_t *scsiCmnd;
2032 tiIORequest_t *tiOrgIORequest;
2034 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
2035 bit32 ataStatus = 0;
2037 bit32 status = tiError;
2038 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
2040 TI_DBG6(("satChainedWriteNVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
2041 agIORequest, agIOStatus, agIOInfoLen));
2044 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2045 satIOContext = (satIOContext_t *) ioContext;
2046 satIntIo = satIOContext->satIntIoContext;
2047 satDevData = satIOContext->pSatDevData;
2048 hostToDevFis = satIOContext->pFis;
2050 if (satIntIo == agNULL)
2052 TI_DBG5(("satChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n"));
2053 satOrgIOContext = satIOContext;
2054 tiOrgIORequest = tdIORequestBody->tiIORequest;
2055 pSense = satIOContext->pSense;
2056 scsiCmnd = satIOContext->pScsiCmnd;
2060 TI_DBG5(("satChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
2061 satOrgIOContext = satIOContext->satOrgIOContext;
2062 if (satOrgIOContext == agNULL)
2064 TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n"));
2069 TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n"));
2071 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
2072 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
2074 pSense = satOrgIOContext->pSense;
2075 scsiCmnd = satOrgIOContext->pScsiCmnd;
2078 tdIORequestBody->ioCompleted = agTRUE;
2079 tdIORequestBody->ioStarted = agFALSE;
2081 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
2083 TI_DBG1(("satChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
2084 satSetSensePayload( pSense,
2085 SCSI_SNSKEY_NO_SENSE,
2087 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
2090 ostiInitiatorIOCompleted( tiRoot,
2091 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2093 SCSI_STAT_CHECK_CONDITION,
2094 satOrgIOContext->pTiSenseData,
2095 satOrgIOContext->interruptContext );
2097 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2099 satFreeIntIoResource( tiRoot,
2106 checking IO status, FIS type and error status
2108 if (agIOStatus != OSSA_IO_SUCCESS)
2110 /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read
2111 agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write
2112 first, assumed to be Reg Device to Host FIS
2113 This is OK to just find fis type
2115 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
2116 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
2118 if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) &&
2119 (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
2120 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
2123 TI_DBG1(("satChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType));
2127 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
2128 (ataStatus & DF_ATA_STATUS_MASK)
2131 TI_DBG1(("satChainedWriteNVerifyCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command));
2134 /* the function below handles abort case */
2135 itdsatDelayedProcessAbnormalCompletion(agRoot,
2143 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2144 satFreeIntIoResource( tiRoot,
2148 } /* end of error */
2150 /* process the success case */
2151 switch (hostToDevFis->h.command)
2153 case SAT_WRITE_DMA: /* fall through */
2154 case SAT_WRITE_SECTORS:/* fall through */
2155 // case SAT_WRITE_DMA_FUA_EXT: /* fall through */
2156 case SAT_WRITE_DMA_EXT: /* fall through */
2157 case SAT_WRITE_SECTORS_EXT: /* fall through */
2158 case SAT_WRITE_FPDMA_QUEUED:
2160 TI_DBG5(("satChainedWriteNVerifyCB: WRITE success case\n"));
2162 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2164 /* done with internally genereated SAT_SMART_RETURN_STATUS */
2165 satFreeIntIoResource( tiRoot,
2168 /* let's loop till TL */
2171 (satOrgIOContext->LoopNum)--;
2173 if (satOrgIOContext->superIOFlag)
2175 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2179 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2182 satNewIntIo = satAllocIntIoResource( tiRoot,
2187 if (satNewIntIo == agNULL)
2189 /* memory allocation failure */
2190 satFreeIntIoResource( tiRoot,
2193 ostiInitiatorIOCompleted( tiRoot,
2194 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2198 satOrgIOContext->interruptContext );
2200 TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n"));
2202 } /* end of memory allocation failure */
2205 * Need to initialize all the fields within satIOContext
2208 satNewIOContext = satPrepareNewIO(
2216 if (satOrgIOContext->LoopNum == 0)
2222 satOrgIOContext->LoopNum = satOrgIOContext->LoopNum2;
2223 status = satChainedWriteNVerify_Start_Verify(tiRoot,
2224 &satNewIntIo->satIntTiIORequest,
2225 satNewIOContext->ptiDeviceHandle,
2226 &satNewIntIo->satIntTiScsiXchg,
2231 status = satChainedWriteNVerify_Write(tiRoot,
2232 &satNewIntIo->satIntTiIORequest,
2233 satNewIOContext->ptiDeviceHandle,
2234 &satNewIntIo->satIntTiScsiXchg,
2238 if (status != tiSuccess)
2240 satFreeIntIoResource( tiRoot,
2243 ostiInitiatorIOCompleted( tiRoot,
2244 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2248 satOrgIOContext->interruptContext );
2249 TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Write fails\n"));
2255 case SAT_READ_VERIFY_SECTORS: /* fall through */
2256 case SAT_READ_VERIFY_SECTORS_EXT:
2257 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2259 /* done with internally genereated SAT_SMART_RETURN_STATUS */
2260 satFreeIntIoResource( tiRoot,
2263 /* let's loop till TL */
2267 if (loopnum == 0) done
2269 (satOrgIOContext->LoopNum)--;
2270 if (satOrgIOContext->LoopNum == 0)
2273 done with write and verify
2275 ostiInitiatorIOCompleted( tiRoot,
2276 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2280 satOrgIOContext->interruptContext );
2284 if (satOrgIOContext->superIOFlag)
2286 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2290 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2293 satNewIntIo = satAllocIntIoResource( tiRoot,
2298 if (satNewIntIo == agNULL)
2300 /* memory allocation failure */
2301 satFreeIntIoResource( tiRoot,
2304 ostiInitiatorIOCompleted( tiRoot,
2305 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2309 satOrgIOContext->interruptContext );
2311 TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n"));
2313 } /* end of memory allocation failure */
2316 * Need to initialize all the fields within satIOContext
2319 satNewIOContext = satPrepareNewIO(
2326 status = satChainedWriteNVerify_Verify(tiRoot,
2327 &satNewIntIo->satIntTiIORequest,
2328 satNewIOContext->ptiDeviceHandle,
2329 &satNewIntIo->satIntTiScsiXchg,
2332 if (status != tiSuccess)
2334 satFreeIntIoResource( tiRoot,
2337 ostiInitiatorIOCompleted( tiRoot,
2338 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2342 satOrgIOContext->interruptContext );
2343 TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Verify fails\n"));
2350 TI_DBG1(("satChainedWriteNVerifyCB: success but default case command 0x%x\n",hostToDevFis->h.command));
2351 ostiInitiatorIOCompleted( tiRoot,
2352 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2356 satOrgIOContext->interruptContext );
2358 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2360 satFreeIntIoResource( tiRoot,
2370 /*****************************************************************************
2371 *! \brief itdsatProcessAbnormalCompletion
2373 * This routine is called to complete error case for SATA request previously
2374 * issued to the LL Layer in saSATAStart()
2376 * \param agRoot: Handles for this instance of SAS/SATA hardware
2377 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
2378 * \param agIOStatus: Status of completed I/O.
2379 * \param agFirstDword:Pointer to the four bytes of FIS.
2380 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
2382 * \param agParam: Additional info based on status.
2383 * \param ioContext: Pointer to satIOContext_t.
2387 *****************************************************************************/
2388 void itdsatProcessAbnormalCompletion(
2390 agsaIORequest_t *agIORequest,
2392 agsaFisHeader_t *agFirstDword,
2395 satIOContext_t *satIOContext
2399 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2400 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2401 bit32 interruptContext = osData->IntContext;
2402 tdIORequestBody_t *tdIORequestBody;
2403 satDeviceData_t *pSatDevData;
2404 tiDeviceHandle_t *tiDeviceHandle;
2405 tdsaDeviceData_t *oneDeviceData = agNULL;
2406 agsaDevHandle_t *agDevHandle = agNULL;
2408 TI_DBG5(("itdsatProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n",
2409 agIORequest, agIOStatus, agIOInfoLen));
2411 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2412 pSatDevData = satIOContext->pSatDevData;
2413 tiDeviceHandle = satIOContext->ptiDeviceHandle;
2415 /* Get into the detail */
2418 case OSSA_IO_SUCCESS:
2419 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS agIOInfoLen %d calling osSatIOCompleted\n", agIOInfoLen));
2421 * At this point agIOInfoLen should be non-zero and there is valid FIS
2422 * to read. Pass this info to the SAT layer in order to do the ATA status
2423 * to SCSI status translation.
2425 osSatIOCompleted( tiRoot,
2426 tdIORequestBody->tiIORequest,
2435 case OSSA_IO_ABORTED:
2436 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n"));
2438 ostiInitiatorIOCompleted( tiRoot,
2439 tdIORequestBody->tiIORequest,
2445 if ( pSatDevData->satTmTaskTag != agNULL )
2447 TI_DBG1(("itdsatProcessAbnormalCompletion: TM callback\n"));
2448 if (tiDeviceHandle == agNULL)
2450 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2453 ostiInitiatorEvent( tiRoot,
2454 agNULL, /* portalContext not used */
2456 tiIntrEventTypeTaskManagement,
2458 pSatDevData->satTmTaskTag);
2462 pSatDevData->satTmTaskTag = agNULL;
2466 * Check if we are in recovery mode and need to update the recovery flag
2468 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2469 (pSatDevData->satPendingIO == 0 ))
2471 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2472 TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n"));
2475 TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2476 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2477 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2480 case OSSA_IO_UNDERFLOW:
2481 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n"));
2482 ostiInitiatorIOCompleted( tiRoot,
2483 tdIORequestBody->tiIORequest,
2491 case OSSA_IO_FAILED:
2492 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n"));
2493 ostiInitiatorIOCompleted( tiRoot,
2494 tdIORequestBody->tiIORequest,
2501 case OSSA_IO_ABORT_RESET:
2502 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n"));
2503 ostiInitiatorIOCompleted( tiRoot,
2504 tdIORequestBody->tiIORequest,
2510 * Check if we are in recovery mode and need to update the recovery flag
2512 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2513 (pSatDevData->satPendingIO == 0 ))
2515 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2516 TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n"));
2519 TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2520 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2521 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2526 case OSSA_IO_NO_DEVICE:
2527 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n"));
2528 ostiInitiatorIOCompleted( tiRoot,
2529 tdIORequestBody->tiIORequest,
2536 case OSSA_IO_PROG_ERROR:
2537 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n"));
2538 ostiInitiatorIOCompleted( tiRoot,
2539 tdIORequestBody->tiIORequest,
2545 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */
2546 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */
2547 case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */
2548 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */
2549 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */
2550 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */
2551 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */
2552 case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */
2553 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus));
2554 if (tiDeviceHandle == agNULL)
2556 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2557 ostiInitiatorIOCompleted( tiRoot,
2558 tdIORequestBody->tiIORequest,
2565 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2566 if (oneDeviceData == agNULL)
2568 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2572 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2575 ostiInitiatorIOCompleted( tiRoot,
2576 tdIORequestBody->tiIORequest,
2583 case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
2584 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
2585 ostiInitiatorIOCompleted( tiRoot,
2586 tdIORequestBody->tiIORequest,
2588 tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted,
2593 case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */
2594 case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */
2595 case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */
2596 case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */
2597 case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */
2598 case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */
2599 case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */
2600 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus));
2601 ostiInitiatorIOCompleted( tiRoot,
2602 tdIORequestBody->tiIORequest,
2608 case OSSA_IO_DS_IN_ERROR:
2609 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n"));
2610 if (tiDeviceHandle == agNULL)
2612 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2613 ostiInitiatorIOCompleted( tiRoot,
2614 tdIORequestBody->tiIORequest,
2621 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2622 if (oneDeviceData == agNULL)
2624 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2628 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2630 ostiInitiatorIOCompleted( tiRoot,
2631 tdIORequestBody->tiIORequest,
2637 case OSSA_IO_DS_NON_OPERATIONAL:
2638 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n"));
2639 if (tiDeviceHandle == agNULL)
2641 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2642 ostiInitiatorIOCompleted( tiRoot,
2643 tdIORequestBody->tiIORequest,
2650 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2651 if (oneDeviceData == agNULL)
2653 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2657 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2658 agDevHandle = oneDeviceData->agDevHandle;
2659 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
2660 oneDeviceData->tdPortContext != agNULL )
2662 saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
2666 ostiInitiatorIOCompleted( tiRoot,
2667 tdIORequestBody->tiIORequest,
2673 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */
2674 case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
2675 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus));
2676 itdsatEncryptionHandler(agRoot,
2683 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */
2684 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */
2685 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
2686 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus));
2687 itdsatDifHandler(agRoot,
2695 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2696 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = unknown 0x%x\n", agIOStatus));
2697 if (oneDeviceData != agNULL)
2699 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2703 TI_DBG1(("itdsatProcessAbnormalCompletion: oneDeviceData is NULL\n"));
2706 ostiInitiatorIOCompleted( tiRoot,
2707 tdIORequestBody->tiIORequest,
2718 /*****************************************************************************
2719 *! \brief itdsatDelayedProcessAbnormalCompletion
2721 * This routine is called to complete error case for SATA request previously
2722 * issued to the LL Layer in saSATAStart().
2723 * This is used when command is chained.
2725 * \param agRoot: Handles for this instance of SAS/SATA hardware
2726 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
2727 * \param agIOStatus: Status of completed I/O.
2728 * \param agFirstDword:Pointer to the four bytes of FIS.
2729 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
2731 * \param agParam: Additional info based on status.
2732 * \param ioContext: Pointer to satIOContext_t.
2736 *****************************************************************************/
2737 void itdsatDelayedProcessAbnormalCompletion(
2739 agsaIORequest_t *agIORequest,
2741 agsaFisHeader_t *agFirstDword,
2744 satIOContext_t *satIOContext
2748 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2749 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2750 bit32 interruptContext = osData->IntContext;
2751 tdIORequestBody_t *tdIORequestBody;
2752 satDeviceData_t *pSatDevData;
2753 tiDeviceHandle_t *tiDeviceHandle;
2754 tdsaDeviceData_t *oneDeviceData = agNULL;
2755 agsaDevHandle_t *agDevHandle = agNULL;
2757 TI_DBG5(("itdsatDelayedProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n",
2758 agIORequest, agIOStatus, agIOInfoLen));
2760 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2761 pSatDevData = satIOContext->pSatDevData;
2762 tiDeviceHandle = satIOContext->ptiDeviceHandle;
2764 /* Get into the detail */
2767 case OSSA_IO_SUCCESS:
2768 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS calling osSatIOCompleted\n"));
2773 case OSSA_IO_ABORTED:
2774 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n"));
2776 ostiInitiatorIOCompleted( tiRoot,
2777 tdIORequestBody->tiIORequest,
2783 if ( pSatDevData->satTmTaskTag != agNULL )
2785 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: TM callback\n"));
2786 if (tiDeviceHandle == agNULL)
2788 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2791 ostiInitiatorEvent( tiRoot,
2792 agNULL, /* portalContext not used */
2794 tiIntrEventTypeTaskManagement,
2796 pSatDevData->satTmTaskTag);
2800 pSatDevData->satTmTaskTag = agNULL;
2804 * Check if we are in recovery mode and need to update the recovery flag
2806 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2807 (pSatDevData->satPendingIO == 0 ))
2809 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2810 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n"));
2813 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2814 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2815 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2818 case OSSA_IO_UNDERFLOW:
2819 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n"));
2820 ostiInitiatorIOCompleted( tiRoot,
2821 tdIORequestBody->tiIORequest,
2829 case OSSA_IO_FAILED:
2830 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n"));
2831 ostiInitiatorIOCompleted( tiRoot,
2832 tdIORequestBody->tiIORequest,
2839 case OSSA_IO_ABORT_RESET:
2840 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n"));
2841 ostiInitiatorIOCompleted( tiRoot,
2842 tdIORequestBody->tiIORequest,
2848 * Check if we are in recovery mode and need to update the recovery flag
2850 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2851 (pSatDevData->satPendingIO == 0 ))
2853 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2854 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n"));
2857 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2858 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2859 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2864 case OSSA_IO_NO_DEVICE:
2865 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n"));
2866 ostiInitiatorIOCompleted( tiRoot,
2867 tdIORequestBody->tiIORequest,
2874 case OSSA_IO_PROG_ERROR:
2875 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n"));
2876 ostiInitiatorIOCompleted( tiRoot,
2877 tdIORequestBody->tiIORequest,
2883 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */
2884 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */
2885 case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */
2886 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */
2887 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */
2888 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */
2889 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */
2890 case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */
2891 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus));
2892 if (tiDeviceHandle == agNULL)
2894 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2895 ostiInitiatorIOCompleted( tiRoot,
2896 tdIORequestBody->tiIORequest,
2903 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2904 if (oneDeviceData == agNULL)
2906 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2910 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2912 ostiInitiatorIOCompleted( tiRoot,
2913 tdIORequestBody->tiIORequest,
2920 case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
2921 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
2922 ostiInitiatorIOCompleted( tiRoot,
2923 tdIORequestBody->tiIORequest,
2925 tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted,
2930 case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */
2931 case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */
2932 case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */
2933 case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */
2934 case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */
2935 case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */
2936 case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */
2937 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus));
2939 ostiInitiatorIOCompleted( tiRoot,
2940 tdIORequestBody->tiIORequest,
2946 case OSSA_IO_DS_IN_ERROR:
2947 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n"));
2948 if (tiDeviceHandle == agNULL)
2950 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2951 ostiInitiatorIOCompleted( tiRoot,
2952 tdIORequestBody->tiIORequest,
2959 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2960 if (oneDeviceData == agNULL)
2962 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2966 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2968 ostiInitiatorIOCompleted( tiRoot,
2969 tdIORequestBody->tiIORequest,
2975 case OSSA_IO_DS_NON_OPERATIONAL:
2976 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n"));
2977 if (tiDeviceHandle == agNULL)
2979 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2980 ostiInitiatorIOCompleted( tiRoot,
2981 tdIORequestBody->tiIORequest,
2988 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2989 if (oneDeviceData == agNULL)
2991 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2995 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2996 agDevHandle = oneDeviceData->agDevHandle;
2997 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
2998 oneDeviceData->tdPortContext != agNULL )
3000 saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
3003 ostiInitiatorIOCompleted( tiRoot,
3004 tdIORequestBody->tiIORequest,
3010 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */
3011 case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
3012 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus));
3013 itdsatEncryptionHandler(agRoot,
3020 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */
3021 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */
3022 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3023 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus));
3024 itdsatDifHandler(agRoot,
3032 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = unknown\n"));
3033 ostiInitiatorIOCompleted( tiRoot,
3034 tdIORequestBody->tiIORequest,
3044 /*****************************************************************************
3045 *! \brief itdsatEncryptionHandler
3047 * Purpose: This function processes I/Os completed and returned by SATA lower
3048 * layer with any encryption specific agIOStatus.
3050 * \param agRoot: pointer to port instance
3051 * \param agIORequest: pointer to I/O request
3052 * \param agIOStatus: I/O status given by LL layer
3053 * \param agIOInfoLen: lenth of complete SAS RESP frame
3054 * \param agParam A Handle used to refer to the response frame or handle
3059 *****************************************************************************/
3061 itdsatEncryptionHandler(
3063 agsaIORequest_t *agIORequest,
3070 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3071 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3072 bit32 intContext = osData->IntContext;
3073 bit32 errorDetail = tiDetailOtherError;
3074 tdIORequestBody_t *tdIORequestBody;
3075 TI_DBG1(("itdsatEncryptionHandler: start\n"));
3076 TI_DBG1(("itdsatEncryptionHandler: agIOStatus 0x%x\n", agIOStatus));
3078 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3082 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
3083 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n"));
3084 errorDetail = tiDetailDekKeyCacheMiss;
3086 case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
3087 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n"));
3088 errorDetail = tiDetailCipherModeInvalid;
3090 case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
3091 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n"));
3092 errorDetail = tiDetailDekIVMismatch;
3094 case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
3095 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n"));
3096 errorDetail = tiDetailDekRamInterfaceError;
3099 TI_DBG1(("itdsatEncryptionHandler: other error!!! 0x%x\n", agIOStatus));
3100 errorDetail = tiDetailOtherError;
3104 ostiInitiatorIOCompleted (
3106 tdIORequestBody->tiIORequest,
3115 /*****************************************************************************
3116 *! \brief itdsatDifHandler
3118 * Purpose: This function processes I/Os completed and returned by SATA lower
3119 * layer with any DIF specific agIOStatus.
3121 * \param agRoot: pointer to port instance
3122 * \param agIORequest: pointer to I/O request
3123 * \param agIOStatus: I/O status given by LL layer
3124 * \param agIOInfoLen: lenth of complete SAS RESP frame
3125 * \param agParam A Handle used to refer to the response frame or handle
3130 *****************************************************************************/
3134 agsaIORequest_t *agIORequest,
3141 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3142 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3143 bit32 intContext = osData->IntContext;
3144 bit32 errorDetail = tiDetailOtherError;
3145 tdIORequestBody_t *tdIORequestBody;
3146 #ifdef TD_DEBUG_ENABLE
3147 agsaDifDetails_t *DifDetail;
3150 TI_DBG2(("itdsatDifHandler: start\n"));
3151 TI_DBG2(("itdsatDifHandler: agIOStatus 0x%x\n", agIOStatus));
3153 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3154 #ifdef TD_DEBUG_ENABLE
3155 DifDetail = (agsaDifDetails_t *)agParam;
3159 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
3160 TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n"));
3161 errorDetail = tiDetailDifAppTagMismatch;
3163 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
3164 TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n"));
3165 errorDetail = tiDetailDifRefTagMismatch;
3167 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3168 TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n"));
3169 errorDetail = tiDetailDifCrcMismatch;
3172 TI_DBG1(("itdsatDifHandler: other error!!! 0x%x\n", agIOStatus));
3173 errorDetail = tiDetailOtherError;
3177 TI_DBG1(("smsatDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA));
3179 ostiInitiatorIOCompleted (
3181 tdIORequestBody->tiIORequest,
3190 /*****************************************************************************/
3191 /*! \brief satProcessAbort
3193 * This function processes abort.
3195 * \param tiRoot: Pointer to TISA initiator driver/port instance.
3196 * \param tiIORequest: Pointer to TISA I/O request context for this I/O.
3197 * \param satIOContext_t: Pointer to the SAT IO Context
3202 /*****************************************************************************/
3203 void satProcessAbort(
3205 tiIORequest_t *tiIORequest,
3206 satIOContext_t *satIOContext
3209 satDeviceData_t *pSatDevData;
3210 //tiDeviceHandle_t *tiDeviceHandle;
3211 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
3213 TI_DBG5(("satProcessAbort: start\n"));
3215 pSatDevData = satIOContext->pSatDevData;
3216 //tiDeviceHandle = satIOContext->ptiDeviceHandle;
3217 hostToDevFis = satIOContext->pFis;
3218 if ( (hostToDevFis->h.command == SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE) &&
3219 (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
3222 /* no completion for send diagnotic in background. It is done in satSendDiagnostic() */
3223 ostiInitiatorIOCompleted( tiRoot,
3228 satIOContext->interruptContext);
3231 if ( pSatDevData->satTmTaskTag != agNULL )
3233 TI_DBG1(("satProcessAbort: TM callback\n"));
3237 pSatDevData->satTmTaskTag = agNULL;
3241 * Check if we are in recovery mode and need to update the recovery flag
3243 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
3244 (pSatDevData->satPendingIO == 0 ))
3246 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
3247 TI_DBG1(("satProcessAbort: STATE NORMAL.\n"));
3249 TI_DBG1(("satProcessAbort: satDriveState %d\n", pSatDevData->satDriveState));
3250 TI_DBG1(("satProcessAbort: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
3251 TI_DBG1(("satProcessAbort: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
3258 /*****************************************************************************
3259 *! \brief satNonDataIOCB
3261 * This routine is a callback function called from ossaSATACompleted().
3262 * This CB routine deals with non-data I/O SATA request.
3264 * \param agRoot: Handles for this instance of SAS/SATA hardware
3265 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
3266 * \param agIOStatus: Status of completed I/O.
3267 * \param agFirstDword:Pointer to the four bytes of FIS.
3268 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
3270 * \param agParam: Additional info based on status.
3271 * \param ioContext: Pointer to satIOContext_t.
3275 *****************************************************************************/
3276 void satNonDataIOCB(
3278 agsaIORequest_t *agIORequest,
3280 agsaFisHeader_t *agFirstDword,
3287 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3288 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3289 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3290 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3291 tdIORequestBody_t *tdIORequestBody;
3292 bit32 interruptContext = osData->IntContext;
3293 satIOContext_t *satIOContext;
3295 TI_DBG5(("satNonDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
3296 agIORequest, agIOStatus, agIOInfoLen));
3298 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3299 satIOContext = (satIOContext_t *) ioContext;
3300 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
3302 tdIORequestBody->ioCompleted = agTRUE;
3303 tdIORequestBody->ioStarted = agFALSE;
3305 /* Process completion */
3306 if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen==0))
3309 * !!! We expect that agIOInfoLen should be non-zero !!!!.
3310 * Now call the OS-App Specific layer about this unexpected completion.
3312 TI_DBG1(("satNonDataIOCB: *** ERROR*** agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
3313 agIORequest, agIOStatus, agIOInfoLen));
3315 ostiInitiatorIOCompleted( tiRoot,
3316 tdIORequestBody->tiIORequest,
3324 /* More checking needed, for non-data IO this should be the normal case */
3325 itdsatProcessAbnormalCompletion( agRoot,
3336 /*****************************************************************************
3337 *! \brief tdssSATADeviceTypeDecode
3339 * This routine decodes ATA signature
3341 * \param pSignature: ATA signature
3345 * TRUE if ATA signature
3348 *****************************************************************************/
3355 tdssSATADeviceTypeDecode(
3359 bit32 deviceType = UNKNOWN_DEVICE;
3361 if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3362 && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00
3363 && (pSignature)[4] == 0xA0 ) /* this is the signature of a Hitachi SATA HDD*/
3365 deviceType = SATA_ATA_DEVICE;
3367 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3368 && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00
3369 && (pSignature)[4] == 0x00 )
3371 deviceType = SATA_ATA_DEVICE;
3373 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3374 && (pSignature)[2] == 0x14 && (pSignature)[3] == 0xEB
3375 && ( (pSignature)[4] == 0x00 || (pSignature)[4] == 0x10) )
3377 deviceType = SATA_ATAPI_DEVICE;
3379 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3380 && (pSignature)[2] == 0x69 && (pSignature)[3] == 0x96
3381 && (pSignature)[4] == 0x00 )
3383 deviceType = SATA_PM_DEVICE;
3385 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3386 && (pSignature)[2] == 0x3C && (pSignature)[3] == 0xC3
3387 && (pSignature)[4] == 0x00 )
3389 deviceType = SATA_SEMB_DEVICE;
3391 else if ( (pSignature)[0] == 0xFF && (pSignature)[1] == 0xFF
3392 && (pSignature)[2] == 0xFF && (pSignature)[3] == 0xFF
3393 && (pSignature)[4] == 0xFF )
3395 deviceType = SATA_SEMB_WO_SEP_DEVICE;
3401 /*****************************************************************************
3402 *! \brief ossaDiscoverSataCB
3404 * Purpose: This function is called by lower layer to inform TD layer of
3405 * STP/SATA discovery results
3408 * \param agRoot Pointer to chip/driver Instance.
3409 * \param agPortContext Pointer to the port context of TD and Lower layer
3410 * \param event event type
3411 * \param pParm1 Pointer to data associated with event
3412 * \param pParm2 Pointer to data associated with event
3416 * \note - For details, refer to SAS/SATA Low-Level API Specification
3418 *****************************************************************************/
3420 osGLOBAL void ossaDiscoverSataCB( agsaRoot_t *agRoot,
3421 agsaPortContext_t *agPortContext,
3427 tdsaRootOsData_t *osData;
3429 tdsaPortContext_t *onePortContext;
3430 tdsaDeviceData_t *oneDeviceData;
3431 agsaDevHandle_t *agDevHandle;
3432 agsaSATADeviceInfo_t *agSATADeviceInfo;
3433 tiPortalContext_t *tiPortalContext;
3435 bit32 devicetype = UNKNOWN_DEVICE;
3437 osData = (tdsaRootOsData_t *)agRoot->osData;
3438 tiRoot = (tiRoot_t *)osData->tiRoot;
3440 TI_DBG5(("ossaDiscoverSataCB: start\n"));
3442 if (agPortContext == agNULL)
3444 TI_DBG1(("ossaDiscoverSataCB: NULL agsaPortContext; wrong\n"));
3448 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
3449 tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
3453 case OSSA_DISCOVER_STARTED:
3455 TI_DBG5(("ossaDiscoverSataCB: STARTED\n"));
3460 case OSSA_DISCOVER_FOUND_DEVICE:
3462 TI_DBG5(("ossaDiscoverSataCB: ***** FOUND DEVICE\n"));
3463 agDevHandle = (agsaDevHandle_t *) pParm1;
3464 agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2;
3466 /* parse the device type */
3467 devicetype = tdssSATADeviceTypeDecode(agSATADeviceInfo->signature);
3470 /* for now, TD handles only ATA Device or ATAPI Device */
3471 if (devicetype == SATA_ATA_DEVICE || devicetype == SATA_ATAPI_DEVICE)
3473 TI_DBG5(("ossaDiscoverSataCB: ***** adding ....\n"));
3474 /* Add SATA device */
3475 tdssAddSATAToSharedcontext( onePortContext,
3480 agSATADeviceInfo->stpPhyIdentifier
3482 #ifdef INITIATOR_DRIVER
3487 tiIntrEventTypeDeviceChange,
3492 } /* end of ATA_ATA_DEVICE or ATA_ATAPI_DEVICE */
3495 TI_DBG5(("ossaDiscoverSataCB: ***** not adding ..... devicetype 0x%x\n", devicetype));
3500 case OSSA_DISCOVER_REMOVED_DEVICE:
3502 TI_DBG1(("ossaDiscoverSataCB: REMOVED_DEVICE\n"));
3503 agDevHandle = (agsaDevHandle_t *) pParm1;
3504 agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2;
3506 oneDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
3508 TI_DBG1(("ossaDiscoverSataCB: signature: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
3509 agSATADeviceInfo->signature[0], agSATADeviceInfo->signature[1],
3510 agSATADeviceInfo->signature[2], agSATADeviceInfo->signature[3],
3511 agSATADeviceInfo->signature[4], agSATADeviceInfo->signature[5],
3512 agSATADeviceInfo->signature[6], agSATADeviceInfo->signature[7] ));
3514 if (oneDeviceData == agNULL)
3516 TI_DBG1(("ossaDiscoverSataCB: Wrong. DevHandle->osData is NULL but is being removed\n"));
3518 tdssRemoveSATAFromSharedcontext( onePortContext,
3522 agDevHandle->osData = agNULL;
3523 #ifdef INITIATOR_DRIVER
3528 tiIntrEventTypeDeviceChange,
3536 case OSSA_DISCOVER_COMPLETE:
3538 TI_DBG1(("ossaDiscoverSataCB: COMPLETE\n"));
3539 onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
3540 TI_DBG6(("ossaDiscoverSataCB: COMPLETE pid %d\n", onePortContext->id));
3542 /* Let OS-Apps specific layer know discovery has been successfully complete */
3543 ostiInitiatorEvent( tiRoot,
3546 tiIntrEventTypeDiscovery,
3552 case OSSA_DISCOVER_ABORT:
3554 TI_DBG1(("ossaDiscoverSataCB: OSSA_DISCOVER_ABORT\n"));
3555 /* Let OS-Apps specific layer know discovery has failed */
3556 ostiInitiatorEvent( tiRoot,
3559 tiIntrEventTypeDiscovery,
3568 TI_DBG1(("ossaDiscoverSataCB: error default event 0x%x\n", event));
3569 /* Let OS-Apps specific layer know discovery has failed */
3570 ostiInitiatorEvent( tiRoot,
3573 tiIntrEventTypeDiscovery,
3579 } /* end of switch */
3584 /*****************************************************************************
3585 *! \brief tdssAddSataToSharedcontext
3587 * Purpose: This function adds a discovered SATA device to a device list of
3590 * \param tsddPortContext_Instance Pointer to the target port context
3591 * \param agRoot Pointer to the root data structure of
3592 * TD and Lower layer
3593 * \param agDevHandle Pointer to a device handle
3594 * \param agSATADeviceInfo Pointer to SATA device info structure
3595 * \param registered indication flag for registration to LL
3599 *****************************************************************************/
3600 /* split into devicedata allocation/registration and sending identify device data */
3602 tdssAddSATAToSharedcontext( tdsaPortContext_t *tdsaPortContext_Instance,
3604 agsaDevHandle_t *agDevHandle,
3605 agsaSATADeviceInfo_t *agSATADeviceInfo,
3610 tdsaPortContext_t *onePortContext = agNULL;
3611 tdList_t *PortContextList;
3612 tdsaDeviceData_t *oneDeviceData = agNULL;
3613 tdList_t *DeviceListList = agNULL;
3614 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3615 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3616 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3617 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3618 satDeviceData_t *pSatDevData;
3619 bit32 Indenom = tdsaAllShared->QueueConfig.numInboundQueues;
3620 bit32 Outdenom = tdsaAllShared->QueueConfig.numOutboundQueues;
3621 bit8 dev_s_rate = 0;
3623 bit8 connectionRate;
3626 bit32 found = agFALSE;
3627 TI_DBG5(("tdssAddSataToSharedcontext: start\n"));
3630 * Find a right portcontext, then get devicedata from FreeLink in DeviceList.
3631 * Then, add the devicedata to the portcontext.
3634 /* Find a right portcontext */
3635 PortContextList = tdsaAllShared->MainPortContextList.flink;
3636 while (PortContextList != &(tdsaAllShared->MainPortContextList))
3638 onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
3639 if (onePortContext == tdsaPortContext_Instance)
3641 TI_DBG5(("tdssAddSataToSharedcontext: found; oneportContext ID %d\n",
3642 onePortContext->id));
3646 PortContextList = PortContextList->flink;
3649 if (found == agFALSE)
3651 TI_DBG1(("tdssAddSataToSharedcontext: No corressponding tdsaPortContext\n"));
3656 1. add the devicedata
3657 2. Send Identify Device Data
3658 3. In CB of Identify Device Data (satAddSATAIDDevCB), finds out the devicedata is new or old
3662 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
3663 if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList)))
3665 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3666 TI_DBG1(("tdssAddSataToSharedcontext: ERROR empty DeviceData FreeLink\n"));
3667 /* notifying link up */
3672 (void *)tdsaAllShared->Ports[phyID].tiPortalContext
3674 #ifdef INITIATOR_DRIVER
3675 /* triggers discovery */
3678 tiPortDiscoveryReady,
3680 (void *) tdsaAllShared->Ports[phyID].tiPortalContext
3686 TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList));
3687 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3688 oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList);
3689 TDLIST_DEQUEUE_THIS(&(oneDeviceData->FreeLink));
3691 TI_DBG1(("tdssAddSataToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
3692 oneDeviceData->InQID = oneDeviceData->id % Indenom;
3693 oneDeviceData->OutQID = oneDeviceData->id % Outdenom;
3695 pSatDevData = (satDeviceData_t *)&(oneDeviceData->satDevData);
3696 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
3697 pSatDevData->satPendingIO = 0;
3698 pSatDevData->satNCQMaxIO = 0;
3699 pSatDevData->satPendingNCQIO = 0;
3700 pSatDevData->satPendingNONNCQIO = 0;
3701 pSatDevData->IDDeviceValid = agFALSE;
3702 pSatDevData->satDeviceType = tdssSATADeviceTypeDecode(onePortContext->remoteSignature);
3704 osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
3706 onePortContext->Count++;
3707 oneDeviceData->DeviceType = TD_SATA_DEVICE; // either TD_SAS_DEVICE or TD_SATA_DEVICE
3708 oneDeviceData->agRoot = agRoot;
3709 // oneDeviceData->agDevHandle = agDevHandle;
3711 // agDevHandle->osData = oneDeviceData; /* TD layer */
3712 oneDeviceData->tdPortContext = onePortContext;
3713 oneDeviceData->valid = agTRUE;
3715 oneDeviceData->directlyAttached = agTRUE;
3716 oneDeviceData->initiator_ssp_stp_smp = 0;
3717 oneDeviceData->target_ssp_stp_smp = 0x1; /* setting SATA device bit */
3718 oneDeviceData->phyID = phyID;
3720 /* parse sasIDframe to fill in agDeviceInfo */
3721 flag = (bit8)((phyID << 4) | TLR);
3722 DEVINFO_PUT_SMPTO(&oneDeviceData->agDeviceInfo, DEFAULT_SMP_TIMEOUT);
3723 DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->agDeviceInfo, (bit16)tdsaAllShared->itNexusTimeout);
3724 DEVINFO_PUT_FBS(&oneDeviceData->agDeviceInfo, 0);
3726 //DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, 0);
3727 DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, flag);
3729 sasorsata = SATA_DEVICE_TYPE; /* SATA disk */
3730 connectionRate = onePortContext->LinkRate;
3731 dev_s_rate = (bit8)(dev_s_rate | (sasorsata << 4));
3732 dev_s_rate = (bit8)(dev_s_rate | connectionRate);
3733 DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->agDeviceInfo, dev_s_rate);
3735 DEVINFO_PUT_SAS_ADDRESSLO(
3736 &oneDeviceData->agDeviceInfo,
3739 DEVINFO_PUT_SAS_ADDRESSHI(
3740 &oneDeviceData->agDeviceInfo,
3744 if (pSatDevData->satDeviceType == SATA_ATAPI_DEVICE )
3746 oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG; /* ATAPI device flag*/
3749 oneDeviceData->agContext.osData = oneDeviceData;
3750 oneDeviceData->agContext.sdkData = agNULL;
3752 if (oneDeviceData->registered == agFALSE)
3754 saRegisterNewDevice( /* tdssAddSATAToSharedcontext */
3756 &oneDeviceData->agContext,
3757 0,/*tdsaRotateQnumber(tiRoot, oneDeviceData),*/
3758 &oneDeviceData->agDeviceInfo,
3759 onePortContext->agPortContext,
3765 /*****************************************************************************
3766 *! \brief tdssRetrySATAID
3768 * Purpose: This function retries identify device data to directly attached SATA
3769 * device after device registration
3771 * \param tiRoot: Pointer to TISA initiator driver/port instance.
3772 * \param oneDeviceData Pointer to a device data
3775 *****************************************************************************/
3777 tdssRetrySATAID( tiRoot_t *tiRoot,
3778 tdsaDeviceData_t *oneDeviceData
3781 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3782 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3784 tdIORequestBody_t *tdIORequestBody;
3787 bit32 memAllocStatus;
3788 agsaIORequest_t *agIORequest = agNULL; /* identify device data itself */
3789 satIOContext_t *satIOContext = agNULL;
3792 TI_DBG5(("tdssRetrySATAID: start\n"));
3793 /* allocate identify device data and sends it */
3794 /* allocation tdIORequestBody and pass it to satTM() */
3795 memAllocStatus = ostiAllocMemory(
3798 (void **)&tdIORequestBody,
3802 sizeof(tdIORequestBody_t),
3806 if (memAllocStatus != tiSuccess)
3808 TI_DBG1(("tdssRetrySATAID: ostiAllocMemory failed... loc 2\n"));
3809 /* notifying link up */
3814 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3816 #ifdef INITIATOR_DRIVER
3817 /* triggers discovery */
3820 tiPortDiscoveryReady,
3822 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3829 if (tdIORequestBody == agNULL)
3831 TI_DBG1(("tdssRetrySATAID: ostiAllocMemory returned NULL tdIORequestBody loc 2\n"));
3832 /* notifying link up */
3837 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3839 #ifdef INITIATOR_DRIVER
3840 /* triggers discovery */
3843 tiPortDiscoveryReady,
3845 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3852 /* setup identify device data IO structure */
3853 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
3854 tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
3855 tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL;
3857 /* initialize tiDevhandle */
3858 tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle);
3859 tdIORequestBody->tiDevHandle->tdData = oneDeviceData;
3861 /* initialize tiIORequest */
3862 tdIORequestBody->tiIORequest = agNULL;
3864 /* initialize agIORequest */
3865 agIORequest = &(tdIORequestBody->agIORequest);
3866 agIORequest->osData = (void *) tdIORequestBody;
3867 agIORequest->sdkData = agNULL; /* SA takes care of this */
3869 /* set up satIOContext */
3870 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
3871 satIOContext->pSatDevData = &(oneDeviceData->satDevData);
3872 satIOContext->pFis =
3873 &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
3876 satIOContext->tiRequestBody = tdIORequestBody;
3877 satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
3878 satIOContext->tiScsiXchg = agNULL;
3879 satIOContext->satIntIoContext = agNULL;
3880 satIOContext->satOrgIOContext = agNULL;
3882 /* followings are used only for internal IO */
3883 satIOContext->currentLBA = 0;
3884 satIOContext->OrgTL = 0;
3887 satIOContext->satToBeAbortedIOContext = agNULL;
3889 satIOContext->NotifyOS = agFALSE;
3891 satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id;
3893 status = satAddSATAStartIDDev(tiRoot,
3895 &(oneDeviceData->tiDeviceHandle),
3900 /* assumption; always new device data */
3903 if (status == tiSuccess)
3905 TI_DBG6(("tdssRetrySATAID: successfully sent identify device data\n"));
3906 TI_DBG6(("tdssRetrySATAID: one case did %d \n", oneDeviceData->id));
3910 TI_DBG1(("tdssRetrySATAID: failed in sending identify device data\n"));
3911 /* put onedevicedata back to free list */
3912 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
3913 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
3914 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3915 /* notifying link up */
3920 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3922 #ifdef INITIATOR_DRIVER
3923 /* triggers discovery */
3926 tiPortDiscoveryReady,
3928 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3937 /*****************************************************************************
3938 *! \brief tdssSubAddSATAToSharedcontext
3940 * Purpose: This function sends identify device data to directly attached SATA
3941 * device after device registration
3943 * \param tiRoot: Pointer to TISA initiator driver/port instance.
3944 * \param oneDeviceData Pointer to a device data
3947 *****************************************************************************/
3949 tdssSubAddSATAToSharedcontext( tiRoot_t *tiRoot,
3950 tdsaDeviceData_t *oneDeviceData
3953 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3954 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3956 tdIORequestBody_t *tdIORequestBody;
3959 bit32 memAllocStatus;
3960 agsaIORequest_t *agIORequest = agNULL; /* identify device data itself */
3961 satIOContext_t *satIOContext = agNULL;
3964 TI_DBG1(("tdssSubAddSATAToSharedcontext: start\n"));
3965 /* allocate identify device data and sends it */
3966 /* allocation tdIORequestBody and pass it to satTM() */
3967 memAllocStatus = ostiAllocMemory(
3970 (void **)&tdIORequestBody,
3974 sizeof(tdIORequestBody_t),
3978 if (memAllocStatus != tiSuccess)
3980 TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory failed... loc 2\n"));
3981 /* notifying link up */
3986 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3988 #ifdef INITIATOR_DRIVER
3989 /* triggers discovery */
3992 tiPortDiscoveryReady,
3994 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4001 if (tdIORequestBody == agNULL)
4003 TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory returned NULL tdIORequestBody loc 2\n"));
4004 /* notifying link up */
4009 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4011 #ifdef INITIATOR_DRIVER
4012 /* triggers discovery */
4015 tiPortDiscoveryReady,
4017 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4024 /* setup identify device data IO structure */
4025 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
4026 tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
4027 tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL;
4029 /* initialize tiDevhandle */
4030 tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle);
4031 tdIORequestBody->tiDevHandle->tdData = oneDeviceData;
4033 /* initialize tiIORequest */
4034 tdIORequestBody->tiIORequest = agNULL;
4036 /* initialize agIORequest */
4037 agIORequest = &(tdIORequestBody->agIORequest);
4038 agIORequest->osData = (void *) tdIORequestBody;
4039 agIORequest->sdkData = agNULL; /* SA takes care of this */
4041 /* set up satIOContext */
4042 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
4043 satIOContext->pSatDevData = &(oneDeviceData->satDevData);
4044 satIOContext->pFis =
4045 &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
4048 satIOContext->tiRequestBody = tdIORequestBody;
4049 satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
4050 satIOContext->tiScsiXchg = agNULL;
4051 satIOContext->satIntIoContext = agNULL;
4052 satIOContext->satOrgIOContext = agNULL;
4054 /* followings are used only for internal IO */
4055 satIOContext->currentLBA = 0;
4056 satIOContext->OrgTL = 0;
4059 satIOContext->satToBeAbortedIOContext = agNULL;
4061 satIOContext->NotifyOS = agFALSE;
4063 satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id;
4065 status = satAddSATAStartIDDev(tiRoot,
4067 &(oneDeviceData->tiDeviceHandle),
4072 /* assumption; always new device data */
4075 if (status == tiSuccess)
4077 TI_DBG6(("tdssSubAddSATAToSharedcontext: successfully sent identify device data\n"));
4079 /* Add the devicedata to the mainlink */
4080 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
4081 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
4082 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
4083 TI_DBG6(("tdssSubAddSATAToSharedcontext: one case did %d \n", oneDeviceData->id));
4087 TI_DBG1(("tdssSubAddSATAToSharedcontext: failed in sending identify device data\n"));
4088 /* put onedevicedata back to free list */
4089 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
4090 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
4091 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
4092 /* notifying link up */
4097 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4099 #ifdef INITIATOR_DRIVER
4100 /* triggers discovery */
4103 tiPortDiscoveryReady,
4105 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4115 /*****************************************************************************
4116 *! \brief tdssRemoveSATAFromSharedcontext
4118 * Purpose: This function removes a discovered device from a device list of
4121 * \param tsddPortContext_Ins Pointer to the target port context
4122 * \param tdsaDeviceData_Ins Pointer to the target device
4123 * \param agRoot Pointer to the root data structure of
4124 * TD and Lower layer
4129 *****************************************************************************/
4131 tdssRemoveSATAFromSharedcontext(
4132 tdsaPortContext_t *tdsaPortContext_Ins,
4133 tdsaDeviceData_t *tdsaDeviceData_ins,
4137 TI_DBG1(("tdssRemoveSATAFromSharedcontex: start\n"));
4142 /*****************************************************************************
4143 *! \brief satSetDevInfo
4145 * Purpose: Based on ATA identify device data, this functions sets fields of
4146 * device data maintained in TD layer
4148 * \param satDevData Pointer to a device data
4149 * \param SATAIdData Pointer to ATA identify device data
4154 *****************************************************************************/
4156 satDeviceData_t *satDevData,
4157 agsaSATAIdentifyData_t *SATAIdData
4160 TI_DBG3(("satSetDevInfo: start\n"));
4162 satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
4163 satDevData->satFormatState = agFALSE;
4164 satDevData->satDeviceFaultState = agFALSE;
4165 satDevData->satTmTaskTag = agNULL;
4166 satDevData->satAbortAfterReset = agFALSE;
4167 satDevData->satAbortCalled = agFALSE;
4168 satDevData->satSectorDone = 0;
4170 /* Qeueu depth, Word 75 */
4171 satDevData->satNCQMaxIO = SATAIdData->queueDepth + 1;
4172 TI_DBG3(("satSetDevInfo: max queue depth %d\n",satDevData->satNCQMaxIO));
4174 /* Support NCQ, if Word 76 bit 8 is set */
4175 if (SATAIdData->sataCapabilities & 0x100)
4177 TI_DBG3(("satSetDevInfo: device supports NCQ\n"));
4178 satDevData->satNCQ = agTRUE;
4182 TI_DBG3(("satSetDevInfo: no NCQ\n"));
4183 satDevData->satNCQ = agFALSE;
4186 /* Support 48 bit addressing, if Word 83 bit 10 and Word 86 bit 10 are set */
4187 if ((SATAIdData->commandSetSupported1 & 0x400) &&
4188 (SATAIdData->commandSetFeatureEnabled1 & 0x400) )
4190 TI_DBG3(("satSetDevInfo: support 48 bit addressing\n"));
4191 satDevData->sat48BitSupport = agTRUE;
4195 TI_DBG3(("satSetDevInfo: NO 48 bit addressing\n"));
4196 satDevData->sat48BitSupport = agFALSE;
4199 /* Support SMART Self Test, word84 bit 1 */
4200 if (SATAIdData->commandSetFeatureSupportedExt & 0x02)
4202 TI_DBG3(("satSetDevInfo: SMART self-test supported \n"));
4203 satDevData->satSMARTSelfTest = agTRUE;
4207 TI_DBG3(("satSetDevInfo: no SMART self-test suppored\n"));
4208 satDevData->satSMARTSelfTest = agFALSE;
4213 /* Support SMART feature set, word82 bit 0 */
4214 if (SATAIdData->commandSetSupported & 0x01)
4216 TI_DBG3(("satSetDevInfo: SMART feature set supported \n"));
4217 satDevData->satSMARTFeatureSet = agTRUE;
4221 TI_DBG3(("satSetDevInfo: no SMART feature set suppored\n"));
4222 satDevData->satSMARTFeatureSet = agFALSE;
4227 /* Support SMART enabled, word85 bit 0 */
4228 if (SATAIdData->commandSetFeatureEnabled & 0x01)
4230 TI_DBG3(("satSetDevInfo: SMART enabled \n"));
4231 satDevData->satSMARTEnabled = agTRUE;
4235 TI_DBG3(("satSetDevInfo: no SMART enabled\n"));
4236 satDevData->satSMARTEnabled = agFALSE;
4239 satDevData->satVerifyState = 0;
4241 /* Removable Media feature set support, word82 bit 2 */
4242 if (SATAIdData->commandSetSupported & 0x4)
4244 TI_DBG3(("satSetDevInfo: Removable Media supported \n"));
4245 satDevData->satRemovableMedia = agTRUE;
4249 TI_DBG3(("satSetDevInfo: no Removable Media suppored\n"));
4250 satDevData->satRemovableMedia = agFALSE;
4253 /* Removable Media feature set enabled, word 85, bit 2 */
4254 if (SATAIdData->commandSetFeatureEnabled & 0x4)
4256 TI_DBG3(("satSetDevInfo: Removable Media enabled\n"));
4257 satDevData->satRemovableMediaEnabled = agTRUE;
4261 TI_DBG3(("satSetDevInfo: no Removable Media enabled\n"));
4262 satDevData->satRemovableMediaEnabled = agFALSE;
4265 /* DMA Support, word49 bit8 */
4266 if (SATAIdData->dma_lba_iod_ios_stimer & 0x100)
4268 TI_DBG3(("satSetDevInfo: DMA supported \n"));
4269 satDevData->satDMASupport = agTRUE;
4273 TI_DBG3(("satSetDevInfo: no DMA suppored\n"));
4274 satDevData->satDMASupport = agFALSE;
4277 /* DMA Enabled, word88 bit0-6, bit8-14*/
4278 /* 0x7F7F = 0111 1111 0111 1111*/
4279 if (SATAIdData->ultraDMAModes & 0x7F7F)
4281 TI_DBG3(("satSetDevInfo: DMA enabled \n"));
4282 satDevData->satDMAEnabled = agTRUE;
4286 TI_DBG3(("satSetDevInfo: no DMA enabled\n"));
4287 satDevData->satDMAEnabled = agFALSE;
4291 setting MaxUserAddrSectors: max user addressable setctors
4292 word60 - 61, should be 0x 0F FF FF FF
4294 satDevData->satMaxUserAddrSectors
4295 = (SATAIdData->numOfUserAddressableSectorsHi << (8*2) )
4296 + SATAIdData->numOfUserAddressableSectorsLo;
4297 TI_DBG3(("satSetDevInfo: MaxUserAddrSectors 0x%x decimal %d\n", satDevData->satMaxUserAddrSectors, satDevData->satMaxUserAddrSectors));
4298 /* Support DMADIR, if Word 62 bit 8 is set */
4299 if (SATAIdData->word62_74[0] & 0x8000)
4301 TI_DBG3(("satSetDevInfo: DMADIR enabled\n"));
4302 satDevData->satDMADIRSupport = agTRUE;
4306 TI_DBG3(("satSetDevInfo: DMADIR disabled\n"));
4307 satDevData->satDMADIRSupport = agFALSE;
4311 /* write cache enabled for caching mode page SAT Table 67 p69, word85 bit5 */
4312 if (SATAIdData->commandSetFeatureEnabled & 0x20)
4314 TI_DBG3(("satSetDevInfo: write cache enabled\n"));
4315 satDevData->satWriteCacheEnabled = agTRUE;
4319 TI_DBG3(("satSetDevInfo: no write cache enabled\n"));
4320 satDevData->satWriteCacheEnabled = agFALSE;
4323 /* look ahead enabled for caching mode page SAT Table 67 p69, word85 bit6 */
4324 if (SATAIdData->commandSetFeatureEnabled & 0x40)
4326 TI_DBG3(("satSetDevInfo: look ahead enabled\n"));
4327 satDevData->satLookAheadEnabled = agTRUE;
4331 TI_DBG3(("satSetDevInfo: no look ahead enabled\n"));
4332 satDevData->satLookAheadEnabled = agFALSE;
4335 /* Support WWN, if Word 87 bit 8 is set */
4336 if (SATAIdData->commandSetFeatureDefault & 0x100)
4338 TI_DBG3(("satSetDevInfo: device supports WWN\n"));
4339 satDevData->satWWNSupport = agTRUE;
4343 TI_DBG3(("satSetDevInfo: no WWN\n"));
4344 satDevData->satWWNSupport = agFALSE;
4351 /*****************************************************************************
4352 *! \brief satInquiryCB
4354 * This routine is a callback function for satInquiry()
4356 * \param agRoot: Handles for this instance of SAS/SATA hardware
4357 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
4358 * \param agIOStatus: Status of completed I/O.
4359 * \param agFirstDword:Pointer to the four bytes of FIS.
4360 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
4362 * \param agParam: Additional info based on status.
4363 * \param ioContext: Pointer to satIOContext_t.
4367 *****************************************************************************/
4370 agsaIORequest_t *agIORequest,
4372 agsaFisHeader_t *agFirstDword,
4379 In the process of Inquiry
4380 Process SAT_IDENTIFY_DEVICE
4382 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4383 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4384 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
4385 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
4386 tdIORequestBody_t *tdIORequestBody;
4387 tdIORequestBody_t *tdOrgIORequestBody;
4388 satIOContext_t *satIOContext;
4389 satIOContext_t *satOrgIOContext;
4390 satInternalIo_t *satIntIo;
4391 satDeviceData_t *satDevData;
4392 #ifdef TD_DEBUG_ENABLE
4393 tdsaDeviceData_t *tdsaDeviceData;
4394 bit32 ataStatus = 0;
4396 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
4398 scsiRspSense_t *pSense;
4399 tiIniScsiCmnd_t *scsiCmnd;
4400 tiIORequest_t *tiOrgIORequest;
4401 tiScsiInitiatorRequest_t *tiScsiRequest; /* TD's tiScsiXchg */
4402 tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* OS's tiScsiXchg */
4403 agsaSATAIdentifyData_t *pSATAIdData;
4406 bit16 *tmpptr,tmpptr_tmp;
4409 bit32 lenNeeded = 0;
4411 TI_DBG6(("satInquiryCB: start\n"));
4412 TI_DBG6(("satInquiryCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
4413 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4414 satIOContext = (satIOContext_t *) ioContext;
4415 satIntIo = satIOContext->satIntIoContext;
4416 satDevData = satIOContext->pSatDevData;
4417 #ifdef TD_DEBUG_ENABLE
4418 tdsaDeviceData = (tdsaDeviceData_t *)satDevData->satSaDeviceData;
4420 tiScsiRequest = satIOContext->tiScsiXchg;
4421 if (satIntIo == agNULL)
4423 TI_DBG6(("satInquiryCB: External, OS generated\n"));
4424 pSense = satIOContext->pSense;
4425 scsiCmnd = satIOContext->pScsiCmnd;
4426 satOrgIOContext = satIOContext;
4427 tiOrgIORequest = tdIORequestBody->tiIORequest;
4431 TI_DBG6(("satInquiryCB: Internal, TD generated\n"));
4432 satOrgIOContext = satIOContext->satOrgIOContext;
4433 if (satOrgIOContext == agNULL)
4435 TI_DBG1(("satInquiryCB: satOrgIOContext is NULL, wrong\n"));
4440 TI_DBG6(("satInquiryCB: satOrgIOContext is NOT NULL\n"));
4442 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
4443 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
4444 pSense = satOrgIOContext->pSense;
4445 scsiCmnd = satOrgIOContext->pScsiCmnd;
4448 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg;
4449 pInquiry = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
4451 tdIORequestBody->ioCompleted = agTRUE;
4452 tdIORequestBody->ioStarted = agFALSE;
4454 TI_DBG3(("satInquiryCB: did %d\n", tdsaDeviceData->id));
4456 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
4458 TI_DBG1(("satInquiryCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
4459 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY)
4461 TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
4462 /* should NOT be retried */
4463 ostiInitiatorIOCompleted (
4469 satOrgIOContext->interruptContext
4474 TI_DBG1(("satInquiryCB: NOT OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
4475 ostiInitiatorIOCompleted (
4481 satOrgIOContext->interruptContext
4484 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4486 satFreeIntIoResource( tiRoot,
4491 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED ||
4492 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION ||
4493 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
4494 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
4495 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION ||
4496 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED ||
4497 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION ||
4498 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR ||
4499 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
4502 TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR\n"));
4504 ostiInitiatorIOCompleted (
4510 satOrgIOContext->interruptContext
4513 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4515 satFreeIntIoResource( tiRoot,
4521 if ( agIOStatus != OSSA_IO_SUCCESS ||
4522 (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
4525 #ifdef TD_DEBUG_ENABLE
4526 // only agsaFisPioSetup_t is expected
4527 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
4528 ataStatus = satPIOSetupHeader->status; // ATA Status register
4529 ataError = satPIOSetupHeader->error; // ATA Eror register
4531 TI_DBG1(("satInquiryCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError));
4532 /* Process abort case */
4533 if (agIOStatus == OSSA_IO_ABORTED)
4535 satProcessAbort(tiRoot,
4540 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4542 satFreeIntIoResource( tiRoot,
4548 ostiInitiatorIOCompleted (
4554 satOrgIOContext->interruptContext
4557 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4559 satFreeIntIoResource( tiRoot,
4568 /* Convert to host endian */
4569 tmpptr = (bit16*)(tiScsiRequest->sglVirtualAddr);
4570 for (x=0; x < sizeof(agsaSATAIdentifyData_t)/sizeof(bit16); x++)
4572 OSSA_READ_LE_16(AGROOT, &tmpptr_tmp, tmpptr, 0);
4573 *tmpptr = tmpptr_tmp;
4575 /*Print tmpptr_tmp here for debugging purpose*/
4578 pSATAIdData = (agsaSATAIdentifyData_t *)(tiScsiRequest->sglVirtualAddr);
4580 TI_DBG5(("satInquiryCB: OS satOrgIOContext %p \n", satOrgIOContext));
4581 TI_DBG5(("satInquiryCB: TD satIOContext %p \n", satIOContext));
4582 TI_DBG5(("satInquiryCB: OS tiScsiXchg %p \n", satOrgIOContext->tiScsiXchg));
4583 TI_DBG5(("satInquiryCB: TD tiScsiXchg %p \n", satIOContext->tiScsiXchg));
4585 /* copy ID Dev data to satDevData */
4586 satDevData->satIdentifyData = *pSATAIdData;
4587 satDevData->IDDeviceValid = agTRUE;
4588 #ifdef TD_INTERNAL_DEBUG
4589 tdhexdump("satInquiryCB ID Dev data",(bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t));
4590 tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
4592 // tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
4594 /* set satDevData fields from IndentifyData */
4595 satSetDevInfo(satDevData,pSATAIdData);
4597 lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4];
4599 /* SPC-4, spec 6.4 p 141 */
4601 if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK))
4603 /* Returns the standard INQUIRY data */
4604 lenNeeded = STANDARD_INQUIRY_SIZE;
4607 satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd);
4608 //tdhexdump("satInquiryCB ***standard***", (bit8 *)pInquiry, 36);
4613 /* EVPD bit != 0 && PAGE CODE != 0 */
4614 /* returns the pages of vital product data information */
4616 /* we must support page 00h, 83h and 89h */
4617 page = scsiCmnd->cdb[2];
4618 if ((page != INQUIRY_SUPPORTED_VPD_PAGE) &&
4619 (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) &&
4620 (page != INQUIRY_ATA_INFORMATION_VPD_PAGE))
4622 satSetSensePayload( pSense,
4623 SCSI_SNSKEY_ILLEGAL_REQUEST,
4625 SCSI_SNSCODE_INVALID_FIELD_IN_CDB,
4628 ostiInitiatorIOCompleted( tiRoot,
4631 SCSI_STAT_CHECK_CONDITION,
4632 satOrgIOContext->pTiSenseData,
4633 satOrgIOContext->interruptContext );
4635 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4637 satFreeIntIoResource( tiRoot,
4640 TI_DBG1(("satInquiryCB: invalid PAGE CODE 0x%x\n", page));
4644 /* checking length */
4647 case INQUIRY_SUPPORTED_VPD_PAGE:
4648 lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */
4650 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4651 if (satDevData->satWWNSupport)
4653 lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */
4657 lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */
4660 case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4661 lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */
4664 TI_DBG1(("satInquiryCB: wrong!!! invalid PAGE CODE 0x%x\n", page));
4670 * Fill in the Inquiry data depending on what Inquiry data we are returning.
4674 case INQUIRY_SUPPORTED_VPD_PAGE:
4675 satInquiryPage0(pInquiry, pSATAIdData);
4677 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4678 satInquiryPage83(pInquiry, pSATAIdData, satDevData);
4680 case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4681 satInquiryPage89(pInquiry, pSATAIdData, satDevData);
4684 TI_DBG1(("satInquiryCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4689 TI_DBG6(("satInquiryCB: calling ostiInitiatorIOCompleted\n"));
4691 if (lenReceived > lenNeeded)
4693 TI_DBG6(("satInquiryCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
4694 lenNeeded, lenReceived, tiOrgIORequest));
4696 ostiInitiatorIOCompleted( tiRoot,
4699 lenReceived - lenNeeded,
4701 satOrgIOContext->interruptContext );
4705 ostiInitiatorIOCompleted( tiRoot,
4710 satOrgIOContext->interruptContext);
4713 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4715 satFreeIntIoResource( tiRoot,
4718 TI_DBG5(("satInquiryCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
4719 TI_DBG6(("satInquiryCB: end\n"));
4724 /*****************************************************************************/
4725 /*! \brief satInquiryIntCB.
4727 * This function is part of INQUIRY SAT implementation. This is called when
4728 * ATA identify device data is available.
4730 * \param tiRoot: Pointer to TISA initiator driver/port instance.
4731 * \param tiIORequest: Pointer to TISA I/O request context for this I/O.
4732 * \param tiDeviceHandle: Pointer to TISA device handle for this I/O.
4733 * \param tiScsiRequest: Pointer to TISA SCSI I/O request and SGL list.
4734 * \param satIOContext_t: Pointer to the SAT IO Context
4736 * \return If command is started successfully
4737 * - \e tiSuccess: I/O request successfully initiated.
4738 * - \e tiBusy: No resources available, try again later.
4739 * - \e tiIONoDevice: Invalid device handle.
4740 * - \e tiError: Other errors.
4742 /*****************************************************************************/
4743 void satInquiryIntCB(
4745 tiIORequest_t *tiIORequest,
4746 tiDeviceHandle_t *tiDeviceHandle,
4747 tiScsiInitiatorRequest_t *tiScsiRequest,
4748 satIOContext_t *satIOContext
4751 scsiRspSense_t *pSense;
4752 tiIniScsiCmnd_t *scsiCmnd;
4753 satDeviceData_t *satDevData;
4754 agsaSATAIdentifyData_t *pSATAIdData;
4759 bit32 lenNeeded = 0;
4761 TI_DBG6(("satInquiryIntCB: start\n"));
4763 pSense = satIOContext->pSense;
4764 scsiCmnd = &tiScsiRequest->scsiCmnd;
4765 pInquiry = (bit8 *) tiScsiRequest->sglVirtualAddr;
4766 satDevData = satIOContext->pSatDevData;
4767 pSATAIdData = &satDevData->satIdentifyData;
4770 lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4];
4772 /* SPC-4, spec 6.4 p 141 */
4774 if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK))
4776 /* Returns the standard INQUIRY data */
4777 lenNeeded = STANDARD_INQUIRY_SIZE;
4779 satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd);
4780 //tdhexdump("satInquiryIntCB ***standard***", (bit8 *)pInquiry, 36);
4785 /* EVPD bit != 0 && PAGE CODE != 0 */
4786 /* returns the pages of vital product data information */
4788 /* we must support page 00h, 83h and 89h */
4789 page = scsiCmnd->cdb[2];
4790 if ((page != INQUIRY_SUPPORTED_VPD_PAGE) &&
4791 (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) &&
4792 (page != INQUIRY_ATA_INFORMATION_VPD_PAGE) &&
4793 (page != INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE))
4795 satSetSensePayload( pSense,
4796 SCSI_SNSKEY_ILLEGAL_REQUEST,
4798 SCSI_SNSCODE_INVALID_FIELD_IN_CDB,
4801 ostiInitiatorIOCompleted( tiRoot,
4804 SCSI_STAT_CHECK_CONDITION,
4805 satIOContext->pTiSenseData,
4806 satIOContext->interruptContext );
4808 TI_DBG1(("satInquiryIntCB: invalid PAGE CODE 0x%x\n", page));
4812 /* checking length */
4815 case INQUIRY_SUPPORTED_VPD_PAGE:
4816 lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */
4818 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4819 if (satDevData->satWWNSupport)
4821 lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */
4825 lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */
4828 case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4829 lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */
4831 case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE:
4832 lenNeeded = SATA_PAGE80_INQUIRY_SIZE; /* 24 */
4836 TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4842 * Fill in the Inquiry data depending on what Inquiry data we are returning.
4846 case INQUIRY_SUPPORTED_VPD_PAGE:
4847 satInquiryPage0(pInquiry, pSATAIdData);
4849 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4850 satInquiryPage83(pInquiry, pSATAIdData, satDevData);
4852 case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4853 satInquiryPage89(pInquiry, pSATAIdData, satDevData);
4855 case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE:
4856 satInquiryPage80(pInquiry, pSATAIdData);
4859 TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4864 TI_DBG6(("satInquiryIntCB: calling ostiInitiatorIOCompleted\n"));
4866 if (lenReceived > lenNeeded)
4868 TI_DBG6(("satInquiryIntCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
4869 lenNeeded, lenReceived, tiIORequest));
4871 ostiInitiatorIOCompleted( tiRoot,
4874 lenReceived - lenNeeded,
4876 satIOContext->interruptContext );
4880 ostiInitiatorIOCompleted( tiRoot,
4885 satIOContext->interruptContext);
4888 TI_DBG5(("satInquiryIntCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
4889 TI_DBG6(("satInquiryIntCB: end\n"));
4894 /*****************************************************************************
4895 *! \brief satVerify10CB
4897 * This routine is a callback function called from ossaSATACompleted().
4898 * This CB routine deals with Verify(10) completion.
4900 * \param agRoot: Handles for this instance of SAS/SATA hardware
4901 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
4902 * \param agIOStatus: Status of completed I/O.
4903 * \param agFirstDword:Pointer to the four bytes of FIS.
4904 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
4906 * \param agParam: Additional info based on status.
4907 * \param ioContext: Pointer to satIOContext_t.
4911 *****************************************************************************/
4914 agsaIORequest_t *agIORequest,
4916 agsaFisHeader_t *agFirstDword,
4922 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4923 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4924 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
4925 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
4926 tdIORequestBody_t *tdIORequestBody;
4927 tdIORequestBody_t *tdOrgIORequestBody;
4928 satIOContext_t *satIOContext;
4929 satIOContext_t *satOrgIOContext;
4930 satInternalIo_t *satIntIo;
4931 satDeviceData_t *satDevData;
4932 scsiRspSense_t *pSense;
4933 tiIORequest_t *tiOrgIORequest;
4935 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
4936 bit32 ataStatus = 0;
4937 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
4939 TI_DBG5(("satVerify10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
4941 /* internally generate tiIOContext */
4942 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4943 satIOContext = (satIOContext_t *) ioContext;
4944 satIntIo = satIOContext->satIntIoContext;
4945 satDevData = satIOContext->pSatDevData;
4946 hostToDevFis = satIOContext->pFis;
4948 if (satIntIo == agNULL)
4950 TI_DBG4(("satVerify10CB: External satInternalIo_t satIntIoContext\n"));
4951 satOrgIOContext = satIOContext;
4952 tiOrgIORequest = tdIORequestBody->tiIORequest;
4953 pSense = satIOContext->pSense;
4957 TI_DBG4(("satVerify10CB: Internal satInternalIo_t satIntIoContext\n"));
4958 satOrgIOContext = satIOContext->satOrgIOContext;
4959 if (satOrgIOContext == agNULL)
4961 TI_DBG4(("satVerify10CB: satOrgIOContext is NULL, wrong\n"));
4966 TI_DBG4(("satVerify10CB: satOrgIOContext is NOT NULL\n"));
4968 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
4969 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
4970 pSense = satOrgIOContext->pSense;
4973 tdIORequestBody->ioCompleted = agTRUE;
4974 tdIORequestBody->ioStarted = agFALSE;
4976 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
4978 TI_DBG1(("satVerify10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
4979 satSetSensePayload( pSense,
4980 SCSI_SNSKEY_NO_SENSE,
4982 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
4985 ostiInitiatorIOCompleted( tiRoot,
4986 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
4988 SCSI_STAT_CHECK_CONDITION,
4989 satOrgIOContext->pTiSenseData,
4990 satOrgIOContext->interruptContext );
4992 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4994 satFreeIntIoResource( tiRoot,
5000 if (agIOStatus != OSSA_IO_SUCCESS)
5002 /* only agsaFisRegDeviceToHost_t is expected */
5003 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5004 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
5007 if( agIOStatus != OSSA_IO_SUCCESS)
5009 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5010 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5014 if( agIOStatus != OSSA_IO_SUCCESS)
5016 TI_DBG1(("satVerify10CB: FAILED, NOT IO_SUCCESS\n"));
5018 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5020 TI_DBG1(("satVerify10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5022 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5023 (ataStatus & DF_ATA_STATUS_MASK)
5026 TI_DBG1(("satVerify10CB: FAILED, FAILED, error status\n"));
5029 /* Process abort case */
5030 if (agIOStatus == OSSA_IO_ABORTED)
5032 satProcessAbort(tiRoot,
5037 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5039 satFreeIntIoResource( tiRoot,
5046 switch (hostToDevFis->h.command)
5048 case SAT_READ_VERIFY_SECTORS_EXT:
5049 TI_DBG1(("satVerify10CB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5052 TI_DBG1(("satVerify10CB: error default case command 0x%x\n", hostToDevFis->h.command));
5056 satSetSensePayload( pSense,
5057 SCSI_SNSKEY_NO_SENSE,
5059 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5062 ostiInitiatorIOCompleted( tiRoot,
5063 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5065 SCSI_STAT_CHECK_CONDITION,
5066 satOrgIOContext->pTiSenseData,
5067 satOrgIOContext->interruptContext );
5069 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5071 satFreeIntIoResource( tiRoot,
5075 } /* end error checking */
5078 /* process success from this point on */
5079 switch (hostToDevFis->h.command)
5081 case SAT_READ_VERIFY_SECTORS_EXT:
5082 TI_DBG5(("satVerify10CB: SAT_WRITE_DMA_EXT success \n"));
5084 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5086 satFreeIntIoResource( tiRoot,
5090 ostiInitiatorIOCompleted( tiRoot,
5095 satOrgIOContext->interruptContext);
5098 TI_DBG1(("satVerify10CB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5100 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5102 satFreeIntIoResource( tiRoot,
5106 satSetSensePayload( pSense,
5107 SCSI_SNSKEY_NO_SENSE,
5109 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5112 ostiInitiatorIOCompleted( tiRoot,
5113 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5115 SCSI_STAT_CHECK_CONDITION,
5116 satOrgIOContext->pTiSenseData,
5117 satOrgIOContext->interruptContext );
5125 /* similar to satVerify10CB */
5126 void satNonChainedVerifyCB(
5128 agsaIORequest_t *agIORequest,
5130 agsaFisHeader_t *agFirstDword,
5132 agsaFrameHandle_t agFrameHandle,
5136 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5137 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5138 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
5139 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5140 tdIORequestBody_t *tdIORequestBody;
5141 tdIORequestBody_t *tdOrgIORequestBody;
5142 satIOContext_t *satIOContext;
5143 satIOContext_t *satOrgIOContext;
5144 satInternalIo_t *satIntIo;
5145 satDeviceData_t *satDevData;
5146 scsiRspSense_t *pSense;
5147 tiIORequest_t *tiOrgIORequest;
5149 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
5150 bit32 ataStatus = 0;
5151 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
5153 TI_DBG5(("satNonChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5155 /* internally generate tiIOContext */
5156 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5157 satIOContext = (satIOContext_t *) ioContext;
5158 satIntIo = satIOContext->satIntIoContext;
5159 satDevData = satIOContext->pSatDevData;
5160 hostToDevFis = satIOContext->pFis;
5162 if (satIntIo == agNULL)
5164 TI_DBG4(("satNonChainedVerifyCB: External satInternalIo_t satIntIoContext\n"));
5165 satOrgIOContext = satIOContext;
5166 tiOrgIORequest = tdIORequestBody->tiIORequest;
5167 pSense = satIOContext->pSense;
5171 TI_DBG4(("satNonChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
5172 satOrgIOContext = satIOContext->satOrgIOContext;
5173 if (satOrgIOContext == agNULL)
5175 TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NULL, wrong\n"));
5180 TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NOT NULL\n"));
5182 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
5183 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
5184 pSense = satOrgIOContext->pSense;
5187 tdIORequestBody->ioCompleted = agTRUE;
5188 tdIORequestBody->ioStarted = agFALSE;
5190 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5192 TI_DBG1(("satNonChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5193 satSetSensePayload( pSense,
5194 SCSI_SNSKEY_NO_SENSE,
5196 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5199 ostiInitiatorIOCompleted( tiRoot,
5200 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5202 SCSI_STAT_CHECK_CONDITION,
5203 satOrgIOContext->pTiSenseData,
5204 satOrgIOContext->interruptContext );
5206 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5208 satFreeIntIoResource( tiRoot,
5214 if (agIOStatus != OSSA_IO_SUCCESS)
5216 /* only agsaFisRegDeviceToHost_t is expected */
5217 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5218 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
5221 if( agIOStatus != OSSA_IO_SUCCESS)
5223 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5224 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5228 if( agIOStatus != OSSA_IO_SUCCESS)
5230 TI_DBG1(("satNonChainedVerifyCB: FAILED, NOT IO_SUCCESS\n"));
5232 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5234 TI_DBG1(("satNonChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5236 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5237 (ataStatus & DF_ATA_STATUS_MASK)
5240 TI_DBG1(("satNonChainedVerifyCB: FAILED, FAILED, error status\n"));
5243 /* Process abort case */
5244 if (agIOStatus == OSSA_IO_ABORTED)
5246 satProcessAbort(tiRoot,
5251 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5253 satFreeIntIoResource( tiRoot,
5260 switch (hostToDevFis->h.command)
5262 case SAT_READ_VERIFY_SECTORS:
5263 TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
5265 case SAT_READ_VERIFY_SECTORS_EXT:
5266 TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5269 TI_DBG1(("satNonChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
5273 satSetSensePayload( pSense,
5274 SCSI_SNSKEY_NO_SENSE,
5276 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5279 ostiInitiatorIOCompleted( tiRoot,
5280 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5282 SCSI_STAT_CHECK_CONDITION,
5283 satOrgIOContext->pTiSenseData,
5284 satOrgIOContext->interruptContext );
5286 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5288 satFreeIntIoResource( tiRoot,
5292 } /* end error checking */
5295 /* process success from this point on */
5296 switch (hostToDevFis->h.command)
5298 case SAT_READ_VERIFY_SECTORS: /* fall through */
5299 case SAT_READ_VERIFY_SECTORS_EXT:
5300 TI_DBG5(("satNonChainedVerifyCB: SAT_WRITE_DMA_EXT success \n"));
5302 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5304 satFreeIntIoResource( tiRoot,
5308 ostiInitiatorIOCompleted( tiRoot,
5313 satOrgIOContext->interruptContext);
5316 TI_DBG1(("satNonChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5318 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5320 satFreeIntIoResource( tiRoot,
5324 satSetSensePayload( pSense,
5325 SCSI_SNSKEY_NO_SENSE,
5327 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5330 ostiInitiatorIOCompleted( tiRoot,
5331 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5333 SCSI_STAT_CHECK_CONDITION,
5334 satOrgIOContext->pTiSenseData,
5335 satOrgIOContext->interruptContext );
5343 void satChainedVerifyCB(
5345 agsaIORequest_t *agIORequest,
5347 agsaFisHeader_t *agFirstDword,
5349 agsaFrameHandle_t agFrameHandle,
5353 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5354 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5355 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
5356 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5357 tdIORequestBody_t *tdIORequestBody;
5358 tdIORequestBody_t *tdOrgIORequestBody;
5359 satIOContext_t *satIOContext;
5360 satIOContext_t *satOrgIOContext;
5361 satIOContext_t *satNewIOContext;
5362 satInternalIo_t *satIntIo;
5363 satInternalIo_t *satNewIntIo = agNULL;
5364 satDeviceData_t *satDevData;
5365 scsiRspSense_t *pSense;
5366 tiIniScsiCmnd_t *scsiCmnd;
5367 tiIORequest_t *tiOrgIORequest;
5369 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
5370 bit32 ataStatus = 0;
5371 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
5372 bit32 status = tiError;
5375 TI_DBG5(("satChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5377 /* internally generate tiIOContext */
5378 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5379 satIOContext = (satIOContext_t *) ioContext;
5380 satIntIo = satIOContext->satIntIoContext;
5381 satDevData = satIOContext->pSatDevData;
5382 hostToDevFis = satIOContext->pFis;
5384 if (satIntIo == agNULL)
5386 TI_DBG4(("satChainedVerifyCB: External satInternalIo_t satIntIoContext\n"));
5387 satOrgIOContext = satIOContext;
5388 tiOrgIORequest = tdIORequestBody->tiIORequest;
5389 pSense = satIOContext->pSense;
5390 scsiCmnd = satIOContext->pScsiCmnd;
5394 TI_DBG4(("satChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
5395 satOrgIOContext = satIOContext->satOrgIOContext;
5396 if (satOrgIOContext == agNULL)
5398 TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NULL, wrong\n"));
5403 TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NOT NULL\n"));
5405 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
5406 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
5407 pSense = satOrgIOContext->pSense;
5408 scsiCmnd = satOrgIOContext->pScsiCmnd;
5411 tdIORequestBody->ioCompleted = agTRUE;
5412 tdIORequestBody->ioStarted = agFALSE;
5414 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5416 TI_DBG1(("satChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5417 satSetSensePayload( pSense,
5418 SCSI_SNSKEY_NO_SENSE,
5420 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5423 ostiInitiatorIOCompleted( tiRoot,
5424 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5426 SCSI_STAT_CHECK_CONDITION,
5427 satOrgIOContext->pTiSenseData,
5428 satOrgIOContext->interruptContext );
5430 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5432 satFreeIntIoResource( tiRoot,
5438 if (agIOStatus != OSSA_IO_SUCCESS)
5440 /* only agsaFisRegDeviceToHost_t is expected */
5441 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5442 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
5445 if( agIOStatus != OSSA_IO_SUCCESS)
5447 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5448 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5452 if( agIOStatus != OSSA_IO_SUCCESS)
5454 TI_DBG1(("satChainedVerifyCB: FAILED, NOT IO_SUCCESS\n"));
5456 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5458 TI_DBG1(("satChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5460 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5461 (ataStatus & DF_ATA_STATUS_MASK)
5464 TI_DBG1(("satChainedVerifyCB: FAILED, FAILED, error status\n"));
5467 /* Process abort case */
5468 if (agIOStatus == OSSA_IO_ABORTED)
5470 satProcessAbort(tiRoot,
5475 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5477 satFreeIntIoResource( tiRoot,
5484 switch (hostToDevFis->h.command)
5486 case SAT_READ_VERIFY_SECTORS:
5487 TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
5489 case SAT_READ_VERIFY_SECTORS_EXT:
5490 TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5493 TI_DBG1(("satChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
5497 satSetSensePayload( pSense,
5498 SCSI_SNSKEY_NO_SENSE,
5500 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5503 ostiInitiatorIOCompleted( tiRoot,
5504 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5506 SCSI_STAT_CHECK_CONDITION,
5507 satOrgIOContext->pTiSenseData,
5508 satOrgIOContext->interruptContext );
5510 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5512 satFreeIntIoResource( tiRoot,
5516 } /* end error checking */
5519 /* process success from this point on */
5520 switch (hostToDevFis->h.command)
5522 case SAT_READ_VERIFY_SECTORS: /* fall through */
5523 case SAT_READ_VERIFY_SECTORS_EXT:
5524 TI_DBG5(("satChainedVerifyCB: SAT_WRITE_DMA_EXT success \n"));
5526 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5528 satFreeIntIoResource( tiRoot,
5532 /* let's loop till TL */
5536 if (loopnum == 0) done
5538 (satOrgIOContext->LoopNum)--;
5539 if (satOrgIOContext->LoopNum == 0)
5542 done with write and verify
5544 ostiInitiatorIOCompleted( tiRoot,
5546 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5550 satOrgIOContext->interruptContext );
5554 if (satOrgIOContext->superIOFlag)
5556 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
5560 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
5563 satNewIntIo = satAllocIntIoResource( tiRoot,
5568 if (satNewIntIo == agNULL)
5570 /* memory allocation failure */
5571 satFreeIntIoResource( tiRoot,
5574 ostiInitiatorIOCompleted( tiRoot,
5575 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5579 satOrgIOContext->interruptContext );
5581 TI_DBG1(("satChainedVerifyCB: momory allocation fails\n"));
5583 } /* end of memory allocation failure */
5586 * Need to initialize all the fields within satIOContext
5589 satNewIOContext = satPrepareNewIO(
5596 status = satChainedVerify(tiRoot,
5597 &satNewIntIo->satIntTiIORequest,
5598 satNewIOContext->ptiDeviceHandle,
5599 &satNewIntIo->satIntTiScsiXchg,
5602 if (status != tiSuccess)
5604 satFreeIntIoResource( tiRoot,
5607 ostiInitiatorIOCompleted( tiRoot,
5608 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5612 satOrgIOContext->interruptContext );
5613 TI_DBG1(("satChainedVerifyCB: calling satChainedVerify fails\n"));
5619 TI_DBG1(("satChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5621 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5623 satFreeIntIoResource( tiRoot,
5627 satSetSensePayload( pSense,
5628 SCSI_SNSKEY_NO_SENSE,
5630 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5633 ostiInitiatorIOCompleted( tiRoot,
5634 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5636 SCSI_STAT_CHECK_CONDITION,
5637 satOrgIOContext->pTiSenseData,
5638 satOrgIOContext->interruptContext );
5645 /*****************************************************************************
5646 *! \brief satTestUnitReadyCB
5648 * This routine is a callback function for satTestUnitReady()
5650 * \param agRoot: Handles for this instance of SAS/SATA hardware
5651 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
5652 * \param agIOStatus: Status of completed I/O.
5653 * \param agFirstDword:Pointer to the four bytes of FIS.
5654 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
5656 * \param agParam: Additional info based on status.
5657 * \param ioContext: Pointer to satIOContext_t.
5661 *****************************************************************************/
5662 void satTestUnitReadyCB(
5664 agsaIORequest_t *agIORequest,
5666 agsaFisHeader_t *agFirstDword,
5673 In the process of TestUnitReady
5674 Process SAT_GET_MEDIA_STATUS
5675 Process SAT_CHECK_POWER_MODE
5677 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5678 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5679 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
5680 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5681 tdIORequestBody_t *tdIORequestBody;
5682 tdIORequestBody_t *tdOrgIORequestBody;
5683 satIOContext_t *satIOContext;
5684 satIOContext_t *satOrgIOContext;
5685 satIOContext_t *satNewIOContext;
5686 satInternalIo_t *satIntIo;
5687 satInternalIo_t *satNewIntIo = agNULL;
5688 satDeviceData_t *satDevData;
5689 scsiRspSense_t *pSense;
5690 tiIniScsiCmnd_t *scsiCmnd;
5691 tiIORequest_t *tiOrgIORequest;
5693 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
5694 bit32 ataStatus = 0;
5698 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
5700 TI_DBG6(("satTestUnitReadyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5702 /* internally generate tiIOContext */
5703 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5704 satIOContext = (satIOContext_t *) ioContext;
5705 satIntIo = satIOContext->satIntIoContext;
5706 satDevData = satIOContext->pSatDevData;
5707 hostToDevFis = satIOContext->pFis;
5709 if (satIntIo == agNULL)
5711 TI_DBG5(("satTestUnitReadyCB: no internal satInternalIo_t satIntIoContext\n"));
5712 pSense = satIOContext->pSense;
5713 scsiCmnd = satIOContext->pScsiCmnd;
5714 satOrgIOContext = satIOContext;
5715 tiOrgIORequest = tdIORequestBody->tiIORequest;
5719 TI_DBG5(("satTestUnitReadyCB: yes internal satInternalIo_t satIntIoContext\n"));
5721 /* orginal tiIOContext */
5722 tiOrgIORequest = (tiIORequest_t *)satIOContext->satIntIoContext->satOrgTiIORequest;
5723 tdOrgIORequestBody = (tdIORequestBody_t *)tiOrgIORequest->tdData;
5724 satOrgIOContext = &(tdOrgIORequestBody->transport.SATA.satIOContext);
5726 pSense = satOrgIOContext->pSense;
5727 scsiCmnd = satOrgIOContext->pScsiCmnd;
5730 tdIORequestBody->ioCompleted = agTRUE;
5731 tdIORequestBody->ioStarted = agFALSE;
5733 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5735 TI_DBG1(("satTestUnitReadyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5736 satSetSensePayload( pSense,
5737 SCSI_SNSKEY_NOT_READY,
5739 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5742 ostiInitiatorIOCompleted( tiRoot,
5743 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5745 SCSI_STAT_CHECK_CONDITION,
5746 satOrgIOContext->pTiSenseData,
5747 satOrgIOContext->interruptContext );
5749 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5751 satFreeIntIoResource( tiRoot,
5758 HW checks an error for us and the results is agIOStatus
5760 if (agIOStatus != OSSA_IO_SUCCESS)
5762 /* only agsaFisRegDeviceToHost_t is expected */
5763 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5764 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
5765 ataError = statDevToHostFisHeader->error; /* ATA Eror register */
5767 if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5769 TI_DBG1(("satTestUnitReadyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5771 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5772 (ataStatus & DF_ATA_STATUS_MASK)
5775 TI_DBG1(("satTestUnitReadyCB: FAILED, FAILED, error status\n"));
5778 /* Process abort case */
5779 if (agIOStatus == OSSA_IO_ABORTED)
5781 satProcessAbort(tiRoot,
5786 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5788 satFreeIntIoResource( tiRoot,
5794 switch (hostToDevFis->h.command)
5796 case SAT_GET_MEDIA_STATUS:
5797 TI_DBG1(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS failed \n"));
5799 /* checking NM bit */
5800 if (ataError & SCSI_NM_MASK)
5802 satSetSensePayload( pSense,
5803 SCSI_SNSKEY_NOT_READY,
5805 SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
5810 satSetSensePayload( pSense,
5811 SCSI_SNSKEY_NOT_READY,
5813 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5817 ostiInitiatorIOCompleted( tiRoot,
5818 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5820 SCSI_STAT_CHECK_CONDITION,
5821 satOrgIOContext->pTiSenseData,
5822 satOrgIOContext->interruptContext );
5824 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5826 satFreeIntIoResource( tiRoot,
5830 case SAT_CHECK_POWER_MODE:
5831 TI_DBG1(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE failed \n"));
5832 satSetSensePayload( pSense,
5833 SCSI_SNSKEY_NOT_READY,
5835 SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION,
5838 ostiInitiatorIOCompleted( tiRoot,
5839 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5841 SCSI_STAT_CHECK_CONDITION,
5842 satOrgIOContext->pTiSenseData,
5843 satOrgIOContext->interruptContext );
5845 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5847 satFreeIntIoResource( tiRoot,
5852 TI_DBG1(("satTestUnitReadyCB: default failed command %d\n", hostToDevFis->h.command));
5854 satSetSensePayload( pSense,
5855 SCSI_SNSKEY_NOT_READY,
5857 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5860 ostiInitiatorIOCompleted( tiRoot,
5861 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5863 SCSI_STAT_CHECK_CONDITION,
5864 satOrgIOContext->pTiSenseData,
5865 satOrgIOContext->interruptContext );
5867 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5869 satFreeIntIoResource( tiRoot,
5878 /* ATA command completes sucessfully */
5879 switch (hostToDevFis->h.command)
5881 case SAT_GET_MEDIA_STATUS:
5883 TI_DBG5(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS success\n"));
5885 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5887 satFreeIntIoResource( tiRoot,
5891 satNewIntIo = satAllocIntIoResource( tiRoot,
5896 if (satNewIntIo == agNULL)
5898 /* memory allocation failure */
5899 satFreeIntIoResource( tiRoot,
5902 satSetSensePayload( pSense,
5903 SCSI_SNSKEY_NOT_READY,
5905 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5908 ostiInitiatorIOCompleted( tiRoot,
5911 SCSI_STAT_CHECK_CONDITION,
5912 satOrgIOContext->pTiSenseData,
5913 satOrgIOContext->interruptContext );
5915 TI_DBG1(("satTestUnitReadyCB: momory allocation fails\n"));
5920 * Need to initialize all the fields within satIOContext
5923 satNewIOContext = satPrepareNewIO(
5931 /* sends SAT_CHECK_POWER_MODE */
5932 status = satTestUnitReady_1( tiRoot,
5933 &satNewIntIo->satIntTiIORequest,
5934 satNewIOContext->ptiDeviceHandle,
5935 &satNewIntIo->satIntTiScsiXchg,
5938 if (status != tiSuccess)
5940 /* sending SAT_CHECK_POWER_MODE fails */
5941 satFreeIntIoResource( tiRoot,
5944 satSetSensePayload( pSense,
5945 SCSI_SNSKEY_NOT_READY,
5947 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5950 ostiInitiatorIOCompleted( tiRoot,
5953 SCSI_STAT_CHECK_CONDITION,
5954 satOrgIOContext->pTiSenseData,
5955 satOrgIOContext->interruptContext );
5957 TI_DBG1(("satTestUnitReadyCB: calling satTestUnitReady_1 fails\n"));
5962 case SAT_CHECK_POWER_MODE:
5963 TI_DBG5(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE success\n"));
5966 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5968 satFreeIntIoResource( tiRoot,
5972 /* returns good status */
5973 ostiInitiatorIOCompleted( tiRoot,
5978 satOrgIOContext->interruptContext );
5982 TI_DBG1(("satTestUnitReadyCB: default success command %d\n", hostToDevFis->h.command));
5983 satSetSensePayload( pSense,
5984 SCSI_SNSKEY_NOT_READY,
5986 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5989 ostiInitiatorIOCompleted( tiRoot,
5990 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5992 SCSI_STAT_CHECK_CONDITION,
5993 satOrgIOContext->pTiSenseData,
5994 satOrgIOContext->interruptContext );
5997 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5999 satFreeIntIoResource( tiRoot,
6008 /*****************************************************************************
6009 *! \brief satWriteSame10CB
6011 * This routine is a callback function for satWriteSame10()
6013 * \param agRoot: Handles for this instance of SAS/SATA hardware
6014 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
6015 * \param agIOStatus: Status of completed I/O.
6016 * \param agFirstDword:Pointer to the four bytes of FIS.
6017 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
6019 * \param agParam: Additional info based on status.
6020 * \param ioContext: Pointer to satIOContext_t.
6024 *****************************************************************************/
6025 void satWriteSame10CB(
6027 agsaIORequest_t *agIORequest,
6029 agsaFisHeader_t *agFirstDword,
6035 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6036 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6037 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
6038 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6039 tdIORequestBody_t *tdIORequestBody;
6040 tdIORequestBody_t *tdOrgIORequestBody;
6041 tdIORequestBody_t *tdNewIORequestBody;
6042 satIOContext_t *satIOContext;
6043 satIOContext_t *satOrgIOContext;
6044 satIOContext_t *satNewIOContext;
6045 satInternalIo_t *satIntIo;
6046 satInternalIo_t *satNewIntIo = agNULL;
6047 satDeviceData_t *satDevData;
6048 scsiRspSense_t *pSense;
6049 tiIniScsiCmnd_t *scsiCmnd;
6050 tiIORequest_t *tiOrgIORequest;
6052 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
6053 bit32 ataStatus = 0;
6056 bit32 sectorcount = 0;
6057 bit32 lba = 0, tl = 0;
6058 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
6059 agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
6061 TI_DBG5(("satWriteSame10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6063 /* internally generate tiIOContext */
6064 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
6065 satIOContext = (satIOContext_t *) ioContext;
6066 satIntIo = satIOContext->satIntIoContext;
6067 satDevData = satIOContext->pSatDevData;
6068 hostToDevFis = satIOContext->pFis;
6070 if (satIntIo == agNULL)
6072 TI_DBG4(("satWriteSame10CB: External satInternalIo_t satIntIoContext\n"));
6073 satOrgIOContext = satIOContext;
6074 tiOrgIORequest = tdIORequestBody->tiIORequest;
6075 pSense = satIOContext->pSense;
6076 scsiCmnd = satIOContext->pScsiCmnd;
6080 TI_DBG4(("satWriteSame10CB: Internal satInternalIo_t satIntIoContext\n"));
6081 satOrgIOContext = satIOContext->satOrgIOContext;
6082 if (satOrgIOContext == agNULL)
6084 TI_DBG4(("satWriteSame10CB: satOrgIOContext is NULL, wrong\n"));
6089 TI_DBG4(("satWriteSame10CB: satOrgIOContext is NOT NULL\n"));
6091 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
6092 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
6094 pSense = satOrgIOContext->pSense;
6095 scsiCmnd = satOrgIOContext->pScsiCmnd;
6099 tdIORequestBody->ioCompleted = agTRUE;
6100 tdIORequestBody->ioStarted = agFALSE;
6102 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6104 TI_DBG1(("satWriteSame10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
6105 satSetSensePayload( pSense,
6106 SCSI_SNSKEY_NO_SENSE,
6108 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6111 ostiInitiatorIOCompleted( tiRoot,
6112 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6114 SCSI_STAT_CHECK_CONDITION,
6115 satOrgIOContext->pTiSenseData,
6116 satOrgIOContext->interruptContext );
6118 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6120 satFreeIntIoResource( tiRoot,
6126 if (agIOStatus != OSSA_IO_SUCCESS)
6128 /* FP, DMA and PIO write */
6129 /* First, assumed to be Reg Device to Host FIS */
6130 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
6131 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
6134 if (agIOStatus != OSSA_IO_SUCCESS)
6136 if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
6138 statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
6140 /* Get ATA Status register */
6141 ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */
6142 ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */
6144 /* ATA Eror register */
6149 if( agIOStatus != OSSA_IO_SUCCESS)
6152 checking IO status, FIS type and error status
6153 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
6155 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
6156 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) ||
6157 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
6161 if( agIOStatus != OSSA_IO_SUCCESS)
6163 TI_DBG1(("satWriteSame10CB: FAILED, NOT IO_SUCCESS\n"));
6165 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
6167 TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6169 else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
6171 TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6173 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
6174 (ataStatus & DF_ATA_STATUS_MASK)
6177 TI_DBG1(("satWriteSame10CB: FAILED, FAILED, error status\n"));
6180 /* Process abort case */
6181 if (agIOStatus == OSSA_IO_ABORTED)
6183 satProcessAbort(tiRoot,
6189 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6191 satFreeIntIoResource( tiRoot,
6198 switch (hostToDevFis->h.command)
6200 case SAT_WRITE_DMA_EXT:
6201 TI_DBG1(("satWriteSame10CB: SAT_WRITE_DMA_EXT\n"));
6203 case SAT_WRITE_SECTORS_EXT:
6204 TI_DBG1(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT\n"));
6206 case SAT_WRITE_FPDMA_QUEUED:
6207 TI_DBG1(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED\n"));
6210 TI_DBG1(("satWriteSame10CB: error default case command 0x%x\n", hostToDevFis->h.command));
6214 satSetSensePayload( pSense,
6215 SCSI_SNSKEY_NO_SENSE,
6217 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6220 ostiInitiatorIOCompleted( tiRoot,
6221 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6223 SCSI_STAT_CHECK_CONDITION,
6224 satOrgIOContext->pTiSenseData,
6225 satOrgIOContext->interruptContext );
6228 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6230 satFreeIntIoResource( tiRoot,
6237 /* process success from this point on */
6239 note: inefficient implementation until a single block can be manipulated
6242 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6244 TI_DBG5(("satWriteSame10CB: SAT_WRITE_DMA_EXT success\n"));
6246 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6248 TI_DBG5(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT success\n"));
6250 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6252 TI_DBG5(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED success\n"));
6256 TI_DBG1(("satWriteSame10CB: error case command 0x%x success\n", hostToDevFis->h.command));
6257 satSetSensePayload( pSense,
6258 SCSI_SNSKEY_NO_SENSE,
6260 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6263 ostiInitiatorIOCompleted( tiRoot,
6264 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6266 SCSI_STAT_CHECK_CONDITION,
6267 satOrgIOContext->pTiSenseData,
6268 satOrgIOContext->interruptContext );
6271 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6273 satFreeIntIoResource( tiRoot,
6280 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6283 satFreeIntIoResource( tiRoot,
6288 increment LBA by one, keeping the same sector count(1)
6289 sends another ATA command with the changed parameters
6292 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
6293 satDevData->satSectorDone++;
6294 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
6296 TI_DBG1(("satWriteSame10CB: sectordone %d\n", satDevData->satSectorDone));
6298 lba = (scsiCmnd->cdb[2] << (8*3)) + (scsiCmnd->cdb[3] << (8*2))
6299 + (scsiCmnd->cdb[4] << 8) + scsiCmnd->cdb[5];
6300 tl = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8];
6302 TI_DBG5(("satWriteSame10CB: lba 0x%x tl 0x%x\n", lba, tl));
6306 /* (satDevData->satMaxUserAddrSectors - 1) - lba*/
6307 sectorcount = (0x0FFFFFFF - 1) - lba;
6314 if (sectorcount <= 0)
6316 satSetSensePayload( pSense,
6317 SCSI_SNSKEY_NO_SENSE,
6319 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6322 ostiInitiatorIOCompleted( tiRoot,
6323 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6325 SCSI_STAT_CHECK_CONDITION,
6326 satOrgIOContext->pTiSenseData,
6327 satOrgIOContext->interruptContext );
6328 TI_DBG1(("satWriteSame10CB: incorrect sectorcount 0x%x\n", sectorcount));
6332 if (sectorcount == satDevData->satSectorDone)
6337 TI_DBG1(("satWriteSame10CB: return writesame done\n"));
6338 satDevData->satSectorDone = 0;
6340 ostiInitiatorIOCompleted( tiRoot,
6345 satOrgIOContext->interruptContext );
6349 /* sends another ATA command */
6350 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6352 TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_DMA_EXT\n"));
6354 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6356 TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_SECTORS_EXT\n"));
6358 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6360 TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_FPDMA_QUEUED\n"));
6363 satNewIntIo = satAllocIntIoResource( tiRoot,
6368 if (satNewIntIo == agNULL)
6370 /* memory allocation failure */
6371 satFreeIntIoResource( tiRoot,
6375 satSetSensePayload( pSense,
6376 SCSI_SNSKEY_NO_SENSE,
6378 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6381 ostiInitiatorIOCompleted( tiRoot,
6382 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6384 SCSI_STAT_CHECK_CONDITION,
6385 satOrgIOContext->pTiSenseData,
6386 satOrgIOContext->interruptContext );
6387 TI_DBG1(("satWriteSame10CB: momory allocation fails\n"));
6389 } /* end memory allocation */
6391 /* the one to be used */
6392 tdNewIORequestBody = satNewIntIo->satIntRequestBody;
6393 satNewIOContext = &tdNewIORequestBody->transport.SATA.satIOContext;
6395 satNewIOContext->pSatDevData = satDevData;
6396 satNewIOContext->pFis = &tdNewIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev;
6397 satNewIOContext->pScsiCmnd = &satNewIntIo->satIntTiScsiXchg.scsiCmnd;
6398 /* saves scsi command for LBA and number of blocks */
6399 osti_memcpy(satNewIOContext->pScsiCmnd, scsiCmnd, sizeof(tiIniScsiCmnd_t));
6400 satNewIOContext->pSense = &tdNewIORequestBody->transport.SATA.sensePayload;
6401 satNewIOContext->pTiSenseData = &tdNewIORequestBody->transport.SATA.tiSenseData;
6402 satNewIOContext->pTiSenseData->senseData = satNewIOContext->pSense;
6403 satNewIOContext->tiRequestBody = satNewIntIo->satIntRequestBody;
6404 satNewIOContext->interruptContext = satNewIOContext->interruptContext;
6405 satNewIOContext->satIntIoContext = satNewIntIo;
6406 satNewIOContext->ptiDeviceHandle = satIOContext->ptiDeviceHandle;
6407 /* saves tiScsiXchg; only for writesame10() */
6408 satNewIOContext->tiScsiXchg = satOrgIOContext->tiScsiXchg;
6410 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6412 status = satWriteSame10_1( tiRoot,
6413 &satNewIntIo->satIntTiIORequest,
6414 satNewIOContext->ptiDeviceHandle,
6415 &satNewIntIo->satIntTiScsiXchg,
6417 lba + satDevData->satSectorDone
6420 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6422 status = satWriteSame10_2( tiRoot,
6423 &satNewIntIo->satIntTiIORequest,
6424 satNewIOContext->ptiDeviceHandle,
6425 &satNewIntIo->satIntTiScsiXchg,
6427 lba + satDevData->satSectorDone
6430 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6432 status = satWriteSame10_3( tiRoot,
6433 &satNewIntIo->satIntTiIORequest,
6434 satNewIOContext->ptiDeviceHandle,
6435 &satNewIntIo->satIntTiScsiXchg,
6437 lba + satDevData->satSectorDone
6443 TI_DBG1(("satWriteSame10CB: sucess but error in command 0x%x\n", hostToDevFis->h.command));
6446 if (status != tiSuccess)
6448 /* sending ATA command fails */
6449 satFreeIntIoResource( tiRoot,
6452 satSetSensePayload( pSense,
6453 SCSI_SNSKEY_NO_SENSE,
6455 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6458 ostiInitiatorIOCompleted( tiRoot,
6459 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6461 SCSI_STAT_CHECK_CONDITION,
6462 satOrgIOContext->pTiSenseData,
6463 satOrgIOContext->interruptContext );
6464 TI_DBG1(("satWriteSame10CB:calling satWriteSame10_1 fails\n"));
6466 } /* end send fails */
6468 } /* end sends another ATA command */
6472 /*****************************************************************************
6473 *! \brief satStartStopUnitCB
6475 * This routine is a callback function called from ossaSATACompleted().
6476 * This CB routine deals with Send Diagnostic completion.
6478 * \param agRoot: Handles for this instance of SAS/SATA hardware
6479 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
6480 * \param agIOStatus: Status of completed I/O.
6481 * \param agFirstDword:Pointer to the four bytes of FIS.
6482 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
6484 * \param agParam: Additional info based on status.
6485 * \param ioContext: Pointer to satIOContext_t.
6489 *****************************************************************************/
6490 void satStartStopUnitCB(
6492 agsaIORequest_t *agIORequest,
6494 agsaFisHeader_t *agFirstDword,
6501 In the process of StartStopUnit
6502 Process FLUSH CACHE (EXT)
6504 Process READ VERIFY SECTOR(S) EXT
6507 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6508 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6509 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
6510 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6511 tdIORequestBody_t *tdIORequestBody;
6512 tdIORequestBody_t *tdOrgIORequestBody;
6513 satIOContext_t *satIOContext;
6514 satIOContext_t *satOrgIOContext;
6515 satIOContext_t *satNewIOContext;
6516 satInternalIo_t *satIntIo;
6517 satInternalIo_t *satNewIntIo = agNULL;
6518 satDeviceData_t *satDevData;
6519 scsiRspSense_t *pSense;
6520 tiIniScsiCmnd_t *scsiCmnd;
6521 tiIORequest_t *tiOrgIORequest;
6523 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
6524 bit32 ataStatus = 0;
6526 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
6528 TI_DBG5(("satStartStopUnitCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6530 /* internally generate tiIOContext */
6531 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
6532 satIOContext = (satIOContext_t *) ioContext;
6533 satIntIo = satIOContext->satIntIoContext;
6534 satDevData = satIOContext->pSatDevData;
6535 hostToDevFis = satIOContext->pFis;
6537 if (satIntIo == agNULL)
6539 TI_DBG4(("satStartStopUnitCB: External satInternalIo_t satIntIoContext\n"));
6540 satOrgIOContext = satIOContext;
6541 tiOrgIORequest = tdIORequestBody->tiIORequest;
6542 pSense = satIOContext->pSense;
6543 scsiCmnd = satIOContext->pScsiCmnd;
6547 TI_DBG4(("satStartStopUnitCB: Internal satInternalIo_t satIntIoContext\n"));
6548 satOrgIOContext = satIOContext->satOrgIOContext;
6549 if (satOrgIOContext == agNULL)
6551 TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NULL, wrong\n"));
6556 TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NOT NULL\n"));
6558 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
6559 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
6561 pSense = satOrgIOContext->pSense;
6562 scsiCmnd = satOrgIOContext->pScsiCmnd;
6565 tdIORequestBody->ioCompleted = agTRUE;
6566 tdIORequestBody->ioStarted = agFALSE;
6568 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6570 TI_DBG1(("satStartStopUnitCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
6573 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6575 TI_DBG1(("satStartStopUnitCB: immed bit 0\n"));
6576 satSetSensePayload( pSense,
6577 SCSI_SNSKEY_ABORTED_COMMAND,
6579 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6582 ostiInitiatorIOCompleted( tiRoot,
6583 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6585 SCSI_STAT_CHECK_CONDITION,
6586 satOrgIOContext->pTiSenseData,
6587 satOrgIOContext->interruptContext );
6590 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6591 satFreeIntIoResource( tiRoot,
6596 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6598 TI_DBG1(("satStartStopUnitCB: immed bit 1\n"));
6599 satSetDeferredSensePayload( pSense,
6600 SCSI_SNSKEY_ABORTED_COMMAND,
6602 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6605 ostiInitiatorIOCompleted( tiRoot,
6606 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6608 SCSI_STAT_CHECK_CONDITION,
6609 satOrgIOContext->pTiSenseData,
6610 satOrgIOContext->interruptContext );
6613 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6614 satFreeIntIoResource( tiRoot,
6624 if (agIOStatus != OSSA_IO_SUCCESS)
6626 /* only agsaFisRegDeviceToHost_t is expected */
6627 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
6628 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
6631 checking IO status, FIS type and error status
6633 if( agIOStatus != OSSA_IO_SUCCESS)
6635 if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
6636 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
6640 if( agIOStatus != OSSA_IO_SUCCESS)
6642 TI_DBG1(("satStartStopUnitCB: FAILED, NOT IO_SUCCESS\n"));
6644 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
6646 TI_DBG1(("satStartStopUnitCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6648 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
6649 (ataStatus & DF_ATA_STATUS_MASK)
6652 TI_DBG1(("satStartStopUnitCB: FAILED, FAILED, error status\n"));
6656 /* Process abort case */
6657 if (agIOStatus == OSSA_IO_ABORTED)
6659 satProcessAbort(tiRoot,
6665 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6667 satFreeIntIoResource( tiRoot,
6673 switch (hostToDevFis->h.command)
6675 case SAT_FLUSH_CACHE: /* fall through */
6676 case SAT_FLUSH_CACHE_EXT:
6677 TI_DBG1(("satStartStopUnitCB: SAT_FLUSH_CACHE(_EXT)\n"));
6678 /* check immed bit in scsi command */
6680 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6682 satSetSensePayload( pSense,
6683 SCSI_SNSKEY_ABORTED_COMMAND,
6685 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6688 ostiInitiatorIOCompleted( tiRoot,
6689 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6691 SCSI_STAT_CHECK_CONDITION,
6692 satOrgIOContext->pTiSenseData,
6693 satOrgIOContext->interruptContext );
6696 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6698 satFreeIntIoResource( tiRoot,
6703 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6705 satSetDeferredSensePayload( pSense,
6706 SCSI_SNSKEY_ABORTED_COMMAND,
6708 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6711 ostiInitiatorIOCompleted( tiRoot,
6712 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6714 SCSI_STAT_CHECK_CONDITION,
6715 satOrgIOContext->pTiSenseData,
6716 satOrgIOContext->interruptContext );
6719 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6721 satFreeIntIoResource( tiRoot,
6727 TI_DBG5(("satStartStopUnitCB: SAT_STANDBY\n"));
6728 /* check immed bit in scsi command */
6730 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6732 satSetSensePayload( pSense,
6733 SCSI_SNSKEY_ABORTED_COMMAND,
6735 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6738 ostiInitiatorIOCompleted( tiRoot,
6739 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6741 SCSI_STAT_CHECK_CONDITION,
6742 satOrgIOContext->pTiSenseData,
6743 satOrgIOContext->interruptContext );
6746 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6748 satFreeIntIoResource( tiRoot,
6753 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6755 satSetDeferredSensePayload( pSense,
6756 SCSI_SNSKEY_ABORTED_COMMAND,
6758 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6761 ostiInitiatorIOCompleted( tiRoot,
6762 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6764 SCSI_STAT_CHECK_CONDITION,
6765 satOrgIOContext->pTiSenseData,
6766 satOrgIOContext->interruptContext );
6769 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6771 satFreeIntIoResource( tiRoot,
6776 case SAT_READ_VERIFY_SECTORS: /* fall through */
6777 case SAT_READ_VERIFY_SECTORS_EXT:
6778 TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT)\n"));
6780 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6782 satSetSensePayload( pSense,
6783 SCSI_SNSKEY_ABORTED_COMMAND,
6785 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6788 ostiInitiatorIOCompleted( tiRoot,
6789 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6791 SCSI_STAT_CHECK_CONDITION,
6792 satOrgIOContext->pTiSenseData,
6793 satOrgIOContext->interruptContext );
6796 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6798 satFreeIntIoResource( tiRoot,
6803 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6805 satSetDeferredSensePayload( pSense,
6806 SCSI_SNSKEY_ABORTED_COMMAND,
6808 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6811 ostiInitiatorIOCompleted( tiRoot,
6812 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6814 SCSI_STAT_CHECK_CONDITION,
6815 satOrgIOContext->pTiSenseData,
6816 satOrgIOContext->interruptContext );
6819 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6821 satFreeIntIoResource( tiRoot,
6826 case SAT_MEDIA_EJECT:
6827 TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT\n"));
6829 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6831 satSetSensePayload( pSense,
6832 SCSI_SNSKEY_ABORTED_COMMAND,
6834 SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED,
6837 ostiInitiatorIOCompleted( tiRoot,
6838 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6840 SCSI_STAT_CHECK_CONDITION,
6841 satOrgIOContext->pTiSenseData,
6842 satOrgIOContext->interruptContext );
6845 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6847 satFreeIntIoResource( tiRoot,
6852 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6854 satSetDeferredSensePayload( pSense,
6855 SCSI_SNSKEY_ABORTED_COMMAND,
6857 SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED,
6860 ostiInitiatorIOCompleted( tiRoot,
6861 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6863 SCSI_STAT_CHECK_CONDITION,
6864 satOrgIOContext->pTiSenseData,
6865 satOrgIOContext->interruptContext );
6867 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6869 satFreeIntIoResource( tiRoot,
6875 /* unspecified case, return no sense and no addition info */
6876 TI_DBG5(("satStartStopUnitCB: default command %d\n", hostToDevFis->h.command));
6877 satSetSensePayload( pSense,
6878 SCSI_SNSKEY_NO_SENSE,
6880 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6883 ostiInitiatorIOCompleted( tiRoot,
6884 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6886 SCSI_STAT_CHECK_CONDITION,
6887 satOrgIOContext->pTiSenseData,
6888 satOrgIOContext->interruptContext );
6891 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6893 satFreeIntIoResource( tiRoot,
6903 /* ATA command completes sucessfully */
6904 switch (hostToDevFis->h.command)
6906 case SAT_FLUSH_CACHE: /* fall through */
6907 case SAT_FLUSH_CACHE_EXT:
6908 TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n"));
6911 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6913 /* done with SAT_FLUSH_CACHE(_EXT) */
6914 satFreeIntIoResource( tiRoot,
6918 /* at this point, successful SAT_READ_VERIFY_SECTORS(_EXT)
6921 satNewIntIo = satAllocIntIoResource( tiRoot,
6926 if (satNewIntIo == agNULL)
6928 /* memory allocation failure */
6929 satFreeIntIoResource( tiRoot,
6933 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6935 satSetSensePayload( pSense,
6936 SCSI_SNSKEY_ABORTED_COMMAND,
6938 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6941 else /* IMMED == 1 */
6943 satSetDeferredSensePayload( pSense,
6944 SCSI_SNSKEY_ABORTED_COMMAND,
6946 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6949 ostiInitiatorIOCompleted( tiRoot,
6952 SCSI_STAT_CHECK_CONDITION,
6953 satOrgIOContext->pTiSenseData,
6954 satOrgIOContext->interruptContext );
6956 TI_DBG1(("satStartStopUnitCB: momory allocation fails\n"));
6958 } /* end of memory allocation failure */
6961 * Need to initialize all the fields within satIOContext
6964 satNewIOContext = satPrepareNewIO(
6972 /* sending SAT_STANDBY */
6973 status = satStartStopUnit_1( tiRoot,
6974 &satNewIntIo->satIntTiIORequest,
6975 satNewIOContext->ptiDeviceHandle,
6976 &satNewIntIo->satIntTiScsiXchg,
6979 if (status != tiSuccess)
6981 /* sending SAT_CHECK_POWER_MODE fails */
6982 satFreeIntIoResource( tiRoot,
6987 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6989 satSetSensePayload( pSense,
6990 SCSI_SNSKEY_ABORTED_COMMAND,
6992 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6995 else /* IMMED == 1 */
6997 satSetDeferredSensePayload( pSense,
6998 SCSI_SNSKEY_ABORTED_COMMAND,
7000 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
7003 ostiInitiatorIOCompleted( tiRoot,
7006 SCSI_STAT_CHECK_CONDITION,
7007 satOrgIOContext->pTiSenseData,
7008 satOrgIOContext->interruptContext );
7010 TI_DBG1(("satStartStopUnitCB: calling satStartStopUnit_1 fails\n"));
7015 TI_DBG5(("satStartStopUnitCB: SAT_STANDBY success case\n"));
7017 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7019 /* done with SAT_STANDBY */
7020 satFreeIntIoResource( tiRoot,
7024 if immed == 0, return good status
7027 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7029 ostiInitiatorIOCompleted( tiRoot,
7034 satOrgIOContext->interruptContext );
7036 satDevData->satStopState = agTRUE;
7038 case SAT_READ_VERIFY_SECTORS: /* fall through */
7039 case SAT_READ_VERIFY_SECTORS_EXT:
7040 TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n"));
7042 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7044 /* done with SAT_READ_VERIFY_SECTORS(_EXT) */
7045 satFreeIntIoResource( tiRoot,
7049 if immed == 0, return good status
7051 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7053 ostiInitiatorIOCompleted( tiRoot,
7058 satOrgIOContext->interruptContext );
7061 if immed == 0, return good status
7064 don't forget to check and set driver state; Active power state
7066 satDevData->satStopState = agFALSE;
7068 case SAT_MEDIA_EJECT:
7069 TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT success case\n"));
7071 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7073 /* done with SAT_READ_VERIFY_SECTORS(_EXT) */
7074 satFreeIntIoResource( tiRoot,
7078 if immed == 0, return good status
7080 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7082 ostiInitiatorIOCompleted( tiRoot,
7087 satOrgIOContext->interruptContext );
7091 TI_DBG1(("satStartStopUnitCB:success but error default case command 0x%x\n", hostToDevFis->h.command));
7093 /* unspecified case, return no sense and no addition info */
7094 satSetSensePayload( pSense,
7095 SCSI_SNSKEY_NO_SENSE,
7097 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
7100 ostiInitiatorIOCompleted( tiRoot,
7101 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7103 SCSI_STAT_CHECK_CONDITION,
7104 satOrgIOContext->pTiSenseData,
7105 satOrgIOContext->interruptContext );
7107 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7109 satFreeIntIoResource( tiRoot,
7117 /*****************************************************************************
7118 *! \brief satSendDiagnosticCB
7120 * This routine is a callback function called from ossaSATACompleted().
7121 * This CB routine deals with Send Diagnostic completion.
7123 * \param agRoot: Handles for this instance of SAS/SATA hardware
7124 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
7125 * \param agIOStatus: Status of completed I/O.
7126 * \param agFirstDword:Pointer to the four bytes of FIS.
7127 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
7129 * \param agParam: Additional info based on status.
7130 * \param ioContext: Pointer to satIOContext_t.
7134 *****************************************************************************/
7135 void satSendDiagnosticCB(
7137 agsaIORequest_t *agIORequest,
7139 agsaFisHeader_t *agFirstDword,
7146 In the process of SendDiagnotic
7147 Process READ VERIFY SECTOR(S) EXT two time
7148 Process SMART ECECUTE OFF-LINE IMMEDIATE
7150 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7151 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7152 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
7153 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
7154 tdIORequestBody_t *tdIORequestBody;
7155 tdIORequestBody_t *tdOrgIORequestBody;
7156 satIOContext_t *satIOContext;
7157 satIOContext_t *satOrgIOContext;
7158 satIOContext_t *satNewIOContext;
7159 satInternalIo_t *satIntIo;
7160 satInternalIo_t *satNewIntIo = agNULL;
7161 satDeviceData_t *satDevData;
7162 scsiRspSense_t *pSense;
7163 tiIniScsiCmnd_t *scsiCmnd;
7164 tiIORequest_t *tiOrgIORequest;
7166 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
7167 bit32 ataStatus = 0;
7169 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
7172 TI_DBG5(("satSendDiagnosticCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
7174 /* internally generate tiIOContext */
7175 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
7176 satIOContext = (satIOContext_t *) ioContext;
7177 satIntIo = satIOContext->satIntIoContext;
7178 satDevData = satIOContext->pSatDevData;
7179 hostToDevFis = satIOContext->pFis;
7181 if (satIntIo == agNULL)
7183 TI_DBG4(("satSendDiagnosticCB: External satInternalIo_t satIntIoContext\n"));
7184 satOrgIOContext = satIOContext;
7185 tiOrgIORequest = tdIORequestBody->tiIORequest;
7186 pSense = satOrgIOContext->pSense;
7187 scsiCmnd = satOrgIOContext->pScsiCmnd;
7191 TI_DBG4(("satSendDiagnosticCB: Internal satInternalIo_t satIntIoContext\n"));
7192 satOrgIOContext = satIOContext->satOrgIOContext;
7193 if (satOrgIOContext == agNULL)
7195 TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NULL, wrong\n"));
7200 TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NOT NULL\n"));
7202 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
7203 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
7204 pSense = satOrgIOContext->pSense;
7205 scsiCmnd = satOrgIOContext->pScsiCmnd;
7208 tdIORequestBody->ioCompleted = agTRUE;
7209 tdIORequestBody->ioStarted = agFALSE;
7211 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
7213 TI_DBG1(("satSendDiagnosticCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
7214 satDevData->satVerifyState = 0;
7215 satDevData->satBGPendingDiag = agFALSE;
7217 if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
7219 /* no completion for background send diagnotic. It is done in satSendDiagnostic() */
7220 ostiInitiatorIOCompleted (
7226 satOrgIOContext->interruptContext
7229 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7231 satFreeIntIoResource( tiRoot,
7238 if (agIOStatus != OSSA_IO_SUCCESS)
7240 /* only agsaFisRegDeviceToHost_t is expected */
7241 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
7242 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
7245 TI_DBG5(("satSendDiagnosticCB: fis command 0x%x\n", hostToDevFis->h.command));
7247 if( agIOStatus != OSSA_IO_SUCCESS)
7250 checking IO status, FIS type and error status
7252 satDevData->satVerifyState = 0;
7253 satDevData->satBGPendingDiag = agFALSE;
7255 if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
7256 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
7261 if( agIOStatus != OSSA_IO_SUCCESS)
7263 if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7264 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7266 TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_READ_VERIFY_SECTORS(_EXT)\n"));
7270 TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n"));
7275 if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
7277 if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7278 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7280 TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_READ_VERIFY_SECTORS(_EXT)\n", statDevToHostFisHeader->fisType));
7284 TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n",statDevToHostFisHeader->fisType));
7289 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
7290 (ataStatus & DF_ATA_STATUS_MASK)
7293 if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7294 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7296 TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_READ_VERIFY_SECTORS(_EXT)\n"));
7300 TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n"));
7304 /* Process abort case */
7305 if (agIOStatus == OSSA_IO_ABORTED)
7307 satProcessAbort(tiRoot,
7312 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7314 satFreeIntIoResource( tiRoot,
7320 if ( (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS) ||
7321 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7323 /* report using the original tiIOrequst */
7324 /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */
7325 satSetSensePayload( pSense,
7326 SCSI_SNSKEY_HARDWARE_ERROR,
7328 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7331 ostiInitiatorIOCompleted( tiRoot,
7332 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7334 SCSI_STAT_CHECK_CONDITION,
7335 satOrgIOContext->pTiSenseData,
7336 satOrgIOContext->interruptContext );
7338 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7340 satFreeIntIoResource( tiRoot,
7347 /* report using the original tiIOrequst */
7348 /* failed during sending SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7349 satSetSensePayload( pSense,
7350 SCSI_SNSKEY_HARDWARE_ERROR,
7352 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7355 if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
7357 /* no completion for background send diagnotic. It is done in satSendDiagnostic() */
7358 ostiInitiatorIOCompleted( tiRoot,
7359 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7361 SCSI_STAT_CHECK_CONDITION,
7362 satOrgIOContext->pTiSenseData,
7363 satOrgIOContext->interruptContext );
7366 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7368 satFreeIntIoResource( tiRoot,
7376 /* processing success case */
7377 switch (hostToDevFis->h.command)
7379 case SAT_READ_VERIFY_SECTORS: /* fall through */
7380 case SAT_READ_VERIFY_SECTORS_EXT:
7381 TI_DBG5(("satSendDiagnosticCB: SAT_READ_VERIFY_SECTORS(_EXT) case\n"));
7382 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
7383 satDevData->satVerifyState++;
7384 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
7385 TI_DBG5(("satSendDiagnosticCB: satVerifyState %d\n",satDevData->satVerifyState));
7387 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7389 /* done with internally genereated AT_READ_VERIFY_SECTORS(_EXT) */
7390 satFreeIntIoResource( tiRoot,
7394 if (satDevData->satVerifyState == 3)
7396 /* reset satVerifyState */
7397 satDevData->satVerifyState = 0;
7398 /* return GOOD status */
7399 TI_DBG5(("satSendDiagnosticCB: return GOOD status\n"));
7400 ostiInitiatorIOCompleted( tiRoot,
7401 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7405 satOrgIOContext->interruptContext );
7411 /* prepare SAT_READ_VERIFY_SECTORS(_EXT) */
7412 satNewIntIo = satAllocIntIoResource( tiRoot,
7417 if (satNewIntIo == agNULL)
7419 /* reset satVerifyState */
7420 satDevData->satVerifyState = 0;
7421 /* memory allocation failure */
7422 satFreeIntIoResource( tiRoot,
7426 /* failed as a part of sending SAT_READ_VERIFY_SECTORS(_EXT) */
7427 satSetSensePayload( pSense,
7428 SCSI_SNSKEY_HARDWARE_ERROR,
7430 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7433 ostiInitiatorIOCompleted( tiRoot,
7436 SCSI_STAT_CHECK_CONDITION,
7437 satOrgIOContext->pTiSenseData,
7438 satOrgIOContext->interruptContext );
7440 TI_DBG1(("satSendDiagnosticCB: momory allocation fails\n"));
7442 } /* end of memory allocation failure */
7445 * Need to initialize all the fields within satIOContext
7448 satNewIOContext = satPrepareNewIO(
7456 if (satDevData->satVerifyState == 1)
7458 /* sending SAT_CHECK_POWER_MODE */
7459 status = satSendDiagnostic_1( tiRoot,
7460 &satNewIntIo->satIntTiIORequest,
7461 satNewIOContext->ptiDeviceHandle,
7462 &satNewIntIo->satIntTiScsiXchg,
7467 /* satDevData->satVerifyState == 2 */
7468 status = satSendDiagnostic_2( tiRoot,
7469 &satNewIntIo->satIntTiIORequest,
7470 satNewIOContext->ptiDeviceHandle,
7471 &satNewIntIo->satIntTiScsiXchg,
7475 if (status != tiSuccess)
7477 /* sending SAT_READ_VERIFY_SECTORS(_EXT) fails */
7478 satFreeIntIoResource( tiRoot,
7482 /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */
7483 satSetSensePayload( pSense,
7484 SCSI_SNSKEY_HARDWARE_ERROR,
7486 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7489 ostiInitiatorIOCompleted( tiRoot,
7492 SCSI_STAT_CHECK_CONDITION,
7493 satOrgIOContext->pTiSenseData,
7494 satOrgIOContext->interruptContext );
7496 /* reset satVerifyState */
7497 satDevData->satVerifyState = 0;
7498 TI_DBG1(("satSendDiagnosticCB: calling satSendDiagnostic_1 or _2 fails\n"));
7501 } /* satDevData->satVerifyState == 1 or 2 */
7504 case SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE:
7505 TI_DBG5(("satSendDiagnosticCB: SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE case\n"));
7507 satDevData->satBGPendingDiag = agFALSE;
7509 if (hostToDevFis->d.lbaLow == 0x01 || hostToDevFis->d.lbaLow == 0x02)
7511 /* for background send diagnostic, no completion here. It is done already. */
7512 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7514 /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7515 satFreeIntIoResource( tiRoot,
7518 TI_DBG5(("satSendDiagnosticCB: returning but no IOCompleted\n"));
7522 TI_DBG5(("satSendDiagnosticCB: returning good status for senddiagnostic\n"));
7523 ostiInitiatorIOCompleted( tiRoot,
7524 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7528 satOrgIOContext->interruptContext );
7531 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7533 /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7534 satFreeIntIoResource( tiRoot,
7541 TI_DBG1(("satSendDiagnosticCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
7542 /* unspecified case, return no sense and no addition info */
7543 satSetSensePayload( pSense,
7544 SCSI_SNSKEY_NO_SENSE,
7546 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
7549 ostiInitiatorIOCompleted( tiRoot,
7550 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7552 SCSI_STAT_CHECK_CONDITION,
7553 satOrgIOContext->pTiSenseData,
7554 satOrgIOContext->interruptContext );
7556 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7558 satFreeIntIoResource( tiRoot,
7565 /*****************************************************************************
7566 *! \brief satRequestSenseCB
7568 * This routine is a callback function called from ossaSATACompleted().
7569 * This CB routine deals with Request Sense completion.
7571 * \param agRoot: Handles for this instance of SAS/SATA hardware
7572 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
7573 * \param agIOStatus: Status of completed I/O.
7574 * \param agFirstDword:Pointer to the four bytes of FIS.
7575 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
7577 * \param agParam: Additional info based on status.
7578 * \param ioContext: Pointer to satIOContext_t.
7582 *****************************************************************************/
7584 CB for internnaly generated SMART_RETURN_STATUS and SAT_CHECK_POWER_MODE
7585 in the process of RequestSense
7588 void satRequestSenseCB(
7590 agsaIORequest_t *agIORequest,
7592 agsaFisHeader_t *agFirstDword,
7598 /* ATA Vol 1, p299 SAT_SMART_RETURN_STATUS */
7600 if threshold exceeds, return SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE
7601 else call satRequestSense_1 to send CHECK_POWER_MODE
7604 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7605 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7606 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
7607 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
7608 tdIORequestBody_t *tdIORequestBody;
7609 tdIORequestBody_t *tdOrgIORequestBody;
7610 satIOContext_t *satIOContext;
7611 satIOContext_t *satOrgIOContext;
7612 satIOContext_t *satNewIOContext;
7613 satInternalIo_t *satIntIo;
7614 satInternalIo_t *satNewIntIo = agNULL;
7615 satDeviceData_t *satDevData;
7616 scsiRspSense_t *pSense;
7617 tiIORequest_t *tiOrgIORequest;
7618 tiIniScsiCmnd_t *scsiCmnd;
7620 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
7621 bit32 ataStatus = 0;
7623 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
7624 agsaFisRegD2HData_t statDevToHostFisData;
7625 bit32 lenReceived = 0;
7628 TI_DBG4(("satRequestSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
7630 /* internally generate tiIOContext */
7631 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
7632 satIOContext = (satIOContext_t *) ioContext;
7633 satIntIo = satIOContext->satIntIoContext;
7634 satDevData = satIOContext->pSatDevData;
7635 hostToDevFis = satIOContext->pFis;
7638 if (satIntIo == agNULL)
7640 TI_DBG4(("satRequestSenseCB: External satInternalIo_t satIntIoContext\n"));
7641 satOrgIOContext = satIOContext;
7642 tiOrgIORequest = tdIORequestBody->tiIORequest;
7643 if (satOrgIOContext->superIOFlag)
7645 pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7649 pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7651 scsiCmnd = satOrgIOContext->pScsiCmnd;
7655 TI_DBG4(("satRequestSenseCB: Internal satInternalIo_t satIntIoContext\n"));
7656 satOrgIOContext = satIOContext->satOrgIOContext;
7657 if (satOrgIOContext == agNULL)
7659 TI_DBG4(("satRequestSenseCB: satOrgIOContext is NULL, wrong\n"));
7664 TI_DBG4(("satRequestSenseCB: satOrgIOContext is NOT NULL\n"));
7666 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
7667 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
7669 if (satOrgIOContext->superIOFlag)
7671 pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7675 pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7677 scsiCmnd = satOrgIOContext->pScsiCmnd;
7680 tdIORequestBody->ioCompleted = agTRUE;
7681 tdIORequestBody->ioStarted = agFALSE;
7683 TI_DBG4(("satRequestSenseCB: fis command 0x%x\n", hostToDevFis->h.command));
7685 lenReceived = scsiCmnd->cdb[4];
7686 TI_DBG1(("satRequestSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
7688 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
7690 TI_DBG1(("satRequestSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
7691 ostiInitiatorIOCompleted (
7697 satOrgIOContext->interruptContext
7700 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7702 satFreeIntIoResource( tiRoot,
7710 checking IO status, FIS type and error status
7712 if (agIOStatus != OSSA_IO_SUCCESS)
7714 /* only agsaFisRegDeviceToHost_t is expected */
7715 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
7716 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
7719 if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
7721 if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7723 TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_RETURN_STATU\n", statDevToHostFisHeader->fisType));
7727 TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_CHECK_POWER_MODE\n",statDevToHostFisHeader->fisType));
7732 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
7733 (ataStatus & DF_ATA_STATUS_MASK)
7736 if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7738 TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_SMART_RETURN_STATU\n"));
7742 TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_CHECK_POWER_MODE\n"));
7746 /* Process abort case */
7747 if (agIOStatus == OSSA_IO_ABORTED)
7749 satProcessAbort(tiRoot,
7754 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7756 satFreeIntIoResource( tiRoot,
7762 if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7764 /* report using the original tiIOrequst */
7765 /* failed during sending SMART RETURN STATUS */
7766 satSetSensePayload( pSense,
7767 SCSI_SNSKEY_NO_SENSE,
7769 SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7772 if (SENSE_DATA_LENGTH < lenReceived)
7775 ostiInitiatorIOCompleted( tiRoot,
7776 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7778 lenReceived - SENSE_DATA_LENGTH,
7780 satOrgIOContext->interruptContext );
7784 ostiInitiatorIOCompleted( tiRoot,
7785 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7789 satOrgIOContext->interruptContext );
7794 /* report using the original tiIOrequst */
7795 /* failed during sending SAT_CHECK_POWER_MODE */
7796 satSetSensePayload( pSense,
7797 SCSI_SNSKEY_NO_SENSE,
7799 SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
7802 if (SENSE_DATA_LENGTH < lenReceived)
7805 ostiInitiatorIOCompleted( tiRoot,
7806 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7808 lenReceived - SENSE_DATA_LENGTH,
7810 satOrgIOContext->interruptContext );
7814 ostiInitiatorIOCompleted( tiRoot,
7815 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7819 satOrgIOContext->interruptContext );
7824 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7826 satFreeIntIoResource( tiRoot,
7832 saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t));
7834 switch (hostToDevFis->h.command)
7836 case SAT_SMART_RETURN_STATUS:
7837 TI_DBG4(("satRequestSenseCB: SAT_SMART_RETURN_STATUS case\n"));
7838 if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C)
7840 /* threshold exceeds */
7841 TI_DBG1(("satRequestSenseCB: threshold exceeds\n"));
7844 /* report using the original tiIOrequst */
7845 /* failed during sending SMART RETURN STATUS */
7846 satSetSensePayload( pSense,
7847 SCSI_SNSKEY_NO_SENSE,
7849 SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7852 if (SENSE_DATA_LENGTH < lenReceived)
7855 ostiInitiatorIOCompleted( tiRoot,
7856 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7858 lenReceived - SENSE_DATA_LENGTH,
7860 satOrgIOContext->interruptContext ); }
7863 ostiInitiatorIOCompleted( tiRoot,
7864 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7868 satOrgIOContext->interruptContext ); }
7871 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7873 satFreeIntIoResource( tiRoot,
7880 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7882 /* done with internally genereated SAT_SMART_RETURN_STATUS */
7883 satFreeIntIoResource( tiRoot,
7887 /* at this point, successful SMART_RETURN_STATUS
7888 xmit SAT_CHECK_POWER_MODE
7890 if (satOrgIOContext->superIOFlag)
7892 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
7896 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
7899 satNewIntIo = satAllocIntIoResource( tiRoot,
7904 if (satNewIntIo == agNULL)
7906 /* memory allocation failure */
7907 satFreeIntIoResource( tiRoot,
7911 /* failed as a part of sending SMART RETURN STATUS */
7912 satSetSensePayload( pSense,
7913 SCSI_SNSKEY_NO_SENSE,
7915 SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7918 if (SENSE_DATA_LENGTH < lenReceived)
7921 ostiInitiatorIOCompleted( tiRoot,
7924 lenReceived - SENSE_DATA_LENGTH,
7926 satOrgIOContext->interruptContext );
7930 ostiInitiatorIOCompleted( tiRoot,
7935 satOrgIOContext->interruptContext );
7938 TI_DBG1(("satRequestSenseCB: momory allocation fails\n"));
7940 } /* end of memory allocation failure */
7944 * Need to initialize all the fields within satIOContext
7947 satNewIOContext = satPrepareNewIO(
7955 /* sending SAT_CHECK_POWER_MODE */
7956 status = satRequestSense_1( tiRoot,
7957 &satNewIntIo->satIntTiIORequest,
7958 satNewIOContext->ptiDeviceHandle,
7959 &satNewIntIo->satIntTiScsiXchg,
7962 if (status != tiSuccess)
7964 /* sending SAT_CHECK_POWER_MODE fails */
7965 satFreeIntIoResource( tiRoot,
7969 /* failed during sending SAT_CHECK_POWER_MODE */
7970 satSetSensePayload( pSense,
7971 SCSI_SNSKEY_NO_SENSE,
7973 SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
7976 if (SENSE_DATA_LENGTH < lenReceived)
7979 ostiInitiatorIOCompleted( tiRoot,
7982 lenReceived - SENSE_DATA_LENGTH,
7984 satOrgIOContext->interruptContext );
7988 ostiInitiatorIOCompleted( tiRoot,
7993 satOrgIOContext->interruptContext );
7996 TI_DBG1(("satRequestSenseCB: calling satRequestSense_1 fails\n"));
8001 case SAT_CHECK_POWER_MODE:
8002 TI_DBG4(("satRequestSenseCB: SAT_CHECK_POWER_MODE case\n"));
8004 /* check ATA STANDBY state */
8005 if (statDevToHostFisData.sectorCount == 0x00)
8008 TI_DBG1(("satRequestSenseCB: in standby\n"));
8011 /* report using the original tiIOrequst */
8012 /* failed during sending SAT_CHECK_POWER_MODE */
8013 satSetSensePayload( pSense,
8014 SCSI_SNSKEY_NO_SENSE,
8016 SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
8019 if (SENSE_DATA_LENGTH < lenReceived)
8022 ostiInitiatorIOCompleted( tiRoot,
8023 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8025 lenReceived - SENSE_DATA_LENGTH,
8027 satOrgIOContext->interruptContext );
8031 ostiInitiatorIOCompleted( tiRoot,
8032 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8036 satOrgIOContext->interruptContext );
8039 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8041 satFreeIntIoResource( tiRoot,
8047 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8049 /* done with internnaly generated SAT_CHECK_POWER_MODE */
8050 satFreeIntIoResource( tiRoot,
8054 if (satDevData->satFormatState == agTRUE)
8056 TI_DBG1(("satRequestSenseCB: in format\n"));
8059 /* report using the original tiIOrequst */
8060 satSetSensePayload( pSense,
8061 SCSI_SNSKEY_NOT_READY,
8063 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS,
8066 if (SENSE_DATA_LENGTH < lenReceived)
8069 ostiInitiatorIOCompleted( tiRoot,
8070 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8072 lenReceived - SENSE_DATA_LENGTH,
8074 satOrgIOContext->interruptContext );
8078 ostiInitiatorIOCompleted( tiRoot,
8079 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8083 satOrgIOContext->interruptContext );
8089 /* normal: returns good status for requestsense */
8090 /* report using the original tiIOrequst */
8091 satSetSensePayload( pSense,
8092 SCSI_SNSKEY_NO_SENSE,
8094 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8096 TI_DBG4(("satRequestSenseCB: returning good status for requestsense\n"));
8097 if (SENSE_DATA_LENGTH < lenReceived)
8100 TI_DBG6(("satRequestSenseCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
8101 SENSE_DATA_LENGTH, lenReceived, tiOrgIORequest));
8102 ostiInitiatorIOCompleted( tiRoot,
8103 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8105 lenReceived - SENSE_DATA_LENGTH,
8107 satOrgIOContext->interruptContext );
8112 ostiInitiatorIOCompleted( tiRoot,
8113 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8117 satOrgIOContext->interruptContext );
8122 TI_DBG1(("satRequestSenseCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
8123 /* pSense here is a part of satOrgIOContext */
8124 pSense = satOrgIOContext->pTiSenseData->senseData;
8125 satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH;
8126 /* unspecified case, return no sense and no addition info */
8127 satSetSensePayload( pSense,
8128 SCSI_SNSKEY_NO_SENSE,
8130 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8133 ostiInitiatorIOCompleted( tiRoot,
8134 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8136 SCSI_STAT_CHECK_CONDITION,
8137 satOrgIOContext->pTiSenseData,
8138 satOrgIOContext->interruptContext );
8140 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8142 satFreeIntIoResource( tiRoot,
8151 /*****************************************************************************
8152 *! \brief satSynchronizeCache10n16CB
8154 * This routine is a callback function for satSynchronizeCache10 and
8155 * satSynchronizeCache1016()
8157 * \param agRoot: Handles for this instance of SAS/SATA hardware
8158 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
8159 * \param agIOStatus: Status of completed I/O.
8160 * \param agFirstDword:Pointer to the four bytes of FIS.
8161 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8163 * \param agParam: Additional info based on status.
8164 * \param ioContext: Pointer to satIOContext_t.
8168 *****************************************************************************/
8169 void satSynchronizeCache10n16CB(
8171 agsaIORequest_t *agIORequest,
8173 agsaFisHeader_t *agFirstDword,
8179 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8180 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8181 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8182 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8183 tdIORequestBody_t *tdIORequestBody;
8184 tdIORequestBody_t *tdOrgIORequestBody;
8185 satIOContext_t *satIOContext;
8186 satIOContext_t *satOrgIOContext;
8187 satInternalIo_t *satIntIo;
8188 satDeviceData_t *satDevData;
8190 scsiRspSense_t *pSense;
8191 tiIniScsiCmnd_t *scsiCmnd;
8192 tiIORequest_t *tiOrgIORequest;
8194 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
8195 bit32 ataStatus = 0;
8196 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
8198 TI_DBG5(("satSynchronizeCache10n16CB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8200 /* internally generate tiIOContext */
8201 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8202 satIOContext = (satIOContext_t *) ioContext;
8203 satIntIo = satIOContext->satIntIoContext;
8204 satDevData = satIOContext->pSatDevData;
8205 hostToDevFis = satIOContext->pFis;
8207 /* SPC: Self-Test Result Log page */
8209 if (satIntIo == agNULL)
8211 TI_DBG4(("satSynchronizeCache10n16CB: External satInternalIo_t satIntIoContext\n"));
8212 satOrgIOContext = satIOContext;
8213 tiOrgIORequest = tdIORequestBody->tiIORequest;
8214 pSense = satIOContext->pSense;
8215 scsiCmnd = satIOContext->pScsiCmnd;
8219 TI_DBG4(("satSynchronizeCache10n16CB: Internal satInternalIo_t satIntIoContext\n"));
8220 satOrgIOContext = satIOContext->satOrgIOContext;
8221 if (satOrgIOContext == agNULL)
8223 TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NULL, wrong\n"));
8228 TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NOT NULL\n"));
8230 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8231 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8233 pSense = satOrgIOContext->pSense;
8234 scsiCmnd = satOrgIOContext->pScsiCmnd;
8237 tdIORequestBody->ioCompleted = agTRUE;
8238 tdIORequestBody->ioStarted = agFALSE;
8240 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8242 TI_DBG1(("satSynchronizeCache10n16CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8244 ostiInitiatorIOCompleted (
8250 satOrgIOContext->interruptContext
8252 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8254 satFreeIntIoResource( tiRoot,
8260 if( agIOStatus != OSSA_IO_SUCCESS)
8262 /* only agsaFisRegDeviceToHost_t is expected */
8263 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
8264 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
8267 if( agIOStatus != OSSA_IO_SUCCESS)
8269 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
8270 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
8274 if( agIOStatus != OSSA_IO_SUCCESS)
8276 TI_DBG1(("satSynchronizeCache10n16CB: FAILED, NOT IO_SUCCESS\n"));
8278 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
8280 TI_DBG1(("satSynchronizeCache10n16CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
8282 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
8283 (ataStatus & DF_ATA_STATUS_MASK)
8286 TI_DBG1(("satSynchronizeCache10n16CB: FAILED, FAILED, error status\n"));
8290 /* Process abort case */
8291 if (agIOStatus == OSSA_IO_ABORTED)
8293 satProcessAbort(tiRoot,
8298 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8300 satFreeIntIoResource( tiRoot,
8306 switch (hostToDevFis->h.command)
8308 case SAT_FLUSH_CACHE:
8309 TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE failed\n"));
8310 /* checking IMMED bit */
8311 if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)
8313 satSetDeferredSensePayload( pSense,
8314 SCSI_SNSKEY_NO_SENSE,
8316 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8321 satSetDeferredSensePayload( pSense,
8322 SCSI_SNSKEY_NO_SENSE,
8324 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8329 ostiInitiatorIOCompleted( tiRoot,
8330 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8332 SCSI_STAT_CHECK_CONDITION,
8333 satOrgIOContext->pTiSenseData,
8334 satOrgIOContext->interruptContext );
8336 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8338 satFreeIntIoResource( tiRoot,
8343 case SAT_FLUSH_CACHE_EXT:
8344 TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT failed\n"));
8345 /* checking IMMED bit */
8346 if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)
8348 satSetDeferredSensePayload( pSense,
8349 SCSI_SNSKEY_NO_SENSE,
8351 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8356 satSetDeferredSensePayload( pSense,
8357 SCSI_SNSKEY_NO_SENSE,
8359 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8364 ostiInitiatorIOCompleted( tiRoot,
8365 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8367 SCSI_STAT_CHECK_CONDITION,
8368 satOrgIOContext->pTiSenseData,
8369 satOrgIOContext->interruptContext );
8371 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8373 satFreeIntIoResource( tiRoot,
8379 TI_DBG1(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command));
8380 satSetSensePayload( pSense,
8381 SCSI_SNSKEY_NO_SENSE,
8383 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8387 ostiInitiatorIOCompleted( tiRoot,
8388 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8390 SCSI_STAT_CHECK_CONDITION,
8391 satOrgIOContext->pTiSenseData,
8392 satOrgIOContext->interruptContext );
8394 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8396 satFreeIntIoResource( tiRoot,
8404 } /* end of error checking */
8407 /* prcessing the success case */
8408 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8410 satFreeIntIoResource( tiRoot,
8415 switch (hostToDevFis->h.command)
8417 case SAT_FLUSH_CACHE:
8418 TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE success\n"));
8420 /* checking IMMED bit */
8421 if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK))
8423 ostiInitiatorIOCompleted( tiRoot,
8424 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8428 satOrgIOContext->interruptContext );
8434 case SAT_FLUSH_CACHE_EXT:
8435 TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT success\n"));
8437 /* checking IMMED bit */
8438 if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK))
8440 ostiInitiatorIOCompleted( tiRoot,
8441 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8445 satOrgIOContext->interruptContext );
8451 TI_DBG5(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command));
8452 satSetSensePayload( pSense,
8453 SCSI_SNSKEY_NO_SENSE,
8455 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8459 ostiInitiatorIOCompleted( tiRoot,
8460 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8462 SCSI_STAT_CHECK_CONDITION,
8463 satOrgIOContext->pTiSenseData,
8464 satOrgIOContext->interruptContext );
8473 /*****************************************************************************
8474 *! \brief satModeSelect6n10CB
8476 * This routine is a callback function for satModeSelect6() and
8479 * \param agRoot: Handles for this instance of SAS/SATA hardware
8480 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
8481 * \param agIOStatus: Status of completed I/O.
8482 * \param agFirstDword:Pointer to the four bytes of FIS.
8483 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8485 * \param agParam: Additional info based on status.
8486 * \param ioContext: Pointer to satIOContext_t.
8490 *****************************************************************************/
8491 void satModeSelect6n10CB(
8493 agsaIORequest_t *agIORequest,
8495 agsaFisHeader_t *agFirstDword,
8501 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8502 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8503 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8504 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8505 tdIORequestBody_t *tdIORequestBody;
8506 tdIORequestBody_t *tdOrgIORequestBody;
8507 satIOContext_t *satIOContext;
8508 satIOContext_t *satOrgIOContext;
8509 satIOContext_t *satNewIOContext;
8510 satInternalIo_t *satIntIo;
8511 satInternalIo_t *satNewIntIo = agNULL;
8512 satDeviceData_t *satDevData;
8513 scsiRspSense_t *pSense;
8514 tiIniScsiCmnd_t *scsiCmnd;
8515 tiIORequest_t *tiOrgIORequest;
8517 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
8518 bit32 ataStatus = 0;
8520 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
8521 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
8523 TI_DBG5(("satModeSelect6n10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8525 /* internally generate tiIOContext */
8526 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8527 satIOContext = (satIOContext_t *) ioContext;
8528 satIntIo = satIOContext->satIntIoContext;
8529 satDevData = satIOContext->pSatDevData;
8530 hostToDevFis = satIOContext->pFis;
8532 if (satIntIo == agNULL)
8534 TI_DBG4(("satModeSelect6n10CB: External satInternalIo_t satIntIoContext\n"));
8535 satOrgIOContext = satIOContext;
8536 tiOrgIORequest = tdIORequestBody->tiIORequest;
8537 tiScsiRequest = satOrgIOContext->tiScsiXchg;
8538 pSense = satOrgIOContext->pSense;
8539 scsiCmnd = satOrgIOContext->pScsiCmnd;
8543 TI_DBG4(("satModeSelect6n10CB: Internal satInternalIo_t satIntIoContext\n"));
8544 satOrgIOContext = satIOContext->satOrgIOContext;
8545 if (satOrgIOContext == agNULL)
8547 TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NULL, wrong\n"));
8552 TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NOT NULL\n"));
8554 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8555 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8557 tiScsiRequest = satOrgIOContext->tiScsiXchg;
8558 pSense = satOrgIOContext->pSense;
8559 scsiCmnd = satOrgIOContext->pScsiCmnd;
8562 tdIORequestBody->ioCompleted = agTRUE;
8563 tdIORequestBody->ioStarted = agFALSE;
8565 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8567 TI_DBG1(("satModeSelect6n10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8568 ostiInitiatorIOCompleted (
8574 satOrgIOContext->interruptContext
8576 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8578 satFreeIntIoResource( tiRoot,
8584 if (agIOStatus != OSSA_IO_SUCCESS)
8586 /* only agsaFisRegDeviceToHost_t is expected */
8587 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
8588 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
8591 if (agIOStatus != OSSA_IO_SUCCESS)
8593 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
8594 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
8598 if( agIOStatus != OSSA_IO_SUCCESS)
8600 TI_DBG1(("satModeSelect6n10CB FAILED, NOT IO_SUCCESS\n"));
8602 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
8604 TI_DBG1(("satModeSelect6n10CB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
8606 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
8607 (ataStatus & DF_ATA_STATUS_MASK)
8610 TI_DBG1(("satModeSelect6n10CB FAILED, FAILED, error status\n"));
8613 /* Process abort case */
8614 if (agIOStatus == OSSA_IO_ABORTED)
8616 satProcessAbort(tiRoot,
8621 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8623 satFreeIntIoResource( tiRoot,
8630 if (hostToDevFis->h.command == SAT_SET_FEATURES)
8632 if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02))
8634 TI_DBG1(("satModeSelect6n10CB 1 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features));
8636 else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55))
8638 TI_DBG1(("ssatModeSelect6n10CB 2 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features));
8642 TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8645 else if (hostToDevFis->h.command == SAT_SMART)
8647 if ((hostToDevFis->h.features == SAT_SMART_ENABLE_OPERATIONS) || (hostToDevFis->h.features == SAT_SMART_DISABLE_OPERATIONS))
8649 TI_DBG1(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS failed, feature 0x%x\n", hostToDevFis->h.features));
8653 TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8658 TI_DBG1(("satModeSelect6n10CB error default case command 0x%x\n", hostToDevFis->h.command));
8662 satSetSensePayload( pSense,
8663 SCSI_SNSKEY_NO_SENSE,
8665 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8668 ostiInitiatorIOCompleted( tiRoot,
8669 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8671 SCSI_STAT_CHECK_CONDITION,
8672 satOrgIOContext->pTiSenseData,
8673 satOrgIOContext->interruptContext );
8676 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8678 satFreeIntIoResource( tiRoot,
8682 } /* error checking */
8686 /* prcessing the success case */
8689 if (hostToDevFis->h.command == SAT_SET_FEATURES)
8691 if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02))
8693 TI_DBG5(("satModeSelect6n10CB 1 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features));
8695 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8697 satFreeIntIoResource( tiRoot,
8701 satNewIntIo = satAllocIntIoResource( tiRoot,
8706 if (satNewIntIo == agNULL)
8708 /* memory allocation failure */
8709 satFreeIntIoResource( tiRoot,
8713 satSetSensePayload( pSense,
8714 SCSI_SNSKEY_NO_SENSE,
8716 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8719 ostiInitiatorIOCompleted( tiRoot,
8720 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8722 SCSI_STAT_CHECK_CONDITION,
8723 satOrgIOContext->pTiSenseData,
8724 satOrgIOContext->interruptContext );
8725 TI_DBG1(("satModeSelect6n10CB: momory allocation fails\n"));
8727 } /* end memory allocation */
8729 satNewIOContext = satPrepareNewIO(
8736 /* sends either ATA SET FEATURES based on DRA bit */
8737 status = satModeSelect6n10_1( tiRoot,
8738 &satNewIntIo->satIntTiIORequest,
8739 satNewIOContext->ptiDeviceHandle,
8740 tiScsiRequest, /* orginal from OS layer */
8744 if (status != tiSuccess)
8746 /* sending ATA command fails */
8747 satFreeIntIoResource( tiRoot,
8750 satSetSensePayload( pSense,
8751 SCSI_SNSKEY_NO_SENSE,
8753 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8756 ostiInitiatorIOCompleted( tiRoot,
8757 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8759 SCSI_STAT_CHECK_CONDITION,
8760 satOrgIOContext->pTiSenseData,
8761 satOrgIOContext->interruptContext );
8762 TI_DBG1(("satModeSelect6n10CB calling satModeSelect6_1 fails\n"));
8764 } /* end send fails */
8767 else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55))
8769 TI_DBG5(("satModeSelect6n10CB 2 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features));
8771 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8773 satFreeIntIoResource( tiRoot,
8777 /* return stat_good */
8778 ostiInitiatorIOCompleted( tiRoot,
8783 satOrgIOContext->interruptContext );
8788 TI_DBG1(("satModeSelect6n10CB error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8790 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8792 satFreeIntIoResource( tiRoot,
8795 satSetSensePayload( pSense,
8796 SCSI_SNSKEY_NO_SENSE,
8798 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8801 ostiInitiatorIOCompleted( tiRoot,
8802 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8804 SCSI_STAT_CHECK_CONDITION,
8805 satOrgIOContext->pTiSenseData,
8806 satOrgIOContext->interruptContext );
8810 else if (hostToDevFis->h.command == SAT_SMART_ENABLE_OPERATIONS ||
8811 hostToDevFis->h.command == SAT_SMART_DISABLE_OPERATIONS
8814 if ((hostToDevFis->h.features == 0xD8) || (hostToDevFis->h.features == 0xD9))
8816 TI_DBG5(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS success, feature 0x%x\n", hostToDevFis->h.features));
8818 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8820 satFreeIntIoResource( tiRoot,
8823 /* return stat_good */
8824 ostiInitiatorIOCompleted( tiRoot,
8829 satOrgIOContext->interruptContext );
8834 TI_DBG1(("satModeSelect6n10CB error unknown command failed 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8836 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8838 satFreeIntIoResource( tiRoot,
8841 satSetSensePayload( pSense,
8842 SCSI_SNSKEY_NO_SENSE,
8844 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8847 ostiInitiatorIOCompleted( tiRoot,
8848 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8850 SCSI_STAT_CHECK_CONDITION,
8851 satOrgIOContext->pTiSenseData,
8852 satOrgIOContext->interruptContext );
8859 TI_DBG1(("satModeSelect6n10CB error default case command success 0x%x\n", hostToDevFis->h.command));
8861 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8863 satFreeIntIoResource( tiRoot,
8867 satSetSensePayload( pSense,
8868 SCSI_SNSKEY_NO_SENSE,
8870 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8873 ostiInitiatorIOCompleted( tiRoot,
8874 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8876 SCSI_STAT_CHECK_CONDITION,
8877 satOrgIOContext->pTiSenseData,
8878 satOrgIOContext->interruptContext );
8885 /*****************************************************************************
8886 *! \brief satSMARTEnableCB
8888 * This routine is a callback function for satSMARTEnable()
8890 * \param agRoot: Handles for this instance of SAS/SATA hardware
8891 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
8892 * \param agIOStatus: Status of completed I/O.
8893 * \param agFirstDword:Pointer to the four bytes of FIS.
8894 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8896 * \param agParam: Additional info based on status.
8897 * \param ioContext: Pointer to satIOContext_t.
8901 *****************************************************************************/
8902 void satSMARTEnableCB(
8904 agsaIORequest_t *agIORequest,
8906 agsaFisHeader_t *agFirstDword,
8912 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8913 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8914 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8915 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8916 tdIORequestBody_t *tdIORequestBody;
8917 tdIORequestBody_t *tdOrgIORequestBody;
8918 satIOContext_t *satIOContext;
8919 satIOContext_t *satOrgIOContext;
8920 satIOContext_t *satNewIOContext;
8921 satInternalIo_t *satIntIo;
8922 satInternalIo_t *satNewIntIo = agNULL;
8923 satDeviceData_t *satDevData;
8924 tiIORequest_t *tiOrgIORequest;
8925 tiIniScsiCmnd_t *scsiCmnd;
8928 TI_DBG4(("satSMARTEnableCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8930 /* internally generate tiIOContext */
8931 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8932 satIOContext = (satIOContext_t *) ioContext;
8933 satIntIo = satIOContext->satIntIoContext;
8934 satDevData = satIOContext->pSatDevData;
8937 if (satIntIo == agNULL)
8939 TI_DBG4(("satSMARTEnableCB: External satInternalIo_t satIntIoContext\n"));
8940 satOrgIOContext = satIOContext;
8941 tiOrgIORequest = tdIORequestBody->tiIORequest;
8942 scsiCmnd = satOrgIOContext->pScsiCmnd;
8946 TI_DBG4(("satSMARTEnableCB: Internal satInternalIo_t satIntIoContext\n"));
8947 satOrgIOContext = satIOContext->satOrgIOContext;
8948 if (satOrgIOContext == agNULL)
8950 TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NULL, wrong\n"));
8955 TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NOT NULL\n"));
8957 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8958 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8960 scsiCmnd = satOrgIOContext->pScsiCmnd;
8963 tdIORequestBody->ioCompleted = agTRUE;
8964 tdIORequestBody->ioStarted = agFALSE;
8966 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8968 TI_DBG1(("satSMARTEnableCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8969 ostiInitiatorIOCompleted (
8975 satOrgIOContext->interruptContext
8978 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8980 satFreeIntIoResource( tiRoot,
8988 checking IO status, FIS type and error status
8990 if (agIOStatus != OSSA_IO_SUCCESS)
8992 TI_DBG1(("satSMARTEnableCB: not success status, status %d\n", agIOStatus));
8993 ostiInitiatorIOCompleted (
8999 satOrgIOContext->interruptContext
9002 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9004 satFreeIntIoResource( tiRoot,
9011 /* process success case */
9012 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9014 satFreeIntIoResource( tiRoot,
9018 satNewIntIo = satAllocIntIoResource( tiRoot,
9024 if (satNewIntIo == agNULL)
9026 /* memory allocation failure */
9027 satFreeIntIoResource( tiRoot,
9031 ostiInitiatorIOCompleted (
9037 satOrgIOContext->interruptContext
9042 satNewIOContext = satPrepareNewIO(
9050 status = satLogSense_1(tiRoot,
9051 &satNewIntIo->satIntTiIORequest,
9052 satNewIOContext->ptiDeviceHandle,
9053 &satNewIntIo->satIntTiScsiXchg,
9056 if (status != tiSuccess)
9058 /* sending SAT_CHECK_POWER_MODE fails */
9059 satFreeIntIoResource( tiRoot,
9063 ostiInitiatorIOCompleted (
9069 satOrgIOContext->interruptContext
9079 /*****************************************************************************
9080 *! \brief satLogSenseCB
9082 * This routine is a callback function for satLogSense()
9084 * \param agRoot: Handles for this instance of SAS/SATA hardware
9085 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
9086 * \param agIOStatus: Status of completed I/O.
9087 * \param agFirstDword:Pointer to the four bytes of FIS.
9088 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
9090 * \param agParam: Additional info based on status.
9091 * \param ioContext: Pointer to satIOContext_t.
9095 *****************************************************************************/
9098 agsaIORequest_t *agIORequest,
9100 agsaFisHeader_t *agFirstDword,
9107 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
9108 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
9109 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
9110 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
9111 tdIORequestBody_t *tdIORequestBody;
9112 tdIORequestBody_t *tdOrgIORequestBody;
9113 satIOContext_t *satIOContext;
9114 satIOContext_t *satOrgIOContext;
9115 satInternalIo_t *satIntIo;
9116 satDeviceData_t *satDevData;
9118 scsiRspSense_t *pSense;
9119 tiIORequest_t *tiOrgIORequest;
9121 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
9122 bit32 ataStatus = 0;
9123 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
9124 tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */
9125 satReadLogExtSelfTest_t *virtAddr1;
9126 satSmartReadLogSelfTest_t *virtAddr2;
9128 bit8 SelfTestExecutionStatus = 0;
9131 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
9132 agsaFisRegD2HData_t statDevToHostFisData;
9133 tiIniScsiCmnd_t *scsiCmnd;
9134 bit32 lenReceived = 0;
9136 TI_DBG5(("satLogSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
9138 /* internally generate tiIOContext */
9139 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
9140 satIOContext = (satIOContext_t *) ioContext;
9141 if (satIOContext == agNULL)
9143 TI_DBG1(("satLogSenseCB: satIOContext is NULL\n"));
9146 satIntIo = satIOContext->satIntIoContext;
9147 satDevData = satIOContext->pSatDevData;
9148 hostToDevFis = satIOContext->pFis;
9150 if (satIntIo == agNULL)
9152 TI_DBG4(("satLogSenseCB: External satInternalIo_t satIntIoContext\n"));
9153 satOrgIOContext = satIOContext;
9154 tiOrgIORequest = tdIORequestBody->tiIORequest;
9155 pSense = satOrgIOContext->pSense;
9156 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg;
9157 /* SCSI command response payload to OS layer */
9158 pLogPage = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9159 /* ATA command response payload */
9160 tiScsiRequest = satOrgIOContext->tiScsiXchg;
9161 scsiCmnd = satOrgIOContext->pScsiCmnd;
9165 TI_DBG4(("satLogSenseCB: Internal satInternalIo_t satIntIoContext\n"));
9166 satOrgIOContext = satIOContext->satOrgIOContext;
9167 if (satOrgIOContext == agNULL)
9169 TI_DBG4(("satLogSenseCB: satOrgIOContext is NULL\n"));
9173 TI_DBG4(("satLogSenseCB: satOrgIOContext is NOT NULL\n"));
9176 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
9177 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
9179 pSense = satOrgIOContext->pSense;
9180 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg;
9181 /* SCSI command response payload to OS layer */
9182 pLogPage = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9183 /* ATA command response payload */
9184 tiScsiRequest = (tiScsiInitiatorRequest_t *)&(satIntIo->satIntTiScsiXchg);
9185 scsiCmnd = satOrgIOContext->pScsiCmnd;
9188 tdIORequestBody->ioCompleted = agTRUE;
9189 tdIORequestBody->ioStarted = agFALSE;
9191 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
9193 TI_DBG1(("satLogSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
9194 ostiInitiatorIOCompleted (
9200 satOrgIOContext->interruptContext
9202 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9204 satFreeIntIoResource( tiRoot,
9210 if (agIOStatus != OSSA_IO_SUCCESS)
9212 /* non-data and pio read -> device to host and pio setup fis are expected */
9214 first, assumed to be Reg Device to Host FIS
9215 This is OK to just find fis type
9217 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
9218 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
9221 if( agIOStatus != OSSA_IO_SUCCESS)
9223 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
9224 (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)) ||
9225 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
9229 if( agIOStatus != OSSA_IO_SUCCESS)
9231 TI_DBG1(("satLogSenseCB: FAILED, NOT IO_SUCCESS\n"));
9233 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
9235 TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
9237 else if (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)
9239 TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
9241 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
9242 (ataStatus & DF_ATA_STATUS_MASK)
9245 TI_DBG1(("satLogSenseCB: FAILED, FAILED, error status\n"));
9248 /* Process abort case */
9249 if (agIOStatus == OSSA_IO_ABORTED)
9251 satProcessAbort(tiRoot,
9256 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9258 satFreeIntIoResource( tiRoot,
9265 if (hostToDevFis->h.command == SAT_READ_LOG_EXT)
9267 TI_DBG1(("satLogSenseCB: SAT_READ_LOG_EXT failed\n"));
9269 else if (hostToDevFis->h.command == SAT_SMART)
9271 if (hostToDevFis->h.features == SAT_SMART_READ_LOG)
9273 TI_DBG1(("satLogSenseCB: SAT_SMART_READ_LOG failed\n"));
9275 else if (hostToDevFis->h.features == SAT_SMART_RETURN_STATUS)
9277 TI_DBG1(("satLogSenseCB: SAT_SMART_RETURN_STATUS failed\n"));
9281 TI_DBG1(("satLogSenseCB: error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
9286 TI_DBG1(("satLogSenseCB: error default case command 0x%x\n", hostToDevFis->h.command));
9289 satSetSensePayload( pSense,
9290 SCSI_SNSKEY_NO_SENSE,
9292 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9295 ostiInitiatorIOCompleted( tiRoot,
9296 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9298 SCSI_STAT_CHECK_CONDITION,
9299 satOrgIOContext->pTiSenseData,
9300 satOrgIOContext->interruptContext );
9302 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9304 satFreeIntIoResource( tiRoot,
9309 } /* error checking */
9312 /* prcessing the success case */
9313 saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t));
9315 lenReceived = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8];
9316 TI_DBG5(("satLogSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
9319 if (hostToDevFis->h.command == SAT_READ_LOG_EXT)
9321 TI_DBG5(("satLogSenseCB: SAT_READ_LOG_EXT success\n"));
9323 /* process log data and sends it to upper */
9325 /* ATA: Extended Self-Test Log */
9326 virtAddr1 = (satReadLogExtSelfTest_t *)(tiScsiRequest->sglVirtualAddr);
9328 ATA/ATAPI VOLII, p197, 287
9329 self-test execution status (4 bits); ((virtAddr1->byte[5] & 0xF0) >> 4)
9331 SelfTestExecutionStatus = (bit8)(((virtAddr1->byte[5] & 0xF0) >> 4));
9333 /* fills in the log page from ATA log page */
9334 /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */
9335 pLogPage[0] = 0x10; /* page code */
9337 pLogPage[2] = 0x01; /* 0x190, page length */
9340 /* SPC-4, Table 217 */
9341 pLogPage[4] = 0; /* Parameter Code */
9342 pLogPage[5] = 0x01; /* Parameter Code, unspecfied but ... */
9343 pLogPage[6] = 3; /* unspecified but ... */
9344 pLogPage[7] = 0x10; /* Parameter Length */
9345 pLogPage[8] = (bit8)(0 | ((virtAddr1->byte[5] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */
9346 pLogPage[9] = 0; /* self test number */
9347 pLogPage[10] = virtAddr1->byte[7]; /* time stamp, MSB */
9348 pLogPage[11] = virtAddr1->byte[6]; /* time stamp, LSB */
9350 pLogPage[12] = 0; /* address of first failure MSB*/
9351 pLogPage[13] = 0; /* address of first failure */
9352 pLogPage[14] = virtAddr1->byte[14]; /* address of first failure */
9353 pLogPage[15] = virtAddr1->byte[13]; /* address of first failure */
9354 pLogPage[16] = virtAddr1->byte[12]; /* address of first failure */
9355 pLogPage[17] = virtAddr1->byte[11]; /* address of first failure */
9356 pLogPage[18] = virtAddr1->byte[10]; /* address of first failure */
9357 pLogPage[19] = virtAddr1->byte[9]; /* address of first failure LSB */
9359 /* SAT rev8 Table75, p 76 */
9360 switch (SelfTestExecutionStatus)
9363 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9364 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9365 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9368 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9369 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9370 pLogPage[22] = 0x81;
9373 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9374 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9375 pLogPage[22] = 0x82;
9378 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9379 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9380 pLogPage[22] = 0x83;
9383 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9384 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9385 pLogPage[22] = 0x84;
9388 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9389 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9390 pLogPage[22] = 0x85;
9393 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9394 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9395 pLogPage[22] = 0x86;
9398 pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR;
9399 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9400 pLogPage[22] = 0x87;
9403 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9404 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9405 pLogPage[22] = 0x88;
9407 case 9: /* fall through */
9408 case 10:/* fall through */
9409 case 11:/* fall through */
9410 case 12:/* fall through */
9411 case 13:/* fall through */
9413 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9414 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9415 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9418 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9419 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9420 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9423 TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus));
9425 satSetSensePayload( pSense,
9426 SCSI_SNSKEY_NO_SENSE,
9428 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9431 ostiInitiatorIOCompleted( tiRoot,
9432 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9434 SCSI_STAT_CHECK_CONDITION,
9435 satOrgIOContext->pTiSenseData,
9436 satOrgIOContext->interruptContext );
9438 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9440 satFreeIntIoResource( tiRoot,
9447 pLogPage[23] = 0; /* vendor specific */
9449 /* the rest of Self-test results log */
9450 /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/
9451 for (i=24;i<=403;i++)
9453 pLogPage[i] = 0; /* vendor specific */
9456 if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived)
9458 TI_DBG6(("satLogSenseCB: 1st underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
9461 ostiInitiatorIOCompleted( tiRoot,
9462 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9464 lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH,
9466 satOrgIOContext->interruptContext );
9471 ostiInitiatorIOCompleted( tiRoot,
9476 satOrgIOContext->interruptContext);
9479 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9481 satFreeIntIoResource( tiRoot,
9487 else if (hostToDevFis->h.command == SAT_SMART_READ_LOG
9488 || hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
9490 if (hostToDevFis->h.features == 0xd5)
9492 TI_DBG5(("satLogSenseCB: SAT_SMART_READ_LOG success\n"));
9493 /* process log data and sends it to upper */
9495 /* ATA: Extended Self-Test Log */
9496 virtAddr2 = (satSmartReadLogSelfTest_t *)(tiScsiRequest->sglVirtualAddr);
9499 self-test execution status (4 bits); ((virtAddr2->byte[3] & 0xF0) >> 4)
9501 SelfTestExecutionStatus = (bit8)(((virtAddr2->byte[3] & 0xF0) >> 4));
9503 /* fills in the log page from ATA log page */
9504 /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */
9505 pLogPage[0] = 0x10; /* page code */
9507 pLogPage[2] = 0x01; /* 0x190, page length */
9508 pLogPage[3] = 0x90; /* 0x190, page length */
9510 /* SPC-4, Table 217 */
9511 pLogPage[4] = 0; /* Parameter Code */
9512 pLogPage[5] = 0x01; /* Parameter Code unspecfied but ... */
9513 pLogPage[6] = 3; /* unspecified but ... */
9514 pLogPage[7] = 0x10; /* Parameter Length */
9515 pLogPage[8] = (bit8)(0 | ((virtAddr2->byte[3] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */
9516 pLogPage[9] = 0; /* self test number */
9517 pLogPage[10] = virtAddr2->byte[5]; /* time stamp, MSB */
9518 pLogPage[11] = virtAddr2->byte[4]; /* time stamp, LSB */
9520 pLogPage[12] = 0; /* address of first failure MSB*/
9521 pLogPage[13] = 0; /* address of first failure */
9522 pLogPage[14] = 0; /* address of first failure */
9523 pLogPage[15] = 0; /* address of first failure */
9524 pLogPage[16] = virtAddr2->byte[10]; /* address of first failure */
9525 pLogPage[17] = virtAddr2->byte[9]; /* address of first failure */
9526 pLogPage[18] = virtAddr2->byte[8]; /* address of first failure */
9527 pLogPage[19] = virtAddr2->byte[7]; /* address of first failure LSB */
9529 /* SAT rev8 Table75, p 76 */
9530 switch (SelfTestExecutionStatus)
9533 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9534 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9535 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9538 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9539 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9540 pLogPage[22] = 0x81;
9543 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9544 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9545 pLogPage[22] = 0x82;
9548 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9549 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9550 pLogPage[22] = 0x83;
9553 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9554 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9555 pLogPage[22] = 0x84;
9558 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9559 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9560 pLogPage[22] = 0x85;
9563 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9564 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9565 pLogPage[22] = 0x86;
9568 pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR;
9569 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9570 pLogPage[22] = 0x87;
9573 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9574 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9575 pLogPage[22] = 0x88;
9577 case 9: /* fall through */
9578 case 10:/* fall through */
9579 case 11:/* fall through */
9580 case 12:/* fall through */
9581 case 13:/* fall through */
9584 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9585 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9586 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9589 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9590 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9591 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9594 TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus));
9596 satSetSensePayload( pSense,
9597 SCSI_SNSKEY_NO_SENSE,
9599 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9602 ostiInitiatorIOCompleted( tiRoot,
9603 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9605 SCSI_STAT_CHECK_CONDITION,
9606 satOrgIOContext->pTiSenseData,
9607 satOrgIOContext->interruptContext );
9609 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9611 satFreeIntIoResource( tiRoot,
9618 pLogPage[23] = 0; /* vendor specific */
9620 /* the rest of Self-test results log */
9621 /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/
9622 for (i=24;i<=403;i++)
9624 pLogPage[i] = 0; /* vendor specific */
9627 if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived)
9629 TI_DBG6(("satLogSenseCB: 2nd underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
9632 ostiInitiatorIOCompleted( tiRoot,
9633 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9635 lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH,
9637 satOrgIOContext->interruptContext );
9642 ostiInitiatorIOCompleted( tiRoot,
9647 satOrgIOContext->interruptContext);
9649 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9651 satFreeIntIoResource( tiRoot,
9657 else if (hostToDevFis->h.features == 0xda)
9659 TI_DBG5(("satLogSenseCB: SAT_SMART_RETURN_STATUS success\n"));
9661 /* fills in the log page from ATA output */
9662 /* SPC-4, 7.2.5, Table 209, 211, p 255 */
9663 pLogPage[0] = 0x2F; /* page code unspecified */
9664 pLogPage[1] = 0; /* reserved */
9665 pLogPage[2] = 0; /* page length */
9666 pLogPage[3] = 0x07; /* page length */
9669 SPC-4, 7.2.5, Table 211, p 255
9670 no vendor specific field
9672 pLogPage[4] = 0; /* Parameter Code */
9673 pLogPage[5] = 0; /* Parameter Code unspecfied but to do: */
9674 pLogPage[6] = 0; /* unspecified */
9675 pLogPage[7] = 0x03; /* Parameter length, unspecified */
9677 /* SAT rev8, 10.2.3.1 Table 72, p 73 */
9678 if (statDevToHostFisData.lbaMid == 0x4F || statDevToHostFisData.lbaHigh == 0xC2)
9680 pLogPage[8] = 0; /* Sense code */
9681 pLogPage[9] = 0; /* Sense code qualifier */
9683 else if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C)
9685 pLogPage[8] = 0x5D; /* Sense code */
9686 pLogPage[9] = 0x10; /* Sense code qualifier */
9689 /* Assumption: No support for SCT */
9690 pLogPage[10] = 0xFF; /* Most Recent Temperature Reading */
9692 if (INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH < lenReceived)
9694 TI_DBG6(("satLogSenseCB: 3rd underrun lenReceived %d len %d \n", lenReceived, INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH));
9697 ostiInitiatorIOCompleted( tiRoot,
9698 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9700 lenReceived - INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH,
9702 satOrgIOContext->interruptContext );
9707 ostiInitiatorIOCompleted( tiRoot,
9712 satOrgIOContext->interruptContext);
9715 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9717 satFreeIntIoResource( tiRoot,
9726 TI_DBG1(("satLogSenseCB: error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
9727 satSetSensePayload( pSense,
9728 SCSI_SNSKEY_NO_SENSE,
9730 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9733 ostiInitiatorIOCompleted( tiRoot,
9734 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9736 SCSI_STAT_CHECK_CONDITION,
9737 satOrgIOContext->pTiSenseData,
9738 satOrgIOContext->interruptContext );
9739 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9741 satFreeIntIoResource( tiRoot,
9750 TI_DBG1(("satLogSenseCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
9751 satSetSensePayload( pSense,
9752 SCSI_SNSKEY_NO_SENSE,
9754 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9757 ostiInitiatorIOCompleted( tiRoot,
9758 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9760 SCSI_STAT_CHECK_CONDITION,
9761 satOrgIOContext->pTiSenseData,
9762 satOrgIOContext->interruptContext );
9764 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9766 satFreeIntIoResource( tiRoot,
9776 /*****************************************************************************
9777 *! \brief satReadMediaSerialNumberCB
9779 * This routine is a callback function called from ossaSATACompleted().
9780 * This CB routine deals with Read Media Serial Number completion.
9782 * \param agRoot: Handles for this instance of SAS/SATA hardware
9783 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
9784 * \param agIOStatus: Status of completed I/O.
9785 * \param agSATAParm1: Additional info based on status.
9786 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
9788 * \param ioContext: Pointer to satIOContext_t.
9792 *****************************************************************************/
9793 void satReadMediaSerialNumberCB(
9795 agsaIORequest_t *agIORequest,
9797 agsaFisHeader_t *agFirstDword,
9799 agsaFrameHandle_t agFrameHandle,
9803 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
9804 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
9805 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
9806 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
9807 tdIORequestBody_t *tdIORequestBody;
9808 tdIORequestBody_t *tdOrgIORequestBody;
9809 satIOContext_t *satIOContext;
9810 satIOContext_t *satOrgIOContext;
9811 satInternalIo_t *satIntIo;
9812 satDeviceData_t *satDevData;
9814 scsiRspSense_t *pSense;
9815 tiIORequest_t *tiOrgIORequest;
9817 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
9818 tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */
9819 bit8 *pMediaSerialNumber;
9821 tiIniScsiCmnd_t *scsiCmnd;
9822 bit32 lenReceived = 0;
9824 TI_DBG4(("satReadMediaSerialNumberCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
9826 /* internally generate tiIOContext */
9827 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
9828 satIOContext = (satIOContext_t *) ioContext;
9829 satIntIo = satIOContext->satIntIoContext;
9830 satDevData = satIOContext->pSatDevData;
9831 hostToDevFis = satIOContext->pFis;
9833 if (satIntIo == agNULL)
9835 TI_DBG4(("satReadMediaSerialNumberCB: External satInternalIo_t satIntIoContext\n"));
9836 satOrgIOContext = satIOContext;
9837 tiOrgIORequest = tdIORequestBody->tiIORequest;
9838 pSense = satOrgIOContext->pSense;
9839 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg;
9840 /* SCSI command response payload to OS layer */
9841 pMediaSerialNumber = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9842 /* ATA command response payload */
9843 scsiCmnd = satOrgIOContext->pScsiCmnd;
9849 TI_DBG4(("satReadMediaSerialNumberCB: Internal satInternalIo_t satIntIoContext\n"));
9850 satOrgIOContext = satIOContext->satOrgIOContext;
9851 if (satOrgIOContext == agNULL)
9853 TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NULL, wrong\n"));
9858 TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NOT NULL\n"));
9860 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
9861 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
9863 pSense = satOrgIOContext->pSense;
9864 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg;
9865 /* SCSI command response payload to OS layer */
9866 pMediaSerialNumber = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9867 /* ATA command response payload */
9868 scsiCmnd = satOrgIOContext->pScsiCmnd;
9871 tdIORequestBody->ioCompleted = agTRUE;
9872 tdIORequestBody->ioStarted = agFALSE;
9874 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
9876 TI_DBG1(("satReadMediaSerialNumberCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
9877 ostiInitiatorIOCompleted (
9883 satOrgIOContext->interruptContext
9885 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9887 satFreeIntIoResource( tiRoot,
9893 if( agIOStatus != OSSA_IO_SUCCESS)
9895 /* Process abort case */
9896 if (agIOStatus == OSSA_IO_ABORTED)
9898 satProcessAbort(tiRoot,
9903 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9905 satFreeIntIoResource( tiRoot,
9910 satSetSensePayload( pSense,
9911 SCSI_SNSKEY_NOT_READY,
9913 SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
9916 ostiInitiatorIOCompleted( tiRoot,
9917 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9919 SCSI_STAT_CHECK_CONDITION,
9920 satOrgIOContext->pTiSenseData,
9921 satOrgIOContext->interruptContext );
9923 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9925 satFreeIntIoResource( tiRoot,
9931 /* process success case */
9932 lenReceived = (scsiCmnd->cdb[6] << (8*3)) + (scsiCmnd->cdb[7] << (8*2))
9933 + (scsiCmnd->cdb[8] << 8) + scsiCmnd->cdb[9];
9934 TI_DBG5(("satReadMediaSerialNumberCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
9936 if (hostToDevFis->h.command == SAT_READ_SECTORS ||
9937 hostToDevFis->h.command == SAT_READ_SECTORS_EXT
9940 pMediaSerialNumber[0] = 0;
9941 pMediaSerialNumber[1] = 0;
9942 pMediaSerialNumber[2] = 0;
9943 pMediaSerialNumber[3] = 4;
9944 pMediaSerialNumber[4] = 0;
9945 pMediaSerialNumber[5] = 0;
9946 pMediaSerialNumber[6] = 0;
9947 pMediaSerialNumber[7] = 0;
9949 if (ZERO_MEDIA_SERIAL_NUMBER_LENGTH < lenReceived)
9951 TI_DBG1(("satReadMediaSerialNumberCB: 1st underrun lenReceived %d len %d \n", lenReceived, ZERO_MEDIA_SERIAL_NUMBER_LENGTH));
9954 ostiInitiatorIOCompleted( tiRoot,
9955 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9957 lenReceived - ZERO_MEDIA_SERIAL_NUMBER_LENGTH,
9959 satOrgIOContext->interruptContext );
9964 ostiInitiatorIOCompleted( tiRoot,
9969 satOrgIOContext->interruptContext);
9971 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9973 satFreeIntIoResource( tiRoot,
9980 TI_DBG1(("satReadMediaSerialNumberCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
9981 satSetSensePayload( pSense,
9982 SCSI_SNSKEY_NO_SENSE,
9984 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9987 ostiInitiatorIOCompleted( tiRoot,
9988 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9990 SCSI_STAT_CHECK_CONDITION,
9991 satOrgIOContext->pTiSenseData,
9992 satOrgIOContext->interruptContext );
9994 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9996 satFreeIntIoResource( tiRoot,
10005 /*****************************************************************************
10006 *! \brief satReadBufferCB
10008 * This routine is a callback function called from ossaSATACompleted().
10009 * This CB routine deals with Read Buffer.
10011 * \param agRoot: Handles for this instance of SAS/SATA hardware
10012 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
10013 * \param agIOStatus: Status of completed I/O.
10014 * \param agSATAParm1: Additional info based on status.
10015 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
10017 * \param ioContext: Pointer to satIOContext_t.
10021 *****************************************************************************/
10022 void satReadBufferCB(
10023 agsaRoot_t *agRoot,
10024 agsaIORequest_t *agIORequest,
10026 agsaFisHeader_t *agFirstDword,
10028 agsaFrameHandle_t agFrameHandle,
10032 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
10033 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
10034 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
10035 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10036 tdIORequestBody_t *tdIORequestBody;
10037 tdIORequestBody_t *tdOrgIORequestBody;
10038 satIOContext_t *satIOContext;
10039 satIOContext_t *satOrgIOContext;
10040 satInternalIo_t *satIntIo;
10041 satDeviceData_t *satDevData;
10042 scsiRspSense_t *pSense;
10043 tiIORequest_t *tiOrgIORequest;
10044 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
10046 TI_DBG4(("satReadBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10048 /* internally generate tiIOContext */
10049 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
10050 satIOContext = (satIOContext_t *) ioContext;
10051 satIntIo = satIOContext->satIntIoContext;
10052 satDevData = satIOContext->pSatDevData;
10053 hostToDevFis = satIOContext->pFis;
10056 if (satIntIo == agNULL)
10058 TI_DBG4(("satReadBufferCB: External satInternalIo_t satIntIoContext\n"));
10059 satOrgIOContext = satIOContext;
10060 tiOrgIORequest = tdIORequestBody->tiIORequest;
10061 pSense = satOrgIOContext->pSense;
10063 /* SCSI command response payload to OS layer */
10065 /* ATA command response payload */
10070 TI_DBG4(("satReadBufferCB: Internal satInternalIo_t satIntIoContext\n"));
10071 satOrgIOContext = satIOContext->satOrgIOContext;
10072 if (satOrgIOContext == agNULL)
10074 TI_DBG4(("satReadBufferCB: satOrgIOContext is NULL, wrong\n"));
10079 TI_DBG4(("satReadBufferCB: satOrgIOContext is NOT NULL\n"));
10081 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10082 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10084 pSense = satOrgIOContext->pSense;
10086 /* SCSI command response payload to OS layer */
10088 /* ATA command response payload */
10092 tdIORequestBody->ioCompleted = agTRUE;
10093 tdIORequestBody->ioStarted = agFALSE;
10095 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10097 TI_DBG1(("satReadBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10098 ostiInitiatorIOCompleted (
10102 tiDetailOtherError,
10104 satOrgIOContext->interruptContext
10106 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10108 satFreeIntIoResource( tiRoot,
10114 if( agIOStatus != OSSA_IO_SUCCESS)
10116 /* Process abort case */
10117 if (agIOStatus == OSSA_IO_ABORTED)
10119 satProcessAbort(tiRoot,
10124 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10126 satFreeIntIoResource( tiRoot,
10131 satSetSensePayload( pSense,
10132 SCSI_SNSKEY_NOT_READY,
10134 SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
10137 ostiInitiatorIOCompleted( tiRoot,
10138 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10140 SCSI_STAT_CHECK_CONDITION,
10141 satOrgIOContext->pTiSenseData,
10142 satOrgIOContext->interruptContext );
10144 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10146 satFreeIntIoResource( tiRoot,
10152 /* process success case */
10153 if (hostToDevFis->h.command == SAT_READ_BUFFER )
10156 ostiInitiatorIOCompleted( tiRoot,
10161 satOrgIOContext->interruptContext);
10162 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10164 satFreeIntIoResource( tiRoot,
10171 TI_DBG1(("satReadBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
10172 satSetSensePayload( pSense,
10173 SCSI_SNSKEY_NO_SENSE,
10175 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
10178 ostiInitiatorIOCompleted( tiRoot,
10179 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10181 SCSI_STAT_CHECK_CONDITION,
10182 satOrgIOContext->pTiSenseData,
10183 satOrgIOContext->interruptContext );
10185 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10187 satFreeIntIoResource( tiRoot,
10197 /*****************************************************************************
10198 *! \brief satWriteBufferCB
10200 * This routine is a callback function called from ossaSATACompleted().
10201 * This CB routine deals with Write Buffer.
10203 * \param agRoot: Handles for this instance of SAS/SATA hardware
10204 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
10205 * \param agIOStatus: Status of completed I/O.
10206 * \param agSATAParm1: Additional info based on status.
10207 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
10209 * \param ioContext: Pointer to satIOContext_t.
10213 *****************************************************************************/
10214 void satWriteBufferCB(
10215 agsaRoot_t *agRoot,
10216 agsaIORequest_t *agIORequest,
10218 agsaFisHeader_t *agFirstDword,
10220 agsaFrameHandle_t agFrameHandle,
10224 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
10225 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
10226 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
10227 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10228 tdIORequestBody_t *tdIORequestBody;
10229 tdIORequestBody_t *tdOrgIORequestBody;
10230 satIOContext_t *satIOContext;
10231 satIOContext_t *satOrgIOContext;
10232 satInternalIo_t *satIntIo;
10233 satDeviceData_t *satDevData;
10234 scsiRspSense_t *pSense;
10235 tiIORequest_t *tiOrgIORequest;
10236 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
10238 TI_DBG4(("satWriteBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10240 /* internally generate tiIOContext */
10241 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
10242 satIOContext = (satIOContext_t *) ioContext;
10243 satIntIo = satIOContext->satIntIoContext;
10244 satDevData = satIOContext->pSatDevData;
10245 hostToDevFis = satIOContext->pFis;
10248 if (satIntIo == agNULL)
10250 TI_DBG4(("satWriteBufferCB: External satInternalIo_t satIntIoContext\n"));
10251 satOrgIOContext = satIOContext;
10252 tiOrgIORequest = tdIORequestBody->tiIORequest;
10253 pSense = satOrgIOContext->pSense;
10254 /* SCSI command response payload to OS layer */
10256 /* ATA command response payload */
10261 TI_DBG4(("satWriteBufferCB: Internal satInternalIo_t satIntIoContext\n"));
10262 satOrgIOContext = satIOContext->satOrgIOContext;
10263 if (satOrgIOContext == agNULL)
10265 TI_DBG4(("satWriteBufferCB: satOrgIOContext is NULL, wrong\n"));
10270 TI_DBG4(("satWriteBufferCB: satOrgIOContext is NOT NULL\n"));
10272 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10273 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10275 pSense = satOrgIOContext->pSense;
10276 /* SCSI command response payload to OS layer */
10278 /* ATA command response payload */
10282 tdIORequestBody->ioCompleted = agTRUE;
10283 tdIORequestBody->ioStarted = agFALSE;
10285 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10287 TI_DBG1(("satWriteBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10288 ostiInitiatorIOCompleted (
10292 tiDetailOtherError,
10294 satOrgIOContext->interruptContext
10296 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10298 satFreeIntIoResource( tiRoot,
10304 if( agIOStatus != OSSA_IO_SUCCESS)
10306 /* Process abort case */
10307 if (agIOStatus == OSSA_IO_ABORTED)
10309 satProcessAbort(tiRoot,
10314 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10316 satFreeIntIoResource( tiRoot,
10321 satSetSensePayload( pSense,
10322 SCSI_SNSKEY_NOT_READY,
10324 SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
10327 ostiInitiatorIOCompleted( tiRoot,
10328 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10330 SCSI_STAT_CHECK_CONDITION,
10331 satOrgIOContext->pTiSenseData,
10332 satOrgIOContext->interruptContext );
10334 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10336 satFreeIntIoResource( tiRoot,
10341 /* process success case */
10342 if (hostToDevFis->h.command == SAT_WRITE_BUFFER )
10345 ostiInitiatorIOCompleted( tiRoot,
10350 satOrgIOContext->interruptContext);
10351 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10353 satFreeIntIoResource( tiRoot,
10360 TI_DBG1(("satWriteBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
10361 satSetSensePayload( pSense,
10362 SCSI_SNSKEY_NO_SENSE,
10364 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
10367 ostiInitiatorIOCompleted( tiRoot,
10368 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10370 SCSI_STAT_CHECK_CONDITION,
10371 satOrgIOContext->pTiSenseData,
10372 satOrgIOContext->interruptContext );
10374 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10376 satFreeIntIoResource( tiRoot,
10386 /*****************************************************************************
10387 *! \brief satReassignBlocksCB
10389 * This routine is a callback function called from ossaSATACompleted().
10390 * This CB routine deals with Reassign Blocks.
10392 * \param agRoot: Handles for this instance of SAS/SATA hardware
10393 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
10394 * \param agIOStatus: Status of completed I/O.
10395 * \param agSATAParm1: Additional info based on status.
10396 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
10398 * \param ioContext: Pointer to satIOContext_t.
10402 *****************************************************************************/
10403 void satReassignBlocksCB(
10404 agsaRoot_t *agRoot,
10405 agsaIORequest_t *agIORequest,
10407 agsaFisHeader_t *agFirstDword,
10409 agsaFrameHandle_t agFrameHandle,
10413 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
10414 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
10415 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
10416 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10417 tdIORequestBody_t *tdIORequestBody;
10418 tdIORequestBody_t *tdOrgIORequestBody;
10419 satIOContext_t *satIOContext;
10420 satIOContext_t *satOrgIOContext;
10421 satIOContext_t *satNewIOContext;
10422 satInternalIo_t *satIntIo;
10423 satInternalIo_t *satNewIntIo = agNULL;
10424 satDeviceData_t *satDevData;
10426 scsiRspSense_t *pSense;
10427 tiIniScsiCmnd_t *scsiCmnd;
10428 tiIORequest_t *tiOrgIORequest;
10430 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
10431 bit32 ataStatus = 0;
10433 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
10434 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
10436 TI_DBG5(("satReassignBlocksCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10438 /* internally generate tiIOContext */
10439 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
10440 satIOContext = (satIOContext_t *) ioContext;
10441 satIntIo = satIOContext->satIntIoContext;
10442 satDevData = satIOContext->pSatDevData;
10443 hostToDevFis = satIOContext->pFis;
10445 if (satIntIo == agNULL)
10447 TI_DBG4(("satReassignBlocksCB: External satInternalIo_t satIntIoContext\n"));
10448 satOrgIOContext = satIOContext;
10449 tiOrgIORequest = tdIORequestBody->tiIORequest;
10450 tiScsiRequest = satOrgIOContext->tiScsiXchg;
10451 pSense = satOrgIOContext->pSense;
10452 scsiCmnd = satOrgIOContext->pScsiCmnd;
10456 TI_DBG4(("satReassignBlocksCB: Internal satInternalIo_t satIntIoContext\n"));
10457 satOrgIOContext = satIOContext->satOrgIOContext;
10458 if (satOrgIOContext == agNULL)
10460 TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NULL, Wrong\n"));
10465 TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NOT NULL, Wrong\n"));
10467 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10468 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10470 tiScsiRequest = satOrgIOContext->tiScsiXchg;
10471 pSense = satOrgIOContext->pSense;
10472 scsiCmnd = satOrgIOContext->pScsiCmnd;
10475 tdIORequestBody->ioCompleted = agTRUE;
10476 tdIORequestBody->ioStarted = agFALSE;
10478 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10480 TI_DBG1(("satReassignBlocksCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10481 ostiInitiatorIOCompleted (
10485 tiDetailOtherError,
10487 satOrgIOContext->interruptContext
10489 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10491 satFreeIntIoResource( tiRoot,
10497 if (agIOStatus != OSSA_IO_SUCCESS)
10499 /* only agsaFisRegDeviceToHost_t is expected */
10500 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
10501 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
10504 if (agIOStatus != OSSA_IO_SUCCESS)
10506 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
10507 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
10510 /* for debugging */
10511 if( agIOStatus != OSSA_IO_SUCCESS)
10513 TI_DBG1(("satReassignBlocksCB FAILED, NOT IO_SUCCESS\n"));
10515 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
10517 TI_DBG1(("satReassignBlocksCB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
10519 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
10520 (ataStatus & DF_ATA_STATUS_MASK)
10523 TI_DBG1(("satReassignBlocksCB FAILED, FAILED, error status\n"));
10526 /* Process abort case */
10527 if (agIOStatus == OSSA_IO_ABORTED)
10529 satProcessAbort(tiRoot,
10534 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10536 satFreeIntIoResource( tiRoot,
10542 /* for debugging */
10543 if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS ||
10544 hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT
10547 TI_DBG1(("satReassignBlocksCB SAT_READ_VERIFY_SECTORS(_EXT) failed\n"));
10548 /* Verify failed; send Write with same LBA */
10549 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10551 satFreeIntIoResource( tiRoot,
10555 satNewIntIo = satAllocIntIoResource( tiRoot,
10558 512, /* writing 1 sector */
10560 if (satNewIntIo == agNULL)
10562 /* memory allocation failure */
10563 satFreeIntIoResource( tiRoot,
10567 satSetSensePayload( pSense,
10568 SCSI_SNSKEY_HARDWARE_ERROR,
10570 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10573 ostiInitiatorIOCompleted( tiRoot,
10574 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10576 SCSI_STAT_CHECK_CONDITION,
10577 satOrgIOContext->pTiSenseData,
10578 satOrgIOContext->interruptContext );
10579 TI_DBG1(("satReassignBlocksCB: momory allocation fails\n"));
10581 } /* end memory allocation */
10583 satNewIOContext = satPrepareNewIO(
10591 /* send Write with same LBA */
10592 status = satReassignBlocks_2(
10594 &satNewIntIo->satIntTiIORequest,
10595 satNewIOContext->ptiDeviceHandle,
10596 &satNewIntIo->satIntTiScsiXchg,
10598 satOrgIOContext->LBA
10601 if (status != tiSuccess)
10603 /* sending ATA command fails */
10604 satFreeIntIoResource( tiRoot,
10607 satSetSensePayload( pSense,
10608 SCSI_SNSKEY_HARDWARE_ERROR,
10610 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10613 ostiInitiatorIOCompleted( tiRoot,
10614 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10616 SCSI_STAT_CHECK_CONDITION,
10617 satOrgIOContext->pTiSenseData,
10618 satOrgIOContext->interruptContext );
10619 TI_DBG1(("satReassignBlocksCB calling fail 1\n"));
10621 } /* end send fails */
10625 else if (hostToDevFis->h.command == SAT_WRITE_DMA ||
10626 hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10627 hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10628 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10629 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10632 TI_DBG1(("satReassignBlocksCB SAT_WRITE failed\n"));
10637 TI_DBG1(("satReassignBlocksCB error default case unexpected command 0x%x\n", hostToDevFis->h.command));
10641 satSetSensePayload( pSense,
10642 SCSI_SNSKEY_HARDWARE_ERROR,
10644 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10647 ostiInitiatorIOCompleted( tiRoot,
10648 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10650 SCSI_STAT_CHECK_CONDITION,
10651 satOrgIOContext->pTiSenseData,
10652 satOrgIOContext->interruptContext );
10655 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10657 satFreeIntIoResource( tiRoot,
10661 } /* error checking */
10665 /* prcessing the success case */
10666 if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS ||
10667 hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT ||
10668 hostToDevFis->h.command == SAT_WRITE_DMA ||
10669 hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10670 hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10671 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10672 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10675 /* next LBA; verify */
10676 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10678 satFreeIntIoResource( tiRoot,
10682 if (satOrgIOContext->ParmIndex >= satOrgIOContext->ParmLen)
10684 TI_DBG5(("satReassignBlocksCB: GOOD status\n"));
10685 /* return stat_good */
10686 ostiInitiatorIOCompleted( tiRoot,
10691 satOrgIOContext->interruptContext );
10696 TI_DBG5(("satReassignBlocksCB: processing next LBA\n"));
10697 satNewIntIo = satAllocIntIoResource( tiRoot,
10702 if (satNewIntIo == agNULL)
10704 /* memory allocation failure */
10705 satFreeIntIoResource( tiRoot,
10709 satSetSensePayload( pSense,
10710 SCSI_SNSKEY_HARDWARE_ERROR,
10712 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10715 ostiInitiatorIOCompleted( tiRoot,
10716 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10718 SCSI_STAT_CHECK_CONDITION,
10719 satOrgIOContext->pTiSenseData,
10720 satOrgIOContext->interruptContext );
10721 TI_DBG1(("satReassignBlocksCB: momory allocation fails\n"));
10723 } /* end memory allocation */
10725 satNewIOContext = satPrepareNewIO(
10733 /* send Verify with the next LBA */
10734 status = satReassignBlocks_1(
10736 &satNewIntIo->satIntTiIORequest,
10737 satNewIOContext->ptiDeviceHandle,
10738 tiScsiRequest, /* orginal from OS layer */
10743 if (status != tiSuccess)
10745 /* sending ATA command fails */
10746 satFreeIntIoResource( tiRoot,
10749 satSetSensePayload( pSense,
10750 SCSI_SNSKEY_HARDWARE_ERROR,
10752 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10755 ostiInitiatorIOCompleted( tiRoot,
10756 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10758 SCSI_STAT_CHECK_CONDITION,
10759 satOrgIOContext->pTiSenseData,
10760 satOrgIOContext->interruptContext );
10761 TI_DBG1(("satReassignBlocksCB calling satModeSelect6_1 fails\n"));
10763 } /* end send fails */
10768 else if (hostToDevFis->h.command == SAT_WRITE_DMA ||
10769 hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10770 hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10771 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10772 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10775 /* next LBA; verify */
10779 TI_DBG1(("satReassignBlocksCB error unknown command success 0x%x \n", hostToDevFis->h.command));
10781 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10783 satFreeIntIoResource( tiRoot,
10786 satSetSensePayload( pSense,
10787 SCSI_SNSKEY_HARDWARE_ERROR,
10789 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10792 ostiInitiatorIOCompleted( tiRoot,
10793 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10795 SCSI_STAT_CHECK_CONDITION,
10796 satOrgIOContext->pTiSenseData,
10797 satOrgIOContext->interruptContext );
10802 /*****************************************************************************
10803 *! \brief satReadLogExtCB
10805 * This routine is a callback function called from ossaSATACompleted().
10806 * This CB routine deals READ LOG EXT completion.
10808 * \param agRoot: Handles for this instance of SAS/SATA hardware
10809 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
10810 * \param agIOStatus: Status of completed I/O.
10811 * \param agFirstDword:Pointer to the four bytes of FIS.
10812 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
10814 * \param agParam: Additional info based on status.
10815 * \param ioContext: Pointer to satIOContext_t.
10819 *****************************************************************************/
10824 void satReadLogExtCB(
10825 agsaRoot_t *agRoot,
10826 agsaIORequest_t *agIORequest,
10828 agsaFisHeader_t *agFirstDword,
10836 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
10837 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
10838 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
10839 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10840 tdIORequestBody_t *tdIORequestBody;
10841 satIOContext_t *satReadLogExtIOContext;
10842 satInternalIo_t *satIntIo;
10843 satDeviceData_t *satDevData;
10844 tdsaDeviceData_t *tdsaDeviceData;
10845 agsaIORequest_t *agAbortIORequest;
10846 tdIORequestBody_t *tdAbortIORequestBody;
10849 bit32 memAllocStatus;
10852 TI_DBG1(("satReadLogExtCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
10853 agIORequest, agIOStatus, agIOInfoLen));
10855 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
10856 satReadLogExtIOContext = (satIOContext_t *) ioContext;
10857 satIntIo = satReadLogExtIOContext->satIntIoContext;
10858 satDevData = satReadLogExtIOContext->pSatDevData;
10859 tdsaDeviceData = (tdsaDeviceData_t *)satDevData->satSaDeviceData;
10861 TI_DBG1(("satReadLogExtCB: did %d\n", tdsaDeviceData->id));
10862 satDecrementPendingIO(tiRoot, tdsaAllShared, satReadLogExtIOContext);
10865 tdIORequestBody->ioCompleted = agTRUE;
10866 tdIORequestBody->ioStarted = agFALSE;
10869 * If READ LOG EXT failed, we issue device reset.
10871 if ( agIOStatus != OSSA_IO_SUCCESS ||
10872 (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
10875 TI_DBG1(("satReadLogExtCB: FAILED.\n"));
10877 satFreeIntIoResource( tiRoot,
10880 /* Abort I/O after completion of device reset */
10881 satDevData->satAbortAfterReset = agTRUE;
10883 /* needs to investigate this case */
10884 /* no report to OS layer */
10886 satReadLogExtIOContext->ptiDeviceHandle,
10887 TD_INTERNAL_TM_RESET,
10897 /***************************************************************************
10898 * The following steps take place when READ LOG EXT successfully completed.
10899 ***************************************************************************/
10901 /************************************************************************
10903 * 1. Issue abort to LL layer to all other pending I/Os for the same SATA
10906 * 2. Free resource allocated for the internally generated READ LOG EXT.
10908 * 3. At the completion of abort, in the context of ossaSATACompleted(),
10909 * return the I/O with error status to the OS-App Specific layer.
10910 * When all I/O aborts are completed, clear SATA device flag to
10911 * indicate ready to process new request.
10913 ***********************************************************************/
10916 * Issue abort to LL layer to all other pending I/Os for the same SATA drive
10919 replace the single IO abort with device abort
10922 TI_DBG1(("satReadLogExtCB: issuing saSATAAbort. Device Abort\n"));
10923 /* do not deregister this device */
10924 tdsaDeviceData->OSAbortAll = agTRUE;
10926 /* allocating agIORequest for abort itself */
10927 memAllocStatus = ostiAllocMemory(
10930 (void **)&tdAbortIORequestBody,
10934 sizeof(tdIORequestBody_t),
10938 if (memAllocStatus != tiSuccess)
10940 /* let os process IO */
10941 TI_DBG1(("satReadLogExtCB: ostiAllocMemory failed...\n"));
10945 if (tdAbortIORequestBody == agNULL)
10947 /* let os process IO */
10948 TI_DBG1(("satReadLogExtCB: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
10952 /* setup task management structure */
10953 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
10954 tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(tdsaDeviceData->tiDeviceHandle);
10955 /* initialize agIORequest */
10956 agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
10957 agAbortIORequest->osData = (void *) tdAbortIORequestBody;
10958 agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
10963 saSATAAbort( agRoot, agAbortIORequest, 0, tdsaDeviceData->agDevHandle, 1, agNULL, agNULL);
10967 * Free resource allocated for the internally generated READ LOG EXT.
10969 satFreeIntIoResource( tiRoot,
10974 * Sequence of recovery continue at some other context:
10975 * At the completion of abort, in the context of ossaSATACompleted(),
10976 * return the I/O with error status to the OS-App Specific layer.
10977 * When all I/O aborts are completed, clear SATA device flag to
10978 * indicate ready to process new request.
10981 satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
10983 TI_DBG1(("satReadLogExtCB: end return\n"));
10988 /*****************************************************************************
10989 *! \brief ossaSATAEvent
10991 * This routine is called to notify the OS Layer of an event associated with
10992 * SATA port or SATA device
10994 * \param agRoot: Handles for this instance of SAS/SATA hardware
10995 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
10996 * \param agPortContext Pointer to the port context of TD and Lower layer
10997 * \param agDevHandle: Pointer to a device handle
10998 * \param event: event type
11002 *****************************************************************************/
11003 osGLOBAL void ossaSATAEvent(
11004 agsaRoot_t *agRoot,
11005 agsaIORequest_t *agIORequest,
11006 agsaPortContext_t *agPortContext,
11007 agsaDevHandle_t *agDevHandle,
11014 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11015 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11016 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
11017 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11018 bit32 interruptContext = osData->IntContext;
11019 tdsaDeviceData_t *pDeviceData;
11020 satDeviceData_t *pSatDevData;
11021 satInternalIo_t *satIntIo = agNULL;
11023 satIOContext_t *satIOContext2;
11024 tdIORequestBody_t *tdIORequestBody;
11025 tiDeviceHandle_t *tiDeviceHandle;
11026 tiIORequest_t tiIORequestTMP;
11027 agsaDifDetails_t agDifDetails;
11028 bit8 framePayload[256];
11029 bit16 frameOffset = 0;
11030 bit16 frameLen = 0;
11033 tdsaDeviceData_t *tdsaDeviceData = agNULL;
11034 satIOContext_t *satIOContext;
11035 tdsaPortContext_t *onePortContext;
11037 if (event == OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE)
11040 /**************************************************************************
11042 * !!!! See Section 13.5.2.4 of SATA 2.5 specs. !!!!
11043 * !!!! If the NCQ error ends up here, it means that the device sent !!!!
11044 * !!!! Register Device To Host FIS (which does not have SActive !!!!
11045 * !!!! register) instead of Set Device Bit FIS (which has SActive !!!!
11046 * !!!! register). The routine osSatIOCompleted() deals with the case !!!!
11047 * !!!! where Set Device Bit FIS was sent by the device. !!!!
11049 * For NCQ we need to issue READ LOG EXT command with log page 10h
11050 * to get the error and to allow other I/Os to continue.
11052 * Here is the basic flow or sequence of error recovery, this sequence is
11053 * similar to the one described in SATA 2.5:
11055 * 1. Set SATA device flag to indicate error condition and returning busy
11056 * for all new request.
11058 * 2. Prepare READ LOG EXT page 10h command. Set flag to indicate that
11059 * the failed I/O has NOT been returned to the OS Layer. Send command.
11061 * 3. When the device receives READ LOG EXT page 10h request all other
11062 * pending I/O are implicitly aborted. No completion (aborted) status
11063 * will be sent to the host for these aborted commands.
11065 * 4. SATL receives the completion for READ LOG EXT command in
11066 * satReadLogExtCB(). Steps 5,6,7,8 below are the step 1,2,3,4 in
11067 * satReadLogExtCB().
11069 * 5. Check flag that indicates whether the failed I/O has been returned
11070 * to the OS Layer. If not, search the I/O context in device data
11071 * looking for a matched tag. Then return the completion of the failed
11072 * NCQ command with the appopriate/trasnlated SCSI status.
11074 * 6. Issue abort to LL layer to all other pending I/Os for the same SATA
11077 * 7. Free resource allocated for the internally generated READ LOG EXT.
11079 * 8. At the completion of abort, in the context of ossaSATACompleted(),
11080 * return the I/O with error status to the OS-App Specific layer.
11081 * When all I/O aborts are completed, clear SATA device flag to
11082 * indicate ready to process new request.
11084 *************************************************************************/
11086 pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
11087 pSatDevData = &pDeviceData->satDevData;
11088 tiDeviceHandle = &((tdsaDeviceData_t *)(pSatDevData->satSaDeviceData))->tiDeviceHandle;
11090 TI_DBG1(("ossaSATAEvent: did %d\n", pDeviceData->id));
11092 if (pSatDevData->satDriveState == SAT_DEV_STATE_NORMAL)
11094 TI_DBG1(("ossaSATAEvent: NCQ ERROR agDevHandle=%p.\n", agDevHandle ));
11096 /* Set flag to indicate we are in recovery */
11097 pSatDevData->satDriveState = SAT_DEV_STATE_IN_RECOVERY;
11100 * Allocate resource for READ LOG EXIT page 10h
11102 satIntIo = satAllocIntIoResource( tiRoot,
11103 &(tiIORequestTMP), /* anything but NULL */
11105 sizeof (satReadLogExtPage10h_t),
11109 * If we cannot allocate resource to do the normal NCQ recovery, we
11110 * will do SATA device reset.
11112 if (satIntIo == agNULL)
11114 /* Abort I/O after completion of device reset */
11115 pSatDevData->satAbortAfterReset = agTRUE;
11116 TI_DBG1(("ossaSATAEvent: can't send RLE due to resource lack\n"));
11119 /* needs to investigate this case */
11120 /* no report to OS layer */
11123 TD_INTERNAL_TM_RESET,
11135 * Clear flag to indicate that the failed I/O has NOT been returned to the
11136 * OS-App specific Layer.
11138 satIntIo->satIntFlag = 0;
11140 /* compare to satPrepareNewIO() */
11141 /* Send READ LOG EXIT page 10h command */
11144 * Need to initialize all the fields within satIOContext except
11145 * reqType and satCompleteCB which will be set depending on cmd.
11148 tdIORequestBody = (tdIORequestBody_t *)satIntIo->satIntRequestBody;
11149 satIOContext2 = &(tdIORequestBody->transport.SATA.satIOContext);
11151 satIOContext2->pSatDevData = pSatDevData;
11152 satIOContext2->pFis = &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
11153 satIOContext2->pScsiCmnd = &(satIntIo->satIntTiScsiXchg.scsiCmnd);
11154 satIOContext2->pSense = &(tdIORequestBody->transport.SATA.sensePayload);
11155 satIOContext2->pTiSenseData = &(tdIORequestBody->transport.SATA.tiSenseData);
11156 satIOContext2->pTiSenseData->senseData = satIOContext2->pSense;
11158 satIOContext2->tiRequestBody = satIntIo->satIntRequestBody;
11159 satIOContext2->interruptContext = interruptContext;
11160 satIOContext2->satIntIoContext = satIntIo;
11162 satIOContext2->ptiDeviceHandle = tiDeviceHandle;
11163 satIOContext2->satOrgIOContext = agNULL;
11164 satIOContext2->tiScsiXchg = agNULL;
11166 status = satSendReadLogExt( tiRoot,
11167 &satIntIo->satIntTiIORequest,
11169 &satIntIo->satIntTiScsiXchg,
11172 if (status !=tiSuccess)
11174 TI_DBG1(("ossaSATAEvent: can't send RLE due to LL api failure\n"));
11175 satFreeIntIoResource( tiRoot,
11178 /* Abort I/O after completion of device reset */
11179 pSatDevData->satAbortAfterReset = agTRUE;
11181 /* needs to investigate this case */
11182 /* no report to OS layer */
11185 TD_INTERNAL_TM_RESET,
11197 TI_DBG1(("ossaSATAEvent: NCQ ERROR but recovery in progress\n"));
11201 else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED)
11203 TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n"));
11205 else if (event == OSSA_IO_XFER_PIO_SETUP_ERROR)
11207 TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR\n"));
11210 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED)
11212 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n"));
11214 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO)
11216 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n"));
11218 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST)
11220 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n"));
11222 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE)
11224 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n"));
11226 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED)
11228 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n"));
11230 else if (event == OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH)
11232 TI_DBG1(("ossaSATAEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n"));
11234 else if (event == OSSA_IO_XFR_ERROR_DIF_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH ||
11235 event == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH)
11237 TI_DBG1(("ossaSSPEvent: DIF related, event 0x%x\n", event));
11238 /* process DIF detail information */
11239 TI_DBG2(("ossaSSPEvent: agIOInfoLen %d\n", agIOInfoLen));
11240 if (agParam == agNULL)
11242 TI_DBG2(("ossaSSPEvent: agParam is NULL!!!\n"));
11245 if (agIOInfoLen < sizeof(agsaDifDetails_t))
11247 TI_DBG2(("ossaSSPEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, sizeof(agsaDifDetails_t)));
11250 /* reads agsaDifDetails_t */
11251 saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t));
11252 frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF);
11253 frameLen = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16;
11255 TI_DBG2(("ossaSSPEvent: UpperLBA 0x%08x LowerLBA 0x%08x\n", agDifDetails.UpperLBA, agDifDetails.LowerLBA));
11256 TI_DBG2(("ossaSSPEvent: SASAddrHI 0x%08x SASAddrLO 0x%08x\n",
11257 TD_GET_SAS_ADDRESSHI(agDifDetails.sasAddressHi), TD_GET_SAS_ADDRESSLO(agDifDetails.sasAddressLo)));
11258 TI_DBG2(("ossaSSPEvent: DIF error mask 0x%x Device ID 0x%x\n",
11259 (agDifDetails.DIFErrDevID) & 0xFF, (agDifDetails.DIFErrDevID & 0xFFFF0000) >> 16));
11260 if (frameLen != 0 && frameLen <= 256)
11262 saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen);
11263 tdhexdump("ossaSSPEvent frame", framePayload, frameLen);
11268 TI_DBG1(("ossaSATAEvent: ERROR event %d agDevHandle=%p.\n", event, agDevHandle ));
11270 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
11271 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
11272 pSatDevData = satIOContext->pSatDevData;
11273 tdsaDeviceData = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData;
11274 onePortContext = tdsaDeviceData->tdPortContext;
11275 TI_DBG1(("ossaSATAEvent: did %d\n", tdsaDeviceData->id));
11277 /* send SMP_PHY_CONTROL_HARD_RESET */
11278 if (event == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA)
11280 if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
11282 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
11283 pSatDevData->NumOfFCA++;
11284 tdsaPhyControlSend(tiRoot,
11286 SMP_PHY_CONTROL_HARD_RESET,
11291 /* given up after one time of SMP HARD RESET; */
11292 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n"));
11293 if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0)
11296 1. remove this device
11297 2. device removal event
11299 tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData);
11300 tdsaDeviceData->valid = agFALSE;
11301 tdsaDeviceData->valid2 = agFALSE;
11302 tdsaDeviceData->registered = agFALSE;
11303 ostiInitiatorEvent(
11305 onePortContext->tiPortalContext,
11307 tiIntrEventTypeDeviceChange,
11317 #endif /* FDS_SM */
11319 /*****************************************************************************
11320 *! \brief itdsatErrorSATAEventHandle
11322 * This routine is called to handle SATA error event
11324 * \param agRoot: Handles for this instance of SAS/SATA hardware
11325 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
11326 * \param agPortContext Pointer to the port context of TD and Lower layer
11327 * \param agDevHandle: Pointer to a device handle
11328 * \param event: event type
11329 * \param ioContext: Pointer to satIOContext_t
11333 *****************************************************************************/
11334 osGLOBAL void itdsatErrorSATAEventHandle(
11335 agsaRoot_t *agRoot,
11336 agsaIORequest_t *agIORequest,
11337 agsaPortContext_t *agPortContext,
11338 agsaDevHandle_t *agDevHandle,
11340 satIOContext_t *ioContext
11343 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11344 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11345 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
11346 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11347 tdIORequestBody_t *tdOrgIORequestBody;
11348 satIOContext_t *satIOContext;
11349 satIOContext_t *satOrgIOContext;
11350 satInternalIo_t *satIntIo;
11351 satDeviceData_t *satDevData;
11352 bit32 interruptContext = osData->IntContext;
11354 TI_DBG1(("itdsatErrorSATAEventHandle: start\n"));
11355 satIOContext = (satIOContext_t *) ioContext;
11356 satIntIo = satIOContext->satIntIoContext;
11357 satDevData = satIOContext->pSatDevData;
11360 TI_DBG1(("itdsatErrorSATAEventHandle: event 0x%x\n", event));
11362 if (satIntIo == agNULL)
11364 TI_DBG1(("itdsatErrorSATAEventHandle: External, OS generated\n"));
11365 satOrgIOContext = satIOContext;
11366 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
11368 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
11370 satFreeIntIoResource( tiRoot,
11374 if (event == OSSA_IO_OVERFLOW)
11376 TI_DBG1(("itdsatErrorSATAEventHandle: tiIOOverRun\n"));
11377 ostiInitiatorIOCompleted( tiRoot,
11378 tdOrgIORequestBody->tiIORequest,
11386 TI_DBG1(("itdsatErrorSATAEventHandle: else\n"));
11387 ostiInitiatorIOCompleted( tiRoot,
11388 tdOrgIORequestBody->tiIORequest,
11390 tiDetailOtherError,
11397 TI_DBG1(("itdsatErrorSATAEventHandle: Internal, TD generated\n"));
11398 satOrgIOContext = satIOContext->satOrgIOContext;
11399 if (satOrgIOContext == agNULL)
11401 TI_DBG1(("itdsatErrorSATAEventHandle: satOrgIOContext is NULL, wrong\n"));
11406 TI_DBG6(("itdsatErrorSATAEventHandle: satOrgIOContext is NOT NULL\n"));
11408 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
11409 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
11411 satFreeIntIoResource( tiRoot,
11415 /* clean up TD layer's IORequestBody */
11418 tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11419 sizeof(tdIORequestBody_t)
11426 osGLOBAL void ossaSATAAbortCB(
11427 agsaRoot_t *agRoot,
11428 agsaIORequest_t *agIORequest,
11432 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11433 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11434 tdIORequestBody_t *tdAbortIORequestBody = agNULL;
11435 tdsaDeviceData_t *oneDeviceData = agNULL;
11436 tiDeviceHandle_t *tiDeviceHandle = agNULL;
11437 tiIORequest_t *taskTag = agNULL;
11439 TI_DBG1(("ossaSATAAbortCB: start\n"));
11441 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
11442 if (tdAbortIORequestBody == agNULL)
11444 TI_DBG1(("ossaSATAAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
11450 /* abort per port */
11451 TI_DBG1(("ossaSATAAbortCB: abort per port\n"));
11453 else if (flag == 1)
11455 TI_DBG1(("ossaSATAAbortCB: abort all\n"));
11456 tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
11457 if (tiDeviceHandle == agNULL)
11459 TI_DBG1(("ossaSATAAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
11462 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11463 sizeof(tdIORequestBody_t)
11468 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
11469 if (oneDeviceData == agNULL)
11471 TI_DBG1(("ossaSATAAbortCB: oneDeviceData is NULL warning!!!!\n"));
11474 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11475 sizeof(tdIORequestBody_t)
11480 if (status == OSSA_IO_SUCCESS)
11482 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n"));
11483 /* clean up TD layer's IORequestBody */
11484 if (oneDeviceData->OSAbortAll == agTRUE)
11486 oneDeviceData->OSAbortAll = agFALSE;
11487 ostiInitiatorEvent( tiRoot,
11490 tiIntrEventTypeLocalAbort,
11496 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11497 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11499 /* callback to OS layer here ??? */
11500 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11503 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11504 sizeof(tdIORequestBody_t)
11508 else if (status == OSSA_IO_NOT_VALID)
11510 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n"));
11512 Nothing is reproted to OS layer
11514 if (oneDeviceData->OSAbortAll == agTRUE)
11516 oneDeviceData->OSAbortAll = agFALSE;
11517 ostiInitiatorEvent( tiRoot,
11520 tiIntrEventTypeLocalAbort,
11526 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11527 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11529 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11532 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11533 sizeof(tdIORequestBody_t)
11536 else if (status == OSSA_IO_NO_DEVICE)
11538 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n"));
11540 Nothing is reproted to OS layer
11542 if (oneDeviceData->OSAbortAll == agTRUE)
11544 oneDeviceData->OSAbortAll = agFALSE;
11545 ostiInitiatorEvent( tiRoot,
11548 tiIntrEventTypeLocalAbort,
11554 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11555 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11557 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11560 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11561 sizeof(tdIORequestBody_t)
11564 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
11566 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
11568 Nothing is reproted to OS layer
11570 if (oneDeviceData->OSAbortAll == agTRUE)
11572 oneDeviceData->OSAbortAll = agFALSE;
11573 ostiInitiatorEvent( tiRoot,
11576 tiIntrEventTypeLocalAbort,
11582 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11583 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11585 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11588 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11589 sizeof(tdIORequestBody_t)
11594 TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status ));
11596 Nothing is reproted to OS layer
11598 if (oneDeviceData->OSAbortAll == agTRUE)
11600 oneDeviceData->OSAbortAll = agFALSE;
11601 ostiInitiatorEvent( tiRoot,
11604 tiIntrEventTypeLocalAbort,
11610 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11611 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11613 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11616 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11617 sizeof(tdIORequestBody_t)
11621 else if (flag == 0)
11623 TI_DBG1(("ossaSATAAbortCB: abort one\n"));
11624 taskTag = tdAbortIORequestBody->tiIOToBeAbortedRequest;
11626 if (status == OSSA_IO_SUCCESS)
11628 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n"));
11630 ostiInitiatorEvent( tiRoot,
11633 tiIntrEventTypeLocalAbort,
11638 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11639 sizeof(tdIORequestBody_t)
11643 else if (status == OSSA_IO_NOT_VALID)
11645 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n"));
11647 ostiInitiatorEvent( tiRoot,
11650 tiIntrEventTypeLocalAbort,
11656 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11657 sizeof(tdIORequestBody_t)
11660 else if (status == OSSA_IO_NO_DEVICE)
11662 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n"));
11664 ostiInitiatorEvent( tiRoot,
11667 tiIntrEventTypeLocalAbort,
11673 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11674 sizeof(tdIORequestBody_t)
11677 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
11679 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
11681 ostiInitiatorEvent( tiRoot,
11684 tiIntrEventTypeLocalAbort,
11690 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11691 sizeof(tdIORequestBody_t)
11696 TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status ));
11698 ostiInitiatorEvent( tiRoot,
11701 tiIntrEventTypeLocalAbort,
11707 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11708 sizeof(tdIORequestBody_t)
11714 TI_DBG1(("ossaSATAAbortCB: wrong flag %d\n", flag));
11719 /*****************************************************************************
11720 *! \brief ossaSATADeviceResetCB
11722 * This routine is called to complete a SATA device reset request previously
11723 * issued to the LL Layer in saSATADeviceReset().
11725 * \param agRoot: Handles for this instance of SAS/SATA hardware
11726 * \param agDevHandle: Pointer to a device handle
11727 * \param resetStatus: Reset status:
11728 * OSSA_SUCCESS: The reset operation completed successfully.
11729 * OSSA_FAILURE: The reset operation failed.
11730 * \param resetparm: Pointer to the Device-To-Host FIS received from the device.
11734 *****************************************************************************/
11736 ossaSATADeviceResetCB(
11737 agsaRoot_t *agRoot,
11738 agsaDevHandle_t *agDevHandle,
11742 bit32 tiResetStatus;
11743 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11744 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11745 tdsaDeviceData_t *pDeviceData;
11746 tiDeviceHandle_t *tiDeviceHandle;
11748 TI_DBG1(("ossaSATADeviceResetCB: agDevHandle=%p resetStatus=0x%x\n",
11749 agDevHandle, resetStatus ));
11751 pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
11752 tiDeviceHandle = &(pDeviceData->tiDeviceHandle);
11754 if (resetStatus == OSSA_SUCCESS )
11755 tiResetStatus = tiSuccess;
11757 tiResetStatus = tiError;
11759 osSatResetCB( tiRoot,
11767 /*****************************************************************************/
11768 /*! \brief satDecrementPendingIO
11770 * This function decrements the number of pending IO's
11772 * \param tiRoot: Pointer to TISA initiator driver/port instance.
11773 * \param tdsaAllShared: Pointer to TD context.
11774 * \param satIOContext_t: Pointer to the SAT IO Context
11779 /*****************************************************************************/
11781 satDecrementPendingIO(
11783 tdsaContext_t *tdsaAllShared,
11784 satIOContext_t *satIOContext
11787 satDeviceData_t *satDevData;
11789 TI_DBG4(("satDecrementPendingIO: start\n"));
11791 satDevData = satIOContext->pSatDevData;
11793 if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
11794 (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
11796 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
11797 satDevData->satPendingNCQIO--;
11798 satIOContext->pSatDevData->satPendingIO--;
11799 TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink);
11800 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
11804 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
11805 satDevData->satPendingNONNCQIO--;
11806 satIOContext->pSatDevData->satPendingIO--;
11807 TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink);
11808 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
11815 satTranslateATAPIErrorsToSCSIErrors(
11820 bit16 *pSenseCodeInfo
11823 if (pSenseKey == agNULL || pSenseCodeInfo == agNULL)
11825 TI_DBG0(("TranslateATAErrorsToSCSIErros: pSenseKey == agNULL || pSenseCodeInfo == agNULL\n"));
11829 if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & NM_ATA_ERROR_MASK))
11831 *pSenseKey = SCSI_SNSKEY_NOT_READY;
11832 *pSenseCodeInfo = 0x3a00;
11834 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ABRT_ATA_ERROR_MASK))
11836 *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
11837 *pSenseCodeInfo = 0;
11839 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MCR_ATA_ERROR_MASK))
11841 *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
11842 *pSenseCodeInfo = 0x5a01;
11844 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & IDNF_ATA_ERROR_MASK))
11846 *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
11847 *pSenseCodeInfo = 0x1401;
11849 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MC_ATA_ERROR_MASK))
11851 *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
11852 *pSenseCodeInfo = 0x2800;
11854 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & UNC_ATA_ERROR_MASK))
11857 *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
11858 *pSenseCodeInfo = 0x1100;
11860 /*add WRITE here */
11862 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ICRC_ATA_ERROR_MASK))
11864 *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
11865 *pSenseCodeInfo = 0x4703;
11867 else if((bATAStatus & DF_ATA_STATUS_MASK))
11869 *pSenseKey = SCSI_SNSKEY_HARDWARE_ERROR;
11870 *pSenseCodeInfo = 0x4400;
11874 TI_DBG0(("unhandled ata error: bATAStatus = 0x%x, bATAError = 0x%x\n",
11875 bATAStatus, bATAError));
11880 #endif /* #ifdef SATA_ENABLE */