1 /*******************************************************************************
3 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
5 *Redistribution and use in source and binary forms, with or without modification, are permitted provided
6 *that the following conditions are met:
7 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
9 *2. Redistributions in binary form must reproduce the above copyright notice,
10 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
11 *with the distribution.
13 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
14 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
15 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
17 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
18 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
19 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
20 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
22 ********************************************************************************/
23 /*****************************************************************************/
26 * This file contains initiator CB functions
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>
37 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
38 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
39 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
41 #include <dev/pms/RefTisa/tisa/api/titypes.h>
42 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
43 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
44 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
47 #include <dev/pms/RefTisa/sat/api/sm.h>
48 #include <dev/pms/RefTisa/sat/api/smapi.h>
49 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
53 #include <dev/pms/RefTisa/discovery/api/dm.h>
54 #include <dev/pms/RefTisa/discovery/api/dmapi.h>
55 #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
58 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
59 #include <dev/pms/freebsd/driver/common/osstring.h>
60 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
62 #ifdef INITIATOR_DRIVER
63 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
64 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
69 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
70 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
74 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
75 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
77 /*****************************************************************************
78 *! \brief itdssTaskCompleted
80 * Purpose: This routine is called to complete an task management request
81 * previously issued to the LL Layer. All task management completes with
82 * this function except query task management.
84 * \param agRoot: Pointer to driver Instance.
85 * \param agIORequest: Pointer to the I/O Request data structure for
87 * \param agIOStatus: Status of I/O just completed.
88 * \param agIOInfoLen: Length of the I/O information associated with this
90 * \param agParam A Handle used to refer to the response frame or handle
92 * \param agOtherInfo Residual count
95 * \note - This is a initiator specific function called by the jump table.
97 *****************************************************************************/
101 agsaIORequest_t *agIORequest,
108 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
109 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
110 tiIORequest_t *taskTag = agNULL, *currentTaskTag = agNULL;
111 tdIORequestBody_t *tdIORequestBody = agNULL;
112 tdIORequestBody_t *TMtdIORequestBody = agNULL;
113 tdIORequestBody_t *AborttdIORequestBody = agNULL;
114 agsaIORequest_t *agTaskedIORequest;
115 agsaSSPResponseInfoUnit_t agSSPRespIU;
118 #ifdef TD_DEBUG_ENABLE
121 agsaSASRequestBody_t *agSASRequestBody = agNULL;
122 agsaSSPScsiTaskMgntReq_t *agSSPTaskMgntRequest = agNULL;
123 agsaIORequest_t *agAbortIORequest;
124 tdIORequestBody_t *tdAbortIORequestBody;
127 bit32 memAllocStatus;
129 bit32 abortOrquery = agTRUE;
130 tiDeviceHandle_t *tiDeviceHandle = agNULL;
131 tdsaDeviceData_t *oneDeviceData = agNULL;
132 agsaDevHandle_t *agDevHandle = agNULL;
133 bit32 status = AGSA_RC_FAILURE;
135 TI_DBG2(("itdssTaskCompleted: start\n"));
137 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
139 /* check the agIOStatus */
140 currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag;
142 if (currentTaskTag == agNULL)
144 TI_DBG1(("itdssTaskCompleted: currentTaskTag is NULL \n"));
145 /* as the currentTaskTag is agNULL, shall not call ostiInitiatorEvent */
147 ostiInitiatorEvent( tiRoot,
150 tiIntrEventTypeTaskManagement,
154 /* free up allocated memory */
157 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
158 sizeof(tdIORequestBody_t)
163 if (agIOStatus != OSSA_IO_SUCCESS)
165 TI_DBG1(("itdssTaskCompleted: agIOStatus failed and tiTMFailed\n"));
166 if (agIOStatus == OSSA_IO_TM_TAG_NOT_FOUND)
168 TI_DBG1(("itdssTaskCompleted: agIOStatus OSSA_IO_TM_TAG_NOT_FOUND\n"));
171 if (agIOStatus == OSSA_IO_ABORTED)
173 TI_DBG1(("itdssTaskCompleted: agIOStatus OSSA_IO_ABORTED\n"));
177 TI_DBG1(("itdssTaskCompleted: agIOStatus 0x%x\n", agIOStatus));
179 ostiInitiatorEvent( tiRoot,
182 tiIntrEventTypeTaskManagement,
185 /* free up allocated memory */
188 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
189 sizeof(tdIORequestBody_t)
194 /* parse the task management response */
195 /* reads agsaSSPResponseInfoUnit_t */
196 saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
197 #ifdef TD_DEBUG_ENABLE
198 data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
200 respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
201 TI_DBG6(("itdssTaskCompleted: dataPres %d. should be 1\n", data_status));
202 /* reads response data */
203 saFrameReadBlock(agRoot, agParam,
204 sizeof(agsaSSPResponseInfoUnit_t),
206 TI_DBG6(("itdssTaskCompleted: res code %d. should be 0\n", respData[3]));
208 taskTag = tdIORequestBody->IOType.InitiatorTMIO.TaskTag;
209 if (taskTag == agNULL)
211 /* other than Abort Task or Query Task */
212 TI_DBG1(("itdssTaskCompleted: taskTag is NULL\n"));
214 abortOrquery = agFALSE;
215 TMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
219 /* Abort Task or Query Task */
220 TI_DBG2(("itdssTaskCompleted: taskTag is NOT NULL\n"));
221 abortOrquery = agTRUE;
222 TMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
225 TI_DBG2(("itdssTaskCompleted: TMtdIORequestBody %p\n", TMtdIORequestBody));
227 if (TMtdIORequestBody == agNULL)
229 TI_DBG1(("itdssTaskCompleted: TMtdIORequestBody is NULL \n"));
230 ostiInitiatorEvent( tiRoot,
233 tiIntrEventTypeTaskManagement,
236 /* free up allocated memory */
239 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
240 sizeof(tdIORequestBody_t)
245 if (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0)
247 TI_DBG1(("itdssTaskCompleted: agIOInfoLen is zero, wrong\n"));
248 ostiInitiatorEvent( tiRoot,
251 tiIntrEventTypeTaskManagement,
254 /* free up allocated memory */
257 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
258 sizeof(tdIORequestBody_t)
263 agSASRequestBody = (agsaSASRequestBody_t *)&(TMtdIORequestBody->transport.SAS.agSASRequestBody);
264 agSSPTaskMgntRequest = (agsaSSPScsiTaskMgntReq_t *)&(agSASRequestBody->sspTaskMgntReq);
265 TI_DBG2(("itdssTaskCompleted: agSSPTaskMgntRequest->taskMgntFunction 0x%x\n", agSSPTaskMgntRequest->taskMgntFunction));
267 if ( (agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK ||
268 agSSPTaskMgntRequest->taskMgntFunction == AGSA_QUERY_TASK) &&
269 abortOrquery == agFALSE
272 TI_DBG1(("itdssTaskCompleted: incorrect tasktag, first\n"));
273 ostiInitiatorEvent( tiRoot,
276 tiIntrEventTypeTaskManagement,
279 /* free up allocated memory */
282 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
283 sizeof(tdIORequestBody_t)
288 if ((agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK_SET ||
289 agSSPTaskMgntRequest->taskMgntFunction == AGSA_CLEAR_TASK_SET ||
290 agSSPTaskMgntRequest->taskMgntFunction == AGSA_LOGICAL_UNIT_RESET ||
291 agSSPTaskMgntRequest->taskMgntFunction == AGSA_CLEAR_ACA ) &&
292 abortOrquery == agTRUE
295 TI_DBG1(("itdssTaskCompleted: incorrect tasktag, second\n"));
296 ostiInitiatorEvent( tiRoot,
299 tiIntrEventTypeTaskManagement,
302 /* free up allocated memory */
305 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
306 sizeof(tdIORequestBody_t)
312 if (agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK)
314 TI_DBG2(("itdssTaskCompleted: calling saSSPAbort()\n"));
315 AborttdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
316 if (AborttdIORequestBody == agNULL)
318 TI_DBG1(("itdssTaskCompleted: wrong, AborttdIORequestBody is NULL\n"));
322 tiDeviceHandle = AborttdIORequestBody->tiDevHandle;
323 if (tiDeviceHandle == agNULL)
325 TI_DBG1(("itdssTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
328 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
329 if (oneDeviceData == agNULL)
331 TI_DBG1(("itdssTaskCompleted: wrong, oneDeviceData is NULL\n"));
334 agDevHandle = oneDeviceData->agDevHandle;
335 if (agDevHandle == agNULL)
337 TI_DBG1(("itdssTaskCompleted: wrong, agDevHandle is NULL\n"));
340 agTaskedIORequest = (agsaIORequest_t *)&(AborttdIORequestBody->agIORequest);
341 if (agTaskedIORequest == agNULL)
343 TI_DBG1(("itdssTaskCompleted: agTaskedIORequest is NULL \n"));
344 ostiInitiatorEvent( tiRoot,
347 tiIntrEventTypeTaskManagement,
350 /* free up allocated memory */
353 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
354 sizeof(tdIORequestBody_t)
360 /* allocating agIORequest for abort itself */
361 memAllocStatus = ostiAllocMemory(
364 (void **)&tdAbortIORequestBody,
368 sizeof(tdIORequestBody_t),
371 if (memAllocStatus != tiSuccess)
373 /* let os process IO */
374 TI_DBG1(("itdssTaskCompleted: ostiAllocMemory failed...\n"));
378 if (tdAbortIORequestBody == agNULL)
380 /* let os process IO */
381 TI_DBG1(("itdssTaskCompleted: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
385 /* setup task management structure */
386 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
387 tdAbortIORequestBody->tiDevHandle = tiDeviceHandle;
388 /* setting callback */
389 tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
391 /* setting to NULL because the local abort is triggered by TD layer */
392 tdAbortIORequestBody->tiIOToBeAbortedRequest = agNULL;
393 /* initialize agIORequest */
394 agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
395 agAbortIORequest->osData = (void *) tdAbortIORequestBody;
396 agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
398 status = saSSPAbort(agRoot, agAbortIORequest, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 0, agTaskedIORequest, agNULL);
399 if (status != AGSA_RC_SUCCESS)
401 TI_DBG1(("itdssTaskCompleted: saSSPAbort failed agIOInfoLen is zero, wrong\n"));
404 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
405 sizeof(tdIORequestBody_t)
411 parse the response and based on the parse,
414 if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_COMPLETE ||
415 respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED)
417 TI_DBG2(("itdssTaskCompleted: tiTMOK\n"));
418 tiDeviceHandle = TMtdIORequestBody->tiDevHandle;
419 if (tiDeviceHandle == agNULL)
421 TI_DBG1(("itdssTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
424 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
425 if (oneDeviceData == agNULL)
427 TI_DBG1(("itdssTaskCompleted: wrong, oneDeviceData is NULL\n"));
430 agDevHandle = oneDeviceData->agDevHandle;
431 if (agDevHandle == agNULL)
433 TI_DBG1(("itdssTaskCompleted: wrong, agDevHandle is NULL\n"));
435 TI_DBG2(("itdssTaskCompleted: setting Device state to SA_DS_OPERATIONAL\n"));
437 saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
439 ostiInitiatorEvent( tiRoot,
442 tiIntrEventTypeTaskManagement,
448 TI_DBG1(("itdssTaskCompleted: tiTMFailed\n"));
449 ostiInitiatorEvent( tiRoot,
452 tiIntrEventTypeTaskManagement,
458 /* free up allocated memory */
461 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
462 sizeof(tdIORequestBody_t)
467 #ifdef INITIATOR_DRIVER
469 /*****************************************************************************
470 *! \brief itdssQueryTaskCompleted
472 * Purpose: This routine is called to complete an query task management request
473 * previously issued to the LL Layer.
475 * \param agRoot: Pointer to driver Instance.
476 * \param agIORequest: Pointer to the I/O Request data structure for
478 * \param agIOStatus: Status of I/O just completed.
479 * \param agIOInfoLen: Length of the I/O information associated with this
481 * \param agParam A Handle used to refer to the response frame or handle
486 * \note - This is a initiator specific function called by the jump table.
488 *****************************************************************************/
490 itdssQueryTaskCompleted(
492 agsaIORequest_t *agIORequest,
499 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
500 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
501 tiIORequest_t *taskTag = agNULL;
502 tdIORequestBody_t *tdIORequestBody = agNULL; /* query task */
503 tdIORequestBody_t *TMtdIORequestBody = agNULL; /* IO being query tasked */
504 agsaIORequest_t *agTaskedIORequest = agNULL;
505 agsaSSPResponseInfoUnit_t agSSPRespIU;
508 #ifdef TD_DEBUG_ENABLE
511 agsaSASRequestBody_t *agSASRequestBody = agNULL;
512 agsaSSPScsiTaskMgntReq_t *agSSPTaskMgntRequest = agNULL;
514 agsaIORequest_t *agAbortIORequest = agNULL;
515 tdIORequestBody_t *tdAbortIORequestBody = agNULL;
518 bit32 memAllocStatus;
519 void *osMemHandle = agNULL;
520 tiDeviceHandle_t *tiDeviceHandle = agNULL;
521 tdsaDeviceData_t *oneDeviceData = agNULL;
522 agsaDevHandle_t *agDevHandle = agNULL;
524 TI_DBG2(("itdssQueryTaskComplted: start\n"));
526 /* query task management IORequestBody */
527 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
529 /* OS's tiIORequest for this query taks, which is agNULL */
530 //currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag;
533 currentTaskTag is agNULL for query task since it is generated by
536 if (agIOStatus != OSSA_IO_SUCCESS)
538 /* let os process IO */
539 TI_DBG1(("itdssQueryTaskComplted: agIOStatus failed and tiTMFailed\n"));
540 /* free up allocated memory */
543 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
544 sizeof(tdIORequestBody_t)
548 /* parse the task management response */
549 /* reads agsaSSPResponseInfoUnit_t */
550 saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
551 #ifdef TD_DEBUG_ENABLE
552 data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
554 respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
556 TI_DBG6(("itdssQueryTaskCompleted: dataPres %d. should be 1\n", data_status));
557 /* reads response data */
558 saFrameReadBlock(agRoot, agParam,
559 sizeof(agsaSSPResponseInfoUnit_t),
562 TI_DBG6(("itdssQueryTaskCompleted: res code %d. should be 0\n", respData[3]));
564 /* IO being query tasked */
565 taskTag = tdIORequestBody->IOType.InitiatorTMIO.TaskTag;
566 if (taskTag == agNULL)
568 TI_DBG1(("itdssQueryTaskComplted: taskTag is NULL \n"));
569 /* free up allocated memory */
572 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
573 sizeof(tdIORequestBody_t)
578 /* request body of IO being query tasked */
579 TMtdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
580 if (TMtdIORequestBody == agNULL)
582 TI_DBG1(("itdssQueryTaskComplted: TMtdIORequestBody is NULL \n"));
583 /* free up allocated memory */
586 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
587 sizeof(tdIORequestBody_t)
592 agTaskedIORequest = &(TMtdIORequestBody->agIORequest);
593 if (agTaskedIORequest == agNULL)
595 TI_DBG1(("itdssQueryTaskComplted: agTaskedIORequest is NULL \n"));
596 /* free up allocated memory */
599 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
600 sizeof(tdIORequestBody_t)
605 if (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0)
607 TI_DBG1(("itdssQueryTaskCompleted: agIOInfoLen is zero, wrong\n"));
608 /* free up allocated memory */
611 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
612 sizeof(tdIORequestBody_t)
616 /* this is query task itself */
617 agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
618 agSSPTaskMgntRequest = &(agSASRequestBody->sspTaskMgntReq);
619 if (agSSPTaskMgntRequest->taskMgntFunction == AGSA_QUERY_TASK)
622 process response for query task
623 For query task, response code must be either
624 TASK MANAGEMENT FUNCTION COMPLETE or TASK MANAGEMENT FUNCTION SUCCEEDED by
627 1. If TASK MANAGEMENT FUNCTION SUCCEEDE, do nothing
629 2. If TASK MANAGEMENT FUNCTION COMPLETE and IO is not completed,
630 retry by saSSPAbort()
632 if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED)
634 /* OK; IO is being process at the target; do nothing */
636 else if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_COMPLETE)
638 tiDeviceHandle = TMtdIORequestBody->tiDevHandle;
639 if (tiDeviceHandle == agNULL)
641 TI_DBG1(("itdssQueryTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
642 /* free up allocated memory */
645 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
646 sizeof(tdIORequestBody_t)
650 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
651 if (oneDeviceData == agNULL)
653 TI_DBG1(("itdssQueryTaskCompleted: wrong, oneDeviceData is NULL\n"));
654 /* free up allocated memory */
657 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
658 sizeof(tdIORequestBody_t)
663 agDevHandle = oneDeviceData->agDevHandle;
664 if (agDevHandle == agNULL)
666 TI_DBG1(("itdssQueryTaskCompleted: wrong, agDevHandle is NULL\n"));
668 /* if IO is not completed, retry IO by saSSPAbort() */
669 if (TMtdIORequestBody->ioCompleted != agTRUE)
671 /* allocating agIORequest for abort itself */
672 memAllocStatus = ostiAllocMemory(
675 (void **)&tdAbortIORequestBody,
679 sizeof(tdIORequestBody_t),
682 if (memAllocStatus != tiSuccess)
684 /* let os process IO */
685 TI_DBG1(("itdssQueryTaskCompleted: ostiAllocMemory failed...\n"));
686 /* free up allocated memory */
689 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
690 sizeof(tdIORequestBody_t)
695 if (tdAbortIORequestBody == agNULL)
697 /* let os process IO */
698 TI_DBG1(("itdssQueryTaskCompleted: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
699 /* free up allocated memory */
702 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
703 sizeof(tdIORequestBody_t)
709 /* setup task management structure */
710 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
711 tdAbortIORequestBody->tiDevHandle = tdIORequestBody->tiDevHandle;
712 tdAbortIORequestBody->tiIOToBeAbortedRequest = agNULL;
714 /* setting callback */
715 tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
717 /* initialize agIORequest */
718 agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
719 agAbortIORequest->osData = (void *) tdAbortIORequestBody;
720 agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
722 TI_DBG2(("itdssQueryTaskCompleted: issuing saSSPAbort()\n"));
723 status = saSSPAbort(agRoot, agAbortIORequest, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 0, agTaskedIORequest, agNULL);
724 if (status != AGSA_RC_SUCCESS)
726 TI_DBG1(("itdssQueryTaskCompleted: saSSPAbort failed agIOInfoLen is zero, wrong\n"));
729 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
730 sizeof(tdIORequestBody_t)
737 TI_DBG1(("itdssQueryTaskComplted: not expected response 0x%x\n",respData[3]));
742 TI_DBG1(("itdssQueryTaskCompleted: not expected task management fn %d\n",agSSPTaskMgntRequest->taskMgntFunction));
745 /* free up allocated memory */
748 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
749 sizeof(tdIORequestBody_t)
755 /*****************************************************************************
756 *! \brief itssdosIOCompleted
758 * Purpose: This routine is called to complete an I/O request previously
759 * issued to the LL Layer in saSSPStart().
761 * \param agRoot: Pointer to driver Instance.
762 * \param agIORequest: Pointer to the I/O Request data structure for
764 * \param agIOStatus: Status of I/O just completed.
765 * \param agIOInfoLen: Length of the I/O information associated with this
767 * \param agParam A Handle used to refer to the response frame or handle
769 * \param agOtherInfo Residual count
772 * \note - This is a initiator specific function called by the jump table.
774 *****************************************************************************/
778 agsaIORequest_t *agIORequest,
785 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
786 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
787 itdsaIni_t *Initiator = (itdsaIni_t *)osData->itdsaIni;
788 tdIORequestBody_t *tdIORequestBody = agNULL;
789 agsaSASRequestBody_t *agSASRequestBody = agNULL;
790 agsaSSPInitiatorRequest_t *agSSPInitiatorRequest = agNULL;
791 agsaSSPResponseInfoUnit_t agSSPRespIU;
793 bit32 scsi_status = 0;
795 tiDeviceHandle_t *tiDeviceHandle = agNULL;
796 tdsaDeviceData_t *oneDeviceData = agNULL;
798 TI_DBG6(("itdssIOCompleted: start\n"));
799 TI_DBG6(("itdssIOCompleted: agIOInfoLen %d\n", agIOInfoLen));
801 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
802 TD_ASSERT((NULL != tdIORequestBody), "itdssIOCompleted:tdIORequestBody NULL");
803 if ( NULL == tdIORequestBody ) // handle windows assert case
807 Initiator->NumIOsActive--;
810 if (tdIORequestBody->ioCompleted == agTRUE)
812 #ifdef TD_DEBUG_ENABLE
813 tiDeviceHandle = tdIORequestBody->tiDevHandle;
814 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
815 #endif /*TD_DEBUG_ENABLE*/
816 TI_DBG1(("itdssIOCompleted: Error!!!!!! double completion\n"));
817 #ifdef TD_DEBUG_ENABLE
818 TI_DBG1(("itdssIOCompleted: did %d \n", oneDeviceData->id));
819 #endif /*TD_DEBUG_ENABLE*/
822 if (Initiator->NumIOsActive == 0)
824 /* so far, no timer assocaicated here */
825 TI_DBG6(("itdssIOCompleted: no acitve IO's. Kill timers\n"));
828 if (tdIORequestBody->tiIORequest->osData == agNULL)
830 TI_DBG1( ("itdssIOCompleted: pos 1; "
831 "tdIORequestBody->tiIORequest->osData is null, wrong\n") );
835 tdIORequestBody->ioCompleted = agTRUE;
836 tdIORequestBody->ioStarted = agFALSE;
838 /* Process completion for debugging, printing cbd */
839 agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
840 agSSPInitiatorRequest = &(agSASRequestBody->sspInitiatorReq);
842 TI_DBG6( ("itdssIOCompleted: CDB 0x%x\n",
843 agSSPInitiatorRequest->sspCmdIU.cdb[0]) );
845 /* no respsonse or sense data; data has been processed */
846 if((agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0))
848 // if this is a standard Inquiry command, notify Stoport to set the
849 // device queue depth to maximize oustanding IO
850 if ( (agSSPInitiatorRequest->sspCmdIU.cdb[0] == SCSIOPC_INQUIRY) &&
851 ((agSSPInitiatorRequest->sspCmdIU.cdb[1] & 0x01) == 0))
854 tiDeviceHandle = tdIORequestBody->tiDevHandle;
857 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
858 if( oneDeviceData->DeviceType == TD_SAS_DEVICE )
860 qdepth = MAX_OUTSTANDING_IO_PER_LUN;
862 if( oneDeviceData->DeviceType == TD_SATA_DEVICE )
868 if ( ostiSetDeviceQueueDepth( tiRoot,
869 tdIORequestBody->tiIORequest,
870 MAX_OUTSTANDING_IO_PER_LUN ) == agFALSE )
872 TI_DBG1( ( "itdssIOCompleted: failed to call "
873 "ostiSetDeviceQueueDepth() Q=%d !!!\n", qdepth ) );
877 TI_DBG2(("itdssIOCompleted: set ostiSetDeviceQueueDepth() Q=%d\n",qdepth));
880 // SCSI command was completed OK, this is the normal path. Now call the
881 // OS Specific module about this completion.
882 ostiInitiatorIOCompleted(
884 tdIORequestBody->tiIORequest,
888 agTRUE /* intContext; is not being used */
895 TI_DBG6(("itdssIOCompleted: SUCCESS but data returned \n"));
896 TI_DBG6( ("itdssIOCompleted: agIOStatus SUCCESS but data returned 0x%x\n",
900 tiDeviceHandle = tdIORequestBody->tiDevHandle;
903 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
907 osti_memset(&agSSPRespIU, 0, sizeof(agsaSSPResponseInfoUnit_t));
909 saFrameReadBlock( agRoot,
913 sizeof(agsaSSPResponseInfoUnit_t) );
914 scsi_status = agSSPRespIU.status;
919 TI_DBG2( ("itdssIOCompleted: SCSI_STAT_GOOD %d\n",
920 Initiator->ScsiStatusCounts.GoodStatus) );
921 Initiator->ScsiStatusCounts.GoodStatus++;
923 case SCSI_STAT_CHECK_CONDITION:
924 TI_DBG1( ("itdssIOCompleted: SCSI_STAT_CHECK_CONDITION %d\n",
925 Initiator->ScsiStatusCounts.CheckCondition) );
926 Initiator->ScsiStatusCounts.CheckCondition++;
929 TI_DBG1( ("itdssIOCompleted: SCSI_STAT_BUSY %d\n",
930 Initiator->ScsiStatusCounts.BusyStatus) );
931 Initiator->ScsiStatusCounts.BusyStatus++;
933 case SCSI_STAT_RESV_CONFLICT:
934 TI_DBG1( ("itdssIOCompleted: SCSI_STAT_RESV_CONFLICT %d\n",
935 Initiator->ScsiStatusCounts.ResvConflict) );
936 Initiator->ScsiStatusCounts.ResvConflict++;
938 case SCSI_STAT_TASK_SET_FULL:
939 Initiator->ScsiStatusCounts.TaskSetFull++;
940 //agIOStatus = OSSA_IO_FAILED;
941 //agOtherInfo = tiDetailBusy;
942 TI_DBG1( ("itdssIOCompleted: SCSI_STAT_TASK_SET_FULL %d\n",
943 Initiator->ScsiStatusCounts.TaskSetFull) );
945 case SCSI_STAT_ACA_ACTIVE:
946 Initiator->ScsiStatusCounts.AcaActive++;
947 TI_DBG1( ("itdssIOCompleted: SCSI_STAT_ACA_ACTIVE %d\n",
948 Initiator->ScsiStatusCounts.AcaActive) );
950 case SCSI_STAT_TASK_ABORTED:
951 Initiator->ScsiStatusCounts.TaskAborted++;
952 TI_DBG1( ("itdssIOCompleted: SCSI_STAT_TASK_ABORTED %d\n",
953 Initiator->ScsiStatusCounts.TaskAborted) );
955 case SCSI_STAT_CONDITION_MET:
956 Initiator->ScsiStatusCounts.ConditionMet++;
957 TI_DBG1( ("itdssIOCompleted: SCSI_STAT_CONDITION_MET %d\n",
958 Initiator->ScsiStatusCounts.ConditionMet) );
960 case SCSI_STAT_INTERMEDIATE:
961 TI_DBG1( ("itdssIOCompleted: SCSI_STAT_INTERMEDIATE %d\n",
962 Initiator->ScsiStatusCounts.ObsoleteStatus) );
963 Initiator->ScsiStatusCounts.ObsoleteStatus++;
965 case SCSI_STAT_INTER_CONDIT_MET:
966 TI_DBG1( ("itdssIOCompleted: SCSI_STAT_INTER_CONDIT_MET %d\n",
967 Initiator->ScsiStatusCounts.ObsoleteStatus) );
968 Initiator->ScsiStatusCounts.ObsoleteStatus++;
970 case SCSI_STAT_COMMANDTERMINATED:
971 TI_DBG1( ("itdssIOCompleted: SCSI_STAT_COMMANDTERMINATED %d\n",
972 Initiator->ScsiStatusCounts.ObsoleteStatus) );
973 Initiator->ScsiStatusCounts.ObsoleteStatus++;
976 Initiator->ScsiStatusCounts.ObsoleteStatus++;
977 TI_DBG1( ("itdssIOCompleted: Unknown scsi_status %d 0x%x\n",
978 scsi_status,Initiator->ScsiStatusCounts.ObsoleteStatus) );
983 case OSSA_IO_SUCCESS:
984 itdssIOSuccessHandler( agRoot,
991 case OSSA_IO_ABORTED:
992 itdssIOAbortedHandler( agRoot,
999 case OSSA_IO_UNDERFLOW:
1000 itdssIOUnderFlowHandler( agRoot,
1007 case OSSA_IO_FAILED:
1008 itdssIOFailedHandler( agRoot,
1015 case OSSA_IO_ABORT_RESET:
1016 itdssIOAbortResetHandler( agRoot,
1023 case OSSA_IO_NO_DEVICE:
1024 itdssIONoDeviceHandler( agRoot,
1031 case OSSA_IO_XFER_ERROR_BREAK:
1032 itdssXferErrorBreakHandler( agRoot,
1039 case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
1040 itdssXferErrorPhyNotReadyHandler( agRoot,
1047 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
1048 itdssOpenCnxErrorProtocolNotSupprotedHandler( agRoot,
1055 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
1056 itdssOpenCnxErrorZoneViolationHandler( agRoot,
1063 case OSSA_IO_OPEN_CNX_ERROR_BREAK:
1064 itdssOpenCnxErrorBreakHandler( agRoot,
1071 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
1072 itdssOpenCnxErrorITNexusLossHandler( agRoot,
1079 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
1080 itdssOpenCnxErrorBadDestinationHandler( agRoot,
1087 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
1088 itdssOpenCnxErrorConnectionRateNotSupportedHandler( agRoot,
1095 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
1096 itdssOpenCnxErrorWrongDestinationHandler( agRoot,
1103 case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR:
1104 itdssOpenCnxErrorUnknownErrorHandler( agRoot,
1111 case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
1112 itdssXferErrorNAKReceivedHandler( agRoot,
1119 case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT:
1120 itdssXferErrorACKNAKTimeoutHandler( agRoot,
1127 case OSSA_IO_XFER_ERROR_DMA:
1128 itdssXferErrorDMAHandler( agRoot,
1135 case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
1136 itdssXferErrorOffsetMismatchHandler( agRoot,
1143 case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
1144 itdssXferOpenRetryTimeoutHandler( agRoot,
1151 case OSSA_IO_PORT_IN_RESET:
1152 itdssPortInResetHandler( agRoot,
1159 case OSSA_IO_DS_NON_OPERATIONAL:
1160 itdssDsNonOperationalHandler( agRoot,
1167 case OSSA_IO_DS_IN_RECOVERY:
1168 itdssDsInRecoveryHandler( agRoot,
1175 case OSSA_IO_TM_TAG_NOT_FOUND:
1176 itdssTmTagNotFoundHandler( agRoot,
1183 case OSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR:
1184 itdssSSPExtIUZeroLenHandler( agRoot,
1191 case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
1192 itdssXferErrorUnexpectedPhaseHandler( agRoot,
1200 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
1201 itdssXferOpenRetryBackoffThresholdReachedHandler( agRoot,
1208 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
1209 itdssOpenCnxErrorItNexusLossOpenTmoHandler( agRoot,
1216 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
1217 itdssOpenCnxErrorItNexusLossNoDestHandler( agRoot,
1224 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
1225 itdssOpenCnxErrorItNexusLossOpenCollideHandler( agRoot,
1232 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
1233 itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler( agRoot,
1240 // encryption IO error handling
1241 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
1242 case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
1243 case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
1244 case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
1245 case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
1246 case OSSA_IO_XFR_ERROR_INTERNAL_RAM:
1247 case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS:
1248 itdssEncryptionHandler( agRoot,
1256 /* DIF IO error handling */
1257 case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
1258 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
1259 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
1260 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
1261 itdssDifHandler( agRoot,
1268 case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
1269 itdssIOResourceUnavailableHandler( agRoot,
1276 case OSSA_MPI_IO_RQE_BUSY_FULL:
1277 itdssIORQEBusyFullHandler( agRoot,
1284 case OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME:
1285 itdssXferErrorInvalidSSPRspFrameHandler( agRoot,
1292 case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
1293 itdssXferErrorEOBDataOverrunHandler( agRoot,
1300 case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED:
1301 itdssOpenCnxErrorOpenPreemptedHandler( agRoot,
1309 TI_DBG1( ("itdssIOCompleted: Unknown agIOStatus 0x%x\n",agIOStatus) );
1310 itdssIODefaultHandler( agRoot,
1323 /*****************************************************************************
1324 *! \brief itdssSMPCompleted
1326 * Purpose: This routine is called to complete an SMP request previously
1327 * issued to the LL Layer in saSMPStart().
1329 * \param agRoot: Pointer to driver Instance.
1330 * \param agIORequest: Pointer to the I/O Request data structure for
1332 * \param agIOStatus: Status of I/O just completed.
1333 * \param agIOInfoLen: Length of the I/O information associated with this
1335 * \param agFrameHandle A Handle used to refer to the response frame
1339 * \note - This is a initiator specific function called by the jump table.
1341 *****************************************************************************/
1345 agsaIORequest_t *agIORequest,
1348 agsaFrameHandle_t agFrameHandle
1351 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1352 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1354 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1355 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
1357 tdssSMPRequestBody_t *tdSMPRequestBody;
1358 agsaSASRequestBody_t *agSASRequestBody;
1359 agsaSMPFrame_t *agSMPFrame;
1360 tdsaDeviceData_t *oneDeviceData;
1361 tiIORequest_t *CurrentTaskTag;
1362 tdsaPortContext_t *onePortContext;
1363 tdsaPortContext_t *oldonePortContext;
1364 smpReqPhyControl_t *smpPhyControlReq;
1366 tdssSMPFrameHeader_t *tdSMPFrameHeader;
1368 agsaDevHandle_t *agDevHandle;
1371 tdssSMPFrameHeader_t *tdRequestSMPFrameHeader;
1372 bit8 smpRequestHeader[4];
1374 bit8 SMPRequestFunction;
1376 TI_DBG3(("itdssSMPCompleted: start\n"));
1379 tdSMPRequestBody = (tdssSMPRequestBody_t *)agIORequest->osData;
1380 CurrentTaskTag = tdSMPRequestBody->CurrentTaskTag;
1382 oneDeviceData = tdSMPRequestBody->tdDevice;
1383 onePortContext = oneDeviceData->tdPortContext;
1384 agDevHandle = oneDeviceData->agDevHandle;
1387 agSASRequestBody = &(tdSMPRequestBody->agSASRequestBody);
1388 agSMPFrame = &(agSASRequestBody->smpFrame);
1391 SMPRequestFunction = tdSMPRequestBody->smpPayload[1];
1393 saFrameReadBlock(agRoot, tdSMPRequestBody->IndirectSMPResp, 0, smpRequestHeader, 4);
1394 tdRequestSMPFrameHeader = (tdssSMPFrameHeader_t *)smpRequestHeader;
1395 SMPRequestFunction = tdRequestSMPFrameHeader->smpFunction;
1398 TI_DBG3(("itdssSMPCompleted: agIORequest %p\n", agIORequest));
1399 TI_DBG3(("itdssSMPCompleted: SMPRequestbody %p\n", tdSMPRequestBody));
1401 if (onePortContext != agNULL)
1403 TI_DBG3(("itdssSMPCompleted: pid %d\n", onePortContext->id));
1407 TI_DBG1(("itdssSMPCompleted: Wrong!!! onePortContext is NULL\n"));
1410 tdSMPRequestBody->osMemHandle,
1411 sizeof(tdssSMPRequestBody_t)
1416 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1417 tdSMPRequestBody->IndirectSMPReqLen
1421 tdSMPRequestBody->IndirectSMPResposMemHandle,
1422 tdSMPRequestBody->IndirectSMPRespLen
1428 oldonePortContext = tdSMPRequestBody->tdPortContext;
1429 if (oldonePortContext != agNULL)
1431 TI_DBG3(("itdssSMPCompleted: old pid %d\n", oldonePortContext->id));
1435 TI_DBG1(("itdssSMPCompleted: Wrong!!! oldonePortContext is NULL\n"));
1438 tdSMPRequestBody->osMemHandle,
1439 sizeof(tdssSMPRequestBody_t)
1444 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1445 tdSMPRequestBody->IndirectSMPReqLen
1449 tdSMPRequestBody->IndirectSMPResposMemHandle,
1450 tdSMPRequestBody->IndirectSMPRespLen
1457 /* decrement the number of pending SMP */
1458 onePortContext->discovery.pendingSMP--;
1460 /* for port invalid case;
1461 full discovery -> full discovery; incremental discovery -> full discovery
1463 if (onePortContext != oldonePortContext)
1465 TI_DBG1(("itdssSMPCompleted: portcontext has changed!!!\n"));
1466 if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
1467 SMPRequestFunction == SMP_REPORT_PHY_SATA ||
1468 SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1470 /* stop SMP timer */
1471 if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1475 &(onePortContext->discovery.DiscoverySMPTimer)
1478 if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1482 &(oldonePortContext->discovery.DiscoverySMPTimer)
1487 /* clean up expanders data strucures; move to free exp when device is cleaned */
1488 tdsaCleanAllExp(tiRoot, oldonePortContext);
1489 /* remove devices */
1490 tdssInternalRemovals(oldonePortContext->agRoot,
1496 tdSMPRequestBody->osMemHandle,
1497 sizeof(tdssSMPRequestBody_t)
1502 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1503 tdSMPRequestBody->IndirectSMPReqLen
1507 tdSMPRequestBody->IndirectSMPResposMemHandle,
1508 tdSMPRequestBody->IndirectSMPRespLen
1514 if (onePortContext->valid == agFALSE)
1516 if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
1517 SMPRequestFunction == SMP_REPORT_PHY_SATA ||
1518 SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1520 /* stop SMP timer */
1521 if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1525 &(onePortContext->discovery.DiscoverySMPTimer)
1528 if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1532 &(oldonePortContext->discovery.DiscoverySMPTimer)
1537 if (onePortContext->discovery.pendingSMP == 0)
1539 TI_DBG1(("itdssSMPCompleted: aborting discovery\n"));
1540 tdsaSASDiscoverAbort(tiRoot, onePortContext);
1544 TI_DBG1(("itdssSMPCompleted: not yet abort; non zero pendingSMP %d\n", onePortContext->discovery.pendingSMP));
1548 tdSMPRequestBody->osMemHandle,
1549 sizeof(tdssSMPRequestBody_t)
1554 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1555 tdSMPRequestBody->IndirectSMPReqLen
1559 tdSMPRequestBody->IndirectSMPResposMemHandle,
1560 tdSMPRequestBody->IndirectSMPRespLen
1567 if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
1568 SMPRequestFunction == SMP_REPORT_PHY_SATA ||
1569 SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1571 /* stop SMP timer */
1572 if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1576 &(onePortContext->discovery.DiscoverySMPTimer)
1579 if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
1583 &(oldonePortContext->discovery.DiscoverySMPTimer)
1588 /* the host as of 4/16/08 does not use indirect SMP. So, check only OSSA_IO_SUCCESS status*/
1589 if (agIOStatus == OSSA_IO_SUCCESS)
1591 //tdhexdump("itdssSMPCompleted", (bit8*)agFrameHandle, agIOInfoLen);
1592 /* parsing SMP payload */
1594 saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
1596 saFrameReadBlock(agRoot, tdSMPRequestBody->IndirectSMPResp, 0, smpHeader, 4);
1598 tdSMPFrameHeader = (tdssSMPFrameHeader_t *)smpHeader;
1600 /* SMP function dependent payload */
1601 switch (tdSMPFrameHeader->smpFunction)
1603 case SMP_REPORT_GENERAL:
1604 TI_DBG3(("itdssSMPCompleted: report general\n"));
1605 if (agIOInfoLen != sizeof(smpRespReportGeneral_t) + 4 &&
1606 tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
1608 TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespReportGeneral_t) + 4));
1609 tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1612 tdSMPRequestBody->osMemHandle,
1613 sizeof(tdssSMPRequestBody_t)
1618 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1619 tdSMPRequestBody->IndirectSMPReqLen
1623 tdSMPRequestBody->IndirectSMPResposMemHandle,
1624 tdSMPRequestBody->IndirectSMPRespLen
1629 tdsaReportGeneralRespRcvd(
1640 TI_DBG3(("itdssSMPCompleted: discover\n"));
1641 if (agIOInfoLen != sizeof(smpRespDiscover_t) + 4 &&
1642 tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
1644 TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespDiscover_t) + 4));
1645 tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1648 tdSMPRequestBody->osMemHandle,
1649 sizeof(tdssSMPRequestBody_t)
1654 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1655 tdSMPRequestBody->IndirectSMPReqLen
1659 tdSMPRequestBody->IndirectSMPResposMemHandle,
1660 tdSMPRequestBody->IndirectSMPRespLen
1665 tdsaDiscoverRespRcvd(
1674 case SMP_REPORT_PHY_SATA:
1675 TI_DBG3(("itdssSMPCompleted: report phy sata\n"));
1676 if (agIOInfoLen != sizeof(smpRespReportPhySata_t) + 4 &&
1677 tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
1679 TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespReportPhySata_t) + 4));
1680 tdsaSATADiscoverDone(tiRoot, onePortContext, tiError);
1683 tdSMPRequestBody->osMemHandle,
1684 sizeof(tdssSMPRequestBody_t)
1689 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1690 tdSMPRequestBody->IndirectSMPReqLen
1694 tdSMPRequestBody->IndirectSMPResposMemHandle,
1695 tdSMPRequestBody->IndirectSMPRespLen
1700 tdsaReportPhySataRcvd(
1709 case SMP_CONFIGURE_ROUTING_INFORMATION:
1710 TI_DBG1(("itdssSMPCompleted: configure routing information\n"));
1711 if (agIOInfoLen != 4 &&
1712 tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
1714 TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
1715 tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1718 tdSMPRequestBody->osMemHandle,
1719 sizeof(tdssSMPRequestBody_t)
1724 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1725 tdSMPRequestBody->IndirectSMPReqLen
1729 tdSMPRequestBody->IndirectSMPResposMemHandle,
1730 tdSMPRequestBody->IndirectSMPRespLen
1735 tdsaConfigRoutingInfoRespRcvd(
1745 case SMP_PHY_CONTROL:
1746 TI_DBG3(("itdssSMPCompleted: phy control\n"));
1747 if (agIOInfoLen != 4 &&
1748 tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) /*zero length is expected */
1750 TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
1751 tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1754 tdSMPRequestBody->osMemHandle,
1755 sizeof(tdssSMPRequestBody_t)
1760 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1761 tdSMPRequestBody->IndirectSMPReqLen
1765 tdSMPRequestBody->IndirectSMPResposMemHandle,
1766 tdSMPRequestBody->IndirectSMPRespLen
1771 tdsaPhyControlRespRcvd(
1784 case SMP_REPORT_MANUFACTURE_INFORMATION:
1785 TI_DBG1(("itdssSMPCompleted: REPORT_MANUFACTURE_INFORMATION\n"));
1786 if (agIOInfoLen != sizeof(smpRespReportManufactureInfo_t) + 4 &&
1787 tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) /*zero length is expected */
1789 TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
1790 tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1793 tdSMPRequestBody->osMemHandle,
1794 sizeof(tdssSMPRequestBody_t)
1799 tdSMPRequestBody->IndirectSMPReqosMemHandle,
1800 tdSMPRequestBody->IndirectSMPReqLen
1804 tdSMPRequestBody->IndirectSMPResposMemHandle,
1805 tdSMPRequestBody->IndirectSMPRespLen
1810 tdsaReportManInfoRespRcvd(
1819 //end temp for testing
1821 case SMP_REPORT_ROUTING_INFORMATION:
1822 case SMP_REPORT_PHY_ERROR_LOG:
1823 case SMP_PHY_TEST_FUNCTION:
1824 case SMP_REPORT_MANUFACTURE_INFORMATION:
1825 case SMP_READ_GPIO_REGISTER:
1826 case SMP_WRITE_GPIO_REGISTER:
1828 TI_DBG1(("itdssSMPCompleted: wrong SMP function 0x%x\n", tdSMPFrameHeader->smpFunction));
1829 TI_DBG1(("itdssSMPCompleted: smpFrameType 0x%x\n", tdSMPFrameHeader->smpFrameType));
1830 TI_DBG1(("itdssSMPCompleted: smpFunctionResult 0x%x\n", tdSMPFrameHeader->smpFunctionResult));
1831 TI_DBG1(("itdssSMPCompleted: smpReserved 0x%x\n", tdSMPFrameHeader->smpReserved));
1832 tdhexdump("itdssSMPCompleted: SMP payload", (bit8 *)agFrameHandle, agIOInfoLen);
1836 else if (agIOStatus == OSSA_IO_ABORTED || agIOStatus == OSSA_IO_INVALID_LENGTH)
1838 /* no retry this case */
1839 TI_DBG1(("itdssSMPCompleted: OSSA_IO_ABORTED\n"));
1841 else if (agIOStatus == OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE)
1843 TI_DBG1(("itdssSMPCompleted: OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE\n"));
1844 saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
1845 tdSMPFrameHeader = (tdssSMPFrameHeader_t *)smpHeader;
1847 status = saSMPStart(
1850 tdSMPRequestBody->queueNumber, //tdsaAllShared->SMPQNum, //tdsaRotateQnumber(tiRoot, oneDeviceData),
1857 if (status == AGSA_RC_SUCCESS)
1859 /* increment the number of pending SMP */
1860 onePortContext->discovery.pendingSMP++;
1861 if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
1862 SMPRequestFunction == SMP_REPORT_PHY_SATA ||
1863 SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1865 /* start discovery-related SMP timer */
1866 tdsaDiscoverySMPTimer(tiRoot, onePortContext, (bit32)(tdSMPFrameHeader->smpFunction), tdSMPRequestBody);
1870 else if (status == AGSA_RC_BUSY)
1872 if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL ||
1873 tdSMPFrameHeader->smpFunction == SMP_DISCOVER ||
1874 tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA ||
1875 tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1877 tdsaSMPBusyTimer(tiRoot, onePortContext, oneDeviceData, tdSMPRequestBody);
1879 else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
1881 /* For taskmanagement SMP, let's fail task management failure */
1882 tdsaPhyControlFailureRespRcvd(
1895 else /* AGSA_RC_FAILURE */
1897 if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL ||
1898 tdSMPFrameHeader->smpFunction == SMP_DISCOVER ||
1899 tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA ||
1900 tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
1902 tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1904 else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
1906 /* task management failure */
1907 tdsaPhyControlFailureRespRcvd(
1923 if (tdSMPRequestBody->retries < SMP_RETRIES) /* 5 */
1925 /* retry the SMP again */
1926 TI_DBG1(("itdssSMPCompleted: failed! but retries %d agIOStatus 0x%x %d agIOInfoLen %d\n",
1927 tdSMPRequestBody->retries, agIOStatus, agIOStatus, agIOInfoLen));
1928 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
1929 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED ||
1930 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO ||
1931 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST ||
1932 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE ||
1933 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED ||
1934 agIOStatus == OSSA_IO_DS_NON_OPERATIONAL
1937 saSetDeviceState(agRoot, agNULL, tdSMPRequestBody->queueNumber, agDevHandle, SA_DS_OPERATIONAL);
1942 tdSMPRequestBody->queueNumber, //tdsaAllShared->SMPQNum, //tdsaRotateQnumber(tiRoot, oneDeviceData),
1948 /* increment the number of pending SMP */
1949 onePortContext->discovery.pendingSMP++;
1950 tdSMPRequestBody->retries++;
1955 tdSMPFrameHeader = (tdssSMPFrameHeader_t *)agSMPFrame->outFrameBuf;
1956 tdSMPPayload = (bit8 *)agSMPFrame->outFrameBuf + 4;
1957 TI_DBG1(("itdssSMPCompleted: failed! no more retry! agIOStatus 0x%x %d\n", agIOStatus, agIOStatus));
1958 if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL)
1960 TI_DBG1(("itdssSMPCompleted: failed! agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n"));
1963 if (agIOStatus == OSSA_IO_DS_IN_RECOVERY)
1965 TI_DBG1(("itdssSMPCompleted: failed! agIOStatus is OSSA_IO_DS_IN_RECOVERY\n"));
1968 if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL ||
1969 tdSMPFrameHeader->smpFunction == SMP_DISCOVER ||
1970 tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA ||
1971 tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION
1974 /* discovery failure */
1975 TI_DBG1(("itdssSMPCompleted: SMP function 0x%x\n", tdSMPFrameHeader->smpFunction));
1976 TI_DBG1(("itdssSMPCompleted: discover done with error\n"));
1977 tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1979 else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
1981 TI_DBG1(("itdssSMPCompleted: SMP_PHY_CONTROL\n"));
1982 smpPhyControlReq = (smpReqPhyControl_t *)tdSMPPayload;
1983 if (smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_CLEAR_AFFILIATION)
1985 TI_DBG1(("itdssSMPCompleted: discover done with error\n"));
1986 tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
1988 else if (smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_HARD_RESET ||
1989 smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_LINK_RESET )
1991 TI_DBG1(("itdssSMPCompleted: device reset failed\n"));
1992 if (CurrentTaskTag != agNULL )
1994 TI_DBG1(("itdssSMPCompleted: callback to OS layer with failure\n"));
1995 ostiInitiatorEvent( tiRoot,
1998 tiIntrEventTypeTaskManagement,
2004 /* hard reset was not done with this device */
2005 oneDeviceData->ResetCnt = 0;
2010 TI_DBG1(("itdssSMPCompleted: unknown phy operation 0x%x\n", smpPhyControlReq->phyOperation));
2012 } /* SMP_PHY_CONTROL */
2015 TI_DBG1(("itdssSMPCompleted: SMP function 0x%x\n", tdSMPFrameHeader->smpFunction));
2022 tdSMPRequestBody->osMemHandle,
2023 sizeof(tdssSMPRequestBody_t)
2028 tdSMPRequestBody->IndirectSMPReqosMemHandle,
2029 tdSMPRequestBody->IndirectSMPReqLen
2033 tdSMPRequestBody->IndirectSMPResposMemHandle,
2034 tdSMPRequestBody->IndirectSMPRespLen
2047 agsaIORequest_t *agIORequest,
2050 agsaFrameHandle_t agFrameHandle
2053 /* pass the payload to OS layer */
2054 TI_DBG3(("itdssSMPCompleted: start\n"));
2059 /*****************************************************************************
2060 *! \brief itdIoSuccessHandler
2062 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2063 * layer with agIOStatus = OSSA_IO_SUCCESS
2065 * \param agRoot: pointer to port instance
2066 * \param agIORequest: pointer to I/O request
2067 * \param agIOStatus: I/O status given by LL layer
2068 * \param agIOInfoLen: lenth of complete SAS RESP frame
2069 * \param agParam A Handle used to refer to the response frame or handle
2071 * \param agOtherInfo Residual count
2075 *****************************************************************************/
2077 itdssIOSuccessHandler(
2079 agsaIORequest_t *agIORequest,
2086 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2087 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2088 itdsaIni_t *Initiator = (itdsaIni_t *)osData->itdsaIni;
2089 tdIORequestBody_t *tdIORequestBody;
2090 agsaSSPResponseInfoUnit_t agSSPRespIU;
2091 tiSenseData_t senseData;
2092 bit8 senseDataPayload[256];
2099 tiDeviceHandle_t *tiDeviceHandle = agNULL;
2100 tdsaDeviceData_t *oneDeviceData = agNULL;
2102 TI_DBG2(("itdssIOSuccessHandler: start\n"));
2103 TI_DBG2(("itdssIOSuccessHandler: agIOInfoLen %d\n", agIOInfoLen));
2105 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2107 tdIORequestBody->ioCompleted = agTRUE;
2108 tdIORequestBody->ioStarted = agFALSE;
2111 agIOInfoLen must be >= sizeof(agsaSSPResponseInfoUnit_t), which is minimum
2114 if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t))
2116 TI_DBG1(("itdssIOSuccessHandler: First agIOInfoLen does not match!!!\n"));
2117 TI_DBG1(("itdssIOSuccessHandler: First agIOInfoLen 0x%x IU 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t)));
2118 ostiInitiatorIOCompleted(
2120 tdIORequestBody->tiIORequest, /* tiIORequest */
2124 agTRUE /* intContext; is not being used */
2128 /* reads agsaSSPResponseInfoUnit_t */
2129 saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
2131 data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
2132 scsi_status = agSSPRespIU.status;
2133 /* endianess is invovled here */
2134 senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU);
2135 respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
2137 TI_DBG2(("itdssIOSuccessHandler: dataPres=%x\n", data_status));
2138 TI_DBG2(("itdssIOSuccessHandler: scsi status=0x%x, senselen=0x%x resplen 0x%x\n", scsi_status, senseLen, respLen));
2141 sanity check: do not go beyond of agIOInfoLen. if happens, return error
2142 agIOInfoLen >= sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> OK
2143 because frame must be divisible by 4, so there can be extra padding
2144 agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> NOT OK
2146 if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
2148 TI_DBG1(("itdssIOSuccessHandler: Second agIOInfoLen does not match!!!\n"));
2149 TI_DBG1(("itdssIOSuccessHandler: Second agIOInfoLen 0x%x IU 0x%x senselen 0x%x resplen 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t), senseLen, respLen));
2151 ostiInitiatorIOCompleted(
2153 tdIORequestBody->tiIORequest, /* tiIORequest */
2157 agTRUE /* intContext; is not being used */
2162 /* reads response data */
2163 saFrameReadBlock(agRoot, agParam,
2164 sizeof(agsaSSPResponseInfoUnit_t),
2166 /* reads sense data */
2167 saFrameReadBlock(agRoot, agParam,
2168 sizeof(agsaSSPResponseInfoUnit_t)
2170 senseDataPayload, senseLen);
2172 if (data_status == 0)
2175 TI_DBG1(("itdssIOSuccessHandler: no data scsi_status 0x%x\n",scsi_status));
2177 ostiInitiatorIOCompleted(
2179 tdIORequestBody->tiIORequest, /* tiIORequest */
2183 agTRUE /* intContext; is not being used */
2189 if (data_status == 1)
2192 TI_DBG1(("itdssIOSuccessHandler: response data \n"));
2194 ostiInitiatorIOCompleted(
2196 tdIORequestBody->tiIORequest, /* tiIORequest */
2200 agTRUE /* intContext; is not being used */
2205 if (data_status == 2)
2208 TI_DBG2(("itdssIOSuccessHandler: sense data \n"));
2210 senseData.senseData = &senseDataPayload;
2211 senseData.senseLen = MIN(256, senseLen);
2213 tdhexdump("ResponseIU I", (bit8 *)&agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
2215 tiDeviceHandle = tdIORequestBody->tiDevHandle;
2216 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2217 TI_DBG1(("sense data Sense Key 0x%2X ASC(Code) 0x%2X ASCQ(Qualifier) 0x%2X, did 0x%x\n",*(senseDataPayload+ 2),*(senseDataPayload + 12),*(senseDataPayload + 13),
2218 oneDeviceData->id));
2219 tdhexdump("sense data I", (bit8 *)senseDataPayload, senseLen);
2220 // tdhexdump("sense data II", (bit8 *)senseData.senseData, senseData.senseLen);
2222 if (senseDataPayload[2] == SCSI_SENSE_KEY_RECOVERED_ERROR)
2224 Initiator->SenseKeyCounter.SoftError ++;
2226 else if (senseDataPayload[2] == SCSI_SENSE_KEY_NOT_READY)
2228 Initiator->SenseKeyCounter.MediumNotReady++;
2230 else if (senseDataPayload[2] == SCSI_SENSE_KEY_MEDIUM_ERROR)
2232 Initiator->SenseKeyCounter.MediumError++;
2234 else if (senseDataPayload[2] == SCSI_SENSE_KEY_HARDWARE_ERROR)
2236 Initiator->SenseKeyCounter.HardwareError++;
2238 else if (senseDataPayload[2] == SCSI_SENSE_KEY_ILLEGAL_REQUEST)
2240 Initiator->SenseKeyCounter.IllegalRequest++;
2242 else if (senseDataPayload[2] == SCSI_SENSE_KEY_UNIT_ATTENTION)
2244 Initiator->SenseKeyCounter.UnitAttention++;
2246 else if (senseDataPayload[2] == SCSI_SENSE_KEY_ABORTED_COMMAND)
2248 Initiator->SenseKeyCounter.AbortCommand++;
2252 Initiator->SenseKeyCounter.OtherKeyType++;
2255 /* when ASQ and ASCQ 0x04 0x11, does saLocalPhyControl for notify spinup */
2256 if ((senseDataPayload[12] == 0x04 && senseDataPayload[13] == 0x11))
2258 TI_DBG2(("itdssIOSuccessHandler: sending notfify spinup\n"));
2259 tiDeviceHandle = tdIORequestBody->tiDevHandle;
2260 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2261 if (oneDeviceData->directlyAttached == agTRUE)
2263 for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
2265 saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
2269 ostiInitiatorIOCompleted(
2272 tdIORequestBody->tiIORequest,
2276 agTRUE /* intContext; is not being used */
2280 if (data_status == 3)
2283 TI_DBG1(("itdssIOSuccessHandler: reserved wrong!!!\n"));
2284 ostiInitiatorIOCompleted(
2286 tdIORequestBody->tiIORequest, /* tiIORequest */
2290 agTRUE /* intContext; is not being used */
2297 /*****************************************************************************
2298 *! \brief itdssIOAbortedHandler
2300 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2301 * layer with agIOStatus = OSSA_IO_ABORTED
2303 * \param agRoot: pointer to port instance
2304 * \param agIORequest: pointer to I/O request
2305 * \param agIOStatus: I/O status given by LL layer
2306 * \param agIOInfoLen: lenth of complete SAS RESP frame
2307 * \param agParam A Handle used to refer to the response frame or handle
2309 * \param agOtherInfo Residual count
2313 *****************************************************************************/
2314 /* see itdosIOCompleted() and itdinit.c and itdIoAbortedHandler in itdio.c*/
2316 itdssIOAbortedHandler (
2318 agsaIORequest_t *agIORequest,
2325 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2326 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2327 bit32 intContext = osData->IntContext;
2328 tdIORequestBody_t *tdIORequestBody;
2329 tiDeviceHandle_t *tiDeviceHandle = agNULL;
2330 tdsaDeviceData_t *oneDeviceData = agNULL;
2332 TI_DBG2(("itdssIOAbortedHandler: start\n"));
2333 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2335 if (agIOStatus != OSSA_IO_ABORTED)
2337 TI_DBG1(("itdssIOAbortedHandler: incorrect agIOStatus 0x%x\n", agIOStatus));
2340 if (tdIORequestBody == agNULL)
2342 TI_DBG1(("itdssIOAbortedHandler: start\n"));
2346 if (tdIORequestBody != agNULL)
2348 tiDeviceHandle = tdIORequestBody->tiDevHandle;
2350 if (tiDeviceHandle != agNULL)
2352 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2354 if (oneDeviceData != agNULL)
2356 TI_DBG2(("itdssIOAbortedHandler: did %d \n", oneDeviceData->id));
2360 TI_DBG1(("itdssIOAbortedHandler: oneDeviceData is NULL\n"));
2364 ostiInitiatorIOCompleted (
2366 tdIORequestBody->tiIORequest,
2377 /*****************************************************************************
2378 *! \brief itdssIOOverFlowHandler
2380 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2381 * layer with agIOStatus = OSSA_IO_OVERFLOW
2383 * \param agRoot: pointer to port instance
2384 * \param agIORequest: pointer to I/O request
2385 * \param agIOStatus: I/O status given by LL layer
2386 * \param agIOInfoLen: lenth of complete SAS RESP frame
2387 * \param agParam A Handle used to refer to the response frame or handle
2392 *****************************************************************************/
2394 itdssIOOverFlowHandler(
2396 agsaIORequest_t *agIORequest,
2402 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2403 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2404 bit32 intContext = osData->IntContext;
2405 tdIORequestBody_t *tdIORequestBody;
2407 TI_DBG2(("itdssIOOverFlowHandler: start\n"));
2408 TI_DBG2(("itdssIOOverFlowHandler: not transferred byte 0x%x\n", agIOInfoLen));
2410 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2412 ostiInitiatorIOCompleted (
2414 tdIORequestBody->tiIORequest,
2426 /*****************************************************************************
2427 *! \brief itdssIOUnderFlowHandler
2429 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2430 * layer with agIOStatus = OSSA_IO_UNDERFLOW
2432 * \param agRoot: pointer to port instance
2433 * \param agIORequest: pointer to I/O request
2434 * \param agIOStatus: I/O status given by LL layer
2435 * \param agIOInfoLen: lenth of complete SAS RESP frame
2436 * \param agParam A Handle used to refer to the response frame or handle
2438 * \param agOtherInfo Residual count
2442 *****************************************************************************/
2444 itdssIOUnderFlowHandler(
2446 agsaIORequest_t *agIORequest,
2453 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2454 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2455 bit32 intContext = osData->IntContext;
2456 tdIORequestBody_t *tdIORequestBody;
2458 TI_DBG6(("itdssIOUnderFlowHandler: start\n"));
2459 TI_DBG6(("itdssIOUnderFlowHandler: agIOInfoLen 0x%x\n", agIOInfoLen));
2461 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2463 ostiInitiatorIOCompleted (
2465 tdIORequestBody->tiIORequest,
2475 /*****************************************************************************
2476 *! \brief itdssIOFailedHandler
2478 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2479 * layer with agIOStatus = OSSA_IO_FAILED
2481 * \param agRoot: pointer to port instance
2482 * \param agIORequest: pointer to I/O request
2483 * \param agIOStatus: I/O status given by LL layer
2484 * \param agIOInfoLen: lenth of complete SAS RESP frame
2485 * \param agParam A Handle used to refer to the response frame or handle
2487 * \param agOtherInfo Residual count
2491 *****************************************************************************/
2493 itdssIOFailedHandler(
2495 agsaIORequest_t *agIORequest,
2502 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2503 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2504 bit32 intContext = osData->IntContext;
2505 tdIORequestBody_t *tdIORequestBody;
2507 TI_DBG1(("itdssIOFailedHandler: start\n"));
2509 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2511 ostiInitiatorIOCompleted (
2513 tdIORequestBody->tiIORequest,
2522 /*****************************************************************************
2523 *! \brief itdssIOAbortResetHandler
2525 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2526 * layer with agIOStatus = OSSA_IO_ABORT_RESET
2528 * \param agRoot: pointer to port instance
2529 * \param agIORequest: pointer to I/O request
2530 * \param agIOStatus: I/O status given by LL layer
2531 * \param agIOInfoLen: lenth of complete SAS RESP frame
2532 * \param agParam A Handle used to refer to the response frame or handle
2534 * \param agOtherInfo Residual count
2538 *****************************************************************************/
2540 itdssIOAbortResetHandler(
2542 agsaIORequest_t *agIORequest,
2549 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2550 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2551 bit32 intContext = osData->IntContext;
2552 tdIORequestBody_t *tdIORequestBody;
2553 TI_DBG2(("itdssIOAbortResetHandler: start\n"));
2555 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2557 ostiInitiatorIOCompleted (
2559 tdIORequestBody->tiIORequest,
2570 /*****************************************************************************
2571 *! \brief itdssIONotValidHandler
2573 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2574 * layer with agIOStatus = OSSA_IO_NOT_VALID
2576 * \param agRoot: pointer to port instance
2577 * \param agIORequest: pointer to I/O request
2578 * \param agIOStatus: I/O status given by LL layer
2579 * \param agIOInfoLen: lenth of complete SAS RESP frame
2580 * \param agParam A Handle used to refer to the response frame or handle
2582 * \param agOtherInfo Residual count
2586 *****************************************************************************/
2588 itdssIONotValidHandler(
2590 agsaIORequest_t *agIORequest,
2597 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2598 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2599 bit32 intContext = osData->IntContext;
2600 tdIORequestBody_t *tdIORequestBody;
2601 TI_DBG2(("itdssIONotValidHandler: start\n"));
2603 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2605 ostiInitiatorIOCompleted (
2607 tdIORequestBody->tiIORequest,
2616 /*****************************************************************************
2617 *! \brief itdssIONoDeviceHandler
2619 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2620 * layer with agIOStatus = OSSA_IO_NO_DEVICE
2622 * \param agRoot: pointer to port instance
2623 * \param agIORequest: pointer to I/O request
2624 * \param agIOStatus: I/O status given by LL layer
2625 * \param agIOInfoLen: lenth of complete SAS RESP frame
2626 * \param agParam A Handle used to refer to the response frame or handle
2628 * \param agOtherInfo Residual count
2632 *****************************************************************************/
2634 itdssIONoDeviceHandler(
2636 agsaIORequest_t *agIORequest,
2643 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2644 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2645 bit32 intContext = osData->IntContext;
2646 tdIORequestBody_t *tdIORequestBody;
2647 TI_DBG2(("itdssIONoDeviceHandler: start\n"));
2649 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2651 ostiInitiatorIOCompleted (
2653 tdIORequestBody->tiIORequest,
2662 #ifdef REMOVED /* to do: removed from spec */
2663 /*****************************************************************************
2664 *! \brief itdssIllegalParameterHandler
2666 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2667 * layer with agIOStatus = OSSA_IO_ILLEGAL_PARAMETER
2669 * \param agRoot: pointer to port instance
2670 * \param agIORequest: pointer to I/O request
2671 * \param agIOStatus: I/O status given by LL layer
2672 * \param agIOInfoLen: lenth of complete SAS RESP frame
2673 * \param agParam A Handle used to refer to the response frame or handle
2678 *****************************************************************************/
2680 itdssIllegalParameterHandler(
2682 agsaIORequest_t *agIORequest,
2688 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2689 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2690 bit32 intContext = osData->IntContext;
2691 tdIORequestBody_t *tdIORequestBody;
2692 TI_DBG2(("itdssIllegalParameterHandler: start\n"));
2694 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2696 ostiInitiatorIOCompleted (
2698 tdIORequestBody->tiIORequest,
2709 /*****************************************************************************
2710 *! \brief itdssLinkFailureHandler
2712 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2713 * layer with agIOStatus = OSSA_IO_LINK_FAILURE
2715 * \param agRoot: pointer to port instance
2716 * \param agIORequest: pointer to I/O request
2717 * \param agIOStatus: I/O status given by LL layer
2718 * \param agIOInfoLen: lenth of complete SAS RESP frame
2719 * \param agParam A Handle used to refer to the response frame or handle
2721 * \param agOtherInfo Residual count
2725 *****************************************************************************/
2727 itdssLinkFailureHandler(
2729 agsaIORequest_t *agIORequest,
2736 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2737 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2738 bit32 intContext = osData->IntContext;
2739 tdIORequestBody_t *tdIORequestBody;
2740 TI_DBG1(("itdssLinkFailureHandler: start\n"));
2742 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2744 ostiInitiatorIOCompleted (
2746 tdIORequestBody->tiIORequest,
2756 /*****************************************************************************
2757 *! \brief itdssProgErrorHandler
2759 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2760 * layer with agIOStatus = OSSA_IO_PROG_ERROR
2762 * \param agRoot: pointer to port instance
2763 * \param agIORequest: pointer to I/O request
2764 * \param agIOStatus: I/O status given by LL layer
2765 * \param agIOInfoLen: lenth of complete SAS RESP frame
2766 * \param agParam A Handle used to refer to the response frame or handle
2768 * \param agOtherInfo Residual count
2772 *****************************************************************************/
2774 itdssProgErrorHandler(
2776 agsaIORequest_t *agIORequest,
2783 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2784 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2785 bit32 intContext = osData->IntContext;
2786 tdIORequestBody_t *tdIORequestBody;
2787 TI_DBG2(("itdssProgErrorHandler: start\n"));
2789 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2791 ostiInitiatorIOCompleted (
2793 tdIORequestBody->tiIORequest,
2803 /*****************************************************************************
2804 *! \brief itdssXferErrorBreakHandler
2806 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2807 * layer with agIOStatus = OSSA_IO_XFER_ERROR_BREAK
2809 * \param agRoot: pointer to port instance
2810 * \param agIORequest: pointer to I/O request
2811 * \param agIOStatus: I/O status given by LL layer
2812 * \param agIOInfoLen: lenth of complete SAS RESP frame
2813 * \param agParam A Handle used to refer to the response frame or handle
2815 * \param agOtherInfo Residual count
2819 *****************************************************************************/
2821 itdssXferErrorBreakHandler(
2823 agsaIORequest_t *agIORequest,
2830 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2831 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2832 bit32 intContext = osData->IntContext;
2833 tdIORequestBody_t *tdIORequestBody;
2834 TI_DBG1(("itdssXferErrorBreakHandler: start\n"));
2836 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2838 ostiInitiatorIOCompleted (
2840 tdIORequestBody->tiIORequest,
2850 /*****************************************************************************
2851 *! \brief itdssXferErrorPhyNotReadyHandler
2853 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2854 * layer with agIOStatus = OSSA_IO_XFER_ERROR_PHY_NOT_READY
2856 * \param agRoot: pointer to port instance
2857 * \param agIORequest: pointer to I/O request
2858 * \param agIOStatus: I/O status given by LL layer
2859 * \param agIOInfoLen: lenth of complete SAS RESP frame
2860 * \param agParam A Handle used to refer to the response frame or handle
2862 * \param agOtherInfo Residual count
2866 *****************************************************************************/
2868 itdssXferErrorPhyNotReadyHandler(
2870 agsaIORequest_t *agIORequest,
2877 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2878 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2879 bit32 intContext = osData->IntContext;
2880 tdIORequestBody_t *tdIORequestBody;
2881 TI_DBG2(("itdssXferErrorPhyNotReadyHandler: start\n"));
2883 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2885 ostiInitiatorIOCompleted (
2887 tdIORequestBody->tiIORequest,
2897 /*****************************************************************************
2898 *! \brief itdssOpenCnxErrorProtocolNotSupprotedHandler
2900 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2901 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED
2903 * \param agRoot: pointer to port instance
2904 * \param agIORequest: pointer to I/O request
2905 * \param agIOStatus: I/O status given by LL layer
2906 * \param agIOInfoLen: lenth of complete SAS RESP frame
2907 * \param agParam A Handle used to refer to the response frame or handle
2909 * \param agOtherInfo Residual count
2913 *****************************************************************************/
2915 itdssOpenCnxErrorProtocolNotSupprotedHandler(
2917 agsaIORequest_t *agIORequest,
2924 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2925 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2926 bit32 intContext = osData->IntContext;
2927 tdIORequestBody_t *tdIORequestBody;
2928 TI_DBG2(("itdssOpenCnxErrorProtocolNotSupprotedHandler: start\n"));
2930 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2932 ostiInitiatorIOCompleted (
2934 tdIORequestBody->tiIORequest,
2944 /*****************************************************************************
2945 *! \brief itdssOpenCnxErrorZoneViolationHandler
2947 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2948 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION
2950 * \param agRoot: pointer to port instance
2951 * \param agIORequest: pointer to I/O request
2952 * \param agIOStatus: I/O status given by LL layer
2953 * \param agIOInfoLen: lenth of complete SAS RESP frame
2954 * \param agParam A Handle used to refer to the response frame or handle
2956 * \param agOtherInfo Residual count
2960 *****************************************************************************/
2962 itdssOpenCnxErrorZoneViolationHandler(
2964 agsaIORequest_t *agIORequest,
2971 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2972 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2973 bit32 intContext = osData->IntContext;
2974 tdIORequestBody_t *tdIORequestBody;
2975 TI_DBG2(("itdssOpenCnxErrorZoneViolationHandler: start\n"));
2977 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2979 ostiInitiatorIOCompleted (
2981 tdIORequestBody->tiIORequest,
2991 /*****************************************************************************
2992 *! \brief itdssOpenCnxErrorBreakHandler
2994 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
2995 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_BREAK
2997 * \param agRoot: pointer to port instance
2998 * \param agIORequest: pointer to I/O request
2999 * \param agIOStatus: I/O status given by LL layer
3000 * \param agIOInfoLen: lenth of complete SAS RESP frame
3001 * \param agParam A Handle used to refer to the response frame or handle
3003 * \param agOtherInfo Residual count
3007 *****************************************************************************/
3009 itdssOpenCnxErrorBreakHandler(
3011 agsaIORequest_t *agIORequest,
3018 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3019 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3020 bit32 intContext = osData->IntContext;
3021 tdIORequestBody_t *tdIORequestBody;
3022 TI_DBG1(("itdssOpenCnxErrorBreakHandler: start\n"));
3024 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3026 ostiInitiatorIOCompleted (
3028 tdIORequestBody->tiIORequest,
3038 /*****************************************************************************
3039 *! \brief itdssOpenCnxErrorITNexusLossHandler
3041 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3042 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS
3044 * \param agRoot: pointer to port instance
3045 * \param agIORequest: pointer to I/O request
3046 * \param agIOStatus: I/O status given by LL layer
3047 * \param agIOInfoLen: lenth of complete SAS RESP frame
3048 * \param agParam A Handle used to refer to the response frame or handle
3050 * \param agOtherInfo Residual count
3054 *****************************************************************************/
3056 itdssOpenCnxErrorITNexusLossHandler(
3058 agsaIORequest_t *agIORequest,
3065 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3066 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3067 bit32 intContext = osData->IntContext;
3068 tdIORequestBody_t *tdIORequestBody;
3069 TI_DBG1(("itdssOpenCnxErrorITNexusLossHandler: start\n"));
3071 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3073 ostiInitiatorIOCompleted (
3075 tdIORequestBody->tiIORequest,
3085 /*****************************************************************************
3086 *! \brief itdssOpenCnxErrorBadDestinationHandler
3088 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3089 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION
3091 * \param agRoot: pointer to port instance
3092 * \param agIORequest: pointer to I/O request
3093 * \param agIOStatus: I/O status given by LL layer
3094 * \param agIOInfoLen: lenth of complete SAS RESP frame
3095 * \param agParam A Handle used to refer to the response frame or handle
3097 * \param agOtherInfo Residual count
3101 *****************************************************************************/
3103 itdssOpenCnxErrorBadDestinationHandler(
3105 agsaIORequest_t *agIORequest,
3112 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3113 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3114 bit32 intContext = osData->IntContext;
3115 tdIORequestBody_t *tdIORequestBody;
3116 TI_DBG1(("itdssOpenCnxErrorBadDestinationHandler: start\n"));
3118 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3120 ostiInitiatorIOCompleted (
3122 tdIORequestBody->tiIORequest,
3132 /*****************************************************************************
3133 *! \brief itdssOpenCnxErrorConnectionRateNotSupportedHandler
3135 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3136 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED
3138 * \param agRoot: pointer to port instance
3139 * \param agIORequest: pointer to I/O request
3140 * \param agIOStatus: I/O status given by LL layer
3141 * \param agIOInfoLen: lenth of complete SAS RESP frame
3142 * \param agParam A Handle used to refer to the response frame or handle
3144 * \param agOtherInfo Residual count
3148 *****************************************************************************/
3150 itdssOpenCnxErrorConnectionRateNotSupportedHandler(
3152 agsaIORequest_t *agIORequest,
3159 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3160 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3161 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3162 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3163 bit32 intContext = osData->IntContext;
3164 tdIORequestBody_t *tdIORequestBody;
3165 agsaDevHandle_t *agDevHandle = agNULL;
3166 tiDeviceHandle_t *tiDeviceHandle = agNULL;
3167 tdsaDeviceData_t *oneDeviceData = agNULL;
3168 bit32 ConnRate = SAS_CONNECTION_RATE_12_0G;
3169 agsaContext_t *agContext = agNULL;
3170 TI_DBG1(("itdssOpenCnxErrorConnectionRateNotSupportedHandler: start\n"));
3172 /* we retry by lowering link rate
3173 retry should be in ossaSetDeviceInfoCB()
3175 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3176 tiDeviceHandle = tdIORequestBody->tiDevHandle;
3177 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
3178 agDevHandle = oneDeviceData->agDevHandle;
3180 if (tdsaAllShared->RateAdjust)
3182 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
3183 oneDeviceData->tdPortContext != agNULL )
3185 ConnRate = DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo);
3186 if (ConnRate == SAS_CONNECTION_RATE_1_5G)
3188 /* no retry; completes IO */
3189 ostiInitiatorIOCompleted(
3191 tdIORequestBody->tiIORequest,
3200 ConnRate = ConnRate - 1;
3202 agContext = &(tdIORequestBody->agContext);
3203 agContext->osData = agIORequest;
3204 saSetDeviceInfo(agRoot, agContext, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 32, ConnRate << 28, ossaIniSetDeviceInfoCB);
3209 ostiInitiatorIOCompleted(
3211 tdIORequestBody->tiIORequest,
3222 /*****************************************************************************
3223 *! \brief itdssOpenCnxErrorSTPResourceBusyHandler
3225 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3226 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
3228 * \param agRoot: pointer to port instance
3229 * \param agIORequest: pointer to I/O request
3230 * \param agIOStatus: I/O status given by LL layer
3231 * \param agIOInfoLen: lenth of complete SAS RESP frame
3232 * \param agParam A Handle used to refer to the response frame or handle
3234 * \param agOtherInfo Residual count
3238 *****************************************************************************/
3240 itdssOpenCnxErrorSTPResourceBusyHandler(
3242 agsaIORequest_t *agIORequest,
3249 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3250 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3251 bit32 intContext = osData->IntContext;
3252 tdIORequestBody_t *tdIORequestBody;
3253 TI_DBG2(("itdssOpenCnxErrorSTPResourceBusyHandler: start\n"));
3255 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3257 ostiInitiatorIOCompleted (
3259 tdIORequestBody->tiIORequest,
3269 /*****************************************************************************
3270 *! \brief itdssOpenCnxErrorWrongDestinationHandler
3272 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3273 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION
3275 * \param agRoot: pointer to port instance
3276 * \param agIORequest: pointer to I/O request
3277 * \param agIOStatus: I/O status given by LL layer
3278 * \param agIOInfoLen: lenth of complete SAS RESP frame
3279 * \param agParam A Handle used to refer to the response frame or handle
3281 * \param agOtherInfo Residual count
3285 *****************************************************************************/
3287 itdssOpenCnxErrorWrongDestinationHandler(
3289 agsaIORequest_t *agIORequest,
3296 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3297 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3298 bit32 intContext = osData->IntContext;
3299 tdIORequestBody_t *tdIORequestBody;
3300 TI_DBG1(("itdssOpenCnxErrorWrongDestinationHandler: start\n"));
3302 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3304 ostiInitiatorIOCompleted (
3306 tdIORequestBody->tiIORequest,
3316 /*****************************************************************************
3317 *! \brief itdssOpenCnxErrorUnknownErrorHandler
3319 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3320 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR
3322 * \param agRoot: pointer to port instance
3323 * \param agIORequest: pointer to I/O request
3324 * \param agIOStatus: I/O status given by LL layer
3325 * \param agIOInfoLen: lenth of complete SAS RESP frame
3326 * \param agParam A Handle used to refer to the response frame or handle
3328 * \param agOtherInfo Residual count
3332 *****************************************************************************/
3334 itdssOpenCnxErrorUnknownErrorHandler(
3336 agsaIORequest_t *agIORequest,
3343 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3344 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3345 bit32 intContext = osData->IntContext;
3346 tdIORequestBody_t *tdIORequestBody;
3347 TI_DBG1(("itdssOpenCnxErrorUnknownErrorHandler: start\n"));
3349 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3351 ostiInitiatorIOCompleted (
3353 tdIORequestBody->tiIORequest,
3363 /*****************************************************************************
3364 *! \brief itdssXferErrorNAKReceivedHandler
3366 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3367 * layer with agIOStatus = OSSA_IO_XFER_ERROR_NAK_RECEIVED
3369 * \param agRoot: pointer to port instance
3370 * \param agIORequest: pointer to I/O request
3371 * \param agIOStatus: I/O status given by LL layer
3372 * \param agIOInfoLen: lenth of complete SAS RESP frame
3373 * \param agParam A Handle used to refer to the response frame or handle
3375 * \param agOtherInfo Residual count
3379 *****************************************************************************/
3381 itdssXferErrorNAKReceivedHandler(
3383 agsaIORequest_t *agIORequest,
3390 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3391 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3392 bit32 intContext = osData->IntContext;
3393 tdIORequestBody_t *tdIORequestBody;
3394 TI_DBG1(("itdssXferErrorNAKReceivedHandler: start\n"));
3396 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3398 ostiInitiatorIOCompleted (
3400 tdIORequestBody->tiIORequest,
3410 /*****************************************************************************
3411 *! \brief itdssXferErrorACKNAKTimeoutHandler
3413 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3414 * layer with agIOStatus = OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT
3416 * \param agRoot: pointer to port instance
3417 * \param agIORequest: pointer to I/O request
3418 * \param agIOStatus: I/O status given by LL layer
3419 * \param agIOInfoLen: lenth of complete SAS RESP frame
3420 * \param agParam A Handle used to refer to the response frame or handle
3422 * \param agOtherInfo Residual count
3426 *****************************************************************************/
3428 itdssXferErrorACKNAKTimeoutHandler(
3430 agsaIORequest_t *agIORequest,
3437 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3438 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3439 bit32 intContext = osData->IntContext;
3440 tdIORequestBody_t *tdIORequestBody;
3441 TI_DBG1(("itdssXferErrorACKNAKTimeoutHandler: start\n"));
3443 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3445 ostiInitiatorIOCompleted (
3447 tdIORequestBody->tiIORequest,
3457 /*****************************************************************************
3458 *! \brief itdssXferErrorPeerAbortedHandler
3460 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3461 * layer with agIOStatus = OSSA_IO_XFER_ERROR_PEER_ABORTED
3463 * \param agRoot: pointer to port instance
3464 * \param agIORequest: pointer to I/O request
3465 * \param agIOStatus: I/O status given by LL layer
3466 * \param agIOInfoLen: lenth of complete SAS RESP frame
3467 * \param agParam A Handle used to refer to the response frame or handle
3469 * \param agOtherInfo Residual count
3473 *****************************************************************************/
3475 itdssXferErrorPeerAbortedHandler(
3477 agsaIORequest_t *agIORequest,
3484 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3485 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3486 bit32 intContext = osData->IntContext;
3487 tdIORequestBody_t *tdIORequestBody;
3488 TI_DBG2(("itdssXferErrorPeerAbortedHandler: start\n"));
3490 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3492 ostiInitiatorIOCompleted (
3494 tdIORequestBody->tiIORequest,
3504 /*****************************************************************************
3505 *! \brief itdssXferErrorRxFrameHandler
3507 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3508 * layer with agIOStatus = OSSA_IO_XFER_ERROR_RX_FRAME
3510 * \param agRoot: pointer to port instance
3511 * \param agIORequest: pointer to I/O request
3512 * \param agIOStatus: I/O status given by LL layer
3513 * \param agIOInfoLen: lenth of complete SAS RESP frame
3514 * \param agParam A Handle used to refer to the response frame or handle
3516 * \param agOtherInfo Residual count
3520 *****************************************************************************/
3522 itdssXferErrorRxFrameHandler(
3524 agsaIORequest_t *agIORequest,
3531 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3532 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3533 bit32 intContext = osData->IntContext;
3534 tdIORequestBody_t *tdIORequestBody;
3535 TI_DBG1(("itdssXferErrorRxFrameHandler: start\n"));
3537 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3539 ostiInitiatorIOCompleted (
3541 tdIORequestBody->tiIORequest,
3551 /*****************************************************************************
3552 *! \brief itdssXferErrorDMAHandler
3554 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3555 * layer with agIOStatus = OSSA_IO_XFER_ERROR_DMA
3557 * \param agRoot: pointer to port instance
3558 * \param agIORequest: pointer to I/O request
3559 * \param agIOStatus: I/O status given by LL layer
3560 * \param agIOInfoLen: lenth of complete SAS RESP frame
3561 * \param agParam A Handle used to refer to the response frame or handle
3563 * \param agOtherInfo Residual count
3567 *****************************************************************************/
3569 itdssXferErrorDMAHandler(
3571 agsaIORequest_t *agIORequest,
3578 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3579 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3580 bit32 intContext = osData->IntContext;
3581 tdIORequestBody_t *tdIORequestBody;
3582 TI_DBG1(("itdssXferErrorDMAHandler: start\n"));
3584 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3586 ostiInitiatorIOCompleted (
3588 tdIORequestBody->tiIORequest,
3590 tiDetailOtherErrorNoRetry,
3598 /*****************************************************************************
3599 *! \brief itdssXferErrorCreditTimeoutHandler
3601 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3602 * layer with agIOStatus = OSSA_IO_XFER_ERROR_CREDIT_TIMEOUT
3604 * \param agRoot: pointer to port instance
3605 * \param agIORequest: pointer to I/O request
3606 * \param agIOStatus: I/O status given by LL layer
3607 * \param agIOInfoLen: lenth of complete SAS RESP frame
3608 * \param agParam A Handle used to refer to the response frame or handle
3610 * \param agOtherInfo Residual count
3614 *****************************************************************************/
3616 itdssXferErrorCreditTimeoutHandler(
3618 agsaIORequest_t *agIORequest,
3625 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3626 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3627 bit32 intContext = osData->IntContext;
3628 tdIORequestBody_t *tdIORequestBody;
3629 TI_DBG1(("itdssXferErrorCreditTimeoutHandler: start\n"));
3631 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3633 ostiInitiatorIOCompleted (
3635 tdIORequestBody->tiIORequest,
3645 /*****************************************************************************
3646 *! \brief itdssXferErrorCMDIssueACKNAKTimeoutHandler
3648 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3649 * layer with agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT
3651 * \param agRoot: pointer to port instance
3652 * \param agIORequest: pointer to I/O request
3653 * \param agIOStatus: I/O status given by LL layer
3654 * \param agIOInfoLen: lenth of complete SAS RESP frame
3655 * \param agParam A Handle used to refer to the response frame or handle
3657 * \param agOtherInfo Residual count
3661 *****************************************************************************/
3663 itdssXferErrorCMDIssueACKNAKTimeoutHandler(
3665 agsaIORequest_t *agIORequest,
3672 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3673 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3674 bit32 intContext = osData->IntContext;
3675 tdIORequestBody_t *tdIORequestBody;
3676 TI_DBG1(("itdssXferErrorCMDIssueACKNAKTimeoutHandler: start\n"));
3678 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3680 ostiInitiatorIOCompleted (
3682 tdIORequestBody->tiIORequest,
3692 /*****************************************************************************
3693 *! \brief itdssXferErrorCMDIssueBreakBeforeACKNAKHandler
3695 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3696 * layer with agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_BREAK_BEFORE_ACK_NAK
3698 * \param agRoot: pointer to port instance
3699 * \param agIORequest: pointer to I/O request
3700 * \param agIOStatus: I/O status given by LL layer
3701 * \param agIOInfoLen: lenth of complete SAS RESP frame
3702 * \param agParam A Handle used to refer to the response frame or handle
3704 * \param agOtherInfo Residual count
3708 *****************************************************************************/
3710 itdssXferErrorCMDIssueBreakBeforeACKNAKHandler(
3712 agsaIORequest_t *agIORequest,
3719 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3720 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3721 bit32 intContext = osData->IntContext;
3722 tdIORequestBody_t *tdIORequestBody;
3723 TI_DBG1(("itdssXferErrorCMDIssueBreakBeforeACKNAKHandler: start\n"));
3725 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3727 ostiInitiatorIOCompleted (
3729 tdIORequestBody->tiIORequest,
3739 /*****************************************************************************
3740 *! \brief itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler
3742 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3743 * layer with agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_PHY_DOWN_BEFORE_ACK_NAK
3745 * \param agRoot: pointer to port instance
3746 * \param agIORequest: pointer to I/O request
3747 * \param agIOStatus: I/O status given by LL layer
3748 * \param agIOInfoLen: lenth of complete SAS RESP frame
3749 * \param agParam A Handle used to refer to the response frame or handle
3751 * \param agOtherInfo Residual count
3755 *****************************************************************************/
3757 itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler(
3759 agsaIORequest_t *agIORequest,
3766 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3767 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3768 bit32 intContext = osData->IntContext;
3769 tdIORequestBody_t *tdIORequestBody;
3770 TI_DBG1(("itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler: start\n"));
3772 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3774 ostiInitiatorIOCompleted (
3776 tdIORequestBody->tiIORequest,
3786 /*****************************************************************************
3787 *! \brief itdssXferErrorDisruptedPhyDownHandler
3789 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3790 * layer with agIOStatus = OSSA_IO_XFER_ERROR_DISRUPTED_PHY_DOWN
3792 * \param agRoot: pointer to port instance
3793 * \param agIORequest: pointer to I/O request
3794 * \param agIOStatus: I/O status given by LL layer
3795 * \param agIOInfoLen: lenth of complete SAS RESP frame
3796 * \param agParam A Handle used to refer to the response frame or handle
3798 * \param agOtherInfo Residual count
3802 *****************************************************************************/
3804 itdssXferErrorDisruptedPhyDownHandler(
3806 agsaIORequest_t *agIORequest,
3813 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3814 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3815 bit32 intContext = osData->IntContext;
3816 tdIORequestBody_t *tdIORequestBody;
3817 TI_DBG2(("itdssXferErrorDisruptedPhyDownHandler: start\n"));
3819 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3821 ostiInitiatorIOCompleted (
3823 tdIORequestBody->tiIORequest,
3833 /*****************************************************************************
3834 *! \brief itdssXferErrorOffsetMismatchHandler
3836 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3837 * layer with agIOStatus = OSSA_IO_XFER_ERROR_OFFSET_MISMATCH
3839 * \param agRoot: pointer to port instance
3840 * \param agIORequest: pointer to I/O request
3841 * \param agIOStatus: I/O status given by LL layer
3842 * \param agIOInfoLen: lenth of complete SAS RESP frame
3843 * \param agParam A Handle used to refer to the response frame or handle
3845 * \param agOtherInfo Residual count
3849 *****************************************************************************/
3851 itdssXferErrorOffsetMismatchHandler(
3853 agsaIORequest_t *agIORequest,
3860 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3861 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3862 bit32 intContext = osData->IntContext;
3863 tdIORequestBody_t *tdIORequestBody;
3864 TI_DBG1(("itdssXferErrorOffsetMismatchHandler: start\n"));
3866 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3868 ostiInitiatorIOCompleted (
3870 tdIORequestBody->tiIORequest,
3880 /*****************************************************************************
3881 *! \brief itdssXferErrorXferZeroDataLenHandler
3883 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3884 * layer with agIOStatus = OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN
3886 * \param agRoot: pointer to port instance
3887 * \param agIORequest: pointer to I/O request
3888 * \param agIOStatus: I/O status given by LL layer
3889 * \param agIOInfoLen: lenth of complete SAS RESP frame
3890 * \param agParam A Handle used to refer to the response frame or handle
3892 * \param agOtherInfo Residual count
3896 *****************************************************************************/
3898 itdssXferErrorXferZeroDataLenHandler(
3900 agsaIORequest_t *agIORequest,
3907 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3908 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3909 bit32 intContext = osData->IntContext;
3910 tdIORequestBody_t *tdIORequestBody;
3911 TI_DBG2(("itdssXferErrorXferZeroDataLenHandler: start\n"));
3913 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3915 ostiInitiatorIOCompleted (
3917 tdIORequestBody->tiIORequest,
3927 /*****************************************************************************
3928 *! \brief itdssXferOpenRetryTimeoutHandler
3930 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
3931 * layer with agIOStatus = OSSA_IO_XFER_OPEN_RETRY_TIMEOUT
3933 * \param agRoot: pointer to port instance
3934 * \param agIORequest: pointer to I/O request
3935 * \param agIOStatus: I/O status given by LL layer
3936 * \param agIOInfoLen: lenth of complete SAS RESP frame
3937 * \param agParam A Handle used to refer to the response frame or handle
3939 * \param agOtherInfo Residual count
3943 *****************************************************************************/
3945 itdssXferOpenRetryTimeoutHandler(
3947 agsaIORequest_t *agIORequest,
3954 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3955 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3956 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3957 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3958 itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
3959 bit32 intContext = osData->IntContext;
3960 tdIORequestBody_t *tdIORequestBody;
3961 agsaDevHandle_t *agDevHandle = agNULL;
3962 tiDeviceHandle_t *tiDeviceHandle = agNULL;
3963 tdsaDeviceData_t *oneDeviceData = agNULL;
3964 bit32 saStatus = AGSA_RC_FAILURE;
3966 TI_DBG2(("itdssXferOpenRetryTimeoutHandler: start\n"));
3968 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3969 tiDeviceHandle = tdIORequestBody->tiDevHandle;
3970 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
3971 agDevHandle = oneDeviceData->agDevHandle;
3973 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
3974 oneDeviceData->tdPortContext != agNULL )
3976 if (tdIORequestBody->reTries < OPEN_RETRY_RETRIES) /* 10 */
3978 saStatus = saSSPStart(agRoot,
3980 tdsaRotateQnumber(tiRoot, oneDeviceData),
3982 tdIORequestBody->agRequestType,
3983 &(tdIORequestBody->transport.SAS.agSASRequestBody),
3987 if (saStatus == AGSA_RC_SUCCESS)
3989 TI_DBG2(("itdssXferOpenRetryTimeoutHandler: retried\n"));
3990 Initiator->NumIOsActive++;
3991 tdIORequestBody->ioStarted = agTRUE;
3992 tdIORequestBody->ioCompleted = agFALSE;
3993 tdIORequestBody->reTries++;
3998 TI_DBG1(("itdssXferOpenRetryTimeoutHandler: retry failed\n"));
3999 tdIORequestBody->ioStarted = agFALSE;
4000 tdIORequestBody->ioCompleted = agTRUE;
4001 tdIORequestBody->reTries = 0;
4006 TI_DBG1(("itdssXferOpenRetryTimeoutHandler: retry is over and fail\n"));
4007 tdIORequestBody->reTries = 0;
4012 TI_DBG1(("itdssXferOpenRetryTimeoutHandler: not valid deivce no retry\n"));
4013 tdIORequestBody->reTries = 0;
4015 ostiInitiatorIOCompleted(
4017 tdIORequestBody->tiIORequest,
4026 /*****************************************************************************
4027 *! \brief itdssPortInResetHandler
4029 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4030 * layer with agIOStatus = OSSA_IO_PORT_IN_RESET
4032 * \param agRoot: pointer to port instance
4033 * \param agIORequest: pointer to I/O request
4034 * \param agIOStatus: I/O status given by LL layer
4035 * \param agIOInfoLen: lenth of complete SAS RESP frame
4036 * \param agParam A Handle used to refer to the response frame or handle
4038 * \param agOtherInfo Residual count
4042 *****************************************************************************/
4044 itdssPortInResetHandler(
4046 agsaIORequest_t *agIORequest,
4053 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4054 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4055 bit32 intContext = osData->IntContext;
4056 tdIORequestBody_t *tdIORequestBody;
4057 TI_DBG2(("itdssPortInResetHandler: start\n"));
4059 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4061 ostiInitiatorIOCompleted (
4063 tdIORequestBody->tiIORequest,
4073 /*****************************************************************************
4074 *! \brief itdssDsNonOperationalHandler
4076 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4077 * layer with agIOStatus = OSSA_IO_DS_NON_OPERATIONAL
4079 * \param agRoot: pointer to port instance
4080 * \param agIORequest: pointer to I/O request
4081 * \param agIOStatus: I/O status given by LL layer
4082 * \param agIOInfoLen: lenth of complete SAS RESP frame
4083 * \param agParam A Handle used to refer to the response frame or handle
4085 * \param agOtherInfo Residual count
4089 *****************************************************************************/
4091 itdssDsNonOperationalHandler(
4093 agsaIORequest_t *agIORequest,
4100 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4101 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4102 bit32 intContext = osData->IntContext;
4103 tdIORequestBody_t *tdIORequestBody;
4104 agsaDevHandle_t *agDevHandle = agNULL;
4105 tiDeviceHandle_t *tiDeviceHandle = agNULL;
4106 tdsaDeviceData_t *oneDeviceData = agNULL;
4109 TI_DBG2(("itdssDsNonOperationalHandler: start\n"));
4112 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4115 /* let's do it only once ????? */
4116 tiDeviceHandle = tdIORequestBody->tiDevHandle;
4117 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
4118 agDevHandle = oneDeviceData->agDevHandle;
4119 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
4120 oneDeviceData->tdPortContext != agNULL )
4122 saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
4126 ostiInitiatorIOCompleted (
4128 tdIORequestBody->tiIORequest,
4138 /*****************************************************************************
4139 *! \brief itdssDsInRecoveryHandler
4141 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4142 * layer with agIOStatus = OSSA_IO_DS_IN_RECOVERY
4144 * \param agRoot: pointer to port instance
4145 * \param agIORequest: pointer to I/O request
4146 * \param agIOStatus: I/O status given by LL layer
4147 * \param agIOInfoLen: lenth of complete SAS RESP frame
4148 * \param agParam A Handle used to refer to the response frame or handle
4150 * \param agOtherInfo Residual count
4154 *****************************************************************************/
4156 itdssDsInRecoveryHandler(
4158 agsaIORequest_t *agIORequest,
4165 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4166 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4167 bit32 intContext = osData->IntContext;
4168 tdIORequestBody_t *tdIORequestBody;
4169 TI_DBG2(("itdssDsInRecoveryHandler: start\n"));
4171 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4173 ostiInitiatorIOCompleted (
4175 tdIORequestBody->tiIORequest,
4185 /*****************************************************************************
4186 *! \brief itdssTmTagNotFoundHandler
4188 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4189 * layer with agIOStatus = OSSA_IO_TM_TAG_NOT_FOUND
4191 * \param agRoot: pointer to port instance
4192 * \param agIORequest: pointer to I/O request
4193 * \param agIOStatus: I/O status given by LL layer
4194 * \param agIOInfoLen: lenth of complete SAS RESP frame
4195 * \param agParam A Handle used to refer to the response frame or handle
4197 * \param agOtherInfo Residual count
4201 *****************************************************************************/
4203 itdssTmTagNotFoundHandler(
4205 agsaIORequest_t *agIORequest,
4212 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4213 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4214 bit32 intContext = osData->IntContext;
4215 tdIORequestBody_t *tdIORequestBody;
4216 TI_DBG2(("itdssTmTagNotFoundHandler: start\n"));
4218 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4220 ostiInitiatorIOCompleted (
4222 tdIORequestBody->tiIORequest,
4232 /*****************************************************************************
4233 *! \brief itdssSSPExtIUZeroLenHandler
4235 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4236 * layer with agIOStatus = OSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR
4238 * \param agRoot: pointer to port instance
4239 * \param agIORequest: pointer to I/O request
4240 * \param agIOStatus: I/O status given by LL layer
4241 * \param agIOInfoLen: lenth of complete SAS RESP frame
4242 * \param agParam A Handle used to refer to the response frame or handle
4244 * \param agOtherInfo Residual count
4248 *****************************************************************************/
4250 itdssSSPExtIUZeroLenHandler(
4252 agsaIORequest_t *agIORequest,
4259 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4260 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4261 bit32 intContext = osData->IntContext;
4262 tdIORequestBody_t *tdIORequestBody;
4263 TI_DBG2(("itdssSSPExtIUZeroLenHandler: start\n"));
4265 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4267 ostiInitiatorIOCompleted (
4269 tdIORequestBody->tiIORequest,
4279 /*****************************************************************************
4280 *! \brief itdssXferErrorUnexpectedPhaseHandler
4282 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4283 * layer with agIOStatus = OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE
4285 * \param agRoot: pointer to port instance
4286 * \param agIORequest: pointer to I/O request
4287 * \param agIOStatus: I/O status given by LL layer
4288 * \param agIOInfoLen: lenth of complete SAS RESP frame
4289 * \param agParam A Handle used to refer to the response frame or handle
4291 * \param agOtherInfo Residual count
4295 *****************************************************************************/
4297 itdssXferErrorUnexpectedPhaseHandler(
4299 agsaIORequest_t *agIORequest,
4306 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4307 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4308 bit32 intContext = osData->IntContext;
4309 tdIORequestBody_t *tdIORequestBody;
4310 TI_DBG2(("itdssXferErrorUnexpectedPhaseHandler: start\n"));
4312 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4314 ostiInitiatorIOCompleted (
4316 tdIORequestBody->tiIORequest,
4327 /*****************************************************************************
4328 *! \brief itdssIOUnderFlowWithChkConditionHandler
4330 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4331 * layer with agIOStatus = OSSA_IO_UNDERFLOW_WITH_CHK_COND
4333 * \param agRoot: pointer to port instance
4334 * \param agIORequest: pointer to I/O request
4335 * \param agIOStatus: I/O status given by LL layer
4336 * \param agIOInfoLen: lenth of complete SAS RESP frame
4337 * \param agParam A Handle used to refer to the response frame or handle
4342 *****************************************************************************/
4344 How to report SCSI_STAT_CHECK_CONDITION and tiIOUnderRun simultaneoulsy???
4345 ostiInitiatorIOCompleted(
4347 tdIORequestBody->tiIORequest,
4349 SCSI_STAT_CHECK_CONDITION,
4356 ostiInitiatorIOCompleted (
4358 tdIORequestBody->tiIORequest,
4365 For now, SCSI_STAT_CHECK_CONDITION is reported until TISA changes (as of 1/6/09)
4366 In other words, this handler is the practically same as itdssIOSuccessHandler()
4369 itdssIOUnderFlowWithChkConditionHandler(
4371 agsaIORequest_t *agIORequest,
4377 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4378 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4379 tdIORequestBody_t *tdIORequestBody;
4380 agsaSSPResponseInfoUnit_t agSSPRespIU;
4381 tiSenseData_t senseData;
4382 bit8 senseDataPayload[256];
4389 tiDeviceHandle_t *tiDeviceHandle = agNULL;
4390 tdsaDeviceData_t *oneDeviceData = agNULL;
4392 TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: start\n"));
4393 TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: agIOInfoLen 0x%x\n", agIOInfoLen));
4395 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4397 tdIORequestBody->ioCompleted = agTRUE;
4398 tdIORequestBody->ioStarted = agFALSE;
4401 agIOInfoLen must be >= sizeof(agsaSSPResponseInfoUnit_t), which is minimum
4404 if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t))
4406 TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: First agIOInfoLen does not match!!!\n"));
4407 TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: First agIOInfoLen 0x%x IU 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t)));
4408 ostiInitiatorIOCompleted(
4410 tdIORequestBody->tiIORequest, /* tiIORequest */
4414 agTRUE /* intContext; is not being used */
4418 /* reads agsaSSPResponseInfoUnit_t */
4419 saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
4421 data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
4422 scsi_status = agSSPRespIU.status;
4423 /* endianess is invovled here */
4424 senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU);
4425 respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
4427 TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: dataPres=%x\n", data_status));
4428 TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: scsi status=0x%x, senselen=0x%x resplen 0x%x\n", scsi_status, senseLen, respLen));
4431 sanity check: do not go beyond of agIOInfoLen. if happens, return error
4432 agIOInfoLen >= sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> OK
4433 because frame must be divisible by 4, so there can be extra padding
4434 agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> NOT OK
4436 if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
4438 TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: Second agIOInfoLen does not match!!!\n"));
4439 TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: Second agIOInfoLen 0x%x IU 0x%x senselen 0x%x resplen 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t), senseLen, respLen));
4441 ostiInitiatorIOCompleted(
4443 tdIORequestBody->tiIORequest, /* tiIORequest */
4447 agTRUE /* intContext; is not being used */
4452 /* reads response data */
4453 saFrameReadBlock(agRoot, agParam,
4454 sizeof(agsaSSPResponseInfoUnit_t),
4456 /* reads sense data */
4457 saFrameReadBlock(agRoot, agParam,
4458 sizeof(agsaSSPResponseInfoUnit_t)
4460 senseDataPayload, senseLen);
4462 if (data_status == 0)
4465 TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: no data\n"));
4467 ostiInitiatorIOCompleted(
4469 tdIORequestBody->tiIORequest, /* tiIORequest */
4473 agTRUE /* intContext; is not being used */
4479 if (data_status == 1)
4482 TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: response data \n"));
4484 ostiInitiatorIOCompleted(
4486 tdIORequestBody->tiIORequest, /* tiIORequest */
4490 agTRUE /* intContext; is not being used */
4495 if (data_status == 2)
4498 TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: sense data \n"));
4500 senseData.senseData = &senseDataPayload;
4501 senseData.senseLen = MIN(256, senseLen);
4503 tdhexdump("ResponseIU I", (bit8 *)&agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
4505 tdhexdump("sense data I", (bit8 *)senseDataPayload, senseLen);
4506 tdhexdump("sense data II", (bit8 *)senseData.senseData, senseData.senseLen);
4508 if (senseDataPayload[2] == SCSI_SENSE_KEY_RECOVERED_ERROR)
4510 Initiator->SenseKeyCounter.SoftError ++;
4512 else if (senseDataPayload[2] == SCSI_SENSE_KEY_NOT_READY)
4514 Initiator->SenseKeyCounter.MediumNotReady++;
4516 else if (senseDataPayload[2] == SCSI_SENSE_KEY_MEDIUM_ERROR)
4518 Initiator->SenseKeyCounter.MediumError++;
4520 else if (senseDataPayload[2] == SCSI_SENSE_KEY_HARDWARE_ERROR)
4522 Initiator->SenseKeyCounter.HardwareError++;
4524 else if (senseDataPayload[2] == SCSI_SENSE_KEY_ILLEGAL_REQUEST)
4526 Initiator->SenseKeyCounter.IllegalRequest++;
4528 else if (senseDataPayload[2] == SCSI_SENSE_KEY_UNIT_ATTENTION)
4530 Initiator->SenseKeyCounter.UnitAttention++;
4532 else if (senseDataPayload[2] == SCSI_SENSE_KEY_ABORTED_COMMAND)
4534 Initiator->SenseKeyCounter.AbortCommand++;
4538 Initiator->SenseKeyCounter.OtherKeyType++;
4541 /* when ASQ and ASCQ 0x04 0x11, does saLocalPhyControl for notify spinup */
4542 if ((senseDataPayload[12] == 0x04 && senseDataPayload[13] == 0x11))
4544 TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: sending notfify spinup\n"));
4545 tiDeviceHandle = tdIORequestBody->tiDevHandle;
4546 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
4547 if (oneDeviceData->directlyAttached == agTRUE)
4549 for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
4551 saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
4555 ostiInitiatorIOCompleted(
4558 tdIORequestBody->tiIORequest,
4562 agTRUE /* intContext; is not being used */
4566 if (data_status == 3)
4569 TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: reserved wrong!!!\n"));
4570 ostiInitiatorIOCompleted(
4572 tdIORequestBody->tiIORequest, /* tiIORequest */
4576 agTRUE /* intContext; is not being used */
4586 /*****************************************************************************
4587 *! \brief itdssXferOpenRetryBackoffThresholdReachedHandler
4589 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4590 * layer with agIOStatus =
4591 * OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED
4593 * \param agRoot: pointer to port instance
4594 * \param agIORequest: pointer to I/O request
4595 * \param agIOStatus: I/O status given by LL layer
4596 * \param agIOInfoLen: lenth of complete SAS RESP frame
4597 * \param agParam A Handle used to refer to the response frame or handle
4599 * \param agOtherInfo Residual count
4603 *****************************************************************************/
4605 itdssXferOpenRetryBackoffThresholdReachedHandler(
4607 agsaIORequest_t *agIORequest,
4614 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4615 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4616 bit32 intContext = osData->IntContext;
4617 tdIORequestBody_t *tdIORequestBody;
4618 TI_DBG2(("itdssXferOpenRetryBackoffThresholdReachedHandler: start\n"));
4620 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4622 ostiInitiatorIOCompleted (
4624 tdIORequestBody->tiIORequest,
4634 /*****************************************************************************
4635 *! \brief itdssOpenCnxErrorItNexusLossOpenTmoHandler
4637 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4638 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO
4640 * \param agRoot: pointer to port instance
4641 * \param agIORequest: pointer to I/O request
4642 * \param agIOStatus: I/O status given by LL layer
4643 * \param agIOInfoLen: lenth of complete SAS RESP frame
4644 * \param agParam A Handle used to refer to the response frame or handle
4646 * \param agOtherInfo Residual count
4650 *****************************************************************************/
4652 itdssOpenCnxErrorItNexusLossOpenTmoHandler(
4654 agsaIORequest_t *agIORequest,
4661 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4662 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4663 bit32 intContext = osData->IntContext;
4664 tdIORequestBody_t *tdIORequestBody;
4665 TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenTmoHandler: start\n"));
4667 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4669 ostiInitiatorIOCompleted (
4671 tdIORequestBody->tiIORequest,
4681 /*****************************************************************************
4682 *! \brief itdssOpenCnxErrorItNexusLossNoDestHandler
4684 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4685 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST
4687 * \param agRoot: pointer to port instance
4688 * \param agIORequest: pointer to I/O request
4689 * \param agIOStatus: I/O status given by LL layer
4690 * \param agIOInfoLen: lenth of complete SAS RESP frame
4691 * \param agParam A Handle used to refer to the response frame or handle
4693 * \param agOtherInfo Residual count
4697 *****************************************************************************/
4699 itdssOpenCnxErrorItNexusLossNoDestHandler(
4701 agsaIORequest_t *agIORequest,
4708 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4709 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4710 bit32 intContext = osData->IntContext;
4711 tdIORequestBody_t *tdIORequestBody;
4712 TI_DBG2(("itdssOpenCnxErrorItNexusLossNoDestHandler: start\n"));
4714 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4716 ostiInitiatorIOCompleted (
4718 tdIORequestBody->tiIORequest,
4728 /*****************************************************************************
4729 *! \brief itdssOpenCnxErrorItNexusLossOpenCollideHandler
4731 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4732 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE
4734 * \param agRoot: pointer to port instance
4735 * \param agIORequest: pointer to I/O request
4736 * \param agIOStatus: I/O status given by LL layer
4737 * \param agIOInfoLen: lenth of complete SAS RESP frame
4738 * \param agParam A Handle used to refer to the response frame or handle
4740 * \param agOtherInfo Residual count
4744 *****************************************************************************/
4746 itdssOpenCnxErrorItNexusLossOpenCollideHandler(
4748 agsaIORequest_t *agIORequest,
4755 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4756 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4757 bit32 intContext = osData->IntContext;
4758 tdIORequestBody_t *tdIORequestBody;
4759 TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenCollideHandler: start\n"));
4761 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4763 ostiInitiatorIOCompleted (
4765 tdIORequestBody->tiIORequest,
4775 /*****************************************************************************
4776 *! \brief itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler
4778 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4779 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED
4781 * \param agRoot: pointer to port instance
4782 * \param agIORequest: pointer to I/O request
4783 * \param agIOStatus: I/O status given by LL layer
4784 * \param agIOInfoLen: lenth of complete SAS RESP frame
4785 * \param agParam A Handle used to refer to the response frame or handle
4787 * \param agOtherInfo Residual count
4791 *****************************************************************************/
4793 itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler(
4795 agsaIORequest_t *agIORequest,
4802 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4803 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4804 bit32 intContext = osData->IntContext;
4805 tdIORequestBody_t *tdIORequestBody;
4806 TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler: start\n"));
4808 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4810 ostiInitiatorIOCompleted (
4812 tdIORequestBody->tiIORequest,
4822 /*****************************************************************************
4823 *! \brief itdssEncryptionHandler
4825 * Purpose: This function processes I/Os completed and returned by SAS lower
4826 * layer with any encryption specific agIOStatus.
4828 * \param agRoot: pointer to port instance
4829 * \param agIORequest: pointer to I/O request
4830 * \param agIOStatus: I/O status given by LL layer
4831 * \param agIOInfoLen: lenth of complete SAS RESP frame
4832 * \param agParam A Handle used to refer to the response frame or handle
4837 *****************************************************************************/
4839 itdssEncryptionHandler (
4841 agsaIORequest_t *agIORequest,
4848 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4849 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4850 bit32 intContext = osData->IntContext;
4851 bit32 errorDetail = tiDetailOtherError;
4852 tdIORequestBody_t *tdIORequestBody;
4853 TI_DBG1(("itdssEncryptionHandler: start\n"));
4854 TI_DBG1(("itdssEncryptionHandler: agIOStatus 0x%x\n", agIOStatus));
4856 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4860 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
4861 TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n"));
4862 errorDetail = tiDetailDekKeyCacheMiss;
4864 case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
4865 TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n"));
4866 errorDetail = tiDetailCipherModeInvalid;
4868 case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
4869 TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n"));
4870 errorDetail = tiDetailDekIVMismatch;
4872 case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
4873 TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n"));
4874 errorDetail = tiDetailDekRamInterfaceError;
4876 case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS:
4877 TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS\n"));
4878 errorDetail = tiDetailDekIndexOutofBounds;
4880 case OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE:
4881 TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE\n"));
4882 errorDetail = tiDetailOtherError;
4885 TI_DBG1(("itdssEncryptionHandler: other error!!! 0x%x\n", agIOStatus));
4886 errorDetail = tiDetailOtherError;
4890 ostiInitiatorIOCompleted (
4892 tdIORequestBody->tiIORequest,
4901 /*****************************************************************************
4902 *! \brief itdssDifHandler
4904 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4905 * layer with any DIF specific agIOStatus
4907 * \param agRoot: pointer to port instance
4908 * \param agIORequest: pointer to I/O request
4909 * \param agIOStatus: I/O status given by LL layer
4910 * \param agIOInfoLen: lenth of complete SAS RESP frame
4911 * \param agParam A Handle used to refer to the response frame or handle
4913 * \param agOtherInfo Residual count
4917 *****************************************************************************/
4921 agsaIORequest_t *agIORequest,
4928 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4929 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4930 bit32 intContext = osData->IntContext;
4931 bit32 errorDetail = tiDetailOtherError;
4932 tdIORequestBody_t *tdIORequestBody;
4933 #ifdef TD_DEBUG_ENABLE
4934 agsaDifDetails_t *DifDetail;
4937 TI_DBG1(("itdssDifHandler: start\n"));
4938 TI_DBG1(("itdssDifHandler: agIOStatus 0x%x\n", agIOStatus));
4939 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4940 #ifdef TD_DEBUG_ENABLE
4941 DifDetail = (agsaDifDetails_t *)agParam;
4945 case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
4946 errorDetail = tiDetailDifMismatch;
4947 TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_MISMATCH\n"));
4949 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
4950 errorDetail = tiDetailDifAppTagMismatch;
4951 TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n"));
4953 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
4954 errorDetail = tiDetailDifRefTagMismatch;
4955 TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n"));
4957 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
4958 errorDetail = tiDetailDifCrcMismatch;
4959 TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n"));
4962 errorDetail = tiDetailOtherError;
4963 TI_DBG1(("itdssDifHandler: other error!!! 0x%x\n", agIOStatus));
4966 TI_DBG1(("itdssDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA));
4967 ostiInitiatorIOCompleted (
4969 tdIORequestBody->tiIORequest,
4978 /*****************************************************************************
4979 *! \brief itdssIOResourceUnavailableHandler
4981 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
4982 * layer with agIOStatus = OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE
4984 * \param agRoot: pointer to port instance
4985 * \param agIORequest: pointer to I/O request
4986 * \param agIOStatus: I/O status given by LL layer
4987 * \param agIOInfoLen: lenth of complete SAS RESP frame
4988 * \param agParam A Handle used to refer to the response frame or handle
4990 * \param agOtherInfo Residual count
4994 *****************************************************************************/
4996 itdssIOResourceUnavailableHandler(
4998 agsaIORequest_t *agIORequest,
5005 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5006 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5007 bit32 intContext = osData->IntContext;
5008 tdIORequestBody_t *tdIORequestBody;
5009 TI_DBG2(("itdssIOResourceUnavailableHandler: start\n"));
5010 TI_DBG2(("itdssIOResourceUnavailableHandler: agIOStatus 0x%x\n", agIOStatus));
5012 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5014 ostiInitiatorIOCompleted (
5016 tdIORequestBody->tiIORequest,
5024 /*****************************************************************************
5025 *! \brief itdssIORQEBusyFullHandler
5027 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
5028 * layer with agIOStatus = OSSA_MPI_IO_RQE_BUSY_FULL
5030 * \param agRoot: pointer to port instance
5031 * \param agIORequest: pointer to I/O request
5032 * \param agIOStatus: I/O status given by LL layer
5033 * \param agIOInfoLen: lenth of complete SAS RESP frame
5034 * \param agParam A Handle used to refer to the response frame or handle
5036 * \param agOtherInfo Residual count
5040 *****************************************************************************/
5042 itdssIORQEBusyFullHandler(
5044 agsaIORequest_t *agIORequest,
5051 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5052 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5053 bit32 intContext = osData->IntContext;
5054 tdIORequestBody_t *tdIORequestBody;
5055 TI_DBG2(("itdssIORQEBusyFullHandler: start\n"));
5056 TI_DBG2(("itdssIORQEBusyFullHandler: agIOStatus 0x%x\n", agIOStatus));
5058 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5060 ostiInitiatorIOCompleted (
5062 tdIORequestBody->tiIORequest,
5071 /*****************************************************************************
5072 *! \brief itdssXferErrorInvalidSSPRspFrameHandler
5074 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
5075 * layer with agIOStatus = OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME
5077 * \param agRoot: pointer to port instance
5078 * \param agIORequest: pointer to I/O request
5079 * \param agIOStatus: I/O status given by LL layer
5080 * \param agIOInfoLen: lenth of complete SAS RESP frame
5081 * \param agParam A Handle used to refer to the response frame or handle
5083 * \param agOtherInfo Residual count
5087 *****************************************************************************/
5089 itdssXferErrorInvalidSSPRspFrameHandler(
5091 agsaIORequest_t *agIORequest,
5098 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5099 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5100 bit32 intContext = osData->IntContext;
5101 tdIORequestBody_t *tdIORequestBody;
5102 TI_DBG2(("itdssXferErrorInvalidSSPRspFrameHandler: start\n"));
5103 TI_DBG2(("itdssXferErrorInvalidSSPRspFrameHandler: agIOStatus 0x%x\n", agIOStatus));
5105 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5107 ostiInitiatorIOCompleted (
5109 tdIORequestBody->tiIORequest,
5118 /*****************************************************************************
5119 *! \brief itdssXferErrorEOBDataOverrunHandler
5121 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
5122 * layer with agIOStatus = OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN
5124 * \param agRoot: pointer to port instance
5125 * \param agIORequest: pointer to I/O request
5126 * \param agIOStatus: I/O status given by LL layer
5127 * \param agIOInfoLen: lenth of complete SAS RESP frame
5128 * \param agParam A Handle used to refer to the response frame or handle
5130 * \param agOtherInfo Residual count
5134 *****************************************************************************/
5136 itdssXferErrorEOBDataOverrunHandler(
5138 agsaIORequest_t *agIORequest,
5145 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5146 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5147 bit32 intContext = osData->IntContext;
5148 tdIORequestBody_t *tdIORequestBody;
5149 TI_DBG2(("itdssXferErrorEOBDataOverrunHandler: start\n"));
5150 TI_DBG2(("itdssXferErrorEOBDataOverrunHandler: agIOStatus 0x%x\n", agIOStatus));
5152 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5154 ostiInitiatorIOCompleted (
5156 tdIORequestBody->tiIORequest,
5165 /*****************************************************************************
5166 *! \brief itdssOpenCnxErrorOpenPreemptedHandler
5168 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
5169 * layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED
5171 * \param agRoot: pointer to port instance
5172 * \param agIORequest: pointer to I/O request
5173 * \param agIOStatus: I/O status given by LL layer
5174 * \param agIOInfoLen: lenth of complete SAS RESP frame
5175 * \param agParam A Handle used to refer to the response frame or handle
5177 * \param agOtherInfo Residual count
5181 *****************************************************************************/
5183 itdssOpenCnxErrorOpenPreemptedHandler(
5185 agsaIORequest_t *agIORequest,
5192 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5193 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5194 bit32 intContext = osData->IntContext;
5195 tdIORequestBody_t *tdIORequestBody;
5196 TI_DBG2(("itdssOpenCnxErrorOpenPreemptedHandler: start\n"));
5197 TI_DBG2(("itdssOpenCnxErrorOpenPreemptedHandler: agIOStatus 0x%x\n", agIOStatus));
5199 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5201 ostiInitiatorIOCompleted (
5203 tdIORequestBody->tiIORequest,
5213 /*****************************************************************************
5214 *! \brief itdssIODefaultHandler
5216 * Purpose: This function processes I/Os completed and returned by SAS/SATA lower
5217 * layer with agIOStatus = unspecified
5219 * \param agRoot: pointer to port instance
5220 * \param agIORequest: pointer to I/O request
5221 * \param agIOStatus: I/O status given by LL layer
5222 * \param agIOInfoLen: lenth of complete SAS RESP frame
5223 * \param agParam A Handle used to refer to the response frame or handle
5225 * \param agOtherInfo Residual count
5229 *****************************************************************************/
5231 itdssIODefaultHandler (
5233 agsaIORequest_t *agIORequest,
5240 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5241 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5242 bit32 intContext = osData->IntContext;
5243 tdIORequestBody_t *tdIORequestBody;
5244 TI_DBG2(("itdssIODefaultHandler: start\n"));
5245 TI_DBG2(("itdssIODefaultHandler: agIOStatus 0x%x\n", agIOStatus));
5247 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5249 ostiInitiatorIOCompleted (
5251 tdIORequestBody->tiIORequest,
5260 /*****************************************************************************
5261 *! \brief itdssIOForDebugging1Completed
5263 * Purpose: This function is only for debugging. This function should NOT be
5266 * \param agRoot: pointer to port instance
5267 * \param agIORequest: pointer to I/O request
5268 * \param agIOStatus: I/O status given by LL layer
5269 * \param agIOInfoLen: lenth of complete SAS RESP frame
5270 * \param agParam A Handle used to refer to the response frame or handle
5272 * \param agOtherInfo Residual count
5276 *****************************************************************************/
5278 itdssIOForDebugging1Completed(
5280 agsaIORequest_t *agIORequest,
5287 TI_DBG1(("itdssIOForDebugging1Completed: start, error!!! can't be called. \n"));
5290 /*****************************************************************************
5291 *! \brief itdssIOForDebugging2Completed
5293 * Purpose: This function is only for debugging. This function should NOT be
5296 * \param agRoot: pointer to port instance
5297 * \param agIORequest: pointer to I/O request
5298 * \param agIOStatus: I/O status given by LL layer
5299 * \param agIOInfoLen: lenth of complete SAS RESP frame
5300 * \param agParam A Handle used to refer to the response frame or handle
5302 * \param agOtherInfo Residual count
5306 *****************************************************************************/
5308 itdssIOForDebugging2Completed(
5310 agsaIORequest_t *agIORequest,
5317 TI_DBG1(("itdssIOForDebugging2Completed: start, error!!! can't be called. \n"));
5320 /*****************************************************************************
5321 *! \brief itdssIOForDebugging3Completed
5323 * Purpose: This function is only for debugging. This function should NOT be
5326 * \param agRoot: pointer to port instance
5327 * \param agIORequest: pointer to I/O request
5328 * \param agIOStatus: I/O status given by LL layer
5329 * \param agIOInfoLen: lenth of complete SAS RESP frame
5330 * \param agParam A Handle used to refer to the response frame or handle
5332 * \param agOtherInfo Residual count
5336 *****************************************************************************/
5338 itdssIOForDebugging3Completed(
5340 agsaIORequest_t *agIORequest,
5347 TI_DBG1(("itdssIOForDebugging3Completed: start, error!!! can't be called. \n"));