The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/pms/RefTisa/tisa/sassata/sas/ini/itdcb.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*******************************************************************************
    2 **
    3 *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
    4 *
    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
    8 *following disclaimer. 
    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. 
   12 *
   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
   21 **
   22 ********************************************************************************/
   23 /*****************************************************************************/
   24 /** \file
   25  *
   26  * This file contains initiator CB functions
   27  *
   28  */
   29 #include <sys/cdefs.h>
   30 __FBSDID("$FreeBSD$");
   31 #include <dev/pms/config.h>
   32 
   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>
   36 
   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>
   40 
   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>
   45 
   46 #ifdef FDS_SM
   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>
   50 #endif
   51 
   52 #ifdef FDS_DM
   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>
   56 #endif
   57 
   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>
   61 
   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>
   66 #endif
   67 
   68 #ifdef TARGET_DRIVER
   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>
   72 #endif
   73 
   74 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
   75 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
   76 
   77 /*****************************************************************************
   78 *!  \brief  itdssTaskCompleted
   79 *
   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.
   83 *
   84 *   \param  agRoot:         Pointer to driver Instance.
   85 *   \param  agIORequest:    Pointer to the I/O Request data structure for
   86 *                           this I/O.
   87 *   \param  agIOStatus:     Status of I/O just completed.
   88 *   \param  agIOInfoLen:    Length of the I/O information associated with this
   89 *                           I/O request
   90 *   \param   agParam        A Handle used to refer to the response frame or handle
   91 *                           of abort request
   92 *   \param  agOtherInfo        Residual count
   93 *   \return:                None
   94 *
   95 *   \note - This is a initiator specific function called by the jump table.
   96 *
   97 *****************************************************************************/
   98 osGLOBAL void
   99 itdssTaskCompleted(
  100                  agsaRoot_t             *agRoot,
  101                  agsaIORequest_t        *agIORequest,
  102                  bit32                  agIOStatus,
  103                  bit32                  agIOInfoLen,
  104                  void                   *agParam,
  105                  bit32                  agOtherInfo
  106                  )
  107 {
  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;
  116   bit8                        respData[128];
  117   bit32                       respLen;
  118 #ifdef  TD_DEBUG_ENABLE
  119   bit32                       data_status;
  120 #endif
  121   agsaSASRequestBody_t        *agSASRequestBody = agNULL;
  122   agsaSSPScsiTaskMgntReq_t    *agSSPTaskMgntRequest = agNULL;
  123   agsaIORequest_t             *agAbortIORequest;
  124   tdIORequestBody_t           *tdAbortIORequestBody;
  125   bit32                       PhysUpper32;
  126   bit32                       PhysLower32;
  127   bit32                       memAllocStatus;
  128   void                        *osMemHandle;
  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;
  134 
  135   TI_DBG2(("itdssTaskCompleted: start\n"));
  136 
  137   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
  138 
  139   /* check the agIOStatus */
  140   currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag;
  141 
  142   if (currentTaskTag == agNULL)
  143   {
  144     TI_DBG1(("itdssTaskCompleted: currentTaskTag is NULL \n"));
  145         /* as the currentTaskTag is agNULL, shall not call ostiInitiatorEvent */
  146         #if 0
  147     ostiInitiatorEvent( tiRoot,
  148                         NULL,
  149                         NULL,
  150                         tiIntrEventTypeTaskManagement,
  151                         tiTMFailed,
  152                         currentTaskTag );
  153     #endif
  154     /* free up allocated memory */
  155     ostiFreeMemory(
  156                    tiRoot,
  157                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  158                    sizeof(tdIORequestBody_t)
  159                    );
  160     return;
  161   }
  162 
  163   if (agIOStatus != OSSA_IO_SUCCESS)
  164   {
  165     TI_DBG1(("itdssTaskCompleted: agIOStatus failed and tiTMFailed\n"));
  166     if (agIOStatus == OSSA_IO_TM_TAG_NOT_FOUND)
  167     {
  168       TI_DBG1(("itdssTaskCompleted: agIOStatus OSSA_IO_TM_TAG_NOT_FOUND\n"));
  169     }
  170     else
  171     if (agIOStatus == OSSA_IO_ABORTED)
  172     {
  173       TI_DBG1(("itdssTaskCompleted: agIOStatus OSSA_IO_ABORTED\n"));
  174     }
  175     else
  176     {
  177       TI_DBG1(("itdssTaskCompleted: agIOStatus 0x%x\n", agIOStatus));
  178     }
  179     ostiInitiatorEvent( tiRoot,
  180                         NULL,
  181                         NULL,
  182                         tiIntrEventTypeTaskManagement,
  183                         tiTMFailed,
  184                         currentTaskTag );
  185     /* free up allocated memory */
  186     ostiFreeMemory(
  187                    tiRoot,
  188                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  189                    sizeof(tdIORequestBody_t)
  190                    );
  191     return;
  192   }
  193 
  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);
  199 #endif
  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),
  205                    respData, respLen);
  206   TI_DBG6(("itdssTaskCompleted: res code %d. should be 0\n", respData[3]));
  207 
  208   taskTag = tdIORequestBody->IOType.InitiatorTMIO.TaskTag;
  209   if (taskTag == agNULL)
  210   {
  211     /* other than Abort Task or Query Task */
  212     TI_DBG1(("itdssTaskCompleted: taskTag is NULL\n"));
  213 
  214     abortOrquery = agFALSE;
  215     TMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
  216   }
  217   else
  218   {
  219     /* Abort Task or Query Task */
  220     TI_DBG2(("itdssTaskCompleted: taskTag is NOT NULL\n"));
  221     abortOrquery = agTRUE;
  222     TMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
  223   }
  224 
  225   TI_DBG2(("itdssTaskCompleted: TMtdIORequestBody %p\n", TMtdIORequestBody));
  226 
  227   if (TMtdIORequestBody == agNULL)
  228   {
  229     TI_DBG1(("itdssTaskCompleted: TMtdIORequestBody is NULL \n"));
  230     ostiInitiatorEvent( tiRoot,
  231                         NULL,
  232                         NULL,
  233                         tiIntrEventTypeTaskManagement,
  234                         tiTMFailed,
  235                         currentTaskTag );
  236     /* free up allocated memory */
  237     ostiFreeMemory(
  238                    tiRoot,
  239                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  240                    sizeof(tdIORequestBody_t)
  241                    );
  242     return;
  243   }
  244 
  245   if (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0)
  246   {
  247     TI_DBG1(("itdssTaskCompleted: agIOInfoLen is zero, wrong\n"));
  248     ostiInitiatorEvent( tiRoot,
  249                         NULL,
  250                         NULL,
  251                         tiIntrEventTypeTaskManagement,
  252                         tiTMFailed,
  253                         currentTaskTag );
  254     /* free up allocated memory */
  255     ostiFreeMemory(
  256                    tiRoot,
  257                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  258                    sizeof(tdIORequestBody_t)
  259                    );
  260     return;
  261   }
  262 
  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));
  266 
  267   if ( (agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK ||
  268         agSSPTaskMgntRequest->taskMgntFunction == AGSA_QUERY_TASK) &&
  269         abortOrquery == agFALSE
  270       )
  271   {
  272     TI_DBG1(("itdssTaskCompleted: incorrect tasktag, first\n"));
  273     ostiInitiatorEvent( tiRoot,
  274                         NULL,
  275                         NULL,
  276                         tiIntrEventTypeTaskManagement,
  277                         tiTMFailed,
  278                         currentTaskTag );
  279     /* free up allocated memory */
  280     ostiFreeMemory(
  281                    tiRoot,
  282                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  283                    sizeof(tdIORequestBody_t)
  284                    );
  285     return;
  286   }
  287 
  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
  293      )
  294   {
  295     TI_DBG1(("itdssTaskCompleted: incorrect tasktag, second\n"));
  296     ostiInitiatorEvent( tiRoot,
  297                         NULL,
  298                         NULL,
  299                         tiIntrEventTypeTaskManagement,
  300                         tiTMFailed,
  301                         currentTaskTag );
  302     /* free up allocated memory */
  303     ostiFreeMemory(
  304                    tiRoot,
  305                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  306                    sizeof(tdIORequestBody_t)
  307                    );
  308     return;
  309   }
  310 
  311 
  312   if (agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK)
  313   {
  314     TI_DBG2(("itdssTaskCompleted: calling saSSPAbort()\n"));
  315     AborttdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
  316     if (AborttdIORequestBody == agNULL)
  317     {
  318       TI_DBG1(("itdssTaskCompleted: wrong, AborttdIORequestBody is NULL\n"));
  319       return;
  320     }
  321 
  322     tiDeviceHandle = AborttdIORequestBody->tiDevHandle;
  323     if (tiDeviceHandle == agNULL)
  324     {
  325       TI_DBG1(("itdssTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
  326       return;
  327     }
  328     oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
  329     if (oneDeviceData == agNULL)
  330     {
  331       TI_DBG1(("itdssTaskCompleted: wrong, oneDeviceData is NULL\n"));
  332       return;
  333     }
  334     agDevHandle = oneDeviceData->agDevHandle;
  335     if (agDevHandle == agNULL)
  336     {
  337       TI_DBG1(("itdssTaskCompleted: wrong, agDevHandle is NULL\n"));
  338     }
  339 
  340     agTaskedIORequest = (agsaIORequest_t *)&(AborttdIORequestBody->agIORequest);
  341     if (agTaskedIORequest == agNULL)
  342     {
  343       TI_DBG1(("itdssTaskCompleted: agTaskedIORequest is NULL \n"));
  344       ostiInitiatorEvent( tiRoot,
  345                           NULL,
  346                           NULL,
  347                           tiIntrEventTypeTaskManagement,
  348                           tiTMFailed,
  349                           currentTaskTag );
  350       /* free up allocated memory */
  351       ostiFreeMemory(
  352                      tiRoot,
  353                      tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  354                      sizeof(tdIORequestBody_t)
  355                      );
  356       return;
  357     }
  358 
  359 
  360     /* allocating agIORequest for abort itself */
  361     memAllocStatus = ostiAllocMemory(
  362                                      tiRoot,
  363                                      &osMemHandle,
  364                                      (void **)&tdAbortIORequestBody,
  365                                      &PhysUpper32,
  366                                      &PhysLower32,
  367                                      8,
  368                                      sizeof(tdIORequestBody_t),
  369                                      agTRUE
  370                                      );
  371     if (memAllocStatus != tiSuccess)
  372     {
  373       /* let os process IO */
  374       TI_DBG1(("itdssTaskCompleted: ostiAllocMemory failed...\n"));
  375       return;
  376     }
  377 
  378     if (tdAbortIORequestBody == agNULL)
  379     {
  380       /* let os process IO */
  381       TI_DBG1(("itdssTaskCompleted: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
  382       return;
  383     }
  384 
  385     /* setup task management structure */
  386     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
  387     tdAbortIORequestBody->tiDevHandle = tiDeviceHandle;
  388     /* setting callback */
  389     tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
  390 
  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 */
  397 
  398     status = saSSPAbort(agRoot, agAbortIORequest, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 0, agTaskedIORequest, agNULL);
  399     if (status != AGSA_RC_SUCCESS)
  400     {
  401       TI_DBG1(("itdssTaskCompleted: saSSPAbort failed agIOInfoLen is zero, wrong\n"));
  402       ostiFreeMemory(
  403                      tiRoot,
  404                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  405                      sizeof(tdIORequestBody_t)
  406                      );
  407     }
  408   }
  409 
  410   /*
  411     parse the response and based on the parse,
  412     set the flag
  413   */
  414   if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_COMPLETE ||
  415       respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED)
  416   {
  417     TI_DBG2(("itdssTaskCompleted: tiTMOK\n"));
  418     tiDeviceHandle = TMtdIORequestBody->tiDevHandle;
  419     if (tiDeviceHandle == agNULL)
  420     {
  421       TI_DBG1(("itdssTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
  422       return;
  423     }
  424     oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
  425     if (oneDeviceData == agNULL)
  426     {
  427       TI_DBG1(("itdssTaskCompleted: wrong, oneDeviceData is NULL\n"));
  428       return;
  429     }
  430     agDevHandle = oneDeviceData->agDevHandle;
  431     if (agDevHandle == agNULL)
  432     {
  433       TI_DBG1(("itdssTaskCompleted: wrong, agDevHandle is NULL\n"));
  434     }
  435     TI_DBG2(("itdssTaskCompleted: setting Device state to SA_DS_OPERATIONAL\n"));
  436 
  437     saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
  438 
  439     ostiInitiatorEvent( tiRoot,
  440                         NULL,
  441                         NULL,
  442                         tiIntrEventTypeTaskManagement,
  443                         tiTMOK,
  444                         currentTaskTag );
  445   }
  446   else
  447   {
  448     TI_DBG1(("itdssTaskCompleted: tiTMFailed\n"));
  449     ostiInitiatorEvent( tiRoot,
  450                         NULL,
  451                         NULL,
  452                         tiIntrEventTypeTaskManagement,
  453                         tiTMFailed,
  454                         currentTaskTag );
  455 
  456   }
  457 
  458   /* free up allocated memory */
  459   ostiFreeMemory(
  460                  tiRoot,
  461                  tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  462                  sizeof(tdIORequestBody_t)
  463                  );
  464   return;
  465 }
  466 
  467 #ifdef INITIATOR_DRIVER
  468 
  469 /*****************************************************************************
  470 *!  \brief  itdssQueryTaskCompleted
  471 *
  472 *  Purpose: This routine is called to complete an query task management request
  473 *           previously issued to the LL Layer.
  474 *
  475 *   \param  agRoot:         Pointer to driver Instance.
  476 *   \param  agIORequest:    Pointer to the I/O Request data structure for
  477 *                           this I/O.
  478 *   \param  agIOStatus:     Status of I/O just completed.
  479 *   \param  agIOInfoLen:    Length of the I/O information associated with this
  480 *                           I/O request
  481 *   \param   agParam        A Handle used to refer to the response frame or handle
  482 *                           of abort request
  483 *
  484 *   \return:                None
  485 *
  486 *   \note - This is a initiator specific function called by the jump table.
  487 *
  488 *****************************************************************************/
  489 osGLOBAL void
  490 itdssQueryTaskCompleted(
  491                         agsaRoot_t             *agRoot,
  492                         agsaIORequest_t        *agIORequest,
  493                         bit32                  agIOStatus,
  494                         bit32                  agIOInfoLen,
  495                         void                   *agParam,
  496                         bit32                  agOtherInfo
  497                         )
  498 {
  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;
  506   bit8                        respData[128];
  507   bit32                       respLen;
  508 #ifdef  TD_DEBUG_ENABLE
  509   bit32                       data_status;
  510 #endif
  511   agsaSASRequestBody_t        *agSASRequestBody = agNULL;
  512   agsaSSPScsiTaskMgntReq_t    *agSSPTaskMgntRequest = agNULL;
  513   bit32                       status;
  514   agsaIORequest_t             *agAbortIORequest = agNULL;
  515   tdIORequestBody_t           *tdAbortIORequestBody = agNULL;
  516   bit32                       PhysUpper32;
  517   bit32                       PhysLower32;
  518   bit32                       memAllocStatus;
  519   void                        *osMemHandle = agNULL;
  520   tiDeviceHandle_t            *tiDeviceHandle = agNULL;
  521   tdsaDeviceData_t            *oneDeviceData = agNULL;
  522   agsaDevHandle_t             *agDevHandle = agNULL;
  523 
  524   TI_DBG2(("itdssQueryTaskComplted: start\n"));
  525 
  526   /* query task management IORequestBody */
  527   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
  528 
  529   /* OS's tiIORequest for this query taks, which is agNULL */
  530   //currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag;
  531 
  532   /*
  533     currentTaskTag is agNULL for query task since it is generated by
  534     TD layer
  535   */
  536   if (agIOStatus != OSSA_IO_SUCCESS)
  537   {
  538     /* let os process IO */
  539     TI_DBG1(("itdssQueryTaskComplted: agIOStatus failed and tiTMFailed\n"));
  540     /* free up allocated memory */
  541     ostiFreeMemory(
  542                    tiRoot,
  543                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  544                    sizeof(tdIORequestBody_t)
  545                    );
  546     return;
  547   }
  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);
  553 #endif
  554   respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
  555 
  556   TI_DBG6(("itdssQueryTaskCompleted: dataPres %d. should be 1\n", data_status));
  557   /* reads response data */
  558   saFrameReadBlock(agRoot, agParam,
  559                    sizeof(agsaSSPResponseInfoUnit_t),
  560                    respData, respLen);
  561 
  562   TI_DBG6(("itdssQueryTaskCompleted: res code %d. should be 0\n", respData[3]));
  563 
  564   /* IO being query tasked */
  565   taskTag = tdIORequestBody->IOType.InitiatorTMIO.TaskTag;
  566   if (taskTag == agNULL)
  567   {
  568     TI_DBG1(("itdssQueryTaskComplted: taskTag is NULL \n"));
  569     /* free up allocated memory */
  570     ostiFreeMemory(
  571                    tiRoot,
  572                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  573                    sizeof(tdIORequestBody_t)
  574                    );
  575     return;
  576   }
  577 
  578   /* request body of IO being query tasked  */
  579   TMtdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
  580   if (TMtdIORequestBody == agNULL)
  581   {
  582     TI_DBG1(("itdssQueryTaskComplted: TMtdIORequestBody is NULL \n"));
  583     /* free up allocated memory */
  584     ostiFreeMemory(
  585                    tiRoot,
  586                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  587                    sizeof(tdIORequestBody_t)
  588                    );
  589     return;
  590   }
  591 
  592   agTaskedIORequest = &(TMtdIORequestBody->agIORequest);
  593   if (agTaskedIORequest == agNULL)
  594   {
  595     TI_DBG1(("itdssQueryTaskComplted: agTaskedIORequest is NULL \n"));
  596     /* free up allocated memory */
  597     ostiFreeMemory(
  598                    tiRoot,
  599                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  600                    sizeof(tdIORequestBody_t)
  601                    );
  602     return;
  603   }
  604 
  605   if (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0)
  606   {
  607     TI_DBG1(("itdssQueryTaskCompleted: agIOInfoLen is zero, wrong\n"));
  608     /* free up allocated memory */
  609     ostiFreeMemory(
  610                    tiRoot,
  611                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  612                    sizeof(tdIORequestBody_t)
  613                    );
  614    return;
  615   }
  616   /* this is query task itself */
  617   agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
  618   agSSPTaskMgntRequest = &(agSASRequestBody->sspTaskMgntReq);
  619   if (agSSPTaskMgntRequest->taskMgntFunction == AGSA_QUERY_TASK)
  620   {
  621     /*
  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
  625       SAM
  626 
  627       1. If TASK MANAGEMENT FUNCTION SUCCEEDE, do nothing
  628 
  629       2. If TASK MANAGEMENT FUNCTION COMPLETE and IO is not completed,
  630       retry by saSSPAbort()
  631     */
  632     if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED)
  633     {
  634       /* OK; IO is being process at the target; do nothing */
  635     }
  636     else if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_COMPLETE)
  637     {
  638       tiDeviceHandle = TMtdIORequestBody->tiDevHandle;
  639       if (tiDeviceHandle == agNULL)
  640       {
  641         TI_DBG1(("itdssQueryTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
  642         /* free up allocated memory */
  643         ostiFreeMemory(
  644                        tiRoot,
  645                        tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  646                        sizeof(tdIORequestBody_t)
  647                        );
  648         return;
  649       }
  650       oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
  651       if (oneDeviceData == agNULL)
  652       {
  653         TI_DBG1(("itdssQueryTaskCompleted: wrong, oneDeviceData is NULL\n"));
  654         /* free up allocated memory */
  655         ostiFreeMemory(
  656                        tiRoot,
  657                        tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  658                        sizeof(tdIORequestBody_t)
  659                        );
  660 
  661         return;
  662       }
  663       agDevHandle = oneDeviceData->agDevHandle;
  664       if (agDevHandle == agNULL)
  665       {
  666         TI_DBG1(("itdssQueryTaskCompleted: wrong, agDevHandle is NULL\n"));
  667       }
  668       /* if IO is not completed, retry IO by saSSPAbort() */
  669       if (TMtdIORequestBody->ioCompleted != agTRUE)
  670       {
  671         /* allocating agIORequest for abort itself */
  672         memAllocStatus = ostiAllocMemory(
  673                                          tiRoot,
  674                                          &osMemHandle,
  675                                          (void **)&tdAbortIORequestBody,
  676                                          &PhysUpper32,
  677                                          &PhysLower32,
  678                                          8,
  679                                          sizeof(tdIORequestBody_t),
  680                                          agTRUE
  681                                          );
  682         if (memAllocStatus != tiSuccess)
  683         {
  684           /* let os process IO */
  685           TI_DBG1(("itdssQueryTaskCompleted: ostiAllocMemory failed...\n"));
  686           /* free up allocated memory */
  687           ostiFreeMemory(
  688                          tiRoot,
  689                          tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  690                          sizeof(tdIORequestBody_t)
  691                          );
  692 
  693           return;
  694         }
  695         if (tdAbortIORequestBody == agNULL)
  696         {
  697           /* let os process IO */
  698           TI_DBG1(("itdssQueryTaskCompleted: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
  699           /* free up allocated memory */
  700           ostiFreeMemory(
  701                          tiRoot,
  702                          tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  703                          sizeof(tdIORequestBody_t)
  704                          );
  705 
  706           return;
  707         }
  708 
  709         /* setup task management structure */
  710         tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
  711         tdAbortIORequestBody->tiDevHandle = tdIORequestBody->tiDevHandle;
  712         tdAbortIORequestBody->tiIOToBeAbortedRequest = agNULL;
  713 
  714         /* setting callback */
  715         tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
  716 
  717         /* initialize agIORequest */
  718         agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
  719         agAbortIORequest->osData = (void *) tdAbortIORequestBody;
  720         agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
  721 
  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)
  725         {
  726           TI_DBG1(("itdssQueryTaskCompleted: saSSPAbort failed agIOInfoLen is zero, wrong\n"));
  727           ostiFreeMemory(
  728                          tiRoot,
  729                          tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  730                          sizeof(tdIORequestBody_t)
  731                          );
  732         }
  733       }
  734     }
  735     else
  736     {
  737       TI_DBG1(("itdssQueryTaskComplted: not expected response 0x%x\n",respData[3]));
  738     }
  739   }
  740   else
  741   {
  742     TI_DBG1(("itdssQueryTaskCompleted: not expected task management fn %d\n",agSSPTaskMgntRequest->taskMgntFunction));
  743   }
  744 
  745   /* free up allocated memory */
  746   ostiFreeMemory(
  747                  tiRoot,
  748                  tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
  749                  sizeof(tdIORequestBody_t)
  750                  );
  751   return;
  752 }
  753 #endif
  754 
  755 /*****************************************************************************
  756 *!  \brief  itssdosIOCompleted
  757 *
  758 *  Purpose: This routine is called to complete an I/O request previously
  759 *           issued to the LL Layer in saSSPStart().
  760 *
  761 *   \param  agRoot:       Pointer to driver Instance.
  762 *   \param  agIORequest:  Pointer to the I/O Request data structure for
  763 *                         this I/O.
  764 *   \param  agIOStatus:   Status of I/O just completed.
  765 *   \param  agIOInfoLen:  Length of the I/O information associated with this
  766 *                         I/O request
  767 *   \param   agParam      A Handle used to refer to the response frame or handle
  768 *                         of abort request
  769 *  \param  agOtherInfo    Residual count
  770 *   \return:              None
  771 *
  772 *   \note - This is a initiator specific function called by the jump table.
  773 *
  774 *****************************************************************************/
  775 FORCEINLINE void
  776 itdssIOCompleted(
  777                  agsaRoot_t             *agRoot,
  778                  agsaIORequest_t        *agIORequest,
  779                  bit32                   agIOStatus,
  780                  bit32                   agIOInfoLen,
  781                  void                   *agParam,
  782                  bit32                   agOtherInfo
  783                  )
  784 {
  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;
  792 
  793   bit32 scsi_status = 0;
  794 
  795   tiDeviceHandle_t          *tiDeviceHandle = agNULL;
  796   tdsaDeviceData_t          *oneDeviceData  = agNULL;
  797 
  798   TI_DBG6(("itdssIOCompleted: start\n"));
  799   TI_DBG6(("itdssIOCompleted: agIOInfoLen %d\n", agIOInfoLen));
  800 
  801   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
  802   TD_ASSERT((NULL != tdIORequestBody), "itdssIOCompleted:tdIORequestBody NULL");
  803   if ( NULL == tdIORequestBody )  // handle windows assert case
  804   {
  805     return;
  806   }
  807   Initiator->NumIOsActive--;
  808 
  809 #ifdef DBG
  810   if (tdIORequestBody->ioCompleted == agTRUE)
  811   {
  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*/
  820   }
  821 
  822   if (Initiator->NumIOsActive == 0)
  823   {
  824     /* so far, no timer assocaicated here */
  825     TI_DBG6(("itdssIOCompleted: no acitve IO's. Kill timers\n"));
  826   }
  827 
  828   if (tdIORequestBody->tiIORequest->osData == agNULL)
  829   {
  830     TI_DBG1( ("itdssIOCompleted: pos 1; "
  831               "tdIORequestBody->tiIORequest->osData is null, wrong\n") );
  832   }
  833 #endif /*DBG*/
  834 
  835   tdIORequestBody->ioCompleted = agTRUE;
  836   tdIORequestBody->ioStarted = agFALSE;
  837 
  838   /* Process completion for debugging, printing cbd */
  839   agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
  840   agSSPInitiatorRequest = &(agSASRequestBody->sspInitiatorReq);
  841 
  842   TI_DBG6( ("itdssIOCompleted: CDB 0x%x\n",
  843             agSSPInitiatorRequest->sspCmdIU.cdb[0]) );
  844 
  845   /* no respsonse or sense data; data has been processed */
  846   if((agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0))
  847   {
  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))
  852     {
  853       bit32 qdepth = 32;
  854       tiDeviceHandle = tdIORequestBody->tiDevHandle;
  855       if( tiDeviceHandle )
  856       {
  857         oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
  858         if( oneDeviceData->DeviceType == TD_SAS_DEVICE )
  859         {
  860           qdepth = MAX_OUTSTANDING_IO_PER_LUN;
  861         }
  862         if( oneDeviceData->DeviceType == TD_SATA_DEVICE )
  863         {
  864           qdepth = 63;
  865         }
  866       }
  867 
  868       if ( ostiSetDeviceQueueDepth( tiRoot,
  869                                     tdIORequestBody->tiIORequest,
  870                                     MAX_OUTSTANDING_IO_PER_LUN ) == agFALSE )
  871       {
  872         TI_DBG1( ( "itdssIOCompleted: failed to call "
  873                    "ostiSetDeviceQueueDepth() Q=%d !!!\n", qdepth ) );
  874       }
  875       else
  876       {
  877         TI_DBG2(("itdssIOCompleted: set ostiSetDeviceQueueDepth() Q=%d\n",qdepth));
  878       }
  879     }
  880     // SCSI command was completed OK, this is the normal path. Now call the
  881     // OS Specific module about this completion.
  882     ostiInitiatorIOCompleted(
  883                              tiRoot,
  884                              tdIORequestBody->tiIORequest,
  885                              tiIOSuccess,
  886                              SCSI_STAT_GOOD,
  887                              agNULL,
  888                              agTRUE /* intContext; is not being used */
  889                              );
  890     return;
  891   }
  892 
  893   else
  894   {
  895     TI_DBG6(("itdssIOCompleted: SUCCESS but data returned \n"));
  896     TI_DBG6( ("itdssIOCompleted: agIOStatus SUCCESS but data returned 0x%x\n",
  897               agIOStatus) );
  898     if(tdIORequestBody)
  899     {
  900       tiDeviceHandle = tdIORequestBody->tiDevHandle;
  901       if(tiDeviceHandle)
  902       {
  903         oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
  904       }
  905     }
  906 
  907     osti_memset(&agSSPRespIU, 0, sizeof(agsaSSPResponseInfoUnit_t));
  908 
  909     saFrameReadBlock( agRoot,
  910                       agParam,
  911                       0,
  912                       &agSSPRespIU,
  913                       sizeof(agsaSSPResponseInfoUnit_t) );
  914     scsi_status = agSSPRespIU.status;
  915 
  916     switch (scsi_status)
  917     {
  918       case SCSI_STAT_GOOD:
  919         TI_DBG2( ("itdssIOCompleted: SCSI_STAT_GOOD %d\n",
  920                   Initiator->ScsiStatusCounts.GoodStatus) );
  921         Initiator->ScsiStatusCounts.GoodStatus++;
  922         break;
  923        case SCSI_STAT_CHECK_CONDITION:
  924         TI_DBG1( ("itdssIOCompleted: SCSI_STAT_CHECK_CONDITION %d\n",
  925                   Initiator->ScsiStatusCounts.CheckCondition) );
  926         Initiator->ScsiStatusCounts.CheckCondition++;
  927         break;
  928       case SCSI_STAT_BUSY:
  929         TI_DBG1( ("itdssIOCompleted: SCSI_STAT_BUSY %d\n",
  930                   Initiator->ScsiStatusCounts.BusyStatus) );
  931         Initiator->ScsiStatusCounts.BusyStatus++;
  932         break;
  933       case SCSI_STAT_RESV_CONFLICT:
  934         TI_DBG1( ("itdssIOCompleted: SCSI_STAT_RESV_CONFLICT %d\n",
  935                   Initiator->ScsiStatusCounts.ResvConflict) );
  936         Initiator->ScsiStatusCounts.ResvConflict++;
  937         break;
  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) );
  944         break;
  945       case SCSI_STAT_ACA_ACTIVE:
  946         Initiator->ScsiStatusCounts.AcaActive++;
  947         TI_DBG1( ("itdssIOCompleted: SCSI_STAT_ACA_ACTIVE %d\n",
  948                   Initiator->ScsiStatusCounts.AcaActive) );
  949         break;
  950       case SCSI_STAT_TASK_ABORTED:
  951         Initiator->ScsiStatusCounts.TaskAborted++;
  952         TI_DBG1( ("itdssIOCompleted: SCSI_STAT_TASK_ABORTED %d\n",
  953                   Initiator->ScsiStatusCounts.TaskAborted) );
  954         break;
  955       case SCSI_STAT_CONDITION_MET:
  956         Initiator->ScsiStatusCounts.ConditionMet++;
  957         TI_DBG1( ("itdssIOCompleted: SCSI_STAT_CONDITION_MET %d\n",
  958                   Initiator->ScsiStatusCounts.ConditionMet) );
  959         break;
  960       case SCSI_STAT_INTERMEDIATE:
  961         TI_DBG1( ("itdssIOCompleted: SCSI_STAT_INTERMEDIATE %d\n",
  962                   Initiator->ScsiStatusCounts.ObsoleteStatus) );
  963         Initiator->ScsiStatusCounts.ObsoleteStatus++;
  964         break;
  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++;
  969         break;
  970       case SCSI_STAT_COMMANDTERMINATED:
  971         TI_DBG1( ("itdssIOCompleted: SCSI_STAT_COMMANDTERMINATED %d\n",
  972                   Initiator->ScsiStatusCounts.ObsoleteStatus) );
  973         Initiator->ScsiStatusCounts.ObsoleteStatus++;
  974         break;
  975       default:
  976         Initiator->ScsiStatusCounts.ObsoleteStatus++;
  977         TI_DBG1( ("itdssIOCompleted: Unknown scsi_status %d 0x%x\n",
  978                   scsi_status,Initiator->ScsiStatusCounts.ObsoleteStatus) );
  979     }
  980 
  981     switch (agIOStatus)
  982     {
  983     case OSSA_IO_SUCCESS:
  984       itdssIOSuccessHandler( agRoot,
  985                              agIORequest,
  986                              agIOStatus,
  987                              agIOInfoLen,
  988                              agParam,
  989                              agOtherInfo );
  990       break;
  991     case OSSA_IO_ABORTED:
  992       itdssIOAbortedHandler( agRoot,
  993                              agIORequest,
  994                              agIOStatus,
  995                              agIOInfoLen,
  996                              agParam,
  997                              agOtherInfo );
  998       break;
  999     case OSSA_IO_UNDERFLOW:
 1000       itdssIOUnderFlowHandler( agRoot,
 1001                                agIORequest,
 1002                                agIOStatus,
 1003                                agIOInfoLen,
 1004                                agParam,
 1005                                agOtherInfo );
 1006       break;
 1007     case OSSA_IO_FAILED:
 1008       itdssIOFailedHandler( agRoot,
 1009                             agIORequest,
 1010                             agIOStatus,
 1011                             agIOInfoLen,
 1012                             agParam,
 1013                             agOtherInfo );
 1014       break;
 1015     case OSSA_IO_ABORT_RESET:
 1016       itdssIOAbortResetHandler( agRoot,
 1017                                 agIORequest,
 1018                                 agIOStatus,
 1019                                 agIOInfoLen,
 1020                                 agParam,
 1021                                 agOtherInfo );
 1022       break;
 1023     case OSSA_IO_NO_DEVICE:
 1024       itdssIONoDeviceHandler( agRoot,
 1025                               agIORequest,
 1026                               agIOStatus,
 1027                               agIOInfoLen,
 1028                               agParam,
 1029                               agOtherInfo );
 1030       break;
 1031     case OSSA_IO_XFER_ERROR_BREAK:
 1032       itdssXferErrorBreakHandler( agRoot,
 1033                                   agIORequest,
 1034                                   agIOStatus,
 1035                                   agIOInfoLen,
 1036                                   agParam,
 1037                                   agOtherInfo );
 1038       break;
 1039     case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
 1040       itdssXferErrorPhyNotReadyHandler( agRoot,
 1041                                         agIORequest,
 1042                                         agIOStatus,
 1043                                         agIOInfoLen,
 1044                                         agParam,
 1045                                         agOtherInfo );
 1046       break;
 1047     case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
 1048       itdssOpenCnxErrorProtocolNotSupprotedHandler( agRoot,
 1049                                                     agIORequest,
 1050                                                     agIOStatus,
 1051                                                     agIOInfoLen,
 1052                                                     agParam,
 1053                                                     agOtherInfo );
 1054       break;
 1055     case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
 1056       itdssOpenCnxErrorZoneViolationHandler( agRoot,
 1057                                              agIORequest,
 1058                                              agIOStatus,
 1059                                              agIOInfoLen,
 1060                                              agParam,
 1061                                              agOtherInfo );
 1062       break;
 1063     case OSSA_IO_OPEN_CNX_ERROR_BREAK:
 1064       itdssOpenCnxErrorBreakHandler( agRoot,
 1065                                      agIORequest,
 1066                                      agIOStatus,
 1067                                      agIOInfoLen,
 1068                                      agParam,
 1069                                      agOtherInfo );
 1070       break;
 1071     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
 1072       itdssOpenCnxErrorITNexusLossHandler( agRoot,
 1073                                            agIORequest,
 1074                                            agIOStatus,
 1075                                            agIOInfoLen,
 1076                                            agParam,
 1077                                            agOtherInfo );
 1078       break;
 1079     case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
 1080       itdssOpenCnxErrorBadDestinationHandler( agRoot,
 1081                                               agIORequest,
 1082                                               agIOStatus,
 1083                                               agIOInfoLen,
 1084                                               agParam,
 1085                                               agOtherInfo );
 1086       break;
 1087     case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
 1088       itdssOpenCnxErrorConnectionRateNotSupportedHandler( agRoot,
 1089                                                           agIORequest,
 1090                                                           agIOStatus,
 1091                                                           agIOInfoLen,
 1092                                                           agParam,
 1093                                                           agOtherInfo );
 1094       break;
 1095     case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
 1096       itdssOpenCnxErrorWrongDestinationHandler( agRoot,
 1097                                                 agIORequest,
 1098                                                 agIOStatus,
 1099                                                 agIOInfoLen,
 1100                                                 agParam,
 1101                                                 agOtherInfo );
 1102       break;
 1103     case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR:
 1104       itdssOpenCnxErrorUnknownErrorHandler( agRoot,
 1105                                             agIORequest,
 1106                                             agIOStatus,
 1107                                             agIOInfoLen,
 1108                                             agParam,
 1109                                             agOtherInfo );
 1110       break;
 1111     case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
 1112       itdssXferErrorNAKReceivedHandler( agRoot,
 1113                                         agIORequest,
 1114                                         agIOStatus,
 1115                                         agIOInfoLen,
 1116                                         agParam,
 1117                                         agOtherInfo );
 1118       break;
 1119     case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT:
 1120       itdssXferErrorACKNAKTimeoutHandler( agRoot,
 1121                                           agIORequest,
 1122                                           agIOStatus,
 1123                                           agIOInfoLen,
 1124                                           agParam,
 1125                                           agOtherInfo );
 1126       break;
 1127     case OSSA_IO_XFER_ERROR_DMA:
 1128       itdssXferErrorDMAHandler( agRoot,
 1129                                 agIORequest,
 1130                                 agIOStatus,
 1131                                 agIOInfoLen,
 1132                                 agParam,
 1133                                 agOtherInfo );
 1134       break;
 1135     case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
 1136       itdssXferErrorOffsetMismatchHandler( agRoot,
 1137                                            agIORequest,
 1138                                            agIOStatus,
 1139                                            agIOInfoLen,
 1140                                            agParam,
 1141                                            agOtherInfo );
 1142       break;
 1143     case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
 1144       itdssXferOpenRetryTimeoutHandler( agRoot,
 1145                                         agIORequest,
 1146                                         agIOStatus,
 1147                                         agIOInfoLen,
 1148                                         agParam,
 1149                                         agOtherInfo );
 1150       break;
 1151     case OSSA_IO_PORT_IN_RESET:
 1152       itdssPortInResetHandler( agRoot,
 1153                                agIORequest,
 1154                                agIOStatus,
 1155                                agIOInfoLen,
 1156                                agParam,
 1157                                agOtherInfo );
 1158       break;
 1159     case OSSA_IO_DS_NON_OPERATIONAL:
 1160       itdssDsNonOperationalHandler( agRoot,
 1161                                     agIORequest,
 1162                                     agIOStatus,
 1163                                     agIOInfoLen,
 1164                                     agParam,
 1165                                     agOtherInfo );
 1166       break;
 1167     case OSSA_IO_DS_IN_RECOVERY:
 1168       itdssDsInRecoveryHandler( agRoot,
 1169                                 agIORequest,
 1170                                 agIOStatus,
 1171                                 agIOInfoLen,
 1172                                 agParam,
 1173                                 agOtherInfo );
 1174       break;
 1175     case OSSA_IO_TM_TAG_NOT_FOUND:
 1176       itdssTmTagNotFoundHandler( agRoot,
 1177                                  agIORequest,
 1178                                  agIOStatus,
 1179                                  agIOInfoLen,
 1180                                  agParam,
 1181                                  agOtherInfo );
 1182       break;
 1183     case OSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR:
 1184       itdssSSPExtIUZeroLenHandler( agRoot,
 1185                                    agIORequest,
 1186                                    agIOStatus,
 1187                                    agIOInfoLen,
 1188                                    agParam,
 1189                                    agOtherInfo );
 1190       break;
 1191     case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
 1192       itdssXferErrorUnexpectedPhaseHandler( agRoot,
 1193                                             agIORequest,
 1194                                             agIOStatus,
 1195                                             agIOInfoLen,
 1196                                             agParam,
 1197                                             agOtherInfo );
 1198       break;
 1199 //new
 1200     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
 1201       itdssXferOpenRetryBackoffThresholdReachedHandler( agRoot,
 1202                                                         agIORequest,
 1203                                                         agIOStatus,
 1204                                                         agIOInfoLen,
 1205                                                         agParam,
 1206                                                         agOtherInfo );
 1207       break;
 1208     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
 1209       itdssOpenCnxErrorItNexusLossOpenTmoHandler( agRoot,
 1210                                                   agIORequest,
 1211                                                   agIOStatus,
 1212                                                   agIOInfoLen,
 1213                                                   agParam,
 1214                                                   agOtherInfo );
 1215       break;
 1216     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
 1217       itdssOpenCnxErrorItNexusLossNoDestHandler( agRoot,
 1218                                                  agIORequest,
 1219                                                  agIOStatus,
 1220                                                  agIOInfoLen,
 1221                                                  agParam,
 1222                                                  agOtherInfo );
 1223       break;
 1224     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
 1225       itdssOpenCnxErrorItNexusLossOpenCollideHandler( agRoot,
 1226                                                       agIORequest,
 1227                                                       agIOStatus,
 1228                                                       agIOInfoLen,
 1229                                                       agParam,
 1230                                                       agOtherInfo );
 1231       break;
 1232     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
 1233       itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler( agRoot,
 1234                                                              agIORequest,
 1235                                                              agIOStatus,
 1236                                                              agIOInfoLen,
 1237                                                              agParam,
 1238                                                              agOtherInfo );
 1239       break;
 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,
 1249                               agIORequest,
 1250                               agIOStatus,
 1251                               agIOInfoLen,
 1252                               agParam,
 1253                               agOtherInfo );
 1254       break;
 1255 
 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,
 1262                        agIORequest,
 1263                        agIOStatus,
 1264                        agIOInfoLen,
 1265                        agParam,
 1266                        agOtherInfo );
 1267       break;
 1268     case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
 1269       itdssIOResourceUnavailableHandler( agRoot,
 1270                                          agIORequest,
 1271                                          agIOStatus,
 1272                                          agIOInfoLen,
 1273                                          agParam,
 1274                                          agOtherInfo );
 1275       break;
 1276     case OSSA_MPI_IO_RQE_BUSY_FULL:
 1277       itdssIORQEBusyFullHandler( agRoot,
 1278                                  agIORequest,
 1279                                  agIOStatus,
 1280                                  agIOInfoLen,
 1281                                  agParam,
 1282                                  agOtherInfo );
 1283       break;
 1284     case OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME:
 1285       itdssXferErrorInvalidSSPRspFrameHandler( agRoot,
 1286                                                agIORequest,
 1287                                                agIOStatus,
 1288                                                agIOInfoLen,
 1289                                                agParam,
 1290                                                agOtherInfo );
 1291       break;
 1292     case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
 1293       itdssXferErrorEOBDataOverrunHandler( agRoot,
 1294                                            agIORequest,
 1295                                            agIOStatus,
 1296                                            agIOInfoLen,
 1297                                            agParam,
 1298                                            agOtherInfo );
 1299       break;
 1300     case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED:
 1301       itdssOpenCnxErrorOpenPreemptedHandler( agRoot,
 1302                                              agIORequest,
 1303                                              agIOStatus,
 1304                                              agIOInfoLen,
 1305                                              agParam,
 1306                                              agOtherInfo );
 1307       break;
 1308     default:
 1309       TI_DBG1( ("itdssIOCompleted: Unknown agIOStatus 0x%x\n",agIOStatus) );
 1310       itdssIODefaultHandler( agRoot,
 1311                              agIORequest,
 1312                              agIOStatus,
 1313                              agIOInfoLen,
 1314                              agParam,
 1315                              agOtherInfo );
 1316       break;
 1317     }
 1318   }
 1319   return;
 1320 }
 1321 
 1322 #ifdef TD_DISCOVER
 1323 /*****************************************************************************
 1324 *!  \brief  itdssSMPCompleted
 1325 *
 1326 *  Purpose: This routine is called to complete an SMP request previously
 1327 *           issued to the LL Layer in saSMPStart().
 1328 *
 1329 *   \param  agRoot:         Pointer to driver Instance.
 1330 *   \param  agIORequest:    Pointer to the I/O Request data structure for
 1331 *                           this I/O.
 1332 *   \param  agIOStatus:     Status of I/O just completed.
 1333 *   \param  agIOInfoLen:    Length of the I/O information associated with this
 1334 *                           I/O request
 1335 *   \param   agFrameHandle  A Handle used to refer to the response frame
 1336 *
 1337 *   \return:                None
 1338 *
 1339 *   \note - This is a initiator specific function called by the jump table.
 1340 *
 1341 *****************************************************************************/
 1342 osGLOBAL void
 1343 itdssSMPCompleted (
 1344                    agsaRoot_t            *agRoot,
 1345                    agsaIORequest_t       *agIORequest,
 1346                    bit32                 agIOStatus,
 1347                    bit32                 agIOInfoLen,
 1348                    agsaFrameHandle_t     agFrameHandle
 1349                    )
 1350 {
 1351   tdsaRootOsData_t          *osData = (tdsaRootOsData_t *)agRoot->osData;
 1352   tiRoot_t                  *tiRoot = (tiRoot_t *)osData->tiRoot;
 1353 #ifdef REMOVED
 1354   tdsaRoot_t                *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
 1355   tdsaContext_t             *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
 1356 #endif
 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;
 1365   bit8                      smpHeader[4];
 1366   tdssSMPFrameHeader_t      *tdSMPFrameHeader;
 1367   bit8                      *tdSMPPayload;
 1368   agsaDevHandle_t           *agDevHandle;
 1369   bit32                     status;
 1370 #ifndef DIRECT_SMP
 1371   tdssSMPFrameHeader_t      *tdRequestSMPFrameHeader;
 1372   bit8                      smpRequestHeader[4];
 1373 #endif
 1374   bit8                      SMPRequestFunction;
 1375 
 1376   TI_DBG3(("itdssSMPCompleted: start\n"));
 1377 
 1378 
 1379   tdSMPRequestBody = (tdssSMPRequestBody_t *)agIORequest->osData;
 1380   CurrentTaskTag  = tdSMPRequestBody->CurrentTaskTag;
 1381 
 1382   oneDeviceData = tdSMPRequestBody->tdDevice;
 1383   onePortContext = oneDeviceData->tdPortContext;
 1384   agDevHandle = oneDeviceData->agDevHandle;
 1385 
 1386 
 1387   agSASRequestBody = &(tdSMPRequestBody->agSASRequestBody);
 1388   agSMPFrame = &(agSASRequestBody->smpFrame);
 1389 
 1390 #ifdef DIRECT_SMP
 1391   SMPRequestFunction = tdSMPRequestBody->smpPayload[1];
 1392 #else
 1393   saFrameReadBlock(agRoot, tdSMPRequestBody->IndirectSMPResp, 0, smpRequestHeader, 4);
 1394   tdRequestSMPFrameHeader = (tdssSMPFrameHeader_t *)smpRequestHeader;
 1395   SMPRequestFunction = tdRequestSMPFrameHeader->smpFunction;
 1396 #endif
 1397 
 1398   TI_DBG3(("itdssSMPCompleted: agIORequest %p\n", agIORequest));
 1399   TI_DBG3(("itdssSMPCompleted: SMPRequestbody %p\n", tdSMPRequestBody));
 1400 
 1401   if (onePortContext != agNULL)
 1402   {
 1403     TI_DBG3(("itdssSMPCompleted: pid %d\n", onePortContext->id));
 1404   }
 1405   else
 1406   {
 1407     TI_DBG1(("itdssSMPCompleted: Wrong!!! onePortContext is NULL\n"));
 1408     ostiFreeMemory(
 1409                  tiRoot,
 1410                  tdSMPRequestBody->osMemHandle,
 1411                  sizeof(tdssSMPRequestBody_t)
 1412                  );
 1413 #ifndef DIRECT_SMP
 1414     ostiFreeMemory(
 1415                  tiRoot,
 1416                  tdSMPRequestBody->IndirectSMPReqosMemHandle,
 1417                  tdSMPRequestBody->IndirectSMPReqLen
 1418                  );
 1419     ostiFreeMemory(
 1420                  tiRoot,
 1421                  tdSMPRequestBody->IndirectSMPResposMemHandle,
 1422                  tdSMPRequestBody->IndirectSMPRespLen
 1423                  );
 1424 #endif
 1425     return;
 1426   }
 1427 
 1428   oldonePortContext = tdSMPRequestBody->tdPortContext;
 1429   if (oldonePortContext != agNULL)
 1430   {
 1431     TI_DBG3(("itdssSMPCompleted: old pid %d\n", oldonePortContext->id));
 1432   }
 1433   else
 1434   {
 1435     TI_DBG1(("itdssSMPCompleted: Wrong!!! oldonePortContext is NULL\n"));
 1436     ostiFreeMemory(
 1437                  tiRoot,
 1438                  tdSMPRequestBody->osMemHandle,
 1439                  sizeof(tdssSMPRequestBody_t)
 1440                  );
 1441 #ifndef DIRECT_SMP
 1442     ostiFreeMemory(
 1443                  tiRoot,
 1444                  tdSMPRequestBody->IndirectSMPReqosMemHandle,
 1445                  tdSMPRequestBody->IndirectSMPReqLen
 1446                  );
 1447     ostiFreeMemory(
 1448                  tiRoot,
 1449                  tdSMPRequestBody->IndirectSMPResposMemHandle,
 1450                  tdSMPRequestBody->IndirectSMPRespLen
 1451                  );
 1452 #endif
 1453     return;
 1454   }
 1455 
 1456 
 1457   /* decrement the number of pending SMP */
 1458   onePortContext->discovery.pendingSMP--;
 1459 
 1460   /* for port invalid case;
 1461      full discovery -> full discovery; incremental discovery -> full discovery
 1462    */
 1463   if (onePortContext != oldonePortContext)
 1464   {
 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 )
 1469     {
 1470       /* stop SMP timer */
 1471       if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
 1472       {
 1473         tdsaKillTimer(
 1474                       tiRoot,
 1475                       &(onePortContext->discovery.DiscoverySMPTimer)
 1476                      );
 1477       }
 1478       if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
 1479       {
 1480         tdsaKillTimer(
 1481                       tiRoot,
 1482                       &(oldonePortContext->discovery.DiscoverySMPTimer)
 1483                      );
 1484       }
 1485     }
 1486 
 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,
 1491                          oldonePortContext
 1492                          );
 1493 
 1494     ostiFreeMemory(
 1495                  tiRoot,
 1496                  tdSMPRequestBody->osMemHandle,
 1497                  sizeof(tdssSMPRequestBody_t)
 1498                  );
 1499 #ifndef DIRECT_SMP
 1500     ostiFreeMemory(
 1501                  tiRoot,
 1502                  tdSMPRequestBody->IndirectSMPReqosMemHandle,
 1503                  tdSMPRequestBody->IndirectSMPReqLen
 1504                  );
 1505     ostiFreeMemory(
 1506                  tiRoot,
 1507                  tdSMPRequestBody->IndirectSMPResposMemHandle,
 1508                  tdSMPRequestBody->IndirectSMPRespLen
 1509                  );
 1510 #endif
 1511     return;
 1512   }
 1513 
 1514   if (onePortContext->valid == agFALSE)
 1515   {
 1516     if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
 1517         SMPRequestFunction == SMP_REPORT_PHY_SATA ||
 1518         SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
 1519     {
 1520       /* stop SMP timer */
 1521       if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
 1522       {
 1523         tdsaKillTimer(
 1524                       tiRoot,
 1525                       &(onePortContext->discovery.DiscoverySMPTimer)
 1526                       );
 1527       }
 1528       if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
 1529       {
 1530         tdsaKillTimer(
 1531                       tiRoot,
 1532                       &(oldonePortContext->discovery.DiscoverySMPTimer)
 1533                       );
 1534       }
 1535     }
 1536 
 1537     if (onePortContext->discovery.pendingSMP == 0)
 1538     {
 1539       TI_DBG1(("itdssSMPCompleted: aborting discovery\n"));
 1540       tdsaSASDiscoverAbort(tiRoot, onePortContext);
 1541     }
 1542     else
 1543     {
 1544       TI_DBG1(("itdssSMPCompleted: not yet abort; non zero pendingSMP %d\n", onePortContext->discovery.pendingSMP));
 1545     }
 1546     ostiFreeMemory(
 1547                  tiRoot,
 1548                  tdSMPRequestBody->osMemHandle,
 1549                  sizeof(tdssSMPRequestBody_t)
 1550                  );
 1551 #ifndef DIRECT_SMP
 1552     ostiFreeMemory(
 1553                  tiRoot,
 1554                  tdSMPRequestBody->IndirectSMPReqosMemHandle,
 1555                  tdSMPRequestBody->IndirectSMPReqLen
 1556                  );
 1557     ostiFreeMemory(
 1558                  tiRoot,
 1559                  tdSMPRequestBody->IndirectSMPResposMemHandle,
 1560                  tdSMPRequestBody->IndirectSMPRespLen
 1561                  );
 1562 #endif
 1563     return;
 1564   }
 1565 
 1566 
 1567   if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
 1568       SMPRequestFunction == SMP_REPORT_PHY_SATA ||
 1569       SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
 1570   {
 1571     /* stop SMP timer */
 1572     if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
 1573     {
 1574       tdsaKillTimer(
 1575                     tiRoot,
 1576                     &(onePortContext->discovery.DiscoverySMPTimer)
 1577                     );
 1578     }
 1579     if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
 1580     {
 1581       tdsaKillTimer(
 1582                     tiRoot,
 1583                     &(oldonePortContext->discovery.DiscoverySMPTimer)
 1584                     );
 1585     }
 1586   }
 1587 
 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)
 1590   {
 1591     //tdhexdump("itdssSMPCompleted", (bit8*)agFrameHandle, agIOInfoLen);
 1592     /* parsing SMP payload */
 1593 #ifdef DIRECT_SMP
 1594     saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
 1595 #else
 1596     saFrameReadBlock(agRoot, tdSMPRequestBody->IndirectSMPResp, 0, smpHeader, 4);
 1597 #endif
 1598     tdSMPFrameHeader = (tdssSMPFrameHeader_t *)smpHeader;
 1599 
 1600     /* SMP function dependent payload */
 1601     switch (tdSMPFrameHeader->smpFunction)
 1602     {
 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)
 1607       {
 1608         TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespReportGeneral_t) + 4));
 1609         tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
 1610         ostiFreeMemory(
 1611                        tiRoot,
 1612                        tdSMPRequestBody->osMemHandle,
 1613                        sizeof(tdssSMPRequestBody_t)
 1614                       );
 1615 #ifndef DIRECT_SMP
 1616         ostiFreeMemory(
 1617                        tiRoot,
 1618                        tdSMPRequestBody->IndirectSMPReqosMemHandle,
 1619                        tdSMPRequestBody->IndirectSMPReqLen
 1620                       );
 1621         ostiFreeMemory(
 1622                        tiRoot,
 1623                        tdSMPRequestBody->IndirectSMPResposMemHandle,
 1624                        tdSMPRequestBody->IndirectSMPRespLen
 1625                       );
 1626 #endif
 1627         return;
 1628       }
 1629       tdsaReportGeneralRespRcvd(
 1630                                 tiRoot,
 1631                                 agRoot,
 1632                                 agIORequest,
 1633                                 oneDeviceData,
 1634                                 tdSMPFrameHeader,
 1635                                 agFrameHandle
 1636                                 );
 1637 
 1638       break;
 1639     case SMP_DISCOVER:
 1640       TI_DBG3(("itdssSMPCompleted: discover\n"));
 1641       if (agIOInfoLen != sizeof(smpRespDiscover_t) + 4 &&
 1642           tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
 1643       {
 1644         TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespDiscover_t) + 4));
 1645         tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
 1646         ostiFreeMemory(
 1647                        tiRoot,
 1648                        tdSMPRequestBody->osMemHandle,
 1649                        sizeof(tdssSMPRequestBody_t)
 1650                       );
 1651 #ifndef DIRECT_SMP
 1652         ostiFreeMemory(
 1653                        tiRoot,
 1654                        tdSMPRequestBody->IndirectSMPReqosMemHandle,
 1655                        tdSMPRequestBody->IndirectSMPReqLen
 1656                       );
 1657         ostiFreeMemory(
 1658                        tiRoot,
 1659                        tdSMPRequestBody->IndirectSMPResposMemHandle,
 1660                        tdSMPRequestBody->IndirectSMPRespLen
 1661                       );
 1662 #endif
 1663         return;
 1664       }
 1665       tdsaDiscoverRespRcvd(
 1666                            tiRoot,
 1667                            agRoot,
 1668                            agIORequest,
 1669                            oneDeviceData,
 1670                            tdSMPFrameHeader,
 1671                            agFrameHandle
 1672                            );
 1673       break;
 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)
 1678       {
 1679         TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespReportPhySata_t) + 4));
 1680         tdsaSATADiscoverDone(tiRoot, onePortContext, tiError);
 1681         ostiFreeMemory(
 1682                        tiRoot,
 1683                        tdSMPRequestBody->osMemHandle,
 1684                        sizeof(tdssSMPRequestBody_t)
 1685                       );
 1686 #ifndef DIRECT_SMP
 1687         ostiFreeMemory(
 1688                        tiRoot,
 1689                        tdSMPRequestBody->IndirectSMPReqosMemHandle,
 1690                        tdSMPRequestBody->IndirectSMPReqLen
 1691                       );
 1692         ostiFreeMemory(
 1693                        tiRoot,
 1694                        tdSMPRequestBody->IndirectSMPResposMemHandle,
 1695                        tdSMPRequestBody->IndirectSMPRespLen
 1696                       );
 1697 #endif
 1698         return;
 1699       }
 1700       tdsaReportPhySataRcvd(
 1701                             tiRoot,
 1702                             agRoot,
 1703                             agIORequest,
 1704                             oneDeviceData,
 1705                             tdSMPFrameHeader,
 1706                             agFrameHandle
 1707                             );
 1708       break;
 1709     case SMP_CONFIGURE_ROUTING_INFORMATION:
 1710       TI_DBG1(("itdssSMPCompleted: configure routing information\n"));
 1711       if (agIOInfoLen != 4 &&
 1712           tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
 1713       {
 1714         TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
 1715         tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
 1716         ostiFreeMemory(
 1717                        tiRoot,
 1718                        tdSMPRequestBody->osMemHandle,
 1719                        sizeof(tdssSMPRequestBody_t)
 1720                       );
 1721 #ifndef DIRECT_SMP
 1722         ostiFreeMemory(
 1723                        tiRoot,
 1724                        tdSMPRequestBody->IndirectSMPReqosMemHandle,
 1725                        tdSMPRequestBody->IndirectSMPReqLen
 1726                       );
 1727         ostiFreeMemory(
 1728                        tiRoot,
 1729                        tdSMPRequestBody->IndirectSMPResposMemHandle,
 1730                        tdSMPRequestBody->IndirectSMPRespLen
 1731                       );
 1732 #endif
 1733         return;
 1734       }
 1735       tdsaConfigRoutingInfoRespRcvd(
 1736                                     tiRoot,
 1737                                     agRoot,
 1738                                     agIORequest,
 1739                                     oneDeviceData,
 1740                                     tdSMPFrameHeader,
 1741                                     agFrameHandle
 1742                                     );
 1743 
 1744       break;
 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 */
 1749       {
 1750         TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
 1751         tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
 1752         ostiFreeMemory(
 1753                        tiRoot,
 1754                        tdSMPRequestBody->osMemHandle,
 1755                        sizeof(tdssSMPRequestBody_t)
 1756                       );
 1757 #ifndef DIRECT_SMP
 1758         ostiFreeMemory(
 1759                        tiRoot,
 1760                        tdSMPRequestBody->IndirectSMPReqosMemHandle,
 1761                        tdSMPRequestBody->IndirectSMPReqLen
 1762                       );
 1763         ostiFreeMemory(
 1764                        tiRoot,
 1765                        tdSMPRequestBody->IndirectSMPResposMemHandle,
 1766                        tdSMPRequestBody->IndirectSMPRespLen
 1767                       );
 1768 #endif
 1769         return;
 1770       }
 1771       tdsaPhyControlRespRcvd(
 1772                              tiRoot,
 1773                              agRoot,
 1774                              agIORequest,
 1775                              oneDeviceData,
 1776                              tdSMPFrameHeader,
 1777                              agFrameHandle,
 1778                              CurrentTaskTag
 1779                              );
 1780 
 1781       break;
 1782 #ifdef REMOVED
 1783 //temp for testing
 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 */
 1788       {
 1789         TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
 1790         tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
 1791         ostiFreeMemory(
 1792                        tiRoot,
 1793                        tdSMPRequestBody->osMemHandle,
 1794                        sizeof(tdssSMPRequestBody_t)
 1795                       );
 1796 #ifndef DIRECT_SMP
 1797         ostiFreeMemory(
 1798                        tiRoot,
 1799                        tdSMPRequestBody->IndirectSMPReqosMemHandle,
 1800                        tdSMPRequestBody->IndirectSMPReqLen
 1801                       );
 1802         ostiFreeMemory(
 1803                        tiRoot,
 1804                        tdSMPRequestBody->IndirectSMPResposMemHandle,
 1805                        tdSMPRequestBody->IndirectSMPRespLen
 1806                       );
 1807 #endif
 1808         return;
 1809       }
 1810       tdsaReportManInfoRespRcvd(
 1811                                 tiRoot,
 1812                                 agRoot,
 1813                                 oneDeviceData,
 1814                                 tdSMPFrameHeader,
 1815                                 agFrameHandle
 1816                                 );
 1817 
 1818        break;
 1819 //end temp for testing
 1820 #endif
 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:
 1827     default:
 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);
 1833       break;
 1834     }
 1835   }
 1836   else if (agIOStatus == OSSA_IO_ABORTED || agIOStatus == OSSA_IO_INVALID_LENGTH)
 1837   {
 1838     /* no retry this case */
 1839     TI_DBG1(("itdssSMPCompleted: OSSA_IO_ABORTED\n"));
 1840   }
 1841   else if (agIOStatus == OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE)
 1842   {
 1843     TI_DBG1(("itdssSMPCompleted: OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE\n"));
 1844     saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
 1845     tdSMPFrameHeader = (tdssSMPFrameHeader_t *)smpHeader;
 1846 
 1847     status = saSMPStart(
 1848                agRoot,
 1849                agIORequest,
 1850                tdSMPRequestBody->queueNumber, //tdsaAllShared->SMPQNum, //tdsaRotateQnumber(tiRoot, oneDeviceData),
 1851                agDevHandle,
 1852                AGSA_SMP_INIT_REQ,
 1853                agSASRequestBody,
 1854                &ossaSMPCompleted
 1855                );
 1856 
 1857     if (status == AGSA_RC_SUCCESS)
 1858     {
 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 )
 1864       {
 1865         /* start discovery-related SMP timer */
 1866         tdsaDiscoverySMPTimer(tiRoot, onePortContext, (bit32)(tdSMPFrameHeader->smpFunction), tdSMPRequestBody);
 1867       }
 1868       return;
 1869     }
 1870     else if (status == AGSA_RC_BUSY)
 1871     {
 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 )
 1876       {
 1877         tdsaSMPBusyTimer(tiRoot, onePortContext, oneDeviceData, tdSMPRequestBody);
 1878       }
 1879       else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
 1880       {
 1881         /* For taskmanagement SMP, let's fail task management failure */
 1882         tdsaPhyControlFailureRespRcvd(
 1883                                       tiRoot,
 1884                                       agRoot,
 1885                                       oneDeviceData,
 1886                                       tdSMPFrameHeader,
 1887                                       agFrameHandle,
 1888                                       CurrentTaskTag
 1889                                       );
 1890       }
 1891       else
 1892       {
 1893       }
 1894     }
 1895     else /* AGSA_RC_FAILURE */
 1896     {
 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 )
 1901       {
 1902         tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
 1903       }
 1904       else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
 1905       {
 1906         /* task management failure */
 1907         tdsaPhyControlFailureRespRcvd(
 1908                                       tiRoot,
 1909                                       agRoot,
 1910                                       oneDeviceData,
 1911                                       tdSMPFrameHeader,
 1912                                       agFrameHandle,
 1913                                       CurrentTaskTag
 1914                                       );
 1915       }
 1916       else
 1917       {
 1918       }
 1919     }
 1920   }
 1921   else
 1922   {
 1923     if (tdSMPRequestBody->retries < SMP_RETRIES) /* 5 */
 1924     {
 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
 1935          )
 1936       {
 1937         saSetDeviceState(agRoot, agNULL, tdSMPRequestBody->queueNumber, agDevHandle, SA_DS_OPERATIONAL);
 1938       }
 1939       saSMPStart(
 1940                  agRoot,
 1941                  agIORequest,
 1942                  tdSMPRequestBody->queueNumber, //tdsaAllShared->SMPQNum, //tdsaRotateQnumber(tiRoot, oneDeviceData),
 1943                  agDevHandle,
 1944                  AGSA_SMP_INIT_REQ,
 1945                  agSASRequestBody,
 1946                  &ossaSMPCompleted
 1947                  );
 1948       /* increment the number of pending SMP */
 1949       onePortContext->discovery.pendingSMP++;
 1950       tdSMPRequestBody->retries++;
 1951       return;
 1952     }
 1953     else
 1954     {
 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)
 1959       {
 1960         TI_DBG1(("itdssSMPCompleted: failed! agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n"));
 1961       }
 1962 
 1963       if (agIOStatus == OSSA_IO_DS_IN_RECOVERY)
 1964       {
 1965         TI_DBG1(("itdssSMPCompleted: failed! agIOStatus is OSSA_IO_DS_IN_RECOVERY\n"));
 1966       }
 1967 
 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
 1972          )
 1973       {
 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);
 1978       }
 1979       else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
 1980       {
 1981         TI_DBG1(("itdssSMPCompleted: SMP_PHY_CONTROL\n"));
 1982         smpPhyControlReq = (smpReqPhyControl_t *)tdSMPPayload;
 1983         if (smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_CLEAR_AFFILIATION)
 1984         {
 1985           TI_DBG1(("itdssSMPCompleted: discover done with error\n"));
 1986           tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
 1987         }
 1988         else if (smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_HARD_RESET ||
 1989                  smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_LINK_RESET )
 1990         {
 1991           TI_DBG1(("itdssSMPCompleted: device reset failed\n"));
 1992           if (CurrentTaskTag != agNULL )
 1993           {
 1994             TI_DBG1(("itdssSMPCompleted: callback to OS layer with failure\n"));
 1995             ostiInitiatorEvent( tiRoot,
 1996                                 NULL,
 1997                                 NULL,
 1998                                 tiIntrEventTypeTaskManagement,
 1999                                 tiTMFailed,
 2000                                 CurrentTaskTag );
 2001           }
 2002           else
 2003           {
 2004             /* hard reset was not done with this device */
 2005             oneDeviceData->ResetCnt = 0;
 2006           }
 2007         }
 2008         else
 2009         {
 2010           TI_DBG1(("itdssSMPCompleted: unknown phy operation 0x%x\n", smpPhyControlReq->phyOperation));
 2011         }
 2012       } /* SMP_PHY_CONTROL */
 2013       else
 2014       {
 2015         TI_DBG1(("itdssSMPCompleted: SMP function 0x%x\n", tdSMPFrameHeader->smpFunction));
 2016       }
 2017     } /* else */
 2018   } /* outer else */
 2019 
 2020   ostiFreeMemory(
 2021                  tiRoot,
 2022                  tdSMPRequestBody->osMemHandle,
 2023                  sizeof(tdssSMPRequestBody_t)
 2024                  );
 2025 #ifndef DIRECT_SMP
 2026   ostiFreeMemory(
 2027                  tiRoot,
 2028                  tdSMPRequestBody->IndirectSMPReqosMemHandle,
 2029                  tdSMPRequestBody->IndirectSMPReqLen
 2030                  );
 2031   ostiFreeMemory(
 2032                  tiRoot,
 2033                  tdSMPRequestBody->IndirectSMPResposMemHandle,
 2034                  tdSMPRequestBody->IndirectSMPRespLen
 2035                  );
 2036 #endif
 2037 
 2038 
 2039   return;
 2040 }
 2041 
 2042 #else
 2043 
 2044 osGLOBAL void
 2045 itdssSMPCompleted (
 2046                    agsaRoot_t            *agRoot,
 2047                    agsaIORequest_t       *agIORequest,
 2048                    bit32                 agIOStatus,
 2049                    bit32                 agIOInfoLen,
 2050                    agsaFrameHandle_t     agFrameHandle
 2051                    )
 2052 {
 2053   /* pass the payload to OS layer */
 2054   TI_DBG3(("itdssSMPCompleted: start\n"));
 2055 }
 2056 #endif
 2057 
 2058 
 2059 /*****************************************************************************
 2060 *! \brief itdIoSuccessHandler
 2061 *
 2062 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2063 *            layer with agIOStatus = OSSA_IO_SUCCESS
 2064 *
 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
 2070 *                             of abort request
 2071 *  \param  agOtherInfo        Residual count
 2072 *  \return: None
 2073 *
 2074 *
 2075 *****************************************************************************/
 2076 osGLOBAL void
 2077 itdssIOSuccessHandler(
 2078                       agsaRoot_t           *agRoot,
 2079                       agsaIORequest_t      *agIORequest,
 2080                       bit32                agIOStatus,
 2081                       bit32                agIOInfoLen,
 2082                       void                 *agParam,
 2083                       bit32                agOtherInfo
 2084                       )
 2085 {
 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];
 2093   bit8                      respData[128];
 2094   bit32                     scsi_status;
 2095   bit32                     senseLen;
 2096   bit32                     respLen;
 2097   bit32                     data_status;
 2098   bit32                     i;
 2099   tiDeviceHandle_t          *tiDeviceHandle = agNULL;
 2100   tdsaDeviceData_t          *oneDeviceData = agNULL;
 2101 
 2102   TI_DBG2(("itdssIOSuccessHandler: start\n"));
 2103   TI_DBG2(("itdssIOSuccessHandler: agIOInfoLen %d\n", agIOInfoLen));
 2104 
 2105   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2106 
 2107   tdIORequestBody->ioCompleted = agTRUE;
 2108   tdIORequestBody->ioStarted = agFALSE;
 2109 
 2110   /*
 2111     agIOInfoLen must be >= sizeof(agsaSSPResponseInfoUnit_t), which is minimum
 2112     date length
 2113   */
 2114   if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t))
 2115   {
 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(
 2119                              tiRoot,
 2120                              tdIORequestBody->tiIORequest, /* tiIORequest */
 2121                              tiIOFailed,
 2122                              tiDetailOtherError,
 2123                              agNULL,
 2124                              agTRUE /* intContext; is not being used */
 2125                              );
 2126     return;
 2127   }
 2128   /* reads agsaSSPResponseInfoUnit_t */
 2129   saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
 2130 
 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);
 2136 
 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));
 2139 
 2140   /*
 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
 2145   */
 2146   if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
 2147   {
 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));
 2150 
 2151     ostiInitiatorIOCompleted(
 2152                              tiRoot,
 2153                              tdIORequestBody->tiIORequest, /* tiIORequest */
 2154                              tiIOFailed,
 2155                              tiDetailOtherError,
 2156                              agNULL,
 2157                              agTRUE /* intContext; is not being used */
 2158                              );
 2159     return;
 2160   }
 2161 
 2162   /* reads response data */
 2163   saFrameReadBlock(agRoot, agParam,
 2164                    sizeof(agsaSSPResponseInfoUnit_t),
 2165                    respData, respLen);
 2166   /* reads sense data */
 2167   saFrameReadBlock(agRoot, agParam,
 2168                    sizeof(agsaSSPResponseInfoUnit_t)
 2169                    + respLen,
 2170                    senseDataPayload, senseLen);
 2171 
 2172   if (data_status == 0)
 2173   {
 2174     /* NO_DATA */
 2175     TI_DBG1(("itdssIOSuccessHandler: no data scsi_status 0x%x\n",scsi_status));
 2176 
 2177     ostiInitiatorIOCompleted(
 2178                              tiRoot,
 2179                              tdIORequestBody->tiIORequest, /* tiIORequest */
 2180                              tiIOSuccess,
 2181                              scsi_status,
 2182                              agNULL,
 2183                              agTRUE /* intContext; is not being used */
 2184                              );
 2185 
 2186     return;
 2187   }
 2188 
 2189   if (data_status == 1)
 2190   {
 2191     /* RESPONSE_DATA */
 2192     TI_DBG1(("itdssIOSuccessHandler: response data \n"));
 2193 
 2194     ostiInitiatorIOCompleted(
 2195                              tiRoot,
 2196                              tdIORequestBody->tiIORequest, /* tiIORequest */
 2197                              tiIOSuccess,
 2198                              0,
 2199                              agNULL,
 2200                              agTRUE /* intContext; is not being used */
 2201                              );
 2202     return;
 2203   }
 2204 
 2205   if (data_status == 2)
 2206   {
 2207     /* SENSE_DATA */
 2208     TI_DBG2(("itdssIOSuccessHandler: sense data \n"));
 2209 
 2210     senseData.senseData = &senseDataPayload;
 2211     senseData.senseLen = MIN(256, senseLen);
 2212     /* debugging */
 2213     tdhexdump("ResponseIU I", (bit8 *)&agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
 2214 
 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);
 2221 
 2222     if (senseDataPayload[2] == SCSI_SENSE_KEY_RECOVERED_ERROR)
 2223     {
 2224       Initiator->SenseKeyCounter.SoftError ++;
 2225     }
 2226     else if (senseDataPayload[2] == SCSI_SENSE_KEY_NOT_READY)
 2227     {
 2228       Initiator->SenseKeyCounter.MediumNotReady++;
 2229     }
 2230     else if (senseDataPayload[2] == SCSI_SENSE_KEY_MEDIUM_ERROR)
 2231     {
 2232       Initiator->SenseKeyCounter.MediumError++;
 2233     }
 2234     else if (senseDataPayload[2] == SCSI_SENSE_KEY_HARDWARE_ERROR)
 2235     {
 2236       Initiator->SenseKeyCounter.HardwareError++;
 2237     }
 2238     else if (senseDataPayload[2] == SCSI_SENSE_KEY_ILLEGAL_REQUEST)
 2239     {
 2240       Initiator->SenseKeyCounter.IllegalRequest++;
 2241     }
 2242     else if (senseDataPayload[2] == SCSI_SENSE_KEY_UNIT_ATTENTION)
 2243     {
 2244       Initiator->SenseKeyCounter.UnitAttention++;
 2245     }
 2246     else if (senseDataPayload[2] == SCSI_SENSE_KEY_ABORTED_COMMAND)
 2247     {
 2248       Initiator->SenseKeyCounter.AbortCommand++;
 2249     }
 2250     else
 2251     {
 2252       Initiator->SenseKeyCounter.OtherKeyType++;
 2253     }
 2254 
 2255     /* when ASQ and ASCQ 0x04 0x11, does saLocalPhyControl for notify spinup */
 2256     if ((senseDataPayload[12] == 0x04 && senseDataPayload[13] == 0x11))
 2257     {
 2258       TI_DBG2(("itdssIOSuccessHandler: sending notfify spinup\n"));
 2259       tiDeviceHandle = tdIORequestBody->tiDevHandle;
 2260       oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
 2261       if (oneDeviceData->directlyAttached == agTRUE)
 2262       {
 2263         for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
 2264         {
 2265           saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
 2266         }
 2267       }
 2268     }
 2269     ostiInitiatorIOCompleted(
 2270                              tiRoot,
 2271                              /* tiIORequest */
 2272                              tdIORequestBody->tiIORequest,
 2273                              tiIOSuccess,
 2274                              scsi_status,
 2275                              &senseData,
 2276                              agTRUE /* intContext; is not being used */
 2277                              );
 2278     return;
 2279   }
 2280   if (data_status == 3)
 2281   {
 2282     /* RESERVED */
 2283     TI_DBG1(("itdssIOSuccessHandler: reserved wrong!!!\n"));
 2284     ostiInitiatorIOCompleted(
 2285                              tiRoot,
 2286                              tdIORequestBody->tiIORequest, /* tiIORequest */
 2287                              tiIOFailed,
 2288                              scsi_status,
 2289                              agNULL,
 2290                              agTRUE /* intContext; is not being used */
 2291                              );
 2292     return;
 2293   }
 2294 
 2295 }
 2296 
 2297 /*****************************************************************************
 2298 *! \brief itdssIOAbortedHandler
 2299 *
 2300 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2301 *            layer with agIOStatus = OSSA_IO_ABORTED
 2302 *
 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
 2308 *                             of abort request
 2309 *  \param  agOtherInfo        Residual count
 2310 *  \return: None
 2311 *
 2312 *
 2313 *****************************************************************************/
 2314 /* see itdosIOCompleted() and itdinit.c and  itdIoAbortedHandler in itdio.c*/
 2315 osGLOBAL void
 2316 itdssIOAbortedHandler (
 2317                        agsaRoot_t              *agRoot,
 2318                        agsaIORequest_t         *agIORequest,
 2319                        bit32                   agIOStatus,
 2320                        bit32                   agIOInfoLen,
 2321                        void                    *agParam,
 2322                        bit32                   agOtherInfo
 2323                        )
 2324 {
 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;
 2331 
 2332   TI_DBG2(("itdssIOAbortedHandler: start\n"));
 2333   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2334 
 2335   if (agIOStatus != OSSA_IO_ABORTED)
 2336   {
 2337     TI_DBG1(("itdssIOAbortedHandler: incorrect agIOStatus 0x%x\n", agIOStatus));
 2338   }
 2339 
 2340   if (tdIORequestBody == agNULL)
 2341   {
 2342     TI_DBG1(("itdssIOAbortedHandler: start\n"));
 2343     return;
 2344   }
 2345 
 2346   if (tdIORequestBody != agNULL)
 2347   {
 2348     tiDeviceHandle = tdIORequestBody->tiDevHandle;
 2349   }
 2350   if (tiDeviceHandle != agNULL)
 2351   {
 2352     oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
 2353   }
 2354   if (oneDeviceData != agNULL)
 2355   {
 2356     TI_DBG2(("itdssIOAbortedHandler: did %d \n", oneDeviceData->id));
 2357   }
 2358   else
 2359   {
 2360     TI_DBG1(("itdssIOAbortedHandler: oneDeviceData is NULL\n"));
 2361   }
 2362 
 2363 
 2364   ostiInitiatorIOCompleted (
 2365                             tiRoot,
 2366                             tdIORequestBody->tiIORequest,
 2367                             tiIOFailed,
 2368                             tiDetailAborted,
 2369                             agNULL,
 2370                             intContext
 2371                             );
 2372 
 2373   return;
 2374 }
 2375 
 2376 #ifdef REMOVED
 2377 /*****************************************************************************
 2378 *! \brief itdssIOOverFlowHandler
 2379 *
 2380 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2381 *            layer with agIOStatus = OSSA_IO_OVERFLOW
 2382 *
 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
 2388 *                             of abort request
 2389 *  \return: None
 2390 *
 2391 *
 2392 *****************************************************************************/
 2393 osGLOBAL void
 2394 itdssIOOverFlowHandler(
 2395                        agsaRoot_t              *agRoot,
 2396                        agsaIORequest_t         *agIORequest,
 2397                        bit32                   agIOStatus,
 2398                        bit32                   agIOInfoLen,
 2399                        void                    *agParam
 2400                        )
 2401 {
 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;
 2406 
 2407   TI_DBG2(("itdssIOOverFlowHandler: start\n"));
 2408   TI_DBG2(("itdssIOOverFlowHandler: not transferred byte 0x%x\n", agIOInfoLen));
 2409 
 2410   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2411 
 2412   ostiInitiatorIOCompleted (
 2413                             tiRoot,
 2414                             tdIORequestBody->tiIORequest,
 2415                             tiIOOverRun,
 2416                             agIOInfoLen,
 2417                             agNULL,
 2418                             intContext
 2419                             );
 2420 
 2421   return;
 2422 }
 2423 #endif
 2424 
 2425 
 2426 /*****************************************************************************
 2427 *! \brief itdssIOUnderFlowHandler
 2428 *
 2429 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2430 *            layer with agIOStatus = OSSA_IO_UNDERFLOW
 2431 *
 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
 2437 *                             of abort request
 2438 *  \param  agOtherInfo        Residual count
 2439 *  \return: None
 2440 *
 2441 *
 2442 *****************************************************************************/
 2443 osGLOBAL void
 2444 itdssIOUnderFlowHandler(
 2445                         agsaRoot_t              *agRoot,
 2446                         agsaIORequest_t         *agIORequest,
 2447                         bit32                   agIOStatus,
 2448                         bit32                   agIOInfoLen,
 2449                         void                    *agParam,
 2450                         bit32                   agOtherInfo
 2451                         )
 2452 {
 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;
 2457 
 2458   TI_DBG6(("itdssIOUnderFlowHandler: start\n"));
 2459   TI_DBG6(("itdssIOUnderFlowHandler: agIOInfoLen 0x%x\n", agIOInfoLen));
 2460 
 2461   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2462 
 2463   ostiInitiatorIOCompleted (
 2464                             tiRoot,
 2465                             tdIORequestBody->tiIORequest,
 2466                             tiIOUnderRun,
 2467                             agIOInfoLen,
 2468                             agNULL,
 2469                             intContext
 2470                             );
 2471 
 2472   return;
 2473 }
 2474 
 2475 /*****************************************************************************
 2476 *! \brief itdssIOFailedHandler
 2477 *
 2478 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2479 *            layer with agIOStatus = OSSA_IO_FAILED
 2480 *
 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
 2486 *                             of abort request
 2487 *  \param  agOtherInfo        Residual count
 2488 *  \return: None
 2489 *
 2490 *
 2491 *****************************************************************************/
 2492 osGLOBAL void
 2493 itdssIOFailedHandler(
 2494                      agsaRoot_t              *agRoot,
 2495                      agsaIORequest_t         *agIORequest,
 2496                      bit32                   agIOStatus,
 2497                      bit32                   agIOInfoLen,
 2498                      void                    *agParam,
 2499                      bit32                   agOtherInfo
 2500                      )
 2501 {
 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;
 2506 
 2507   TI_DBG1(("itdssIOFailedHandler: start\n"));
 2508 
 2509   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2510 
 2511   ostiInitiatorIOCompleted (
 2512                             tiRoot,
 2513                             tdIORequestBody->tiIORequest,
 2514                             tiIOFailed,
 2515                             tiDetailOtherError,
 2516                             agNULL,
 2517                             intContext
 2518                             );
 2519   return;
 2520 }
 2521 
 2522 /*****************************************************************************
 2523 *! \brief itdssIOAbortResetHandler
 2524 *
 2525 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2526 *            layer with agIOStatus = OSSA_IO_ABORT_RESET
 2527 *
 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
 2533 *                             of abort request
 2534 *  \param  agOtherInfo        Residual count
 2535 *  \return: None
 2536 *
 2537 *
 2538 *****************************************************************************/
 2539 osGLOBAL void
 2540 itdssIOAbortResetHandler(
 2541                          agsaRoot_t              *agRoot,
 2542                          agsaIORequest_t         *agIORequest,
 2543                          bit32                   agIOStatus,
 2544                          bit32                   agIOInfoLen,
 2545                          void                    *agParam,
 2546                          bit32                   agOtherInfo
 2547                          )
 2548 {
 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"));
 2554 
 2555   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2556 
 2557   ostiInitiatorIOCompleted (
 2558                             tiRoot,
 2559                             tdIORequestBody->tiIORequest,
 2560                             tiIOFailed,
 2561                             tiDetailAbortReset,
 2562                             agNULL,
 2563                             intContext
 2564                             );
 2565 
 2566 
 2567   return;
 2568 }
 2569 
 2570 /*****************************************************************************
 2571 *! \brief itdssIONotValidHandler
 2572 *
 2573 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2574 *            layer with agIOStatus = OSSA_IO_NOT_VALID
 2575 *
 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
 2581 *                             of abort request
 2582 *  \param  agOtherInfo        Residual count
 2583 *  \return: None
 2584 *
 2585 *
 2586 *****************************************************************************/
 2587 osGLOBAL void
 2588 itdssIONotValidHandler(
 2589                        agsaRoot_t           *agRoot,
 2590                        agsaIORequest_t      *agIORequest,
 2591                        bit32                agIOStatus,
 2592                        bit32                agIOInfoLen,
 2593                        void                 *agParam,
 2594                        bit32                agOtherInfo
 2595                        )
 2596 {
 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"));
 2602 
 2603   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2604 
 2605   ostiInitiatorIOCompleted (
 2606                             tiRoot,
 2607                             tdIORequestBody->tiIORequest,
 2608                             tiIOFailed,
 2609                             tiDetailNotValid,
 2610                             agNULL,
 2611                             intContext
 2612                             );
 2613   return;
 2614 }
 2615 
 2616 /*****************************************************************************
 2617 *! \brief itdssIONoDeviceHandler
 2618 *
 2619 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2620 *            layer with agIOStatus = OSSA_IO_NO_DEVICE
 2621 *
 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
 2627 *                             of abort request
 2628 *  \param  agOtherInfo        Residual count
 2629 *  \return: None
 2630 *
 2631 *
 2632 *****************************************************************************/
 2633 osGLOBAL void
 2634 itdssIONoDeviceHandler(
 2635                        agsaRoot_t           *agRoot,
 2636                        agsaIORequest_t      *agIORequest,
 2637                        bit32                agIOStatus,
 2638                        bit32                agIOInfoLen,
 2639                        void                 *agParam,
 2640                        bit32                agOtherInfo
 2641                        )
 2642 {
 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"));
 2648 
 2649   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2650 
 2651   ostiInitiatorIOCompleted (
 2652                             tiRoot,
 2653                             tdIORequestBody->tiIORequest,
 2654                             tiIOFailed,
 2655                             tiDetailNoLogin,
 2656                             agNULL,
 2657                             intContext
 2658                             );
 2659   return;
 2660 }
 2661 
 2662 #ifdef REMOVED /* to do: removed from spec */
 2663 /*****************************************************************************
 2664 *! \brief itdssIllegalParameterHandler
 2665 *
 2666 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2667 *            layer with agIOStatus = OSSA_IO_ILLEGAL_PARAMETER
 2668 *
 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
 2674 *                             of abort request
 2675 *  \return: None
 2676 *
 2677 *
 2678 *****************************************************************************/
 2679 osGLOBAL void
 2680 itdssIllegalParameterHandler(
 2681                        agsaRoot_t           *agRoot,
 2682                        agsaIORequest_t      *agIORequest,
 2683                        bit32                agIOStatus,
 2684                        bit32                agIOInfoLen,
 2685                        void                 *agParam
 2686                        )
 2687 {
 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"));
 2693 
 2694   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2695 
 2696   ostiInitiatorIOCompleted (
 2697                             tiRoot,
 2698                             tdIORequestBody->tiIORequest,
 2699                             tiIOFailed,
 2700                             tiDetailOtherError,
 2701                             agNULL,
 2702                             intContext
 2703                             );
 2704 
 2705   return;
 2706 }
 2707 #endif
 2708 
 2709 /*****************************************************************************
 2710 *! \brief itdssLinkFailureHandler
 2711 *
 2712 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2713 *            layer with agIOStatus = OSSA_IO_LINK_FAILURE
 2714 *
 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
 2720 *                             of abort request
 2721 *  \param  agOtherInfo        Residual count
 2722 *  \return: None
 2723 *
 2724 *
 2725 *****************************************************************************/
 2726 osGLOBAL void
 2727 itdssLinkFailureHandler(
 2728                        agsaRoot_t           *agRoot,
 2729                        agsaIORequest_t      *agIORequest,
 2730                        bit32                agIOStatus,
 2731                        bit32                agIOInfoLen,
 2732                        void                 *agParam,
 2733                        bit32                agOtherInfo
 2734                        )
 2735 {
 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"));
 2741 
 2742   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2743 
 2744   ostiInitiatorIOCompleted (
 2745                             tiRoot,
 2746                             tdIORequestBody->tiIORequest,
 2747                             tiIOFailed,
 2748                             tiDetailOtherError,
 2749                             agNULL,
 2750                             intContext
 2751                             );
 2752 
 2753   return;
 2754 }
 2755 
 2756 /*****************************************************************************
 2757 *! \brief itdssProgErrorHandler
 2758 *
 2759 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2760 *            layer with agIOStatus = OSSA_IO_PROG_ERROR
 2761 *
 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
 2767 *                             of abort request
 2768 *  \param  agOtherInfo        Residual count
 2769 *  \return: None
 2770 *
 2771 *
 2772 *****************************************************************************/
 2773 osGLOBAL void
 2774 itdssProgErrorHandler(
 2775                        agsaRoot_t           *agRoot,
 2776                        agsaIORequest_t      *agIORequest,
 2777                        bit32                agIOStatus,
 2778                        bit32                agIOInfoLen,
 2779                        void                 *agParam,
 2780                        bit32                agOtherInfo
 2781                        )
 2782 {
 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"));
 2788 
 2789   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2790 
 2791   ostiInitiatorIOCompleted (
 2792                             tiRoot,
 2793                             tdIORequestBody->tiIORequest,
 2794                             tiIOFailed,
 2795                             tiDetailOtherError,
 2796                             agNULL,
 2797                             intContext
 2798                             );
 2799 
 2800   return;
 2801 }
 2802 
 2803 /*****************************************************************************
 2804 *! \brief itdssXferErrorBreakHandler
 2805 *
 2806 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2807 *            layer with agIOStatus = OSSA_IO_XFER_ERROR_BREAK
 2808 *
 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
 2814 *                             of abort request
 2815 *  \param  agOtherInfo        Residual count
 2816 *  \return: None
 2817 *
 2818 *
 2819 *****************************************************************************/
 2820 osGLOBAL void
 2821 itdssXferErrorBreakHandler(
 2822                        agsaRoot_t           *agRoot,
 2823                        agsaIORequest_t      *agIORequest,
 2824                        bit32                agIOStatus,
 2825                        bit32                agIOInfoLen,
 2826                        void                 *agParam,
 2827                        bit32                agOtherInfo
 2828                        )
 2829 {
 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"));
 2835 
 2836   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2837 
 2838   ostiInitiatorIOCompleted (
 2839                             tiRoot,
 2840                             tdIORequestBody->tiIORequest,
 2841                             tiIOFailed,
 2842                             tiDetailOtherError,
 2843                             agNULL,
 2844                             intContext
 2845                             );
 2846 
 2847   return;
 2848 }
 2849 
 2850 /*****************************************************************************
 2851 *! \brief itdssXferErrorPhyNotReadyHandler
 2852 *
 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
 2855 *
 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
 2861 *                             of abort request
 2862 *  \param  agOtherInfo        Residual count
 2863 *  \return: None
 2864 *
 2865 *
 2866 *****************************************************************************/
 2867 osGLOBAL void
 2868 itdssXferErrorPhyNotReadyHandler(
 2869                        agsaRoot_t           *agRoot,
 2870                        agsaIORequest_t      *agIORequest,
 2871                        bit32                agIOStatus,
 2872                        bit32                agIOInfoLen,
 2873                        void                 *agParam,
 2874                        bit32                agOtherInfo
 2875                        )
 2876 {
 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"));
 2882 
 2883   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2884 
 2885   ostiInitiatorIOCompleted (
 2886                             tiRoot,
 2887                             tdIORequestBody->tiIORequest,
 2888                             tiIOFailed,
 2889                             tiDetailOtherError,
 2890                             agNULL,
 2891                             intContext
 2892                             );
 2893 
 2894   return;
 2895 }
 2896 
 2897 /*****************************************************************************
 2898 *! \brief itdssOpenCnxErrorProtocolNotSupprotedHandler
 2899 *
 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
 2902 *
 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
 2908 *                             of abort request
 2909 *  \param  agOtherInfo        Residual count
 2910 *  \return: None
 2911 *
 2912 *
 2913 *****************************************************************************/
 2914 osGLOBAL void
 2915 itdssOpenCnxErrorProtocolNotSupprotedHandler(
 2916                        agsaRoot_t           *agRoot,
 2917                        agsaIORequest_t      *agIORequest,
 2918                        bit32                agIOStatus,
 2919                        bit32                agIOInfoLen,
 2920                        void                 *agParam,
 2921                        bit32                agOtherInfo
 2922                        )
 2923 {
 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"));
 2929 
 2930   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2931 
 2932   ostiInitiatorIOCompleted (
 2933                             tiRoot,
 2934                             tdIORequestBody->tiIORequest,
 2935                             tiIOFailed,
 2936                             tiDetailOtherError,
 2937                             agNULL,
 2938                             intContext
 2939                             );
 2940 
 2941   return;
 2942 }
 2943 
 2944 /*****************************************************************************
 2945 *! \brief itdssOpenCnxErrorZoneViolationHandler
 2946 *
 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
 2949 *
 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
 2955 *                             of abort request
 2956 *  \param  agOtherInfo        Residual count
 2957 *  \return: None
 2958 *
 2959 *
 2960 *****************************************************************************/
 2961 osGLOBAL void
 2962 itdssOpenCnxErrorZoneViolationHandler(
 2963                        agsaRoot_t           *agRoot,
 2964                        agsaIORequest_t      *agIORequest,
 2965                        bit32                agIOStatus,
 2966                        bit32                agIOInfoLen,
 2967                        void                 *agParam,
 2968                        bit32                agOtherInfo
 2969                        )
 2970 {
 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"));
 2976 
 2977   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 2978 
 2979   ostiInitiatorIOCompleted (
 2980                             tiRoot,
 2981                             tdIORequestBody->tiIORequest,
 2982                             tiIOFailed,
 2983                             tiDetailOtherError,
 2984                             agNULL,
 2985                             intContext
 2986                             );
 2987 
 2988   return;
 2989 }
 2990 
 2991 /*****************************************************************************
 2992 *! \brief itdssOpenCnxErrorBreakHandler
 2993 *
 2994 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 2995 *            layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_BREAK
 2996 *
 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
 3002 *                             of abort request
 3003 *  \param  agOtherInfo        Residual count
 3004 *  \return: None
 3005 *
 3006 *
 3007 *****************************************************************************/
 3008 osGLOBAL void
 3009 itdssOpenCnxErrorBreakHandler(
 3010                        agsaRoot_t           *agRoot,
 3011                        agsaIORequest_t      *agIORequest,
 3012                        bit32                agIOStatus,
 3013                        bit32                agIOInfoLen,
 3014                        void                 *agParam,
 3015                        bit32                agOtherInfo
 3016                        )
 3017 {
 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"));
 3023 
 3024   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3025 
 3026   ostiInitiatorIOCompleted (
 3027                             tiRoot,
 3028                             tdIORequestBody->tiIORequest,
 3029                             tiIOFailed,
 3030                             tiDetailOtherError,
 3031                             agNULL,
 3032                             intContext
 3033                             );
 3034 
 3035   return;
 3036 }
 3037 
 3038 /*****************************************************************************
 3039 *! \brief itdssOpenCnxErrorITNexusLossHandler
 3040 *
 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
 3043 *
 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
 3049 *                             of abort request
 3050 *  \param  agOtherInfo        Residual count
 3051 *  \return: None
 3052 *
 3053 *
 3054 *****************************************************************************/
 3055 osGLOBAL void
 3056 itdssOpenCnxErrorITNexusLossHandler(
 3057                        agsaRoot_t           *agRoot,
 3058                        agsaIORequest_t      *agIORequest,
 3059                        bit32                agIOStatus,
 3060                        bit32                agIOInfoLen,
 3061                        void                 *agParam,
 3062                        bit32                agOtherInfo
 3063                        )
 3064 {
 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"));
 3070 
 3071   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3072 
 3073   ostiInitiatorIOCompleted (
 3074                             tiRoot,
 3075                             tdIORequestBody->tiIORequest,
 3076                             tiIOFailed,
 3077                             tiDetailOtherError,
 3078                             agNULL,
 3079                             intContext
 3080                             );
 3081 
 3082   return;
 3083 }
 3084 
 3085 /*****************************************************************************
 3086 *! \brief itdssOpenCnxErrorBadDestinationHandler
 3087 *
 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
 3090 *
 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
 3096 *                             of abort request
 3097 *  \param  agOtherInfo        Residual count
 3098 *  \return: None
 3099 *
 3100 *
 3101 *****************************************************************************/
 3102 osGLOBAL void
 3103 itdssOpenCnxErrorBadDestinationHandler(
 3104                        agsaRoot_t           *agRoot,
 3105                        agsaIORequest_t      *agIORequest,
 3106                        bit32                agIOStatus,
 3107                        bit32                agIOInfoLen,
 3108                        void                 *agParam,
 3109                        bit32                agOtherInfo
 3110                        )
 3111 {
 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"));
 3117 
 3118   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3119 
 3120   ostiInitiatorIOCompleted (
 3121                             tiRoot,
 3122                             tdIORequestBody->tiIORequest,
 3123                             tiIOFailed,
 3124                             tiDetailOtherError,
 3125                             agNULL,
 3126                             intContext
 3127                             );
 3128 
 3129   return;
 3130 }
 3131 
 3132 /*****************************************************************************
 3133 *! \brief itdssOpenCnxErrorConnectionRateNotSupportedHandler
 3134 *
 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
 3137 *
 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
 3143 *                             of abort request
 3144 *  \param  agOtherInfo        Residual count
 3145 *  \return: None
 3146 *
 3147 *
 3148 *****************************************************************************/
 3149 osGLOBAL void
 3150 itdssOpenCnxErrorConnectionRateNotSupportedHandler(
 3151                        agsaRoot_t           *agRoot,
 3152                        agsaIORequest_t      *agIORequest,
 3153                        bit32                agIOStatus,
 3154                        bit32                agIOInfoLen,
 3155                        void                 *agParam,
 3156                        bit32                agOtherInfo
 3157                        )
 3158 {
 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"));
 3171 
 3172   /* we retry by lowering link rate
 3173      retry should be in ossaSetDeviceInfoCB()
 3174   */
 3175   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3176   tiDeviceHandle = tdIORequestBody->tiDevHandle;
 3177   oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
 3178   agDevHandle = oneDeviceData->agDevHandle;
 3179 
 3180   if (tdsaAllShared->RateAdjust)
 3181   {
 3182     if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
 3183         oneDeviceData->tdPortContext != agNULL )
 3184     {
 3185       ConnRate = DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo);
 3186       if (ConnRate == SAS_CONNECTION_RATE_1_5G)
 3187       {
 3188         /* no retry; completes IO */
 3189         ostiInitiatorIOCompleted(
 3190                                  tiRoot,
 3191                                  tdIORequestBody->tiIORequest,
 3192                                  tiIOFailed,
 3193                                  tiDetailOtherError,
 3194                                  agNULL,
 3195                                  intContext
 3196                                  );
 3197       }
 3198       else
 3199       {
 3200         ConnRate = ConnRate - 1;
 3201       }
 3202       agContext = &(tdIORequestBody->agContext);
 3203       agContext->osData = agIORequest;
 3204       saSetDeviceInfo(agRoot, agContext, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 32, ConnRate << 28, ossaIniSetDeviceInfoCB);
 3205     }
 3206   }
 3207   else
 3208   {
 3209     ostiInitiatorIOCompleted(
 3210                              tiRoot,
 3211                              tdIORequestBody->tiIORequest,
 3212                              tiIOFailed,
 3213                              tiDetailOtherError,
 3214                              agNULL,
 3215                              intContext
 3216                              );
 3217   }
 3218 
 3219   return;
 3220 }
 3221 
 3222 /*****************************************************************************
 3223 *! \brief itdssOpenCnxErrorSTPResourceBusyHandler
 3224 *
 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
 3227 *
 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
 3233 *                             of abort request
 3234 *  \param  agOtherInfo        Residual count
 3235 *  \return: None
 3236 *
 3237 *
 3238 *****************************************************************************/
 3239 osGLOBAL void
 3240 itdssOpenCnxErrorSTPResourceBusyHandler(
 3241                        agsaRoot_t           *agRoot,
 3242                        agsaIORequest_t      *agIORequest,
 3243                        bit32                agIOStatus,
 3244                        bit32                agIOInfoLen,
 3245                        void                 *agParam,
 3246                        bit32                agOtherInfo
 3247                        )
 3248 {
 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"));
 3254 
 3255   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3256 
 3257   ostiInitiatorIOCompleted (
 3258                             tiRoot,
 3259                             tdIORequestBody->tiIORequest,
 3260                             tiIOFailed,
 3261                             tiDetailOtherError,
 3262                             agNULL,
 3263                             intContext
 3264                             );
 3265 
 3266   return;
 3267 }
 3268 
 3269 /*****************************************************************************
 3270 *! \brief itdssOpenCnxErrorWrongDestinationHandler
 3271 *
 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
 3274 *
 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
 3280 *                             of abort request
 3281 *  \param  agOtherInfo        Residual count
 3282 *  \return: None
 3283 *
 3284 *
 3285 *****************************************************************************/
 3286 osGLOBAL void
 3287 itdssOpenCnxErrorWrongDestinationHandler(
 3288                        agsaRoot_t           *agRoot,
 3289                        agsaIORequest_t      *agIORequest,
 3290                        bit32                agIOStatus,
 3291                        bit32                agIOInfoLen,
 3292                        void                 *agParam,
 3293                        bit32                agOtherInfo
 3294                        )
 3295 {
 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"));
 3301 
 3302   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3303 
 3304   ostiInitiatorIOCompleted (
 3305                             tiRoot,
 3306                             tdIORequestBody->tiIORequest,
 3307                             tiIOFailed,
 3308                             tiDetailOtherError,
 3309                             agNULL,
 3310                             intContext
 3311                             );
 3312 
 3313   return;
 3314 }
 3315 
 3316 /*****************************************************************************
 3317 *! \brief itdssOpenCnxErrorUnknownErrorHandler
 3318 *
 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
 3321 *
 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
 3327 *                             of abort request
 3328 *  \param  agOtherInfo        Residual count
 3329 *  \return: None
 3330 *
 3331 *
 3332 *****************************************************************************/
 3333 osGLOBAL void
 3334 itdssOpenCnxErrorUnknownErrorHandler(
 3335                        agsaRoot_t           *agRoot,
 3336                        agsaIORequest_t      *agIORequest,
 3337                        bit32                agIOStatus,
 3338                        bit32                agIOInfoLen,
 3339                        void                 *agParam,
 3340                        bit32                agOtherInfo
 3341                        )
 3342 {
 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"));
 3348 
 3349   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3350 
 3351   ostiInitiatorIOCompleted (
 3352                             tiRoot,
 3353                             tdIORequestBody->tiIORequest,
 3354                             tiIOFailed,
 3355                             tiDetailOtherError,
 3356                             agNULL,
 3357                             intContext
 3358                             );
 3359 
 3360   return;
 3361 }
 3362 
 3363 /*****************************************************************************
 3364 *! \brief itdssXferErrorNAKReceivedHandler
 3365 *
 3366 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 3367 *            layer with agIOStatus = OSSA_IO_XFER_ERROR_NAK_RECEIVED
 3368 *
 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
 3374 *                             of abort request
 3375 *  \param  agOtherInfo        Residual count
 3376 *  \return: None
 3377 *
 3378 *
 3379 *****************************************************************************/
 3380 osGLOBAL void
 3381 itdssXferErrorNAKReceivedHandler(
 3382                        agsaRoot_t           *agRoot,
 3383                        agsaIORequest_t      *agIORequest,
 3384                        bit32                agIOStatus,
 3385                        bit32                agIOInfoLen,
 3386                        void                 *agParam,
 3387                        bit32                agOtherInfo
 3388                        )
 3389 {
 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"));
 3395 
 3396   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3397 
 3398   ostiInitiatorIOCompleted (
 3399                             tiRoot,
 3400                             tdIORequestBody->tiIORequest,
 3401                             tiIOFailed,
 3402                             tiDetailOtherError,
 3403                             agNULL,
 3404                             intContext
 3405                             );
 3406 
 3407   return;
 3408 }
 3409 
 3410 /*****************************************************************************
 3411 *! \brief itdssXferErrorACKNAKTimeoutHandler
 3412 *
 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
 3415 *
 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
 3421 *                             of abort request
 3422 *  \param  agOtherInfo        Residual count
 3423 *  \return: None
 3424 *
 3425 *
 3426 *****************************************************************************/
 3427 osGLOBAL void
 3428 itdssXferErrorACKNAKTimeoutHandler(
 3429                        agsaRoot_t           *agRoot,
 3430                        agsaIORequest_t      *agIORequest,
 3431                        bit32                agIOStatus,
 3432                        bit32                agIOInfoLen,
 3433                        void                 *agParam,
 3434                        bit32                agOtherInfo
 3435                        )
 3436 {
 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"));
 3442 
 3443   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3444 
 3445   ostiInitiatorIOCompleted (
 3446                             tiRoot,
 3447                             tdIORequestBody->tiIORequest,
 3448                             tiIOFailed,
 3449                             tiDetailOtherError,
 3450                             agNULL,
 3451                             intContext
 3452                             );
 3453 
 3454   return;
 3455 }
 3456 
 3457 /*****************************************************************************
 3458 *! \brief itdssXferErrorPeerAbortedHandler
 3459 *
 3460 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 3461 *            layer with agIOStatus = OSSA_IO_XFER_ERROR_PEER_ABORTED
 3462 *
 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
 3468 *                             of abort request
 3469 *  \param  agOtherInfo        Residual count
 3470 *  \return: None
 3471 *
 3472 *
 3473 *****************************************************************************/
 3474 osGLOBAL void
 3475 itdssXferErrorPeerAbortedHandler(
 3476                        agsaRoot_t           *agRoot,
 3477                        agsaIORequest_t      *agIORequest,
 3478                        bit32                agIOStatus,
 3479                        bit32                agIOInfoLen,
 3480                        void                 *agParam,
 3481                        bit32                agOtherInfo
 3482                        )
 3483 {
 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"));
 3489 
 3490   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3491 
 3492   ostiInitiatorIOCompleted (
 3493                             tiRoot,
 3494                             tdIORequestBody->tiIORequest,
 3495                             tiIOFailed,
 3496                             tiDetailOtherError,
 3497                             agNULL,
 3498                             intContext
 3499                             );
 3500 
 3501   return;
 3502 }
 3503 
 3504 /*****************************************************************************
 3505 *! \brief itdssXferErrorRxFrameHandler
 3506 *
 3507 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 3508 *            layer with agIOStatus = OSSA_IO_XFER_ERROR_RX_FRAME
 3509 *
 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
 3515 *                             of abort request
 3516 *  \param  agOtherInfo        Residual count
 3517 *  \return: None
 3518 *
 3519 *
 3520 *****************************************************************************/
 3521 osGLOBAL void
 3522 itdssXferErrorRxFrameHandler(
 3523                        agsaRoot_t           *agRoot,
 3524                        agsaIORequest_t      *agIORequest,
 3525                        bit32                agIOStatus,
 3526                        bit32                agIOInfoLen,
 3527                        void                 *agParam,
 3528                        bit32                agOtherInfo
 3529                        )
 3530 {
 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"));
 3536 
 3537   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3538 
 3539   ostiInitiatorIOCompleted (
 3540                             tiRoot,
 3541                             tdIORequestBody->tiIORequest,
 3542                             tiIOFailed,
 3543                             tiDetailOtherError,
 3544                             agNULL,
 3545                             intContext
 3546                             );
 3547 
 3548   return;
 3549 }
 3550 
 3551 /*****************************************************************************
 3552 *! \brief itdssXferErrorDMAHandler
 3553 *
 3554 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 3555 *            layer with agIOStatus = OSSA_IO_XFER_ERROR_DMA
 3556 *
 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
 3562 *                             of abort request
 3563 *  \param  agOtherInfo        Residual count
 3564 *  \return: None
 3565 *
 3566 *
 3567 *****************************************************************************/
 3568 osGLOBAL void
 3569 itdssXferErrorDMAHandler(
 3570                        agsaRoot_t           *agRoot,
 3571                        agsaIORequest_t      *agIORequest,
 3572                        bit32                agIOStatus,
 3573                        bit32                agIOInfoLen,
 3574                        void                 *agParam,
 3575                        bit32                agOtherInfo
 3576                        )
 3577 {
 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"));
 3583 
 3584   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3585 
 3586   ostiInitiatorIOCompleted (
 3587                             tiRoot,
 3588                             tdIORequestBody->tiIORequest,
 3589                             tiIOFailed,
 3590                             tiDetailOtherErrorNoRetry,
 3591                             agNULL,
 3592                             intContext
 3593                             );
 3594 
 3595   return;
 3596 }
 3597 
 3598 /*****************************************************************************
 3599 *! \brief itdssXferErrorCreditTimeoutHandler
 3600 *
 3601 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 3602 *            layer with agIOStatus = OSSA_IO_XFER_ERROR_CREDIT_TIMEOUT
 3603 *
 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
 3609 *                             of abort request
 3610 *  \param  agOtherInfo        Residual count
 3611 *  \return: None
 3612 *
 3613 *
 3614 *****************************************************************************/
 3615 osGLOBAL void
 3616 itdssXferErrorCreditTimeoutHandler(
 3617                        agsaRoot_t           *agRoot,
 3618                        agsaIORequest_t      *agIORequest,
 3619                        bit32                agIOStatus,
 3620                        bit32                agIOInfoLen,
 3621                        void                 *agParam,
 3622                        bit32                agOtherInfo
 3623                        )
 3624 {
 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"));
 3630 
 3631   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3632 
 3633   ostiInitiatorIOCompleted (
 3634                             tiRoot,
 3635                             tdIORequestBody->tiIORequest,
 3636                             tiIOFailed,
 3637                             tiDetailOtherError,
 3638                             agNULL,
 3639                             intContext
 3640                             );
 3641 
 3642   return;
 3643 }
 3644 
 3645 /*****************************************************************************
 3646 *! \brief itdssXferErrorCMDIssueACKNAKTimeoutHandler
 3647 *
 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
 3650 *
 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
 3656 *                             of abort request
 3657 *  \param  agOtherInfo        Residual count
 3658 *  \return: None
 3659 *
 3660 *
 3661 *****************************************************************************/
 3662 osGLOBAL void
 3663 itdssXferErrorCMDIssueACKNAKTimeoutHandler(
 3664                        agsaRoot_t           *agRoot,
 3665                        agsaIORequest_t      *agIORequest,
 3666                        bit32                agIOStatus,
 3667                        bit32                agIOInfoLen,
 3668                        void                 *agParam,
 3669                        bit32                agOtherInfo
 3670                        )
 3671 {
 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"));
 3677 
 3678   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3679 
 3680   ostiInitiatorIOCompleted (
 3681                             tiRoot,
 3682                             tdIORequestBody->tiIORequest,
 3683                             tiIOFailed,
 3684                             tiDetailOtherError,
 3685                             agNULL,
 3686                             intContext
 3687                             );
 3688 
 3689   return;
 3690 }
 3691 
 3692 /*****************************************************************************
 3693 *! \brief itdssXferErrorCMDIssueBreakBeforeACKNAKHandler
 3694 *
 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
 3697 *
 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
 3703 *                             of abort request
 3704 *  \param  agOtherInfo        Residual count
 3705 *  \return: None
 3706 *
 3707 *
 3708 *****************************************************************************/
 3709 osGLOBAL void
 3710 itdssXferErrorCMDIssueBreakBeforeACKNAKHandler(
 3711                        agsaRoot_t           *agRoot,
 3712                        agsaIORequest_t      *agIORequest,
 3713                        bit32                agIOStatus,
 3714                        bit32                agIOInfoLen,
 3715                        void                 *agParam,
 3716                        bit32                agOtherInfo
 3717                        )
 3718 {
 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"));
 3724 
 3725   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3726 
 3727   ostiInitiatorIOCompleted (
 3728                             tiRoot,
 3729                             tdIORequestBody->tiIORequest,
 3730                             tiIOFailed,
 3731                             tiDetailOtherError,
 3732                             agNULL,
 3733                             intContext
 3734                             );
 3735 
 3736   return;
 3737 }
 3738 
 3739 /*****************************************************************************
 3740 *! \brief itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler
 3741 *
 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
 3744 *
 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
 3750 *                             of abort request
 3751 *  \param  agOtherInfo        Residual count
 3752 *  \return: None
 3753 *
 3754 *
 3755 *****************************************************************************/
 3756 osGLOBAL void
 3757 itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler(
 3758                        agsaRoot_t           *agRoot,
 3759                        agsaIORequest_t      *agIORequest,
 3760                        bit32                agIOStatus,
 3761                        bit32                agIOInfoLen,
 3762                        void                 *agParam,
 3763                        bit32                agOtherInfo
 3764                        )
 3765 {
 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"));
 3771 
 3772   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3773 
 3774   ostiInitiatorIOCompleted (
 3775                             tiRoot,
 3776                             tdIORequestBody->tiIORequest,
 3777                             tiIOFailed,
 3778                             tiDetailOtherError,
 3779                             agNULL,
 3780                             intContext
 3781                             );
 3782 
 3783   return;
 3784 }
 3785 
 3786 /*****************************************************************************
 3787 *! \brief itdssXferErrorDisruptedPhyDownHandler
 3788 *
 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
 3791 *
 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
 3797 *                             of abort request
 3798 *  \param  agOtherInfo        Residual count
 3799 *  \return: None
 3800 *
 3801 *
 3802 *****************************************************************************/
 3803 osGLOBAL void
 3804 itdssXferErrorDisruptedPhyDownHandler(
 3805                        agsaRoot_t           *agRoot,
 3806                        agsaIORequest_t      *agIORequest,
 3807                        bit32                agIOStatus,
 3808                        bit32                agIOInfoLen,
 3809                        void                 *agParam,
 3810                        bit32                agOtherInfo
 3811                        )
 3812 {
 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"));
 3818 
 3819   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3820 
 3821   ostiInitiatorIOCompleted (
 3822                             tiRoot,
 3823                             tdIORequestBody->tiIORequest,
 3824                             tiIOFailed,
 3825                             tiDetailOtherError,
 3826                             agNULL,
 3827                             intContext
 3828                             );
 3829 
 3830   return;
 3831 }
 3832 
 3833 /*****************************************************************************
 3834 *! \brief itdssXferErrorOffsetMismatchHandler
 3835 *
 3836 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 3837 *            layer with agIOStatus = OSSA_IO_XFER_ERROR_OFFSET_MISMATCH
 3838 *
 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
 3844 *                             of abort request
 3845 *  \param  agOtherInfo        Residual count
 3846 *  \return: None
 3847 *
 3848 *
 3849 *****************************************************************************/
 3850 osGLOBAL void
 3851 itdssXferErrorOffsetMismatchHandler(
 3852                        agsaRoot_t           *agRoot,
 3853                        agsaIORequest_t      *agIORequest,
 3854                        bit32                agIOStatus,
 3855                        bit32                agIOInfoLen,
 3856                        void                 *agParam,
 3857                        bit32                agOtherInfo
 3858                        )
 3859 {
 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"));
 3865 
 3866   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3867 
 3868   ostiInitiatorIOCompleted (
 3869                             tiRoot,
 3870                             tdIORequestBody->tiIORequest,
 3871                             tiIOFailed,
 3872                             tiDetailOtherError,
 3873                             agNULL,
 3874                             intContext
 3875                             );
 3876 
 3877   return;
 3878 }
 3879 
 3880 /*****************************************************************************
 3881 *! \brief itdssXferErrorXferZeroDataLenHandler
 3882 *
 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
 3885 *
 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
 3891 *                             of abort request
 3892 *  \param  agOtherInfo        Residual count
 3893 *  \return: None
 3894 *
 3895 *
 3896 *****************************************************************************/
 3897 osGLOBAL void
 3898 itdssXferErrorXferZeroDataLenHandler(
 3899                        agsaRoot_t           *agRoot,
 3900                        agsaIORequest_t      *agIORequest,
 3901                        bit32                agIOStatus,
 3902                        bit32                agIOInfoLen,
 3903                        void                 *agParam,
 3904                        bit32                agOtherInfo
 3905                        )
 3906 {
 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"));
 3912 
 3913   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3914 
 3915   ostiInitiatorIOCompleted (
 3916                             tiRoot,
 3917                             tdIORequestBody->tiIORequest,
 3918                             tiIOFailed,
 3919                             tiDetailOtherError,
 3920                             agNULL,
 3921                             intContext
 3922                             );
 3923 
 3924   return;
 3925 }
 3926 
 3927 /*****************************************************************************
 3928 *! \brief itdssXferOpenRetryTimeoutHandler
 3929 *
 3930 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 3931 *            layer with agIOStatus = OSSA_IO_XFER_OPEN_RETRY_TIMEOUT
 3932 *
 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
 3938 *                             of abort request
 3939 *  \param  agOtherInfo        Residual count
 3940 *  \return: None
 3941 *
 3942 *
 3943 *****************************************************************************/
 3944 osGLOBAL void
 3945 itdssXferOpenRetryTimeoutHandler(
 3946                        agsaRoot_t           *agRoot,
 3947                        agsaIORequest_t      *agIORequest,
 3948                        bit32                agIOStatus,
 3949                        bit32                agIOInfoLen,
 3950                        void                 *agParam,
 3951                        bit32                agOtherInfo
 3952                        )
 3953 {
 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;
 3965 
 3966   TI_DBG2(("itdssXferOpenRetryTimeoutHandler: start\n"));
 3967 
 3968   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 3969   tiDeviceHandle = tdIORequestBody->tiDevHandle;
 3970   oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
 3971   agDevHandle = oneDeviceData->agDevHandle;
 3972 
 3973   if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
 3974       oneDeviceData->tdPortContext != agNULL )
 3975   {
 3976     if (tdIORequestBody->reTries < OPEN_RETRY_RETRIES) /* 10 */
 3977     {
 3978       saStatus = saSSPStart(agRoot,
 3979                             agIORequest,
 3980                             tdsaRotateQnumber(tiRoot, oneDeviceData),
 3981                             agDevHandle,
 3982                             tdIORequestBody->agRequestType,
 3983                             &(tdIORequestBody->transport.SAS.agSASRequestBody),
 3984                             agNULL,
 3985                             &ossaSSPCompleted);
 3986 
 3987       if (saStatus == AGSA_RC_SUCCESS)
 3988       {
 3989         TI_DBG2(("itdssXferOpenRetryTimeoutHandler: retried\n"));
 3990         Initiator->NumIOsActive++;
 3991         tdIORequestBody->ioStarted = agTRUE;
 3992         tdIORequestBody->ioCompleted = agFALSE;
 3993         tdIORequestBody->reTries++;
 3994         return;
 3995       }
 3996       else
 3997       {
 3998         TI_DBG1(("itdssXferOpenRetryTimeoutHandler: retry failed\n"));
 3999         tdIORequestBody->ioStarted = agFALSE;
 4000         tdIORequestBody->ioCompleted = agTRUE;
 4001         tdIORequestBody->reTries = 0;
 4002       }
 4003     }
 4004     else
 4005     {
 4006       TI_DBG1(("itdssXferOpenRetryTimeoutHandler: retry is over and fail\n"));
 4007       tdIORequestBody->reTries = 0;
 4008     }
 4009   }
 4010   else
 4011   {
 4012     TI_DBG1(("itdssXferOpenRetryTimeoutHandler: not valid deivce no retry\n"));
 4013     tdIORequestBody->reTries = 0;
 4014   }
 4015   ostiInitiatorIOCompleted(
 4016                            tiRoot,
 4017                            tdIORequestBody->tiIORequest,
 4018                            tiIOFailed,
 4019                            tiDetailOtherError,
 4020                            agNULL,
 4021                            intContext
 4022                            );
 4023   return;
 4024 }
 4025 
 4026 /*****************************************************************************
 4027 *! \brief itdssPortInResetHandler
 4028 *
 4029 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 4030 *            layer with agIOStatus = OSSA_IO_PORT_IN_RESET
 4031 *
 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
 4037 *                             of abort request
 4038 *  \param  agOtherInfo        Residual count
 4039 *  \return: None
 4040 *
 4041 *
 4042 *****************************************************************************/
 4043 osGLOBAL void
 4044 itdssPortInResetHandler(
 4045                        agsaRoot_t           *agRoot,
 4046                        agsaIORequest_t      *agIORequest,
 4047                        bit32                agIOStatus,
 4048                        bit32                agIOInfoLen,
 4049                        void                 *agParam,
 4050                        bit32                agOtherInfo
 4051                        )
 4052 {
 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"));
 4058 
 4059   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4060 
 4061   ostiInitiatorIOCompleted (
 4062                             tiRoot,
 4063                             tdIORequestBody->tiIORequest,
 4064                             tiIOFailed,
 4065                             tiDetailOtherError,
 4066                             agNULL,
 4067                             intContext
 4068                             );
 4069 
 4070   return;
 4071 }
 4072 
 4073 /*****************************************************************************
 4074 *! \brief itdssDsNonOperationalHandler
 4075 *
 4076 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 4077 *            layer with agIOStatus = OSSA_IO_DS_NON_OPERATIONAL
 4078 *
 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
 4084 *                             of abort request
 4085 *  \param  agOtherInfo        Residual count
 4086 *  \return: None
 4087 *
 4088 *
 4089 *****************************************************************************/
 4090 osGLOBAL void
 4091 itdssDsNonOperationalHandler(
 4092                        agsaRoot_t           *agRoot,
 4093                        agsaIORequest_t      *agIORequest,
 4094                        bit32                agIOStatus,
 4095                        bit32                agIOInfoLen,
 4096                        void                 *agParam,
 4097                        bit32                agOtherInfo
 4098                        )
 4099 {
 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;
 4107 
 4108 
 4109   TI_DBG2(("itdssDsNonOperationalHandler: start\n"));
 4110 
 4111 
 4112   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4113 
 4114 #if 1 /* TBD */
 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 )
 4121   {
 4122     saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
 4123   }
 4124 #endif
 4125 
 4126   ostiInitiatorIOCompleted (
 4127                             tiRoot,
 4128                             tdIORequestBody->tiIORequest,
 4129                             tiIOFailed,
 4130                             tiDetailOtherError,
 4131                             agNULL,
 4132                             intContext
 4133                             );
 4134 
 4135   return;
 4136 }
 4137 
 4138 /*****************************************************************************
 4139 *! \brief itdssDsInRecoveryHandler
 4140 *
 4141 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 4142 *            layer with agIOStatus = OSSA_IO_DS_IN_RECOVERY
 4143 *
 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
 4149 *                             of abort request
 4150 *  \param  agOtherInfo        Residual count
 4151 *  \return: None
 4152 *
 4153 *
 4154 *****************************************************************************/
 4155 osGLOBAL void
 4156 itdssDsInRecoveryHandler(
 4157                        agsaRoot_t           *agRoot,
 4158                        agsaIORequest_t      *agIORequest,
 4159                        bit32                agIOStatus,
 4160                        bit32                agIOInfoLen,
 4161                        void                 *agParam,
 4162                        bit32                agOtherInfo
 4163                        )
 4164 {
 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"));
 4170 
 4171   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4172 
 4173   ostiInitiatorIOCompleted (
 4174                             tiRoot,
 4175                             tdIORequestBody->tiIORequest,
 4176                             tiIOFailed,
 4177                             tiDetailOtherError,
 4178                             agNULL,
 4179                             intContext
 4180                             );
 4181 
 4182   return;
 4183 }
 4184 
 4185 /*****************************************************************************
 4186 *! \brief itdssTmTagNotFoundHandler
 4187 *
 4188 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 4189 *            layer with agIOStatus = OSSA_IO_TM_TAG_NOT_FOUND
 4190 *
 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
 4196 *                             of abort request
 4197 *  \param  agOtherInfo        Residual count
 4198 *  \return: None
 4199 *
 4200 *
 4201 *****************************************************************************/
 4202 osGLOBAL void
 4203 itdssTmTagNotFoundHandler(
 4204                        agsaRoot_t           *agRoot,
 4205                        agsaIORequest_t      *agIORequest,
 4206                        bit32                agIOStatus,
 4207                        bit32                agIOInfoLen,
 4208                        void                 *agParam,
 4209                        bit32                agOtherInfo
 4210                        )
 4211 {
 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"));
 4217 
 4218   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4219 
 4220   ostiInitiatorIOCompleted (
 4221                             tiRoot,
 4222                             tdIORequestBody->tiIORequest,
 4223                             tiIOFailed,
 4224                             tiDetailOtherError,
 4225                             agNULL,
 4226                             intContext
 4227                             );
 4228 
 4229   return;
 4230 }
 4231 
 4232 /*****************************************************************************
 4233 *! \brief itdssSSPExtIUZeroLenHandler
 4234 *
 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
 4237 *
 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
 4243 *                             of abort request
 4244 *  \param  agOtherInfo        Residual count
 4245 *  \return: None
 4246 *
 4247 *
 4248 *****************************************************************************/
 4249 osGLOBAL void
 4250 itdssSSPExtIUZeroLenHandler(
 4251                        agsaRoot_t           *agRoot,
 4252                        agsaIORequest_t      *agIORequest,
 4253                        bit32                agIOStatus,
 4254                        bit32                agIOInfoLen,
 4255                        void                 *agParam,
 4256                        bit32                agOtherInfo
 4257                        )
 4258 {
 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"));
 4264 
 4265   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4266 
 4267   ostiInitiatorIOCompleted (
 4268                             tiRoot,
 4269                             tdIORequestBody->tiIORequest,
 4270                             tiIOFailed,
 4271                             tiDetailOtherError,
 4272                             agNULL,
 4273                             intContext
 4274                             );
 4275 
 4276   return;
 4277 }
 4278 
 4279 /*****************************************************************************
 4280 *! \brief itdssXferErrorUnexpectedPhaseHandler
 4281 *
 4282 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 4283 *            layer with agIOStatus = OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE
 4284 *
 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
 4290 *                             of abort request
 4291 *  \param  agOtherInfo        Residual count
 4292 *  \return: None
 4293 *
 4294 *
 4295 *****************************************************************************/
 4296 osGLOBAL void
 4297 itdssXferErrorUnexpectedPhaseHandler(
 4298                        agsaRoot_t           *agRoot,
 4299                        agsaIORequest_t      *agIORequest,
 4300                        bit32                agIOStatus,
 4301                        bit32                agIOInfoLen,
 4302                        void                 *agParam,
 4303                        bit32                agOtherInfo
 4304                        )
 4305 {
 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"));
 4311 
 4312   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4313 
 4314   ostiInitiatorIOCompleted (
 4315                             tiRoot,
 4316                             tdIORequestBody->tiIORequest,
 4317                             tiIOFailed,
 4318                             tiDetailOtherError,
 4319                             agNULL,
 4320                             intContext
 4321                             );
 4322 
 4323   return;
 4324 }
 4325 
 4326 #ifdef REMOVED
 4327 /*****************************************************************************
 4328 *! \brief itdssIOUnderFlowWithChkConditionHandler
 4329 *
 4330 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 4331 *            layer with agIOStatus = OSSA_IO_UNDERFLOW_WITH_CHK_COND
 4332 *
 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
 4338 *                             of abort request
 4339 *  \return: None
 4340 *
 4341 *
 4342 *****************************************************************************/
 4343 /*
 4344   How to report SCSI_STAT_CHECK_CONDITION and tiIOUnderRun simultaneoulsy???
 4345   ostiInitiatorIOCompleted(
 4346                              tiRoot,
 4347                              tdIORequestBody->tiIORequest,
 4348                              tiIOSuccess,
 4349                              SCSI_STAT_CHECK_CONDITION,
 4350                              &senseData,
 4351                              agTRUE
 4352                              );
 4353 
 4354                  vs
 4355 
 4356   ostiInitiatorIOCompleted (
 4357                             tiRoot,
 4358                             tdIORequestBody->tiIORequest,
 4359                             tiIOUnderRun,
 4360                             agIOInfoLen,
 4361                             agNULL,
 4362                             intContext
 4363                             );
 4364 
 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()
 4367 */
 4368 osGLOBAL void
 4369 itdssIOUnderFlowWithChkConditionHandler(
 4370                         agsaRoot_t              *agRoot,
 4371                         agsaIORequest_t         *agIORequest,
 4372                         bit32                   agIOStatus,
 4373                         bit32                   agIOInfoLen,
 4374                         void                    *agParam
 4375                         )
 4376 {
 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];
 4383   bit8                      respData[128];
 4384   bit32                     scsi_status;
 4385   bit32                     senseLen;
 4386   bit32                     respLen;
 4387   bit32                     data_status;
 4388   bit32                     i;
 4389   tiDeviceHandle_t          *tiDeviceHandle = agNULL;
 4390   tdsaDeviceData_t          *oneDeviceData = agNULL;
 4391 
 4392   TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: start\n"));
 4393   TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: agIOInfoLen 0x%x\n", agIOInfoLen));
 4394 
 4395   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4396 
 4397   tdIORequestBody->ioCompleted = agTRUE;
 4398   tdIORequestBody->ioStarted = agFALSE;
 4399 
 4400   /*
 4401     agIOInfoLen must be >= sizeof(agsaSSPResponseInfoUnit_t), which is minimum
 4402     date length
 4403   */
 4404   if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t))
 4405   {
 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(
 4409                              tiRoot,
 4410                              tdIORequestBody->tiIORequest, /* tiIORequest */
 4411                              tiIOFailed,
 4412                              tiDetailOtherError,
 4413                              agNULL,
 4414                              agTRUE /* intContext; is not being used */
 4415                              );
 4416     return;
 4417   }
 4418   /* reads agsaSSPResponseInfoUnit_t */
 4419   saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
 4420 
 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);
 4426 
 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));
 4429 
 4430   /*
 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
 4435   */
 4436   if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
 4437   {
 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));
 4440 
 4441     ostiInitiatorIOCompleted(
 4442                              tiRoot,
 4443                              tdIORequestBody->tiIORequest, /* tiIORequest */
 4444                              tiIOFailed,
 4445                              tiDetailOtherError,
 4446                              agNULL,
 4447                              agTRUE /* intContext; is not being used */
 4448                              );
 4449     return;
 4450   }
 4451 
 4452   /* reads response data */
 4453   saFrameReadBlock(agRoot, agParam,
 4454                    sizeof(agsaSSPResponseInfoUnit_t),
 4455                    respData, respLen);
 4456   /* reads sense data */
 4457   saFrameReadBlock(agRoot, agParam,
 4458                    sizeof(agsaSSPResponseInfoUnit_t)
 4459                    + respLen,
 4460                    senseDataPayload, senseLen);
 4461 
 4462   if (data_status == 0)
 4463   {
 4464     /* NO_DATA */
 4465     TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: no data\n"));
 4466 
 4467     ostiInitiatorIOCompleted(
 4468                              tiRoot,
 4469                              tdIORequestBody->tiIORequest, /* tiIORequest */
 4470                              tiIOSuccess,
 4471                              scsi_status,
 4472                              agNULL,
 4473                              agTRUE /* intContext; is not being used */
 4474                              );
 4475 
 4476     return;
 4477   }
 4478 
 4479   if (data_status == 1)
 4480   {
 4481     /* RESPONSE_DATA */
 4482     TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: response data \n"));
 4483 
 4484     ostiInitiatorIOCompleted(
 4485                              tiRoot,
 4486                              tdIORequestBody->tiIORequest, /* tiIORequest */
 4487                              tiIOSuccess,
 4488                              0,
 4489                              agNULL,
 4490                              agTRUE /* intContext; is not being used */
 4491                              );
 4492     return;
 4493   }
 4494 
 4495   if (data_status == 2)
 4496   {
 4497     /* SENSE_DATA */
 4498     TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: sense data \n"));
 4499 
 4500     senseData.senseData = &senseDataPayload;
 4501     senseData.senseLen = MIN(256, senseLen);
 4502     /* debugging */
 4503     tdhexdump("ResponseIU I", (bit8 *)&agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
 4504 
 4505     tdhexdump("sense data I", (bit8 *)senseDataPayload, senseLen);
 4506     tdhexdump("sense data II", (bit8 *)senseData.senseData, senseData.senseLen);
 4507 
 4508     if (senseDataPayload[2] == SCSI_SENSE_KEY_RECOVERED_ERROR)
 4509     {
 4510       Initiator->SenseKeyCounter.SoftError ++;
 4511     }
 4512     else if (senseDataPayload[2] == SCSI_SENSE_KEY_NOT_READY)
 4513     {
 4514       Initiator->SenseKeyCounter.MediumNotReady++;
 4515     }
 4516     else if (senseDataPayload[2] == SCSI_SENSE_KEY_MEDIUM_ERROR)
 4517     {
 4518       Initiator->SenseKeyCounter.MediumError++;
 4519     }
 4520     else if (senseDataPayload[2] == SCSI_SENSE_KEY_HARDWARE_ERROR)
 4521     {
 4522       Initiator->SenseKeyCounter.HardwareError++;
 4523     }
 4524     else if (senseDataPayload[2] == SCSI_SENSE_KEY_ILLEGAL_REQUEST)
 4525     {
 4526       Initiator->SenseKeyCounter.IllegalRequest++;
 4527     }
 4528     else if (senseDataPayload[2] == SCSI_SENSE_KEY_UNIT_ATTENTION)
 4529     {
 4530       Initiator->SenseKeyCounter.UnitAttention++;
 4531     }
 4532     else if (senseDataPayload[2] == SCSI_SENSE_KEY_ABORTED_COMMAND)
 4533     {
 4534       Initiator->SenseKeyCounter.AbortCommand++;
 4535     }
 4536     else
 4537     {
 4538       Initiator->SenseKeyCounter.OtherKeyType++;
 4539     }
 4540 
 4541     /* when ASQ and ASCQ 0x04 0x11, does saLocalPhyControl for notify spinup */
 4542     if ((senseDataPayload[12] == 0x04 && senseDataPayload[13] == 0x11))
 4543     {
 4544       TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: sending notfify spinup\n"));
 4545       tiDeviceHandle = tdIORequestBody->tiDevHandle;
 4546       oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
 4547       if (oneDeviceData->directlyAttached == agTRUE)
 4548       {
 4549         for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
 4550         {
 4551           saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
 4552         }
 4553       }
 4554     }
 4555     ostiInitiatorIOCompleted(
 4556                              tiRoot,
 4557                              /* tiIORequest */
 4558                              tdIORequestBody->tiIORequest,
 4559                              tiIOSuccess,
 4560                              scsi_status,
 4561                              &senseData,
 4562                              agTRUE /* intContext; is not being used */
 4563                              );
 4564     return;
 4565   }
 4566   if (data_status == 3)
 4567   {
 4568     /* RESERVED */
 4569     TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: reserved wrong!!!\n"));
 4570     ostiInitiatorIOCompleted(
 4571                              tiRoot,
 4572                              tdIORequestBody->tiIORequest, /* tiIORequest */
 4573                              tiIOFailed,
 4574                              scsi_status,
 4575                              agNULL,
 4576                              agTRUE /* intContext; is not being used */
 4577                              );
 4578     return;
 4579   }
 4580 
 4581 
 4582   return;
 4583 }
 4584 #endif
 4585 
 4586 /*****************************************************************************
 4587 *! \brief itdssXferOpenRetryBackoffThresholdReachedHandler
 4588 *
 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
 4592 *
 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
 4598 *                             of abort request
 4599 *  \param  agOtherInfo        Residual count
 4600 *  \return: None
 4601 *
 4602 *
 4603 *****************************************************************************/
 4604 osGLOBAL void
 4605 itdssXferOpenRetryBackoffThresholdReachedHandler(
 4606                                                  agsaRoot_t           *agRoot,
 4607                                                  agsaIORequest_t      *agIORequest,
 4608                                                  bit32                agIOStatus,
 4609                                                  bit32                agIOInfoLen,
 4610                                                  void                 *agParam,
 4611                                                  bit32                agOtherInfo
 4612                                                 )
 4613 {
 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"));
 4619 
 4620   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4621 
 4622   ostiInitiatorIOCompleted (
 4623                             tiRoot,
 4624                             tdIORequestBody->tiIORequest,
 4625                             tiIOFailed,
 4626                             tiDetailOtherError,
 4627                             agNULL,
 4628                             intContext
 4629                             );
 4630 
 4631   return;
 4632 }
 4633 
 4634 /*****************************************************************************
 4635 *! \brief itdssOpenCnxErrorItNexusLossOpenTmoHandler
 4636 *
 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
 4639 *
 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
 4645 *                             of abort request
 4646 *  \param  agOtherInfo        Residual count
 4647 *  \return: None
 4648 *
 4649 *
 4650 *****************************************************************************/
 4651 osGLOBAL void
 4652 itdssOpenCnxErrorItNexusLossOpenTmoHandler(
 4653                                            agsaRoot_t           *agRoot,
 4654                                            agsaIORequest_t      *agIORequest,
 4655                                            bit32                agIOStatus,
 4656                                            bit32                agIOInfoLen,
 4657                                            void                 *agParam,
 4658                                            bit32                agOtherInfo
 4659                                           )
 4660 {
 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"));
 4666 
 4667   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4668 
 4669   ostiInitiatorIOCompleted (
 4670                             tiRoot,
 4671                             tdIORequestBody->tiIORequest,
 4672                             tiIOFailed,
 4673                             tiDetailOtherError,
 4674                             agNULL,
 4675                             intContext
 4676                             );
 4677 
 4678   return;
 4679 }
 4680 
 4681 /*****************************************************************************
 4682 *! \brief itdssOpenCnxErrorItNexusLossNoDestHandler
 4683 *
 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
 4686 *
 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
 4692 *                             of abort request
 4693 *  \param  agOtherInfo        Residual count
 4694 *  \return: None
 4695 *
 4696 *
 4697 *****************************************************************************/
 4698 osGLOBAL void
 4699 itdssOpenCnxErrorItNexusLossNoDestHandler(
 4700                                           agsaRoot_t           *agRoot,
 4701                                           agsaIORequest_t      *agIORequest,
 4702                                           bit32                agIOStatus,
 4703                                           bit32                agIOInfoLen,
 4704                                           void                 *agParam,
 4705                                           bit32                agOtherInfo
 4706                                          )
 4707 {
 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"));
 4713 
 4714   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4715 
 4716   ostiInitiatorIOCompleted (
 4717                             tiRoot,
 4718                             tdIORequestBody->tiIORequest,
 4719                             tiIOFailed,
 4720                             tiDetailOtherError,
 4721                             agNULL,
 4722                             intContext
 4723                             );
 4724 
 4725   return;
 4726 }
 4727 
 4728 /*****************************************************************************
 4729 *! \brief itdssOpenCnxErrorItNexusLossOpenCollideHandler
 4730 *
 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
 4733 *
 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
 4739 *                             of abort request
 4740 *  \param  agOtherInfo        Residual count
 4741 *  \return: None
 4742 *
 4743 *
 4744 *****************************************************************************/
 4745 osGLOBAL void
 4746 itdssOpenCnxErrorItNexusLossOpenCollideHandler(
 4747                                                agsaRoot_t           *agRoot,
 4748                                                agsaIORequest_t      *agIORequest,
 4749                                                bit32                agIOStatus,
 4750                                                bit32                agIOInfoLen,
 4751                                                void                 *agParam,
 4752                                                bit32                agOtherInfo
 4753                                               )
 4754 {
 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"));
 4760 
 4761   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4762 
 4763   ostiInitiatorIOCompleted (
 4764                             tiRoot,
 4765                             tdIORequestBody->tiIORequest,
 4766                             tiIOFailed,
 4767                             tiDetailOtherError,
 4768                             agNULL,
 4769                             intContext
 4770                             );
 4771 
 4772   return;
 4773 }
 4774 
 4775 /*****************************************************************************
 4776 *! \brief itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler
 4777 *
 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
 4780 *
 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
 4786 *                             of abort request
 4787 *  \param  agOtherInfo        Residual count
 4788 *  \return: None
 4789 *
 4790 *
 4791 *****************************************************************************/
 4792 osGLOBAL void
 4793 itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler(
 4794                                                       agsaRoot_t           *agRoot,
 4795                                                       agsaIORequest_t      *agIORequest,
 4796                                                       bit32                agIOStatus,
 4797                                                       bit32                agIOInfoLen,
 4798                                                       void                 *agParam,
 4799                                                       bit32                agOtherInfo
 4800                                                      )
 4801 {
 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"));
 4807 
 4808   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4809 
 4810   ostiInitiatorIOCompleted (
 4811                             tiRoot,
 4812                             tdIORequestBody->tiIORequest,
 4813                             tiIOFailed,
 4814                             tiDetailOtherError,
 4815                             agNULL,
 4816                             intContext
 4817                             );
 4818 
 4819   return;
 4820 }
 4821 
 4822 /*****************************************************************************
 4823 *! \brief itdssEncryptionHandler
 4824 *
 4825 *  Purpose:  This function processes I/Os completed and returned by SAS lower
 4826 *            layer with any encryption specific agIOStatus.
 4827 *
 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
 4833 *                             of abort request
 4834 *  \return: None
 4835 *
 4836 *
 4837 *****************************************************************************/
 4838 osGLOBAL void
 4839 itdssEncryptionHandler (
 4840                        agsaRoot_t              *agRoot,
 4841                        agsaIORequest_t         *agIORequest,
 4842                        bit32                   agIOStatus,
 4843                        bit32                   agIOInfoLen,
 4844                        void                    *agParam,
 4845                        bit32                   agOtherInfo
 4846                        )
 4847 {
 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));
 4855 
 4856   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4857 
 4858   switch (agIOStatus)
 4859   {
 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;
 4863       break;
 4864   case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
 4865       TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n"));
 4866       errorDetail = tiDetailCipherModeInvalid;
 4867       break;
 4868   case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
 4869       TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n"));
 4870       errorDetail = tiDetailDekIVMismatch;
 4871       break;
 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;
 4875       break;
 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;
 4879       break;
 4880   case OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE:
 4881       TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE\n"));
 4882       errorDetail = tiDetailOtherError;
 4883       break;
 4884   default:
 4885       TI_DBG1(("itdssEncryptionHandler: other error!!! 0x%x\n", agIOStatus));
 4886       errorDetail = tiDetailOtherError;
 4887       break;
 4888   }
 4889 
 4890   ostiInitiatorIOCompleted (
 4891                             tiRoot,
 4892                             tdIORequestBody->tiIORequest,
 4893                             tiIOEncryptError,
 4894                             errorDetail,
 4895                             agNULL,
 4896                             intContext
 4897                             );
 4898   return;
 4899 }
 4900 
 4901 /*****************************************************************************
 4902 *! \brief itdssDifHandler
 4903 *
 4904 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 4905 *            layer with any DIF specific agIOStatus
 4906 *
 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
 4912 *                             of abort request
 4913 *  \param  agOtherInfo        Residual count
 4914 *  \return: None
 4915 *
 4916 *
 4917 *****************************************************************************/
 4918 osGLOBAL void
 4919 itdssDifHandler(
 4920                 agsaRoot_t           *agRoot,
 4921                 agsaIORequest_t      *agIORequest,
 4922                 bit32                agIOStatus,
 4923                 bit32                agIOInfoLen,
 4924                 void                 *agParam,
 4925                 bit32                agOtherInfo
 4926                )
 4927 {
 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;
 4935 #endif
 4936 
 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;
 4942 #endif
 4943   switch (agIOStatus)
 4944   {
 4945   case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
 4946       errorDetail = tiDetailDifMismatch;
 4947       TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_MISMATCH\n"));
 4948       break;
 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"));
 4952       break;
 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"));
 4956       break;
 4957   case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
 4958       errorDetail = tiDetailDifCrcMismatch;
 4959       TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n"));
 4960       break;
 4961   default:
 4962       errorDetail = tiDetailOtherError;
 4963       TI_DBG1(("itdssDifHandler: other error!!! 0x%x\n", agIOStatus));
 4964       break;
 4965   }
 4966   TI_DBG1(("itdssDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA));
 4967   ostiInitiatorIOCompleted (
 4968                             tiRoot,
 4969                             tdIORequestBody->tiIORequest,
 4970                             tiIODifError,
 4971                             errorDetail,
 4972                             agNULL,
 4973                             intContext
 4974                             );
 4975   return;
 4976 }
 4977 
 4978 /*****************************************************************************
 4979 *! \brief itdssIOResourceUnavailableHandler
 4980 *
 4981 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 4982 *            layer with agIOStatus = OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE
 4983 *
 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
 4989 *                             of abort request
 4990 *  \param  agOtherInfo        Residual count
 4991 *  \return: None
 4992 *
 4993 *
 4994 *****************************************************************************/
 4995 osGLOBAL void
 4996 itdssIOResourceUnavailableHandler(
 4997                                   agsaRoot_t              *agRoot,
 4998                                   agsaIORequest_t         *agIORequest,
 4999                                   bit32                   agIOStatus,
 5000                                   bit32                   agIOInfoLen,
 5001                                   void                    *agParam,
 5002                                   bit32                   agOtherInfo
 5003                                  )
 5004 {
 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));
 5011 
 5012   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 5013 
 5014   ostiInitiatorIOCompleted (
 5015                             tiRoot,
 5016                             tdIORequestBody->tiIORequest,
 5017                             tiIOFailed,
 5018                             tiDetailBusy,
 5019                             agNULL,
 5020                             intContext
 5021                             );
 5022   return;
 5023 }
 5024 /*****************************************************************************
 5025 *! \brief itdssIORQEBusyFullHandler
 5026 *
 5027 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 5028 *            layer with agIOStatus = OSSA_MPI_IO_RQE_BUSY_FULL
 5029 *
 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
 5035 *                             of abort request
 5036 *  \param  agOtherInfo        Residual count
 5037 *  \return: None
 5038 *
 5039 *
 5040 *****************************************************************************/
 5041 osGLOBAL void
 5042 itdssIORQEBusyFullHandler(
 5043                                   agsaRoot_t              *agRoot,
 5044                                   agsaIORequest_t         *agIORequest,
 5045                                   bit32                   agIOStatus,
 5046                                   bit32                   agIOInfoLen,
 5047                                   void                    *agParam,
 5048                                   bit32                   agOtherInfo
 5049                                  )
 5050 {
 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));
 5057 
 5058   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 5059 
 5060   ostiInitiatorIOCompleted (
 5061                             tiRoot,
 5062                             tdIORequestBody->tiIORequest,
 5063                             tiIOFailed,
 5064                             tiDetailBusy,
 5065                             agNULL,
 5066                             intContext
 5067                             );
 5068   return;
 5069 }
 5070 
 5071 /*****************************************************************************
 5072 *! \brief itdssXferErrorInvalidSSPRspFrameHandler
 5073 *
 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
 5076 *
 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
 5082 *                             of abort request
 5083 *  \param  agOtherInfo        Residual count
 5084 *  \return: None
 5085 *
 5086 *
 5087 *****************************************************************************/
 5088 osGLOBAL void
 5089 itdssXferErrorInvalidSSPRspFrameHandler(
 5090                                   agsaRoot_t              *agRoot,
 5091                                   agsaIORequest_t         *agIORequest,
 5092                                   bit32                   agIOStatus,
 5093                                   bit32                   agIOInfoLen,
 5094                                   void                    *agParam,
 5095                                   bit32                   agOtherInfo
 5096                                  )
 5097 {
 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));
 5104 
 5105   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 5106 
 5107   ostiInitiatorIOCompleted (
 5108                             tiRoot,
 5109                             tdIORequestBody->tiIORequest,
 5110                             tiIOFailed,
 5111                             tiDetailOtherError,
 5112                             agNULL,
 5113                             intContext
 5114                             );
 5115   return;
 5116 }
 5117 
 5118 /*****************************************************************************
 5119 *! \brief itdssXferErrorEOBDataOverrunHandler
 5120 *
 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
 5123 *
 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
 5129 *                             of abort request
 5130 *  \param  agOtherInfo        Residual count
 5131 *  \return: None
 5132 *
 5133 *
 5134 *****************************************************************************/
 5135 osGLOBAL void
 5136 itdssXferErrorEOBDataOverrunHandler(
 5137                                   agsaRoot_t              *agRoot,
 5138                                   agsaIORequest_t         *agIORequest,
 5139                                   bit32                   agIOStatus,
 5140                                   bit32                   agIOInfoLen,
 5141                                   void                    *agParam,
 5142                                   bit32                   agOtherInfo
 5143                                  )
 5144 {
 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));
 5151 
 5152   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 5153 
 5154   ostiInitiatorIOCompleted (
 5155                             tiRoot,
 5156                             tdIORequestBody->tiIORequest,
 5157                             tiIOFailed,
 5158                             tiDetailOtherError,
 5159                             agNULL,
 5160                             intContext
 5161                             );
 5162   return;
 5163 }
 5164 
 5165 /*****************************************************************************
 5166 *! \brief itdssOpenCnxErrorOpenPreemptedHandler
 5167 *
 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
 5170 *
 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
 5176 *                             of abort request
 5177 *  \param  agOtherInfo        Residual count
 5178 *  \return: None
 5179 *
 5180 *
 5181 *****************************************************************************/
 5182 osGLOBAL void
 5183 itdssOpenCnxErrorOpenPreemptedHandler(
 5184                                   agsaRoot_t              *agRoot,
 5185                                   agsaIORequest_t         *agIORequest,
 5186                                   bit32                   agIOStatus,
 5187                                   bit32                   agIOInfoLen,
 5188                                   void                    *agParam,
 5189                                   bit32                   agOtherInfo
 5190                                  )
 5191 {
 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));
 5198 
 5199   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 5200 
 5201   ostiInitiatorIOCompleted (
 5202                             tiRoot,
 5203                             tdIORequestBody->tiIORequest,
 5204                             tiIOFailed,
 5205                             tiDetailOtherError,
 5206                             agNULL,
 5207                             intContext
 5208                             );
 5209   return;
 5210 }
 5211 
 5212 /* default */
 5213 /*****************************************************************************
 5214 *! \brief itdssIODefaultHandler
 5215 *
 5216 *  Purpose:  This function processes I/Os completed and returned by SAS/SATA lower
 5217 *            layer with agIOStatus = unspecified
 5218 *
 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
 5224 *                             of abort request
 5225 *  \param  agOtherInfo        Residual count
 5226 *  \return: None
 5227 *
 5228 *
 5229 *****************************************************************************/
 5230 osGLOBAL void
 5231 itdssIODefaultHandler (
 5232                        agsaRoot_t              *agRoot,
 5233                        agsaIORequest_t         *agIORequest,
 5234                        bit32                   agIOStatus,
 5235                        bit32                   agIOInfoLen,
 5236                        void                    *agParam,
 5237                        bit32                   agOtherInfo
 5238                        )
 5239 {
 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));
 5246 
 5247   tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 5248 
 5249   ostiInitiatorIOCompleted (
 5250                             tiRoot,
 5251                             tdIORequestBody->tiIORequest,
 5252                             tiIOFailed,
 5253                             tiDetailOtherError,
 5254                             agNULL,
 5255                             intContext
 5256                             );
 5257   return;
 5258 }
 5259 
 5260 /*****************************************************************************
 5261 *! \brief itdssIOForDebugging1Completed
 5262 *
 5263 *  Purpose:  This function is only for debugging. This function should NOT be
 5264 *            called.
 5265 *
 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
 5271 *                             of abort request
 5272 *  \param  agOtherInfo        Residual count
 5273 *  \return: None
 5274 *
 5275 *
 5276 *****************************************************************************/
 5277 osGLOBAL void
 5278 itdssIOForDebugging1Completed(
 5279                  agsaRoot_t             *agRoot,
 5280                  agsaIORequest_t        *agIORequest,
 5281                  bit32                  agIOStatus,
 5282                  bit32                  agIOInfoLen,
 5283                  void                   *agParam,
 5284                  bit32                  agOtherInfo
 5285                  )
 5286 {
 5287   TI_DBG1(("itdssIOForDebugging1Completed: start, error!!! can't be called. \n"));
 5288 }
 5289 
 5290 /*****************************************************************************
 5291 *! \brief itdssIOForDebugging2Completed
 5292 *
 5293 *  Purpose:  This function is only for debugging. This function should NOT be
 5294 *            called.
 5295 *
 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
 5301 *                             of abort request
 5302 *  \param  agOtherInfo        Residual count
 5303 *  \return: None
 5304 *
 5305 *
 5306 *****************************************************************************/
 5307 osGLOBAL void
 5308 itdssIOForDebugging2Completed(
 5309                  agsaRoot_t             *agRoot,
 5310                  agsaIORequest_t        *agIORequest,
 5311                  bit32                  agIOStatus,
 5312                  bit32                  agIOInfoLen,
 5313                  void                   *agParam,
 5314                  bit32                  agOtherInfo
 5315                  )
 5316 {
 5317   TI_DBG1(("itdssIOForDebugging2Completed: start, error!!! can't be called.  \n"));
 5318 }
 5319 
 5320 /*****************************************************************************
 5321 *! \brief itdssIOForDebugging3Completed
 5322 *
 5323 *  Purpose:  This function is only for debugging. This function should NOT be
 5324 *            called.
 5325 *
 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
 5331 *                             of abort request
 5332 *  \param  agOtherInfo        Residual count
 5333 *  \return: None
 5334 *
 5335 *
 5336 *****************************************************************************/
 5337 osGLOBAL void
 5338 itdssIOForDebugging3Completed(
 5339                  agsaRoot_t             *agRoot,
 5340                  agsaIORequest_t        *agIORequest,
 5341                  bit32                  agIOStatus,
 5342                  bit32                  agIOInfoLen,
 5343                  void                   *agParam,
 5344                  bit32                  agOtherInfo
 5345                  )
 5346 {
 5347   TI_DBG1(("itdssIOForDebugging3Completed: start, error!!! can't be called.  \n"));
 5348 }
 5349 
 5350 

Cache object: 147d2ce92695d6610969d8a1d683d7cd


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.