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/sallsdk/spc/saint.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 *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
    3 *
    4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided 
    5 *that the following conditions are met: 
    6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
    7 *following disclaimer. 
    8 *2. Redistributions in binary form must reproduce the above copyright notice, 
    9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
   10 *with the distribution. 
   11 *
   12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 
   13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
   14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
   16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
   17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
   18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
   19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
   20 
   21 ********************************************************************************/
   22 /*******************************************************************************/
   23 /*! \file saint.c
   24  *  \brief The file implements the functions to handle/enable/disable interrupt
   25  *
   26  */
   27 /*******************************************************************************/
   28 #include <sys/cdefs.h>
   29 __FBSDID("$FreeBSD$");
   30 #include <dev/pms/config.h>
   31 
   32 #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
   33 #define SA_CLEAR_ODCR_IN_INTERRUPT
   34 
   35 //#define SA_TEST_FW_SPURIOUS_INT
   36 
   37 #ifdef SA_TEST_FW_SPURIOUS_INT
   38 bit32 gOurIntCount = 0;
   39 bit32 gSpuriousIntCount = 0;
   40 bit32 gSpuriousInt[64]=
   41 {
   42 0,0,0,0,0,0,0,0,
   43 0,0,0,0,0,0,0,0,
   44 0,0,0,0,0,0,0,0,
   45 0,0,0,0,0,0,0,0,
   46 0,0,0,0,0,0,0,0,
   47 0,0,0,0,0,0,0,0,
   48 0,0,0,0,0,0,0,0,
   49 0,0,0,0,0,0,0,0
   50 };
   51 bit32 gSpuriousInt1[64]=
   52 {
   53 0,0,0,0,0,0,0,0,
   54 0,0,0,0,0,0,0,0,
   55 0,0,0,0,0,0,0,0,
   56 0,0,0,0,0,0,0,0,
   57 0,0,0,0,0,0,0,0,
   58 0,0,0,0,0,0,0,0,
   59 0,0,0,0,0,0,0,0,
   60 0,0,0,0,0,0,0,0
   61 };
   62 #endif /* SA_TEST_FW_SPURIOUS_INT */
   63 
   64 #ifdef SA_ENABLE_TRACE_FUNCTIONS
   65 #ifdef siTraceFileID
   66 #undef siTraceFileID
   67 #endif /* siTraceFileID */
   68 #define siTraceFileID 'G'
   69 #endif /* SA_ENABLE_TRACE_FUNCTIONS */
   70 
   71 LOCAL FORCEINLINE bit32 siProcessOBMsg(
   72                            agsaRoot_t  *agRoot,
   73                            bit32        count,
   74                            bit32        queueNum
   75                            );
   76 
   77 LOCAL bit32 siFatalInterruptHandler(
   78   agsaRoot_t  *agRoot,
   79   bit32       interruptVectorIndex
   80   )
   81 {
   82   agsaLLRoot_t         *saRoot = agNULL;
   83   agsaFatalErrorInfo_t fatal_error;
   84   bit32                value;
   85   bit32                ret = AGSA_RC_FAILURE;
   86   bit32                Sendfatal = agTRUE;
   87   
   88   SA_ASSERT((agNULL != agRoot), "");
   89   if (agRoot == agNULL)
   90   {
   91     SA_DBG1(("siFatalInterruptHandler: agRoot == agNULL\n"));
   92     return AGSA_RC_FAILURE;
   93   }
   94   saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
   95   SA_ASSERT((agNULL != saRoot), "");
   96   if (saRoot == agNULL)
   97   {
   98     SA_DBG1(("siFatalInterruptHandler: saRoot == agNULL\n"));
   99     return AGSA_RC_FAILURE;
  100   }
  101 
  102   value  = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1);
  103   if (saRoot->ResetFailed)
  104   {
  105     SA_DBG1(("siFatalInterruptHandler: ResetFailed\n"));
  106     ossaDisableInterrupts(agRoot, interruptVectorIndex);
  107     return AGSA_RC_FAILURE;
  108   }
  109 
  110   if(SCRATCH_PAD1_V_ERROR_STATE( value ) )
  111   {
  112     si_memset(&fatal_error, 0, sizeof(agsaFatalErrorInfo_t));
  113     /* read detail fatal errors */
  114     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0, MSGU_SCRATCH_PAD_0);
  115     fatal_error.errorInfo0 = value;
  116     SA_DBG1(("siFatalInterruptHandler: ScratchPad0 AAP error 0x%x code 0x%x\n",SCRATCH_PAD1_V_ERROR_STATE( value ), value));
  117 
  118     value  = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1);
  119     fatal_error.errorInfo1 = value;
  120     /* AAP error state */
  121     SA_DBG1(("siFatalInterruptHandler: AAP error state and error code 0x%x\n", value));
  122     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2, MSGU_SCRATCH_PAD_2);
  123     fatal_error.errorInfo2 = value;
  124     SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2 0x%08x\n", fatal_error.errorInfo2 ));
  125 
  126 #if defined(SALLSDK_DEBUG)
  127     if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_ILA_ERR)
  128     {
  129       SA_DBG1(("siFatalInterruptHandler:SCRATCH_PAD1_V_ERROR_STATE SCRATCH_PAD2_FW_ILA_ERR 0x%08x\n", SCRATCH_PAD2_FW_ILA_ERR));
  130     }
  131     if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_FLM_ERR)
  132     {
  133       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_FLM_ERR 0x%08x\n", SCRATCH_PAD2_FW_FLM_ERR));
  134     }
  135     if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_FW_ASRT_ERR)
  136     {
  137       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_FW_ASRT_ERR 0x%08x\n", SCRATCH_PAD2_FW_FW_ASRT_ERR));
  138     }
  139     if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_WDG_ERR)
  140     {
  141       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_HW_WDG_ERR 0x%08x\n", SCRATCH_PAD2_FW_HW_WDG_ERR));
  142     }
  143     if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_GEN_EXCEPTION_ERR)
  144     {
  145       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_GEN_EXCEPTION_ERR 0x%08x\n", SCRATCH_PAD2_FW_GEN_EXCEPTION_ERR));
  146     }
  147     if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_UNDTMN_ERR)
  148     {
  149       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_UNDTMN_ERR 0x%08x\n",SCRATCH_PAD2_FW_UNDTMN_ERR ));
  150     }
  151     if(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_FATAL_ERR)
  152     {
  153       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_HW_FATAL_ERR 0x%08x\n", SCRATCH_PAD2_FW_HW_FATAL_ERR));
  154     }
  155     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_PCS_ERR )
  156     {
  157       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_PCS_ERR 0x%08x\n", value));
  158     }
  159     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_GSM_ERR )
  160     {
  161       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_GSM_ERR 0x%08x\n", value));
  162     }
  163     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP0_ERR )
  164     {
  165       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP0_ERR 0x%08x\n", value));
  166     }
  167     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) ==SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP1_ERR  )
  168     {
  169       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP1_ERR 0x%08x\n", value));
  170     }
  171     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP2_ERR )
  172     {
  173       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP2_ERR 0x%08x\n", value));
  174     }
  175     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_ERAAE_ERR )
  176     {
  177       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_ERAAE_ERR 0x%08x\n", value));
  178     }
  179     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_SDS_ERR )
  180     {
  181       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_SDS_ERR 0x%08x\n", value));
  182     }
  183     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_CORE_ERR )
  184     {
  185       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_CORE_ERR 0x%08x\n", value));
  186     }
  187     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_AL_ERR )
  188     {
  189       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_AL_ERR 0x%08x\n", value));
  190     }
  191     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_MSGU_ERR )
  192     {
  193       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_MSGU_ERR 0x%08x\n", value));
  194     }
  195     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_SPBC_ERR )
  196     {
  197       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_SPBC_ERR 0x%08x\n", value));
  198     }
  199     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_BDMA_ERR )
  200     {
  201       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_BDMA_ERR 0x%08x\n", value));
  202     }
  203     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) ==  SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSL2B_ERR)
  204     {
  205       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSL2B_ERR 0x%08x\n", value));
  206     }
  207     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSDC_ERR )
  208     {
  209       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSDC_ERR 0x%08x\n", value));
  210     }
  211     if((fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_MASK) == SCRATCH_PAD2_HW_ERROR_INT_INDX_UNDETERMINED_ERROR_OCCURRED )
  212     {
  213       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_HW_ERROR_INT_INDX_UNDETERMINED_ERROR_OCCURRED 0x%08x\n", value));
  214     }
  215 #endif /* SALLSDK_DEBUG */
  216 
  217     if( fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_NON_FATAL_ERR   &&
  218       !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_ILA_ERR)           &&
  219       !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_FLM_ERR)           &&
  220       !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_FW_ASRT_ERR)       &&
  221       !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_WDG_ERR)        &&
  222       !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_GEN_EXCEPTION_ERR) &&
  223       !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_UNDTMN_ERR)        &&
  224       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_PCS_ERR)       &&
  225       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_GSM_ERR)       &&
  226       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP0_ERR)     &&
  227       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_OSSP2_ERR)     &&
  228       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_ERAAE_ERR)     &&
  229       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_SDS_ERR)       &&
  230       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_CORE_ERR) &&
  231       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_PCIE_AL_ERR)   &&
  232       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_MSGU_ERR)      &&
  233       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_SPBC_ERR)      &&
  234       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_BDMA_ERR)      &&
  235       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSL2B_ERR)   &&
  236       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_MCPSDC_ERR)    &&
  237       !(fatal_error.errorInfo2 & SCRATCH_PAD2_HW_ERROR_INT_INDX_UNDETERMINED_ERROR_OCCURRED) &&
  238       !(fatal_error.errorInfo2 & SCRATCH_PAD2_FW_HW_FATAL_ERR) )
  239     {
  240       SA_DBG1(("siFatalInterruptHandler: SCRATCH_PAD2_FW_HW_NON_FATAL_ERR 0x%08x\n", value));
  241       Sendfatal = agFALSE;
  242     }
  243 
  244     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3, MSGU_SCRATCH_PAD_3);
  245     SA_DBG1(("siFatalInterruptHandler: ScratchPad3 IOP error code 0x%08x\n", value));
  246     fatal_error.errorInfo3 = value;
  247 
  248     if (agNULL != saRoot)
  249     {
  250       fatal_error.regDumpBusBaseNum0 = saRoot->mainConfigTable.regDumpPCIBAR;
  251       fatal_error.regDumpOffset0 = saRoot->mainConfigTable.FatalErrorDumpOffset0;
  252       fatal_error.regDumpLen0 = saRoot->mainConfigTable.FatalErrorDumpLength0;
  253       fatal_error.regDumpBusBaseNum1 = saRoot->mainConfigTable.regDumpPCIBAR;
  254       fatal_error.regDumpOffset1 = saRoot->mainConfigTable.FatalErrorDumpOffset1;
  255       fatal_error.regDumpLen1 = saRoot->mainConfigTable.FatalErrorDumpLength1;
  256     }
  257     else
  258     {
  259       fatal_error.regDumpBusBaseNum0 = 0;
  260       fatal_error.regDumpOffset0 = 0;
  261       fatal_error.regDumpLen0 = 0;
  262       fatal_error.regDumpBusBaseNum1 = 0;
  263       fatal_error.regDumpOffset1 = 0;
  264       fatal_error.regDumpLen1 = 0;
  265     }
  266     /* Call Back with error */
  267     SA_DBG1(("siFatalInterruptHandler: Sendfatal %x HostR0 0x%x\n",Sendfatal ,ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_Rsvd_0_Register ) ));
  268     SA_DBG1(("siFatalInterruptHandler:  ScratchPad2 0x%x ScratchPad3 0x%x\n",
  269                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Host_Scratchpad_2_Register),
  270                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Host_Scratchpad_3_Register) ));
  271 
  272     ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_MALFUNCTION, Sendfatal, (void *)&fatal_error, agNULL);
  273     ret = AGSA_RC_SUCCESS;
  274   }
  275   else
  276   {
  277     bit32 host_reg0;
  278     host_reg0 = ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_Rsvd_0_Register );
  279     if( host_reg0 == 0x2)
  280     {
  281       Sendfatal = agFALSE;
  282 
  283       SA_DBG1(("siFatalInterruptHandler: Non fatal ScratchPad1 0x%x HostR0 0x%x\n", value,host_reg0));
  284       SA_DBG1(("siFatalInterruptHandler:  ScratchPad0 0x%x ScratchPad1 0x%x\n",
  285                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register),
  286                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_1_Register) ));
  287       SA_DBG1(("siFatalInterruptHandler:  ScratchPad2 0x%x ScratchPad3 0x%x\n",
  288                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_2_Register),
  289                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_3_Register) ));
  290 
  291       ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_MALFUNCTION, Sendfatal, (void *)&fatal_error, agNULL);
  292       ret = AGSA_RC_SUCCESS;
  293     }
  294     else if( host_reg0 == HDA_AES_DIF_FUNC)
  295     {
  296       SA_DBG1(("siFatalInterruptHandler: HDA_AES_DIF_FUNC 0x%x\n",
  297                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_Rsvd_0_Register)));
  298       Sendfatal = agFALSE;
  299       ret = AGSA_RC_SUCCESS;
  300     }
  301     else
  302     {
  303       SA_DBG1(("siFatalInterruptHandler: No error detected ScratchPad1 0x%x HostR0 0x%x\n", value,host_reg0));
  304       SA_DBG1(("siFatalInterruptHandler:  ScratchPad0 0x%x ScratchPad1 0x%x\n",
  305                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register),
  306                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_1_Register) ));
  307       SA_DBG1(("siFatalInterruptHandler:  ScratchPad2 0x%x ScratchPad3 0x%x\n",
  308                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_2_Register),
  309                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_3_Register) ));
  310 
  311       SA_DBG1(("siFatalInterruptHandler: Doorbell_Set  %08X U %08X\n",
  312                                ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register),
  313                                ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU)));
  314       SA_DBG1(("siFatalInterruptHandler: Doorbell_Mask %08X U %08X\n",
  315                                ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ),
  316                                ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU )));
  317 
  318       ret = AGSA_RC_FAILURE;
  319     }
  320   }
  321   return ret;
  322 
  323 }
  324 
  325 GLOBAL bit32 saFatalInterruptHandler(
  326   agsaRoot_t  *agRoot,
  327   bit32       interruptVectorIndex
  328   )
  329 {
  330   agsaLLRoot_t         *saRoot = agNULL;
  331   bit32                ret = AGSA_RC_FAILURE;
  332 
  333   /* sanity check */
  334   SA_ASSERT((agNULL != agRoot), "");
  335   saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
  336   SA_ASSERT((agNULL != saRoot), "");
  337 
  338   if (saRoot->ResetFailed)
  339   {
  340     SA_DBG1(("saFatalInterruptHandler: ResetFailed\n"));
  341     ossaDisableInterrupts(agRoot, interruptVectorIndex);
  342     return AGSA_RC_FAILURE;
  343   }
  344   if (saRoot->swConfig.fatalErrorInterruptEnable != 1)
  345   {
  346     SA_DBG1(("saFatalInterruptHandler: fatalErrorInterrtupt is NOT enabled\n"));
  347     ossaDisableInterrupts(agRoot, interruptVectorIndex);
  348     return AGSA_RC_FAILURE;
  349   }
  350 
  351   if (saRoot->swConfig.fatalErrorInterruptVector != interruptVectorIndex)
  352   {
  353     SA_DBG1(("saFatalInterruptHandler: interruptVectorIndex does not match 0x%x 0x%x\n",
  354              saRoot->swConfig.fatalErrorInterruptVector, interruptVectorIndex));
  355     SA_DBG1(("saFatalInterruptHandler:  ScratchPad0 0x%x ScratchPad1 0x%x\n",
  356                               ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register),
  357                               ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_1_Register) ));
  358     SA_DBG1(("saFatalInterruptHandler:  ScratchPad2 0x%x ScratchPad3 0x%x\n",
  359                               ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_2_Register),
  360                               ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_3_Register) ));
  361     ossaDisableInterrupts(agRoot, interruptVectorIndex);
  362     return AGSA_RC_FAILURE;
  363   }
  364 
  365   ret = siFatalInterruptHandler(agRoot,interruptVectorIndex);
  366 
  367 
  368   ossaDisableInterrupts(agRoot, interruptVectorIndex);
  369 
  370   return ret;
  371 }
  372 /******************************************************************************/
  373 /*! \brief Function to process the interrupts
  374  *
  375  *  The saInterruptHandler() function is called after an interrupts has
  376  *  been received
  377  *  This function disables interrupts
  378  *
  379  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  380  *                instance of SAS/SATA hardware
  381  *  \param interruptVectorIndex message that caused MSI message
  382  *
  383  *  \return TRUE if we caused interrupt
  384  *
  385  */
  386 /*******************************************************************************/
  387 FORCEINLINE bit32
  388 saInterruptHandler(
  389   agsaRoot_t  *agRoot,
  390   bit32       interruptVectorIndex
  391   )
  392 {
  393   agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
  394   bit32 ToBeProcessedCount = 0;
  395   bit32 our_int = 0;
  396 #ifdef SA_TEST_FW_SPURIOUS_INT
  397   bit8         i;
  398 #endif/* SA_TEST_FW_SPURIOUS_INT */
  399 
  400   if( agNULL == saRoot )
  401   {
  402     /* Can be called before initialize is completed in a shared
  403        interrupt environment like windows 2003
  404     */
  405     return(ToBeProcessedCount);
  406   }
  407 
  408   if( (our_int = saRoot->OurInterrupt(agRoot,interruptVectorIndex)) == FALSE )
  409   {
  410 #ifdef SA_TEST_FW_SPURIOUS_INT
  411     gSpuriousIntCount++;
  412     smTrace(hpDBG_REGISTERS,"S1",gSpuriousIntCount);
  413     /* TP:S1 gSpuriousIntCount */
  414 #endif /* SA_TEST_FW_SPURIOUS_INT */
  415     return(ToBeProcessedCount);
  416   }
  417 
  418   smTraceFuncEnter(hpDBG_TICK_INT, "5q");
  419 
  420   smTrace(hpDBG_TICK_INT,"VI",interruptVectorIndex);
  421   /* TP:Vi interrupt VectorIndex */
  422 
  423   if ( agFALSE == saRoot->sysIntsActive )
  424   {
  425     // SA_ASSERT(0, "saInterruptHandler sysIntsActive not set");
  426 
  427 #ifdef SA_PRINTOUT_IN_WINDBG
  428 #ifndef DBG
  429         DbgPrint("saInterruptHandler: sysIntsActive not set Doorbell_Mask_Set  %08X U %08X\n",
  430                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register),
  431                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU) );
  432 #endif /* DBG  */
  433 #endif /* SA_PRINTOUT_IN_WINDBG  */
  434 
  435 
  436     SA_DBG1(("saInterruptHandler: Doorbell_Mask_Set  %08X U %08X\n",
  437                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register),
  438                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU)));
  439     ossaDisableInterrupts(agRoot, interruptVectorIndex);
  440     return(ToBeProcessedCount);
  441 
  442   }
  443 
  444   /* Allow replacement of disable interrupt */
  445   ossaDisableInterrupts(agRoot, interruptVectorIndex);
  446 
  447 
  448 #ifdef SA_TEST_FW_SPURIOUS_INT
  449 
  450   /* count for my interrupt */
  451   gOurIntCount++;
  452 
  453   smTrace(hpDBG_REGISTERS,"S4",gOurIntCount);
  454   /* TP:S4 gOurIntCount */
  455 #endif /* SA_TEST_FW_SPURIOUS_INT */
  456 
  457   smTraceFuncExit(hpDBG_TICK_INT, 'a', "5q");
  458   return(TRUE);
  459 
  460 }
  461 
  462 /******************************************************************************/
  463 /*! \brief Function to disable MSIX interrupts
  464  *
  465  *  siDisableMSIXInterrupts disables interrupts
  466  *  called thru macro ossaDisableInterrupts
  467  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  468  *                instance of SAS/SATA hardware
  469  *  \param interruptVectorIndex - vector index for message
  470  *
  471  */
  472 /*******************************************************************************/
  473 GLOBAL void siDisableMSIXInterrupts(
  474   agsaRoot_t *agRoot,
  475   bit32 interruptVectorIndex
  476   )
  477 {
  478   bit32 msi_index;
  479 #ifndef SA_CLEAR_ODCR_IN_INTERRUPT
  480   bit32 value;
  481 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */
  482   msi_index = interruptVectorIndex * MSIX_TABLE_ELEMENT_SIZE;
  483   msi_index += MSIX_TABLE_BASE;
  484   ossaHwRegWrite(agRoot,msi_index , MSIX_INTERRUPT_DISABLE);
  485   ossaHwRegRead(agRoot, msi_index); /* Dummy read */
  486 #ifndef SA_CLEAR_ODCR_IN_INTERRUPT
  487   value  = (1 << interruptVectorIndex);
  488   ossaHwRegWrite(agRoot, MSGU_ODCR, value);
  489 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */
  490 }
  491 
  492 /******************************************************************************/
  493 /*! \brief Function to disable MSIX V interrupts
  494  *
  495  *  siDisableMSIXInterrupts disables interrupts
  496  *  called thru macro ossaDisableInterrupts
  497  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  498  *                instance of SAS/SATA hardware
  499  *  \param interruptVectorIndex - vector index for message
  500  *
  501  */
  502 /*******************************************************************************/
  503 void siDisableMSIX_V_Interrupts(
  504   agsaRoot_t *agRoot,
  505   bit32 interruptVectorIndex
  506   )
  507 {
  508   bit64 mask;
  509   agsabit32bit64 u64;
  510   mask =( (bit64)1 << interruptVectorIndex);
  511   u64.B64 = mask;
  512   if(smIS64bInt(agRoot))
  513   {
  514     SA_DBG4(("siDisableMSIX_V_Interrupts: VI %d U 0x%08X L 0x%08X\n",interruptVectorIndex,u64.S32[1],u64.S32[0]));
  515     ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_RegisterU,u64.S32[1]);
  516   }
  517   ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_Register, u64.S32[0]);
  518 
  519 }
  520 /******************************************************************************/
  521 /*! \brief Function to disable MSI interrupts
  522  *
  523  *  siDisableMSIInterrupts disables interrupts
  524  *  called thru macro ossaDisableInterrupts
  525  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  526  *                instance of SAS/SATA hardware
  527  *  \param interruptVectorIndex - vector index for message
  528  *
  529  */
  530 /*******************************************************************************/
  531 GLOBAL void siDisableMSIInterrupts(
  532   agsaRoot_t *agRoot,
  533   bit32 interruptVectorIndex
  534   )
  535 {
  536   bit32 ODMRValue;
  537   bit32 mask;
  538   mask = 1 << interruptVectorIndex;
  539 
  540   /*Must be protected for interuption */
  541   ODMRValue = ossaHwRegRead(agRoot, MSGU_ODMR);
  542   ODMRValue |= mask;
  543 
  544   ossaHwRegWrite(agRoot, MSGU_ODMR, ODMRValue);
  545   ossaHwRegWrite(agRoot, MSGU_ODCR, mask);
  546 }
  547 
  548 /******************************************************************************/
  549 /*! \brief Function to disable MSI V interrupts
  550  *
  551  *  siDisableMSIInterrupts disables interrupts
  552  *  called thru macro ossaDisableInterrupts
  553  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  554  *                instance of SAS/SATA hardware
  555  *  \param interruptVectorIndex - vector index for message
  556  *
  557  */
  558 /*******************************************************************************/
  559 GLOBAL void siDisableMSI_V_Interrupts(
  560   agsaRoot_t *agRoot,
  561   bit32 interruptVectorIndex
  562   )
  563 {
  564   SA_ASSERT(0, "Should not be called");
  565   SA_DBG4(("siDisableMSI_V_Interrupts:\n"));
  566 }
  567 
  568 /******************************************************************************/
  569 /*! \brief Function to process Legacy interrupts
  570  *
  571  *  siDisableLegacyInterrupts disables interrupts
  572  *  called thru macro ossaDisableInterrupts
  573  *
  574  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  575  *                instance of SAS/SATA hardware
  576  *  \param interruptVectorIndex not used in legacy case
  577  *
  578  */
  579 /*******************************************************************************/
  580 GLOBAL void siDisableLegacyInterrupts(
  581   agsaRoot_t *agRoot,
  582   bit32 interruptVectorIndex
  583   )
  584 {
  585   ossaHwRegWrite(agRoot, MSGU_ODMR, ODMR_MASK_ALL);
  586 #ifndef SA_CLEAR_ODCR_IN_INTERRUPT
  587   ossaHwRegWrite(agRoot, MSGU_ODCR, ODCR_CLEAR_ALL);
  588 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */
  589 }
  590 
  591 /******************************************************************************/
  592 /*! \brief Function to process Legacy V interrupts
  593  *
  594  *  siDisableLegacyInterrupts disables interrupts
  595  *  called thru macro ossaDisableInterrupts
  596  *
  597  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  598  *                instance of SAS/SATA hardware
  599  *  \param interruptVectorIndex not used in legacy case
  600  *
  601  */
  602 /*******************************************************************************/
  603 GLOBAL void siDisableLegacy_V_Interrupts(
  604   agsaRoot_t *agRoot,
  605   bit32 interruptVectorIndex
  606   )
  607 {
  608 
  609   bit64 mask;
  610   agsabit32bit64 u64;
  611   mask =( (bit64)1 << interruptVectorIndex);
  612   u64.B64 = mask;
  613 
  614   SA_DBG4(("siDisableLegacy_V_Interrupts:IN MSGU_READ_ODR  %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODR,  V_Outbound_Doorbell_Set_Register)));
  615   SA_DBG4(("siDisableLegacy_V_Interrupts:IN MSGU_READ_ODMR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODMR, V_Outbound_Doorbell_Mask_Set_Register )));
  616   if(smIS64bInt(agRoot))
  617   {
  618     SA_DBG4(("siDisableLegacy_V_Interrupts: VI %d U 0x%08X L 0x%08X\n",interruptVectorIndex,u64.S32[1],u64.S32[0]));
  619     ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_Register,u64.S32[1] );
  620   }
  621   ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_RegisterU,u64.S32[0]);
  622 
  623 }
  624 /******************************************************************************/
  625 /*! \brief Function to process MSIX interrupts
  626  *
  627  *  siOurMSIXInterrupt checks if we generated interrupt
  628  *  called thru function pointer saRoot->OurInterrupt
  629  *
  630  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  631  *                instance of SAS/SATA hardware
  632  *  \return always true
  633  */
  634 /*******************************************************************************/
  635 GLOBAL bit32 siOurMSIXInterrupt(
  636   agsaRoot_t *agRoot,
  637   bit32 interruptVectorIndex
  638   )
  639 {
  640   return(TRUE);
  641 }
  642 
  643 /******************************************************************************/
  644 /*! \brief Function to process MSIX V interrupts
  645  *
  646  *  siOurMSIXInterrupt checks if we generated interrupt
  647  *  called thru function pointer saRoot->OurInterrupt
  648  *
  649  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  650  *                instance of SAS/SATA hardware
  651  *  \return always true
  652  */
  653 /*******************************************************************************/
  654 GLOBAL bit32 siOurMSIX_V_Interrupt(
  655   agsaRoot_t *agRoot,
  656   bit32 interruptVectorIndex
  657   )
  658 {
  659   return(TRUE);
  660 }
  661 /******************************************************************************/
  662 /*! \brief Function to process MSI interrupts
  663  *
  664  *  siOurMSIInterrupt checks if we generated interrupt
  665  *  called thru function pointer saRoot->OurInterrupt
  666  *
  667  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  668  *                instance of SAS/SATA hardware
  669  *  \return always true
  670  */
  671 /*******************************************************************************/
  672 bit32 siOurMSIInterrupt(
  673   agsaRoot_t *agRoot,
  674   bit32 interruptVectorIndex
  675   )
  676 {
  677   return(TRUE);
  678 }
  679 
  680 /******************************************************************************/
  681 /*! \brief Function to process MSI V interrupts
  682  *
  683  *  siOurMSIInterrupt checks if we generated interrupt
  684  *  called thru function pointer saRoot->OurInterrupt
  685  *
  686  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  687  *                instance of SAS/SATA hardware
  688  *  \return always true
  689  */
  690 /*******************************************************************************/
  691 bit32 siOurMSI_V_Interrupt(
  692   agsaRoot_t *agRoot,
  693   bit32 interruptVectorIndex
  694   )
  695 {
  696   SA_DBG4((":siOurMSI_V_Interrupt\n"));
  697   return(TRUE);
  698 }
  699 
  700 /******************************************************************************/
  701 /*! \brief Function to process Legacy interrupts
  702  *
  703  *  siOurLegacyInterrupt checks if we generated interrupt
  704  *  called thru function pointer saRoot->OurInterrupt
  705  *
  706  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  707  *                instance of SAS/SATA hardware
  708  *  \return true if we claim interrupt
  709  */
  710 /*******************************************************************************/
  711 bit32 siOurLegacyInterrupt(
  712   agsaRoot_t *agRoot,
  713   bit32 interruptVectorIndex
  714   )
  715 {
  716   bit32 Int_masked;
  717   bit32 Int_active;
  718   Int_masked = MSGU_READ_ODMR;
  719   Int_active = MSGU_READ_ODR;
  720 
  721   if(Int_masked & 1 )
  722   {
  723     return(FALSE);
  724   }
  725   if(Int_active & 1 )
  726   {
  727 
  728     return(TRUE);
  729   }
  730   return(FALSE);
  731 }
  732 
  733 /******************************************************************************/
  734 /*! \brief Function to process Legacy V interrupts
  735  *
  736  *  siOurLegacyInterrupt checks if we generated interrupt
  737  *  called thru function pointer saRoot->OurInterrupt
  738  *
  739  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  740  *                instance of SAS/SATA hardware
  741  *  \return true if we claim interrupt
  742  */
  743 /*******************************************************************************/
  744 bit32 siOurLegacy_V_Interrupt(
  745   agsaRoot_t *agRoot,
  746   bit32 interruptVectorIndex
  747   )
  748 {
  749   bit32 Int_active;
  750   Int_active = siHalRegReadExt(agRoot, GEN_MSGU_ODR, V_Outbound_Doorbell_Set_Register  );
  751 
  752   return(Int_active ? TRUE : FALSE);
  753 }
  754 
  755 
  756 /******************************************************************************/
  757 /*! \brief Function to process the cause of interrupt
  758  *
  759  *  The saDelayedInterruptHandler() function is called after an interrupt messages has
  760  *  been received it may be called by a deferred procedure call
  761  *
  762  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  763  *                instance of SAS/SATA hardware
  764  *  \param interruptVectorIndex  - vector index for message
  765  *  \param count Number of completion queue entries to consume
  766  *
  767  *  \return number of messages processed
  768  *
  769  */
  770 /*******************************************************************************/
  771 FORCEINLINE bit32
  772 saDelayedInterruptHandler(
  773   agsaRoot_t  *agRoot,
  774   bit32       interruptVectorIndex,
  775   bit32       count
  776   )
  777 {
  778   agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
  779   bit32         processedMsgCount = 0;
  780   bit32         pad1 = 0;
  781   bit32         host_reg0 = 0;
  782 #if defined(SALLSDK_DEBUG)
  783   bit32 host_reg1 = 0;
  784 #endif
  785   bit8         i = 0;
  786 
  787   OSSA_OUT_ENTER(agRoot);
  788 
  789   smTraceFuncEnter(hpDBG_VERY_LOUD,"5p");
  790 
  791   smTrace(hpDBG_VERY_LOUD,"Vd",interruptVectorIndex);
  792   /* TP:Vd delayed VectorIndex */
  793   smTrace(hpDBG_VERY_LOUD,"Vc",count);
  794   /* TP:Vc IOMB count*/
  795 
  796   if( saRoot->swConfig.fatalErrorInterruptEnable &&
  797       saRoot->swConfig.fatalErrorInterruptVector == interruptVectorIndex )
  798   {
  799     pad1 = siHalRegReadExt(agRoot,GEN_MSGU_SCRATCH_PAD_1,  MSGU_SCRATCH_PAD_1);
  800     host_reg0 = ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_Rsvd_0_Register );
  801 
  802 
  803     if(saRoot->swConfig.hostDirectAccessMode & 2 )
  804     {
  805       if( host_reg0 == HDA_AES_DIF_FUNC)
  806       { 
  807         host_reg0 = 0;
  808       }
  809     }
  810 
  811 
  812 #if defined(SALLSDK_DEBUG)
  813     host_reg1 = ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_Rsvd_1_Register );
  814 #endif
  815     if( (SCRATCH_PAD1_V_ERROR_STATE( pad1 ) != 0 ) && host_reg0 )
  816     {
  817 
  818       SA_DBG1(("saDelayedInterruptHandler: vi %d  Error %08X\n",interruptVectorIndex,  SCRATCH_PAD1_V_ERROR_STATE( pad1 )));
  819       SA_DBG1(("saDelayedInterruptHandler: Sp 1 %08X Hr0 %08X Hr1 %08X\n",pad1,host_reg0,host_reg1 ));
  820       SA_DBG1(("saDelayedInterruptHandler: SCRATCH_PAD1_V_ERROR_STATE      %08X\n", SCRATCH_PAD1_V_ERROR_STATE( pad1 )));
  821       SA_DBG1(("saDelayedInterruptHandler: SCRATCH_PAD1_V_ILA_ERROR_STATE  %08X\n", SCRATCH_PAD1_V_ILA_ERROR_STATE( pad1 )));
  822       SA_DBG1(("saDelayedInterruptHandler: SCRATCH_PAD1_V_RAAE_ERROR_STATE %08X\n", SCRATCH_PAD1_V_RAAE_ERROR_STATE( pad1 )));
  823       SA_DBG1(("saDelayedInterruptHandler: SCRATCH_PAD1_V_IOP0_ERROR_STATE %08X\n", SCRATCH_PAD1_V_IOP0_ERROR_STATE( pad1 )));
  824       SA_DBG1(("saDelayedInterruptHandler: SCRATCH_PAD1_V_IOP1_ERROR_STATE %08X\n", SCRATCH_PAD1_V_IOP1_ERROR_STATE( pad1 )));
  825 
  826       siFatalInterruptHandler( agRoot, interruptVectorIndex  );
  827       ossaDisableInterrupts(agRoot, interruptVectorIndex);
  828 
  829     }
  830     else
  831     {
  832       SA_DBG2(("saDelayedInterruptHandler: Fatal Check VI %d SCRATCH_PAD1 %08X host_reg0 %08X host_reg1 %08X\n",interruptVectorIndex, pad1,host_reg0,host_reg1));
  833       SA_DBG2(("saDelayedInterruptHandler:  ScratchPad0 0x%x ScratchPad1 0x%x\n",
  834                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register),
  835                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_1_Register) ));
  836       SA_DBG2(("saDelayedInterruptHandler:  ScratchPad2 0x%x ScratchPad3 0x%x\n",
  837                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_2_Register),
  838                                 ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_3_Register) ));
  839 
  840       SA_DBG2(("saDelayedInterruptHandler: Doorbell_Set  %08X U %08X\n",
  841                                ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register),
  842                                ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU)));
  843       SA_DBG2(("saDelayedInterruptHandler: Doorbell_Mask %08X U %08X\n",
  844                                ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ),
  845                                ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU )));
  846     }
  847 
  848   }
  849 
  850 
  851 #ifdef SA_LNX_PERF_MODE
  852   return siProcessOBMsg(agRoot, count, interruptVectorIndex);
  853 #endif
  854 
  855   /* check all the configuration outbound queues within a vector bitmap */
  856   SA_ASSERT((saRoot->QueueConfig.numOutboundQueues < 65), "numOutboundQueue");
  857 
  858   for ( i = 0; i < saRoot->QueueConfig.numOutboundQueues; i++ )
  859   {
  860     /* process IOMB in the outbound queue 0 to 31 if bit set in the vector bitmap */
  861     if (i < OQ_NUM_32)
  862     {
  863       if (saRoot->interruptVecIndexBitMap[interruptVectorIndex] & (1 << i))
  864       {
  865         processedMsgCount += siProcessOBMsg(agRoot, count, i);
  866       }
  867       else if (saRoot->QueueConfig.outboundQueues[i].interruptEnable == 0)
  868       {
  869         /* polling mode - interruptVectorIndex = 0 only and no bit set */
  870         processedMsgCount += siProcessOBMsg(agRoot, count, i);
  871       }
  872 #ifdef SA_FW_TEST_INTERRUPT_REASSERT
  873       else if (saRoot->CheckAll)
  874       {
  875         /* polling mode - interruptVectorIndex = 0 only and no bit set */
  876         processedMsgCount += siProcessOBMsg(agRoot, count, i);
  877       }
  878 #endif /* SA_FW_TEST_INTERRUPT_REASSERT */
  879 
  880     }
  881     else
  882     {
  883       /* process IOMB in the outbound queue 32 to 63 if bit set in the vector bitmap */
  884       if (saRoot->interruptVecIndexBitMap1[interruptVectorIndex] & (1 << (i - OQ_NUM_32)))
  885       {
  886         processedMsgCount += siProcessOBMsg(agRoot, count, i);
  887       }
  888       /* check interruptEnable bit for polling mode of OQ */
  889       /* the following code can be removed, we do not care about the bit */
  890       else if (saRoot->QueueConfig.outboundQueues[i].interruptEnable == 0)
  891       {
  892         /* polling mode - interruptVectorIndex = 0 only and no bit set */
  893         processedMsgCount += siProcessOBMsg(agRoot, count, i);
  894       }
  895 #ifdef SA_FW_TEST_INTERRUPT_REASSERT
  896       else if (saRoot->CheckAll)
  897       {
  898         /* polling mode - interruptVectorIndex = 0 only and no bit set */
  899         processedMsgCount += siProcessOBMsg(agRoot, count, i);
  900       }
  901 #endif /* SA_FW_TEST_INTERRUPT_REASSERT */
  902     }
  903   }
  904 
  905 #ifdef SA_FW_TEST_INTERRUPT_REASSERT
  906   saRoot->CheckAll = 0;
  907 #endif /* SA_FW_TEST_INTERRUPT_REASSERT */
  908 
  909 #ifndef SA_RENABLE_IN_OSLAYER
  910   if ( agTRUE == saRoot->sysIntsActive )
  911   {
  912     /* Allow replacement of enable interrupt */
  913     ossaReenableInterrupts(agRoot, interruptVectorIndex);
  914   }
  915 #endif /* SA_RENABLE_IN_OSLAYER */
  916 
  917   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5p");
  918 
  919   OSSA_OUT_LEAVE(agRoot);
  920   return processedMsgCount;
  921 }
  922 
  923 /******************************************************************************/
  924 /*! \brief Function to reenable MSIX interrupts
  925  *
  926  *  siReenableMSIXInterrupts  reenableinterrupts
  927  *  called thru macro ossaReenableInterrupts
  928  *
  929  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  930  *                instance of SAS/SATA hardware
  931  *  \param interruptVectorIndex  - vector index for message
  932  *
  933  */
  934 /*******************************************************************************/
  935 void siReenableMSIXInterrupts(
  936    agsaRoot_t *agRoot,
  937    bit32 interruptVectorIndex
  938   )
  939 {
  940   bit32 msi_index;
  941 #ifdef SA_CLEAR_ODCR_IN_INTERRUPT
  942   bit32 value;
  943 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */
  944   msi_index = interruptVectorIndex * MSIX_TABLE_ELEMENT_SIZE;
  945   msi_index += MSIX_TABLE_BASE;
  946   ossaHwRegWriteExt(agRoot, PCIBAR0,msi_index, MSIX_INTERRUPT_ENABLE);
  947 
  948   SA_DBG4(("siReenableMSIXInterrupts:interruptVectorIndex %d\n",interruptVectorIndex));
  949 
  950 #ifdef SA_CLEAR_ODCR_IN_INTERRUPT
  951   value  = (1 << interruptVectorIndex);
  952   siHalRegWriteExt(agRoot, GEN_MSGU_ODCR, MSGU_ODCR, value);
  953 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */
  954 }
  955 /******************************************************************************/
  956 /*! \brief Function to reenable MSIX interrupts
  957  *
  958  *  siReenableMSIXInterrupts  reenableinterrupts
  959  *  called thru macro ossaReenableInterrupts
  960  *
  961  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
  962  *                instance of SAS/SATA hardware
  963  *  \param interruptVectorIndex  - vector index for message
  964  *
  965  */
  966 /*******************************************************************************/
  967 void siReenableMSIX_V_Interrupts(
  968     agsaRoot_t *agRoot,
  969     bit32 interruptVectorIndex
  970     )
  971 {
  972   agsaLLRoot_t         *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
  973   bit64 mask;
  974   agsabit32bit64 u64;
  975   mask =( (bit64)1 << interruptVectorIndex);
  976   u64.B64 = mask;
  977 
  978   SA_DBG4(("siReenableMSIX_V_Interrupts:\n"));
  979 
  980   if(saRoot->sysIntsActive)
  981   {
  982     if(smIS64bInt(agRoot))
  983     {
  984       SA_DBG4(("siReenableMSIX_V_Interrupts: VI %d U 0x%08X L 0x%08X\n",interruptVectorIndex,u64.S32[1],u64.S32[0]));
  985       ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Clear_RegisterU,u64.S32[1] );
  986     }
  987     ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Clear_Register,u64.S32[0]);
  988   }
  989   else
  990   {
  991       SA_DBG1(("siReenableMSIX_V_Interrupts: VI %d sysIntsActive off\n",interruptVectorIndex));
  992   }
  993 
  994 }
  995 
  996 /******************************************************************************/
  997 /*! \brief Function to reenable MSI interrupts
  998  *
  999  *  siReenableMSIXInterrupts  reenableinterrupts
 1000  *  called thru macro ossaReenableInterrupts
 1001  *
 1002  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
 1003  *                instance of SAS/SATA hardware
 1004  *  \param interruptVectorIndex  - vector index for message
 1005  *
 1006  */
 1007 /*******************************************************************************/
 1008 GLOBAL void siReenableMSIInterrupts(
 1009   agsaRoot_t *agRoot,
 1010   bit32 interruptVectorIndex
 1011   )
 1012 {
 1013   bit32 ODMRValue;
 1014 
 1015   ODMRValue = siHalRegReadExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR);
 1016   ODMRValue &= ~(1 << interruptVectorIndex);
 1017 
 1018   siHalRegWriteExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR, ODMRValue);
 1019 }
 1020 
 1021 /******************************************************************************/
 1022 /*! \brief Function to reenable MSI V interrupts
 1023  *
 1024  *  siReenableMSIXInterrupts  reenableinterrupts
 1025  *  called thru macro ossaReenableInterrupts
 1026  *
 1027  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
 1028  *                instance of SAS/SATA hardware
 1029  *  \param interruptVectorIndex  - vector index for message
 1030  *
 1031  */
 1032 /*******************************************************************************/
 1033 GLOBAL void siReenableMSI_V_Interrupts(
 1034    agsaRoot_t *agRoot,
 1035    bit32 interruptVectorIndex
 1036    )
 1037 {
 1038   SA_ASSERT(0, "Should not be called");
 1039 
 1040   SA_DBG4(("siReenableMSI_V_Interrupts:\n"));
 1041 
 1042 }
 1043 /******************************************************************************/
 1044 /*! \brief Function to reenable Legacy interrupts
 1045  *
 1046  *  siReenableLegacyInterrupts reenableinterrupts
 1047  *  called thru macro ossaReenableInterrupts
 1048  *
 1049  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
 1050  *                instance of SAS/SATA hardware
 1051  *  \param interruptVectorIndex always zero
 1052  *
 1053  */
 1054 /*******************************************************************************/
 1055 GLOBAL void siReenableLegacyInterrupts(
 1056   agsaRoot_t *agRoot,
 1057   bit32 interruptVectorIndex
 1058   )
 1059 {
 1060   siHalRegWriteExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR, ODMR_CLEAR_ALL);
 1061 
 1062 #ifdef SA_CLEAR_ODCR_IN_INTERRUPT
 1063   siHalRegWriteExt(agRoot, GEN_MSGU_ODCR, MSGU_ODCR, ODCR_CLEAR_ALL);
 1064 #endif /* SA_CLEAR_ODCR_IN_INTERRUPT */
 1065 }
 1066 
 1067 /******************************************************************************/
 1068 /*! \brief Function to reenable Legacy V interrupts
 1069  *
 1070  *  siReenableLegacyInterrupts reenableinterrupts
 1071  *  called thru macro ossaReenableInterrupts
 1072  *
 1073  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
 1074  *                instance of SAS/SATA hardware
 1075  *  \param interruptVectorIndex always zero
 1076  *
 1077  */
 1078 /*******************************************************************************/
 1079 GLOBAL void siReenableLegacy_V_Interrupts(
 1080   agsaRoot_t *agRoot,
 1081   bit32 interruptVectorIndex
 1082   )
 1083 {
 1084 
 1085   bit32 mask;
 1086   mask = 1 << interruptVectorIndex;
 1087 
 1088   SA_DBG5(("siReenableLegacy_V_Interrupts:IN MSGU_READ_ODR  %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODR, V_Outbound_Doorbell_Set_Register)));
 1089   SA_DBG5(("siReenableLegacy_V_Interrupts:IN MSGU_READ_ODMR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODMR, V_Outbound_Doorbell_Mask_Set_Register )));
 1090 
 1091   ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Clear_Register, mask);
 1092   ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Clear_Register, mask );
 1093 
 1094 
 1095   SA_DBG5(("siReenableLegacy_V_Interrupts:OUT MSGU_READ_ODMR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODMR, V_Outbound_Doorbell_Mask_Set_Register )));
 1096 
 1097 }
 1098 
 1099 /******************************************************************************/
 1100 /*! \brief Function to enable a single interrupt vector
 1101  *
 1102  *
 1103  *
 1104  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
 1105  *                instance of SAS/SATA hardware
 1106  *  \param interruptVectorIndex Interrupt vector to enable
 1107  *
 1108  */
 1109 /*******************************************************************************/
 1110 /******************************************************************************/
 1111 /*! \brief  saSystemInterruptsEnable
 1112  *   Function to enable a single interrupt vector
 1113  *
 1114  *  \param agRoot OS Layer-specific and LL Layer-specific context handles for this
 1115  *                instance of SAS/SATA hardware
 1116  *  \param interruptVectorIndex Interrupt vector to enable
 1117  *
 1118  */
 1119 /*******************************************************************************/
 1120 GLOBAL FORCEINLINE
 1121 void saSystemInterruptsEnable(
 1122                               agsaRoot_t  *agRoot,
 1123                               bit32       interruptVectorIndex
 1124                               )
 1125 {
 1126   ossaReenableInterrupts(agRoot, interruptVectorIndex);
 1127 }
 1128 /******************************************************************************/
 1129 /*! \brief Routine to handle Outbound Message
 1130  *
 1131  *  The handle for outbound message
 1132  *
 1133  *  \param agRoot   handles for this instance of SAS/SATA hardware
 1134  *  \param count    interrupt message count
 1135  *  \param queueNum outbound queue
 1136  *
 1137  *  \return
 1138  */
 1139 /*******************************************************************************/
 1140 LOCAL FORCEINLINE bit32
 1141 siProcessOBMsg(
 1142   agsaRoot_t  *agRoot,
 1143   bit32       count,
 1144   bit32       queueNum
 1145   )
 1146 {
 1147   agsaLLRoot_t         *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 1148   mpiOCQueue_t         *circularQ = agNULL;
 1149   void                 *pMsg1     = agNULL;
 1150   bit32                ret, processedMsgCount = 0;
 1151   bit32                ParseOBIombStatus = 0;
 1152 #ifdef SA_ENABLE_TRACE_FUNCTIONS
 1153   bit32                i = 0;
 1154 #endif
 1155   bit16                opcode  = 0;
 1156   mpiMsgCategory_t     category;
 1157   bit8                 bc      = 0;
 1158 
 1159   smTraceFuncEnter(hpDBG_VERY_LOUD,"5r");
 1160 
 1161 
 1162   SA_DBG3(("siProcessOBMsg: queueNum 0x%x\n", queueNum));
 1163 
 1164   ossaSingleThreadedEnter(agRoot, LL_IOREQ_OBQ_LOCK + queueNum);
 1165 
 1166   circularQ = &saRoot->outboundQueue[queueNum];
 1167   OSSA_READ_LE_32(circularQ->agRoot, &circularQ->producerIdx, circularQ->piPointer, 0);
 1168 
 1169   if (circularQ->producerIdx == circularQ->consumerIdx)
 1170   {
 1171     ossaSingleThreadedLeave(agRoot, LL_IOREQ_OBQ_LOCK + queueNum);
 1172     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5r");
 1173     return processedMsgCount;
 1174   }
 1175 
 1176   ossaSingleThreadedLeave(agRoot, LL_IOREQ_OBQ_LOCK + queueNum);
 1177 
 1178   do
 1179   {
 1180     /* ossaSingleThreadedEnter(agRoot, LL_IOREQ_OBQ_LOCK + queueNum); */
 1181     ret = mpiMsgConsume(circularQ, &pMsg1, &category, &opcode, &bc);
 1182     /* ossaSingleThreadedLeave(agRoot, LL_IOREQ_OBQ_LOCK + queueNum); */
 1183 
 1184     if (AGSA_RC_SUCCESS == ret)
 1185     {
 1186       smTrace(hpDBG_IOMB,"M0",queueNum);
 1187       /* TP:M0 queueNum */
 1188       smTrace(hpDBG_VERY_LOUD,"MA",opcode);
 1189       /* TP:MA opcode */
 1190       smTrace(hpDBG_IOMB,"MB",category);
 1191       /* TP:MB category */
 1192 
 1193 #ifdef SA_ENABLE_TRACE_FUNCTIONS
 1194       for (i=0; i<((bit32)bc*(circularQ->elementSize/4)); i++)
 1195       {
 1196           /* The -sizeof(mpiMsgHeader_t) is to account for mpiMsgConsume incrementing the pointer past the header*/
 1197           smTrace(hpDBG_IOMB,"MC",*( ((bit32*)((bit8 *)pMsg1 - sizeof(mpiMsgHeader_t))) + i));
 1198           /* TP:MC Outbound IOMB Dword */
 1199       }
 1200 #endif
 1201 
 1202       MPI_DEBUG_TRACE( circularQ->qNumber,((circularQ->producerIdx << 16 ) | circularQ->consumerIdx),MPI_DEBUG_TRACE_OBQ, (void *)(((bit8*)pMsg1) - sizeof(mpiMsgHeader_t)), circularQ->elementSize);
 1203 
 1204       ossaLogIomb(circularQ->agRoot,
 1205                   circularQ->qNumber,
 1206                   FALSE,
 1207                   (void *)(((bit8*)pMsg1) - sizeof(mpiMsgHeader_t)),
 1208                   bc*circularQ->elementSize);
 1209 
 1210       ossaQueueProcessed(agRoot, queueNum, circularQ->producerIdx, circularQ->consumerIdx);
 1211       /* process the outbound message */
 1212       ParseOBIombStatus = mpiParseOBIomb(agRoot, (bit32 *)pMsg1, category, opcode);
 1213       if (ParseOBIombStatus == AGSA_RC_FAILURE)
 1214       {
 1215         SA_DBG1(("siProcessOBMsg, Failed Q %2d PI 0x%03x CI 0x%03x\n", queueNum, circularQ->producerIdx, circularQ->consumerIdx));
 1216 #if defined(SALLSDK_DEBUG)
 1217         /* free the message for debug: this is a hang! */
 1218 
 1219         mpiMsgFreeSet(circularQ, pMsg1, bc);
 1220         processedMsgCount ++;
 1221 #endif /**/
 1222         break;
 1223       }
 1224 
 1225       /* free the message from the outbound circular buffer */
 1226       mpiMsgFreeSet(circularQ, pMsg1, bc);
 1227       processedMsgCount ++;
 1228     }
 1229     else
 1230     //if (AGSA_RC_BUSY == ret) // always (circularQ->producerIdx == circularQ->consumerIdx)
 1231     // || (AGSA_RC_FAILURE == ret)
 1232     {
 1233         break;
 1234     }
 1235   }
 1236   /* end of message processing if hit the count */
 1237   while(count > processedMsgCount);
 1238 
 1239 /* #define SALLSDK_FATAL_ERROR_DETECT 1 */
 1240 /*
 1241    this comments are to be removed
 1242    fill in 0x1D 0x1e 0x1f 0x20 in MPI table for
 1243   bit32   regDumpBusBaseNum0;
 1244   bit32   regDumpOffset0;
 1245   bit32   regDumpLen0;
 1246   bit32   regDumpBusBaseNum1;
 1247   bit32   regDumpOffset1;
 1248   bit32   regDumpLen1;
 1249   in agsaFatalErrorInfo_t
 1250 
 1251   ??? regDumpBusBaseNum0 and regDumpBusBaseNum1
 1252     saRoot->mainConfigTable.regDumpPCIBAR = pcibar;
 1253     saRoot->mainConfigTable.FatalErrorDumpOffset0 = config->FatalErrorDumpOffset0;
 1254     saRoot->mainConfigTable.FatalErrorDumpLength0 = config->FatalErrorDumpLength0;
 1255     saRoot->mainConfigTable.FatalErrorDumpOffset1 = config->FatalErrorDumpOffset1;
 1256     saRoot->mainConfigTable.FatalErrorDumpLength1 = config->FatalErrorDumpLength1;
 1257 
 1258 
 1259 
 1260 */
 1261 #if defined(SALLSDK_FATAL_ERROR_DETECT)
 1262 
 1263   if( smIS_SPC(agRoot) ) /* SPC only */
 1264   {
 1265 
 1266   /* any fatal error happened */
 1267   /* executing this code impacts performance by 1% when no error is detected */
 1268   {
 1269     agsaFatalErrorInfo_t fatal_error;
 1270     bit32                value;
 1271     bit32                value1;
 1272 
 1273     value  = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1);
 1274     value1 = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2, MSGU_SCRATCH_PAD_2);
 1275 
 1276     if( (value & SA_FATAL_ERROR_SP1_AAP1_ERR_MASK) == SA_FATAL_ERROR_FATAL_ERROR ||
 1277         (value1 & SA_FATAL_ERROR_SP2_IOP_ERR_MASK) == SA_FATAL_ERROR_FATAL_ERROR    )
 1278     {
 1279       si_memset(&fatal_error, 0, sizeof(agsaFatalErrorInfo_t));
 1280       /* read detail fatal errors */
 1281       value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0, MSGU_SCRATCH_PAD_0);
 1282       fatal_error.errorInfo0 = value;
 1283       SA_DBG1(("siProcessOBMsg: ScratchPad0 AAP error code 0x%x\n", value));
 1284 
 1285       value  = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1);
 1286       fatal_error.errorInfo1 = value;
 1287       /* AAP error state */
 1288       SA_DBG1(("siProcessOBMsg: AAP error state and error code 0x%x\n", value));
 1289       value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2, MSGU_SCRATCH_PAD_2);
 1290       fatal_error.errorInfo2 = value;
 1291       /* IOP error state */
 1292       SA_DBG1(("siProcessOBMsg: IOP error state and error code 0x%x\n", value));
 1293       value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3, MSGU_SCRATCH_PAD_3);
 1294       SA_DBG1(("siProcessOBMsg: ScratchPad3 IOP error code 0x%x\n", value));
 1295       fatal_error.errorInfo3 = value;
 1296 
 1297       if (agNULL != saRoot)
 1298       {
 1299         fatal_error.regDumpBusBaseNum0 = saRoot->mainConfigTable.regDumpPCIBAR;
 1300         fatal_error.regDumpOffset0 = saRoot->mainConfigTable.FatalErrorDumpOffset0;
 1301         fatal_error.regDumpLen0 = saRoot->mainConfigTable.FatalErrorDumpLength0;
 1302         fatal_error.regDumpBusBaseNum1 = saRoot->mainConfigTable.regDumpPCIBAR;
 1303         fatal_error.regDumpOffset1 = saRoot->mainConfigTable.FatalErrorDumpOffset1;
 1304         fatal_error.regDumpLen1 = saRoot->mainConfigTable.FatalErrorDumpLength1;
 1305       }
 1306       else
 1307       {
 1308         fatal_error.regDumpBusBaseNum0 = 0;
 1309         fatal_error.regDumpOffset0 = 0;
 1310         fatal_error.regDumpLen0 = 0;
 1311         fatal_error.regDumpBusBaseNum1 = 0;
 1312         fatal_error.regDumpOffset1 = 0;
 1313         fatal_error.regDumpLen1 = 0;
 1314       }
 1315       /* Call Back with error */
 1316       SA_DBG1(("siProcessOBMsg: SALLSDK_FATAL_ERROR_DETECT \n"));
 1317       ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_MALFUNCTION, 0, (void *)&fatal_error, agNULL);
 1318     }
 1319   }
 1320   }
 1321 #endif /* SALLSDK_FATAL_ERROR_DETECT */
 1322   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5r");
 1323   return processedMsgCount;
 1324 }
 1325 
 1326 /******************************************************************************/
 1327 /*! \brief Function to enable/disable interrupts
 1328  *
 1329  *  The saSystemInterruptsActive() function is called to indicate to the LL Layer
 1330  *  whether interrupts are available. The parameter sysIntsActive indicates whether
 1331  *  interrupts are available at this time.
 1332  *
 1333  *  \param agRoot handles for this instance of SAS/SATA hardware
 1334  *  \param sysIntsActive flag for enable/disable interrupt
 1335  *
 1336  *  \return -void-
 1337  *
 1338  */
 1339 /*******************************************************************************/
 1340 GLOBAL void saSystemInterruptsActive(
 1341   agsaRoot_t  *agRoot,
 1342   agBOOLEAN   sysIntsActive
 1343   )
 1344 {
 1345   bit32 x;
 1346   agsaLLRoot_t  *saRoot;
 1347 
 1348   SA_ASSERT((agNULL != agRoot), "");
 1349   if (agRoot == agNULL)
 1350   {
 1351     SA_DBG1(("saSystemInterruptsActive: agRoot == agNULL\n"));
 1352     return;
 1353   }
 1354   saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 1355   SA_ASSERT((agNULL != saRoot), "");
 1356   if (saRoot == agNULL)
 1357   {
 1358     SA_DBG1(("saSystemInterruptsActive: saRoot == agNULL\n"));
 1359     return;
 1360   }
 1361 
 1362   smTraceFuncEnter(hpDBG_TICK_INT,"5s");
 1363   SA_DBG1(("saSystemInterruptsActive: now 0x%X new 0x%x\n",saRoot->sysIntsActive,sysIntsActive));
 1364   SA_DBG3(("saSystemInterruptsActive: Doorbell_Set  %08X U %08X\n",
 1365                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register),
 1366                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU)));
 1367   SA_DBG3(("saSystemInterruptsActive: Doorbell_Mask %08X U %08X\n",
 1368                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ),
 1369                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU )));
 1370 
 1371   if( saRoot->sysIntsActive && sysIntsActive )
 1372   {
 1373     SA_DBG1(("saSystemInterruptsActive: Already active 0x%X new 0x%x\n",saRoot->sysIntsActive,sysIntsActive));
 1374     smTraceFuncExit(hpDBG_TICK_INT, 'a', "5s");
 1375     return;
 1376   }
 1377 
 1378   if( !saRoot->sysIntsActive && !sysIntsActive )
 1379   {
 1380     if(smIS_SPC(agRoot))
 1381     {
 1382       siHalRegWriteExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR,AGSA_INTERRUPT_HANDLE_ALL_CHANNELS );
 1383     }
 1384     else
 1385     {
 1386       ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_Register, AGSA_INTERRUPT_HANDLE_ALL_CHANNELS);
 1387       ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_RegisterU, AGSA_INTERRUPT_HANDLE_ALL_CHANNELS);
 1388     }
 1389     SA_DBG1(("saSystemInterruptsActive: Already disabled 0x%X new 0x%x\n",saRoot->sysIntsActive,sysIntsActive));
 1390     smTraceFuncExit(hpDBG_TICK_INT, 'b', "5s");
 1391     return;
 1392   }
 1393 
 1394   /* Set the flag is sdkData */
 1395   saRoot->sysIntsActive = (bit8)sysIntsActive;
 1396 
 1397 
 1398   smTrace(hpDBG_TICK_INT,"Vq",sysIntsActive);
 1399   /* TP:Vq sysIntsActive */
 1400   /* If sysIntsActive is true */
 1401   if ( agTRUE == sysIntsActive )
 1402   {
 1403 
 1404     SA_DBG1(("saSystemInterruptsActive: Doorbell_Set  %08X U %08X\n",
 1405                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register),
 1406                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU)));
 1407     SA_DBG1(("saSystemInterruptsActive: Doorbell_Mask_Set  %08X U %08X\n",
 1408                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register),
 1409                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU)));
 1410     if(smIS_SPCV(agRoot))
 1411     {
 1412       ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Clear_Register, 0xFFFFFFFF);
 1413       ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Clear_RegisterU, 0xFFFFFFFF);
 1414     }
 1415     /* enable interrupt */
 1416     for(x=0; x < saRoot->numInterruptVectors; x++)
 1417     {
 1418       ossaReenableInterrupts(agRoot,x );
 1419     }
 1420 
 1421     if(saRoot->swConfig.fatalErrorInterruptEnable)
 1422     {
 1423       ossaReenableInterrupts(agRoot,saRoot->swConfig.fatalErrorInterruptVector );
 1424     }
 1425 
 1426     siHalRegWriteExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR, 0);
 1427   }
 1428   /* If sysIntsActive is false */
 1429   else
 1430   {
 1431     /* disable interrupt */
 1432     if(smIS_SPC(agRoot))
 1433     {
 1434       siHalRegWriteExt(agRoot, GEN_MSGU_ODMR, MSGU_ODMR,AGSA_INTERRUPT_HANDLE_ALL_CHANNELS );
 1435     }
 1436     else
 1437     {
 1438       ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_Register, AGSA_INTERRUPT_HANDLE_ALL_CHANNELS);
 1439       ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Mask_Set_RegisterU, AGSA_INTERRUPT_HANDLE_ALL_CHANNELS);
 1440     }
 1441   }
 1442 
 1443   SA_DBG3(("saSystemInterruptsActive: Doorbell_Set  %08X U %08X\n",
 1444                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register),
 1445                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU)));
 1446   SA_DBG3(("saSystemInterruptsActive: Doorbell_Mask %08X U %08X\n",
 1447                            ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ),
 1448                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU )));
 1449 
 1450 
 1451   smTraceFuncExit(hpDBG_TICK_INT, 'c', "5s");
 1452 }
 1453 
 1454 /******************************************************************************/
 1455 /*! \brief Routine to handle for received SAS with data payload event
 1456  *
 1457  *  The handle for received SAS with data payload event
 1458  *
 1459  *  \param agRoot   handles for this instance of SAS/SATA hardware
 1460  *  \param pRequest handles for the IOrequest
 1461  *  \param pRespIU  the pointer to the Response IU
 1462  *  \param param    Payload Length
 1463  *
 1464  *  \return -void-
 1465  */
 1466 /*******************************************************************************/
 1467 GLOBAL void siEventSSPResponseWtDataRcvd(
 1468   agsaRoot_t                *agRoot,
 1469   agsaIORequestDesc_t       *pRequest,
 1470   agsaSSPResponseInfoUnit_t *pRespIU,
 1471   bit32                     param,
 1472   bit32                     sspTag
 1473   )
 1474 {
 1475   agsaLLRoot_t  *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 1476   agsaDeviceDesc_t        *pDevice;
 1477   bit32                   count = 0;
 1478   bit32                   padCount;
 1479 
 1480   smTraceFuncEnter(hpDBG_VERY_LOUD,"5g");
 1481 
 1482   /* get frame handle */
 1483 
 1484   /* If the request is still valid */
 1485   if ( agTRUE == pRequest->valid )
 1486   {
 1487     /* get device */
 1488     pDevice = pRequest->pDevice;
 1489 
 1490     /* Delete the request from the pendingIORequests */
 1491     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1492     saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
 1493     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1494 
 1495     if (sspTag & SSP_RESCV_BIT)
 1496     {
 1497         /* get the pad count, bit 17 and 18 of sspTag */
 1498       padCount = (sspTag >> SSP_RESCV_PAD_SHIFT) & 0x3;
 1499       /* get Residual Count */
 1500       count = *(bit32 *)((bit8 *)pRespIU + param + padCount);
 1501     }
 1502 
 1503     (*(ossaSSPCompletedCB_t)(pRequest->completionCB))(agRoot,
 1504                              pRequest->pIORequestContext,
 1505                              OSSA_IO_SUCCESS,
 1506                              param,
 1507                              (void *)pRespIU,
 1508                              (bit16)(sspTag & SSPTAG_BITS),
 1509                              count);
 1510 
 1511     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1512     pRequest->valid = agFALSE;
 1513     /* return the request to free pool */
 1514     if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
 1515     {
 1516       SA_DBG1(("siEventSSPResponseWtDataRcvd: saving pRequest (%p) for later use\n", pRequest));
 1517       saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
 1518     }
 1519     else
 1520     {
 1521       /* return the request to free pool */
 1522       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
 1523     }
 1524     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1525 
 1526   }
 1527   else
 1528   {
 1529     SA_DBG1(("siEventSSPResponseWtDataRcvd: pRequest->Valid not TRUE\n"));
 1530   }
 1531 
 1532   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5g");
 1533 
 1534   return;
 1535 }
 1536 
 1537 /******************************************************************************/
 1538 /*! \brief Routine to handle successfully completed IO event
 1539  *
 1540  *  Handle successfully completed IO
 1541  *
 1542  *  \param agRoot   handles for this instance of SAS/SATA hardware
 1543  *  \param pRequest Pointer of IO request of the IO
 1544  *  \param status   status of the IO
 1545  *
 1546  *  \return -void-
 1547  */
 1548 /*******************************************************************************/
 1549 GLOBAL FORCEINLINE void siIODone(
 1550   agsaRoot_t                *agRoot,
 1551   agsaIORequestDesc_t       *pRequest,
 1552   bit32                     status,
 1553   bit32                     sspTag
 1554   )
 1555 {
 1556   agsaLLRoot_t     *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 1557   agsaDeviceDesc_t *pDevice = agNULL;
 1558 
 1559   smTraceFuncEnter(hpDBG_VERY_LOUD,"5h");
 1560 
 1561   SA_ASSERT(NULL != pRequest, "pRequest cannot be null");
 1562 
 1563   /* If the request is still valid */
 1564   if ( agTRUE == pRequest->valid )
 1565   {
 1566     /* get device */
 1567     pDevice = pRequest->pDevice;
 1568 
 1569     /* process different request type */
 1570     switch (pRequest->requestType & AGSA_REQTYPE_MASK)
 1571     {
 1572       case AGSA_SSP_REQTYPE:
 1573       {
 1574         SA_ASSERT(pRequest->valid, "pRequest not valid");
 1575         pRequest->completionCB(agRoot,
 1576                                pRequest->pIORequestContext,
 1577                                OSSA_IO_SUCCESS,
 1578                                0,
 1579                                agNULL,
 1580                                (bit16)(sspTag & SSPTAG_BITS),
 1581                                0);
 1582         ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1583         /* Delete the request from the pendingIORequests */
 1584         saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
 1585         /* return the request to free pool */
 1586         pRequest->valid = agFALSE;
 1587         saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
 1588         ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1589 
 1590 
 1591         break;
 1592       }
 1593       case AGSA_SATA_REQTYPE:
 1594       {
 1595         SA_DBG5(("siIODone: SATA complete\n"));
 1596 
 1597         if ( agNULL != pRequest->pIORequestContext )
 1598         {
 1599           SA_DBG5(("siIODone: Complete Request\n"));
 1600 
 1601           (*(ossaSATACompletedCB_t)(pRequest->completionCB))(agRoot,
 1602                                                              pRequest->pIORequestContext,
 1603                                                              OSSA_IO_SUCCESS,
 1604                                                              agNULL,
 1605                                                              0,
 1606                                                              agNULL);
 1607         }
 1608         ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1609         /* Delete the request from the pendingIORequests */
 1610         saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
 1611         /* return the request to free pool */
 1612         saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
 1613         ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1614 
 1615         pRequest->valid = agFALSE;
 1616 
 1617         break;
 1618       }
 1619       case AGSA_SMP_REQTYPE:
 1620       {
 1621         if ( agNULL != pRequest->pIORequestContext )
 1622         {
 1623           (*(ossaSMPCompletedCB_t)(pRequest->completionCB))(agRoot,
 1624                                                             pRequest->pIORequestContext,
 1625                                                             OSSA_IO_SUCCESS,
 1626                                                             0,
 1627                                                             agNULL);
 1628         }
 1629 
 1630         ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1631         /* Delete the request from the pendingSMPRequests */
 1632         saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
 1633         /* return the request to free pool */
 1634         if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
 1635         {
 1636           SA_DBG1(("siIODone: saving pRequest (%p) for later use\n", pRequest));
 1637           saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
 1638         }
 1639         else
 1640         {
 1641           saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
 1642         }
 1643         ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1644 
 1645         pRequest->valid = agFALSE;
 1646 
 1647         break;
 1648       }
 1649       default:
 1650       {
 1651         SA_DBG1(("siIODone: unknown request type (%x) is completed. HTag=0x%x\n", pRequest->requestType, pRequest->HTag));
 1652         break;
 1653       }
 1654     }
 1655   }
 1656   else
 1657   {
 1658     SA_DBG1(("siIODone: The request is not valid any more. HTag=0x%x requestType=0x%x\n", pRequest->HTag, pRequest->requestType));
 1659   }
 1660 
 1661   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5h");
 1662 
 1663 }
 1664 
 1665 /******************************************************************************/
 1666 /*! \brief Routine to handle abnormal completed IO/SMP event
 1667  *
 1668  *  Handle abnormal completed IO/SMP
 1669  *
 1670  *  \param agRoot   handles for this instance of SAS/SATA hardware
 1671  *  \param pRequest Pointer of IO request of the IO
 1672  *  \param status   status of the IO
 1673  *  \param param    Length
 1674  *
 1675  *  \return -void-
 1676  */
 1677 /*******************************************************************************/
 1678 GLOBAL void siAbnormal(
 1679   agsaRoot_t                *agRoot,
 1680   agsaIORequestDesc_t       *pRequest,
 1681   bit32                     status,
 1682   bit32                     param,
 1683   bit32                     sspTag
 1684   )
 1685 {
 1686   agsaLLRoot_t     *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 1687   agsaDeviceDesc_t *pDevice;
 1688 
 1689   smTraceFuncEnter(hpDBG_VERY_LOUD,"5i");
 1690 
 1691   if (agNULL == pRequest)
 1692   {
 1693     SA_DBG1(("siAbnormal: pRequest is NULL.\n"));
 1694     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5i");
 1695     return;
 1696   }
 1697 
 1698   /* If the request is still valid */
 1699   if ( agTRUE == pRequest->valid )
 1700   {
 1701     /* get device */
 1702 
 1703     SA_ASSERT((pRequest->pIORequestContext->osData != pRequest->pIORequestContext->sdkData), "pIORequestContext");
 1704 
 1705     pDevice = pRequest->pDevice;
 1706 
 1707     /* remove the IO request from IOMap */
 1708     saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
 1709     saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
 1710     saRoot->IOMap[pRequest->HTag].agContext = agNULL;
 1711 
 1712     smTrace(hpDBG_VERY_LOUD,"P6",status );
 1713      /* TP:P6 siAbnormal status */
 1714     smTrace(hpDBG_VERY_LOUD,"P7",param );
 1715      /* TP:P7 siAbnormal param */
 1716     /* process different request type */
 1717     switch (pRequest->requestType & AGSA_REQTYPE_MASK)
 1718     {
 1719       case AGSA_SSP_REQTYPE:
 1720       {
 1721         (*(ossaSSPCompletedCB_t)(pRequest->completionCB))(agRoot,
 1722                                                           pRequest->pIORequestContext,
 1723                                                           status,
 1724                                                           param,
 1725                                                           agNULL,
 1726                                                           (bit16)(sspTag & SSPTAG_BITS),
 1727                                                           ((sspTag & SSP_AGR_S_BIT)? (1 << 0) : 0));
 1728 
 1729         ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1730         /* Delete the request from the pendingIORequests */
 1731         saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
 1732         pRequest->valid = agFALSE;
 1733         /* return the request to free pool */
 1734         if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
 1735         {
 1736           SA_DBG1(("siAbnormal: saving pRequest (%p) for later use\n", pRequest));
 1737           saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
 1738         }
 1739         else
 1740         {
 1741           /* return the request to free pool */
 1742           saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
 1743         }
 1744         ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1745 
 1746         break;
 1747       }
 1748       case AGSA_SATA_REQTYPE:
 1749       {
 1750         SA_DBG5(("siAbnormal: SATA \n"));
 1751 
 1752         if ( agNULL != pRequest->pIORequestContext )
 1753         {
 1754           SA_DBG5(("siAbnormal: Calling SATACompletedCB\n"));
 1755 
 1756           (*(ossaSATACompletedCB_t)(pRequest->completionCB))(agRoot,
 1757                                                              pRequest->pIORequestContext,
 1758                                                              status,
 1759                                                              agNULL,
 1760                                                              param,
 1761                                                              agNULL);
 1762         }
 1763 
 1764         ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1765         /* Delete the request from the pendingIORequests */
 1766         saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
 1767         /* return the request to free pool */
 1768         pRequest->valid = agFALSE;
 1769         if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
 1770         {
 1771           SA_DBG1(("siAbnormal: saving pRequest (%p) for later use\n", pRequest));
 1772           saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
 1773         }
 1774         else
 1775         {
 1776           /* return the request to free pool */
 1777           saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
 1778         }
 1779         ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1780 
 1781         break;
 1782       }
 1783       case AGSA_SMP_REQTYPE:
 1784       {
 1785         if ( agNULL != pRequest->pIORequestContext )
 1786         {
 1787           (*(ossaSMPCompletedCB_t)(pRequest->completionCB))(agRoot,
 1788                                                             pRequest->pIORequestContext,
 1789                                                             status,
 1790                                                             param,
 1791                                                             agNULL);
 1792         }
 1793 
 1794         ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1795         /* Delete the request from the pendingSMPRequests */
 1796         saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
 1797         /* return the request to free pool */
 1798         pRequest->valid = agFALSE;
 1799         if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
 1800         {
 1801           SA_DBG1(("siAbnormal: saving pRequest (%p) for later use\n", pRequest));
 1802           saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
 1803         }
 1804         else
 1805         {
 1806           /* return the request to free pool */
 1807           saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
 1808         }
 1809         ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1810 
 1811         break;
 1812       }
 1813       default:
 1814       {
 1815         SA_DBG1(("siAbnormal: unknown request type (%x) is completed. Tag=0x%x\n", pRequest->requestType, pRequest->HTag));
 1816         break;
 1817       }
 1818     }
 1819 
 1820   }
 1821   else
 1822   {
 1823     SA_DBG1(("siAbnormal: The request is not valid any more. Tag=0x%x\n", pRequest->HTag));
 1824   }
 1825 
 1826   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5i");
 1827 
 1828   return;
 1829 }
 1830 
 1831 
 1832 /******************************************************************************/
 1833 /*! \brief Routine to handle abnormal DIF completed IO/SMP event
 1834  *
 1835  *  Handle abnormal completed IO/SMP
 1836  *
 1837  *  \param agRoot   handles for this instance of SAS/SATA hardware
 1838  *  \param pRequest Pointer of IO request of the IO
 1839  *  \param status   status of the IO
 1840  *  \param param    Length
 1841  *
 1842  *  \return -void-
 1843  */
 1844 /*******************************************************************************/
 1845 GLOBAL void siDifAbnormal(
 1846   agsaRoot_t          *agRoot,
 1847   agsaIORequestDesc_t *pRequest,
 1848   bit32               status,
 1849   bit32               param,
 1850   bit32               sspTag,
 1851   bit32               *pMsg1
 1852   )
 1853 {
 1854   agsaLLRoot_t     *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 1855   agsaDeviceDesc_t *pDevice;
 1856 
 1857   smTraceFuncEnter(hpDBG_VERY_LOUD,"2S");
 1858 
 1859   if (agNULL == pRequest)
 1860   {
 1861     SA_DBG1(("siDifAbnormal: pRequest is NULL.\n"));
 1862     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2S");
 1863     return;
 1864   }
 1865 
 1866   /* If the request is still valid */
 1867   if ( agTRUE == pRequest->valid )
 1868   {
 1869     /* get device */
 1870     pDevice = pRequest->pDevice;
 1871 
 1872     /* remove the IO request from IOMap */
 1873     saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
 1874     saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
 1875     saRoot->IOMap[pRequest->HTag].agContext = agNULL;
 1876 
 1877     smTrace(hpDBG_VERY_LOUD,"P6",status );
 1878      /* TP:P6 siDifAbnormal status */
 1879     /* process different request type */
 1880     switch (pRequest->requestType & AGSA_REQTYPE_MASK)
 1881     {
 1882       case AGSA_SSP_REQTYPE:
 1883       {
 1884         agsaDifDetails_t          agDifDetails;
 1885         agsaSSPCompletionDifRsp_t    *pIomb;
 1886         pIomb = (agsaSSPCompletionDifRsp_t *)pMsg1;
 1887         si_memset(&agDifDetails, 0, sizeof(agDifDetails));
 1888 
 1889         OSSA_READ_LE_32(agRoot, &agDifDetails.UpperLBA,           pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,UpperLBA ));
 1890         OSSA_READ_LE_32(agRoot, &agDifDetails.LowerLBA,           pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,LowerLBA ));
 1891         OSSA_READ_LE_32(agRoot, &agDifDetails.sasAddressHi,       pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,sasAddressHi ));
 1892         OSSA_READ_LE_32(agRoot, &agDifDetails.sasAddressLo,       pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,sasAddressLo));
 1893         OSSA_READ_LE_32(agRoot, &agDifDetails.ExpectedCRCUDT01,   pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,ExpectedCRCUDT01 ));
 1894         OSSA_READ_LE_32(agRoot, &agDifDetails.ExpectedUDT2345,    pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,ExpectedUDT2345));
 1895         OSSA_READ_LE_32(agRoot, &agDifDetails.ActualCRCUDT01,     pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,ActualCRCUDT01 ));
 1896         OSSA_READ_LE_32(agRoot, &agDifDetails.ActualUDT2345,      pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,ActualUDT2345));
 1897         OSSA_READ_LE_32(agRoot, &agDifDetails.DIFErrDevID,        pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,DIFErrDevID ));
 1898         OSSA_READ_LE_32(agRoot, &agDifDetails.ErrBoffsetEDataLen, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t,ErrBoffsetEDataLen ));
 1899         agDifDetails.frame = (void *)(bit8*)(pIomb+ OSSA_OFFSET_OF(agsaSSPCompletionDifRsp_t, EDATA_FRM));
 1900 
 1901         (*(ossaSSPCompletedCB_t)(pRequest->completionCB))(agRoot,
 1902                                                           pRequest->pIORequestContext,
 1903                                                           status,
 1904                                                           param,
 1905                                                           &agDifDetails,
 1906                                                           (bit16)(sspTag & SSPTAG_BITS),
 1907                     ((sspTag & SSP_AGR_S_BIT)? (1 << 0) : 0));
 1908 
 1909         ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1910         pRequest->valid = agFALSE;
 1911         /* Delete the request from the pendingIORequests */
 1912         saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
 1913 
 1914         /* return the request to free pool */
 1915         if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
 1916         {
 1917           SA_DBG1(("siDifAbnormal: saving pRequest (%p) for later use\n", pRequest));
 1918           saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
 1919         }
 1920         else
 1921         {
 1922           /* return the request to free pool */
 1923           saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
 1924         }
 1925         ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 1926 
 1927         break;
 1928       }
 1929       default:
 1930       {
 1931         SA_DBG1(("siDifAbnormal: unknown request type (%x) is completed. Tag=0x%x\n", pRequest->requestType, pRequest->HTag));
 1932         break;
 1933       }
 1934     }
 1935 
 1936   }
 1937   else
 1938   {
 1939     SA_DBG1(("siDifAbnormal: The request is not valid any more. Tag=0x%x\n", pRequest->HTag));
 1940   }
 1941 
 1942   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2S");
 1943 
 1944   return;
 1945 }
 1946 
 1947 
 1948 /******************************************************************************/
 1949 /*! \brief Routine to handle for received SMP response event
 1950  *
 1951  *  The handle for received SMP response event
 1952  *
 1953  *  \param agRoot      handles for this instance of SAS/SATA hardware
 1954  *  \param pIomb       Pointer of payload of IOMB
 1955  *  \param payloadSize size of the payload
 1956  *  \param tag         the tag of the request SMP
 1957  *
 1958  *  \return -void-
 1959  */
 1960 /*******************************************************************************/
 1961 GLOBAL void siSMPRespRcvd(
 1962   agsaRoot_t              *agRoot,
 1963   agsaSMPCompletionRsp_t  *pIomb,
 1964   bit32                   payloadSize,
 1965   bit32                   tag
 1966   )
 1967 {
 1968   agsaLLRoot_t            *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 1969   agsaFrameHandle_t       frameHandle;
 1970   agsaIORequestDesc_t     *pRequest;
 1971   agsaDeviceDesc_t        *pDevice;
 1972   agsaPort_t              *pPort;
 1973 
 1974   smTraceFuncEnter(hpDBG_VERY_LOUD,"5j");
 1975 
 1976   /* get the request */
 1977   pRequest = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
 1978   SA_ASSERT(pRequest, "pRequest");
 1979 
 1980   /* get the port */
 1981   pPort = pRequest->pPort;
 1982   SA_ASSERT(pPort, "pPort");
 1983 
 1984   if (pRequest->IRmode == 0)
 1985   {
 1986     /* get frame handle - direct response mode */
 1987     frameHandle = (agsaFrameHandle_t)(&(pIomb->SMPrsp[0]));
 1988 #if defined(SALLSDK_DEBUG)
 1989     SA_DBG3(("saSMPRespRcvd(direct): smpRspPtr=0x%p - len=0x%x\n",
 1990         frameHandle,
 1991         payloadSize
 1992         ));
 1993 #endif /* SALLSDK_DEBUG */
 1994   }
 1995   else
 1996   {
 1997     /* indirect response mode */
 1998     frameHandle = agNULL;
 1999   }
 2000 
 2001   /* If the request is still valid */
 2002   if ( agTRUE == pRequest->valid )
 2003   {
 2004     /* get device */
 2005     pDevice = pRequest->pDevice;
 2006     SA_ASSERT(pDevice, "pDevice");
 2007 
 2008     /* Delete the request from the pendingSMPRequests */
 2009     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 2010     saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
 2011     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 2012 
 2013     /* If the request is from OS layer */
 2014     if ( agNULL != pRequest->pIORequestContext )
 2015     {
 2016       if (agNULL == frameHandle)
 2017       {
 2018         /* indirect mode */
 2019         /* call back with success */
 2020         (*(ossaSMPCompletedCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, OSSA_IO_SUCCESS, payloadSize, frameHandle);
 2021       }
 2022       else
 2023       {
 2024         /* direct mode */
 2025         /* call back with success */
 2026         (*(ossaSMPCompletedCB_t)(pRequest->completionCB))(agRoot, pRequest->pIORequestContext, OSSA_IO_SUCCESS, payloadSize, frameHandle);
 2027       }
 2028     }
 2029 
 2030     /* remove the IO request from IOMap */
 2031     saRoot->IOMap[tag].Tag = MARK_OFF;
 2032     saRoot->IOMap[tag].IORequest = agNULL;
 2033     saRoot->IOMap[tag].agContext = agNULL;
 2034     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 2035     pRequest->valid = agFALSE;
 2036     if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
 2037     {
 2038       SA_DBG1(("siSMPRespRcvd: saving pRequest (%p) for later use\n", pRequest));
 2039       saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
 2040     }
 2041     else
 2042     {
 2043       /* return the request to free pool */
 2044       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
 2045     }
 2046     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
 2047   }
 2048 
 2049   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5j");
 2050 
 2051   return;
 2052 }
 2053 
 2054 /******************************************************************************/
 2055 /*! \brief Routine to handle for received Phy Up event
 2056  *
 2057  *  The handle for received Phy Up event
 2058  *
 2059  *  \param agRoot handles for this instance of SAS/SATA hardware
 2060  *  \param phyId for the Phy Up event happened
 2061  *  \param agSASIdentify is the remote phy Identify
 2062  *  \param portId is the port context index of the phy up event
 2063  *  \param deviceId is the device context index
 2064  *  \param linkRate link up rate from SPC
 2065  *
 2066  *  \return -void-
 2067  */
 2068 /*******************************************************************************/
 2069 GLOBAL void siEventPhyUpRcvd(
 2070   agsaRoot_t        *agRoot,
 2071   bit32             phyId,
 2072   agsaSASIdentify_t *agSASIdentify,
 2073   bit32             portId,
 2074   bit32             npipps,
 2075   bit8              linkRate
 2076   )
 2077 {
 2078   agsaLLRoot_t      *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 2079   agsaPhy_t         *pPhy = &(saRoot->phys[phyId]);
 2080   agsaPort_t        *pPort;
 2081   agsaSASIdentify_t remoteIdentify;
 2082   agsaPortContext_t *agPortContext;
 2083 
 2084   smTraceFuncEnter(hpDBG_VERY_LOUD,"5k");
 2085 
 2086   /* Read remote SAS Identify from response message and save it */
 2087   remoteIdentify = *agSASIdentify;
 2088 
 2089   /* get port context from portMap */
 2090   SA_DBG2(("siEventPhyUpRcvd:PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[portId & PORTID_MASK].PortID,saRoot->PortMap[portId & PORTID_MASK].PortStatus,saRoot->PortMap[portId & PORTID_MASK].PortContext));
 2091   agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
 2092 
 2093   SA_DBG2(("siEventPhyUpRcvd: portID %d PortContext %p linkRate 0x%X\n", portId, agPortContext,linkRate));
 2094   if (smIS_SPCV8006(agRoot))
 2095   {
 2096     SA_DBG1(("siEventPhyUpRcvd: SAS_PHY_UP received for SATA Controller\n"));
 2097     return;
 2098   }
 2099 
 2100   if (agNULL != agPortContext)
 2101   {
 2102     /* existing port */
 2103     pPort = (agsaPort_t *) (agPortContext->sdkData);
 2104     pPort->portId = portId;
 2105 
 2106     /* include the phy to the port */
 2107     pPort->phyMap[phyId] = agTRUE;
 2108     /* Set the port for the phy */
 2109     saRoot->phys[phyId].pPort = pPort;
 2110 
 2111     /* Update port state */
 2112     if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
 2113     {
 2114       pPort->status &= ~PORT_INVALIDATING;
 2115       saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
 2116       SA_DBG1(("siEventPhyUpRcvd: portID %d PortContext %p, hitting workaround\n", portId, agPortContext));
 2117     }
 2118   }
 2119   else
 2120   {
 2121     ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
 2122     /* new port */
 2123     /* Allocate a free port */
 2124     pPort = (agsaPort_t *) saLlistGetHead(&(saRoot->freePorts));
 2125     if (agNULL != pPort)
 2126     {
 2127       /* Acquire port list lock */
 2128       saLlistRemove(&(saRoot->freePorts), &(pPort->linkNode));
 2129 
 2130       /* setup the port data structure */
 2131       pPort->portContext.osData = agNULL;
 2132       pPort->portContext.sdkData = pPort;
 2133 
 2134       /* Add to valid port list */
 2135       saLlistAdd(&(saRoot->validPorts), &(pPort->linkNode));
 2136       /* Release port list lock */
 2137       ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
 2138 
 2139       /* include the phy to the port */
 2140       pPort->phyMap[phyId] = agTRUE;
 2141       /* Set the port for the phy */
 2142       saRoot->phys[phyId].pPort = pPort;
 2143 
 2144       /* Setup portMap based on portId */
 2145       saRoot->PortMap[portId].PortID = portId;
 2146       saRoot->PortMap[portId].PortContext = &(pPort->portContext);
 2147       pPort->portId = portId;
 2148 
 2149       SA_DBG3(("siEventPhyUpRcvd: NewPort portID %d PortContext %p\n", portId, saRoot->PortMap[portId].PortContext));
 2150     }
 2151     else
 2152     {
 2153       ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
 2154       /* pPort is agNULL*/
 2155       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5k");
 2156       return;
 2157     }
 2158 
 2159     if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
 2160     {
 2161       pPort->status &= ~PORT_INVALIDATING;
 2162       saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
 2163     }
 2164     else
 2165     {
 2166       SA_DBG1(("siEventPhyUpRcvd: PortInvalid portID %d PortContext %p\n", portId, saRoot->PortMap[portId].PortContext));
 2167     }
 2168   }
 2169 
 2170   /* adjust the bit fields before callback */
 2171   phyId = (linkRate << SHIFT8) | phyId;
 2172   /* report PhyId, NPIP, PortState */
 2173   phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
 2174   ossaHwCB(agRoot, &(pPort->portContext), OSSA_HW_EVENT_SAS_PHY_UP, phyId, agNULL, &remoteIdentify);
 2175 
 2176   /* set PHY_UP status */
 2177   PHY_STATUS_SET(pPhy, PHY_UP);
 2178 
 2179   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5k");
 2180 
 2181   /* return */
 2182   return;
 2183 }
 2184 
 2185 /******************************************************************************/
 2186 /*! \brief Routine to handle for received SATA signature event
 2187  *
 2188  *  The handle for received SATA signature event
 2189  *
 2190  *  \param agRoot   handles for this instance of SAS/SATA hardware
 2191  *  \param phyId    the phy id of the phy received the frame
 2192  *  \param pMsg     the pointer to the message payload
 2193  *  \param portId   the port context index of the phy up event
 2194  *  \param deviceId the device context index
 2195  *  \param linkRate link up rate from SPC
 2196  *
 2197  *  \return -void-
 2198  */
 2199 /*******************************************************************************/
 2200 GLOBAL void siEventSATASignatureRcvd(
 2201   agsaRoot_t    *agRoot,
 2202   bit32         phyId,
 2203   void          *pMsg,
 2204   bit32         portId,
 2205   bit32         npipps,
 2206   bit8          linkRate
 2207   )
 2208 {
 2209   agsaLLRoot_t                *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 2210   agsaPhy_t                   *pPhy = &(saRoot->phys[phyId]);
 2211   agsaPort_t                  *pPort = agNULL;
 2212   agsaPortContext_t           *agPortContext;
 2213 #if defined(SALLSDK_DEBUG)
 2214   agsaFisRegDeviceToHost_t    *fisD2H;
 2215   /* Read the D2H FIS */
 2216   fisD2H = (agsaFisRegDeviceToHost_t *)pMsg;
 2217 #endif  /* SALLSDK_DEBUG */
 2218 
 2219   smTraceFuncEnter(hpDBG_VERY_LOUD,"5m");
 2220 
 2221   SA_DBG5(("siEventSATASignatureRcvd: About to read the signatureFIS data\n"));
 2222 
 2223 
 2224   SA_DBG5(("agsaFisRegDeviceToHost_t:\n"));
 2225   SA_DBG5(("  fisType         = %x\n", fisD2H->h.fisType));
 2226   SA_DBG5(("  i_pmPort        = %x\n", fisD2H->h.i_pmPort));
 2227   SA_DBG5(("  status          = %x\n", fisD2H->h.status));
 2228   SA_DBG5(("  error           = %x\n", fisD2H->h.error));
 2229 
 2230   SA_DBG5(("  lbaLow          = %x\n", fisD2H->d.lbaLow));
 2231   SA_DBG5(("  lbaMid          = %x\n", fisD2H->d.lbaMid));
 2232   SA_DBG5(("  lbaHigh         = %x\n", fisD2H->d.lbaHigh));
 2233   SA_DBG5(("  device          = %x\n", fisD2H->d.device));
 2234 
 2235   SA_DBG5(("  lbaLowExp       = %x\n", fisD2H->d.lbaLowExp));
 2236   SA_DBG5(("  lbaMidExp       = %x\n", fisD2H->d.lbaMidExp));
 2237   SA_DBG5(("  lbaHighExp      = %x\n", fisD2H->d.lbaHighExp));
 2238   SA_DBG5(("  reserved4       = %x\n", fisD2H->d.reserved4));
 2239 
 2240   SA_DBG5(("  sectorCount     = %x\n", fisD2H->d.sectorCount));
 2241   SA_DBG5(("  sectorCountExp  = %x\n", fisD2H->d.sectorCountExp));
 2242   SA_DBG5(("  reserved5       = %x\n", fisD2H->d.reserved5));
 2243   SA_DBG5(("  reserved6       = %x\n", fisD2H->d.reserved6));
 2244 
 2245   SA_DBG5(("  reserved7 (32)  = %08X\n", fisD2H->d.reserved7));
 2246 
 2247   SA_DBG5(("siEventSATASignatureRcvd: GOOD signatureFIS data\n"));
 2248 
 2249 #if defined(SALLSDK_DEBUG)
 2250   /* read signature */
 2251   pPhy->remoteSignature[0] = (bit8) fisD2H->d.sectorCount;
 2252   pPhy->remoteSignature[1] = (bit8) fisD2H->d.lbaLow;
 2253   pPhy->remoteSignature[2] = (bit8) fisD2H->d.lbaMid;
 2254   pPhy->remoteSignature[3] = (bit8) fisD2H->d.lbaHigh;
 2255   pPhy->remoteSignature[4] = (bit8) fisD2H->d.device;
 2256 #endif
 2257 
 2258   /* get port context from portMap */
 2259   SA_DBG2(("siEventSATASignatureRcvd:PortID 0x%x PortStatus 0x%x PortContext %p\n",saRoot->PortMap[portId & PORTID_MASK].PortID,saRoot->PortMap[portId & PORTID_MASK].PortStatus,saRoot->PortMap[portId & PORTID_MASK].PortContext));
 2260   agPortContext = (agsaPortContext_t *)saRoot->PortMap[portId].PortContext;
 2261 
 2262   SA_DBG2(("siEventSATASignatureRcvd: portID %d PortContext %p\n", portId, agPortContext));
 2263 
 2264   if (agNULL != agPortContext)
 2265   {
 2266     /* exist port */
 2267     pPort = (agsaPort_t *) (agPortContext->sdkData);
 2268     pPort->portId = portId;
 2269 
 2270     /* include the phy to the port */
 2271     pPort->phyMap[phyId] = agTRUE;
 2272     /* Set the port for the phy */
 2273     saRoot->phys[phyId].pPort = pPort;
 2274   }
 2275   else
 2276   {
 2277     ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
 2278     /* new port */
 2279     /* Allocate a free port */
 2280     pPort = (agsaPort_t *) saLlistGetHead(&(saRoot->freePorts));
 2281     if (agNULL != pPort)
 2282     {
 2283       /* Acquire port list lock */
 2284       saLlistRemove(&(saRoot->freePorts), &(pPort->linkNode));
 2285 
 2286       /* setup the port data structure */
 2287       pPort->portContext.osData = agNULL;
 2288       pPort->portContext.sdkData = pPort;
 2289 
 2290       /* Add to valid port list */
 2291       saLlistAdd(&(saRoot->validPorts), &(pPort->linkNode));
 2292       /* Release port list lock */
 2293       ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
 2294 
 2295       /* include the phy to the port */
 2296       pPort->phyMap[phyId] = agTRUE;
 2297       /* Set the port for the phy */
 2298       saRoot->phys[phyId].pPort = pPort;
 2299 
 2300       /* Setup portMap based on portId */
 2301       saRoot->PortMap[portId].PortID = portId;
 2302       saRoot->PortMap[portId].PortContext = &(pPort->portContext);
 2303       pPort->portId = portId;
 2304       SA_DBG3(("siEventSATASignatureRcvd: NewPort portID %d portContect %p\n", portId, saRoot->PortMap[portId].PortContext));
 2305     }
 2306     else
 2307     {
 2308       ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
 2309       /* pPort is agNULL*/
 2310       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5m");
 2311       return;
 2312     }
 2313 
 2314     if (OSSA_PORT_VALID == (npipps & PORT_STATE_MASK))
 2315     {
 2316       pPort->status &= ~PORT_INVALIDATING;
 2317       saRoot->PortMap[portId].PortStatus  &= ~PORT_INVALIDATING;
 2318     }
 2319     else
 2320     {
 2321       SA_DBG1(("siEventSATASignatureRcvd: PortInvalid portID %d PortContext %p\n", portId, saRoot->PortMap[portId].PortContext));
 2322     }
 2323   }
 2324 
 2325   /* adjust the bit fields before callback */
 2326   phyId = (linkRate << SHIFT8) | phyId;
 2327   /* report PhyId, NPIP, PortState */
 2328   phyId |= (npipps & PHY_IN_PORT_MASK) | ((npipps & PORT_STATE_MASK) << SHIFT16);
 2329   ossaHwCB(agRoot, &(pPort->portContext), OSSA_HW_EVENT_SATA_PHY_UP, phyId, agNULL, pMsg);
 2330 
 2331   /* set PHY_UP status */
 2332   PHY_STATUS_SET(pPhy, PHY_UP);
 2333 
 2334   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5m");
 2335 
 2336   /* return */
 2337   return;
 2338 }
 2339 
 2340 
 2341 /******************************************************************************/
 2342 /*! \brief Process Outbound IOMB Message
 2343  *
 2344  *  Process Outbound IOMB from SPC
 2345  *
 2346  *  \param agRoot       Handles for this instance of SAS/SATA LL Layer
 2347  *  \param pMsg1        Pointer of Response IOMB message 1
 2348  *  \param category     category of outbpond IOMB header
 2349  *  \param opcode       Opcode of Outbound IOMB header
 2350  *  \param bc           buffer count of IOMB header
 2351  *
 2352  *  \return success or fail
 2353  *
 2354  */
 2355 /*******************************************************************************/
 2356 GLOBAL bit32 mpiParseOBIomb(
 2357   agsaRoot_t        *agRoot,
 2358   bit32             *pMsg1,
 2359   mpiMsgCategory_t  category,
 2360   bit16             opcode
 2361   )
 2362 {
 2363   agsaLLRoot_t      *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 2364   bit32              ret = AGSA_RC_SUCCESS;
 2365   bit32              parserStatus = AGSA_RC_SUCCESS;
 2366 
 2367   smTraceFuncEnter(hpDBG_VERY_LOUD, "2f");
 2368 
 2369   switch (opcode)
 2370   {
 2371     case OPC_OUB_COMBINED_SSP_COMP:
 2372     {
 2373       agsaSSPCoalescedCompletionRsp_t  *pIomb = (agsaSSPCoalescedCompletionRsp_t *)pMsg1;
 2374       agsaIORequestDesc_t              *pRequest = agNULL;
 2375       bit32  tag     = 0;
 2376       bit32  sspTag  = 0;
 2377       bit32  count   = 0;
 2378 
 2379 #ifdef SALL_API_TEST
 2380       saRoot->LLCounters.IOCounter.numSSPCompleted++;
 2381       SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n",
 2382          pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
 2383 #else
 2384       SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SSP_COMP Response received IOMB=%p\n", pMsg1));
 2385 #endif
 2386       /* get Tag */
 2387       for (count = 0; count < pIomb->coalescedCount; count++)
 2388       {
 2389         tag = pIomb->sspComplCxt[count].tag;
 2390         sspTag = pIomb->sspComplCxt[count].SSPTag;
 2391         pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
 2392         SA_ASSERT((pRequest), "pRequest");
 2393 
 2394         if(pRequest == agNULL)
 2395         {
 2396           SA_DBG1(("mpiParseOBIomb,OPC_OUB_COMBINED_SSP_COMP Resp IOMB tag=0x%x, status=0x%x, param=0x%x, SSPTag=0x%x\n", tag, OSSA_IO_SUCCESS, 0, sspTag));
 2397 #ifdef SA_ENABLE_PCI_TRIGGER
 2398           if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_COAL_IOMB_ERROR )
 2399           {
 2400             siPCITriger(agRoot);
 2401           }
 2402 #endif /* SA_ENABLE_PCI_TRIGGER */
 2403           return(AGSA_RC_FAILURE);
 2404         }
 2405         SA_ASSERT((pRequest->valid), "pRequest->valid");
 2406 
 2407 #ifdef SA_ENABLE_PCI_TRIGGER
 2408         if(!pRequest->valid)
 2409         {
 2410           if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_COAL_INVALID )
 2411           {
 2412             siPCITriger(agRoot);
 2413           }
 2414         }
 2415 #endif /* SA_ENABLE_PCI_TRIGGER */
 2416 
 2417 
 2418         SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SSP_COMP IOMB tag=0x%x, status=0x%x, param=0x%x, SSPTag=0x%x\n", tag, OSSA_IO_SUCCESS, 0, sspTag));
 2419 
 2420         /* Completion of SSP without Response Data */
 2421         siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, sspTag);
 2422       }
 2423     }
 2424     break;
 2425 
 2426     case OPC_OUB_SSP_COMP:
 2427     {
 2428 #ifdef SALL_API_TEST
 2429       saRoot->LLCounters.IOCounter.numSSPCompleted++;
 2430       SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p %d\n",
 2431          pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
 2432 #else
 2433       SA_DBG3(("mpiParseOBIomb, SSP_COMP Response received IOMB=%p\n", pMsg1));
 2434 #endif
 2435       /* process the SSP IO Completed response message */
 2436       mpiSSPCompletion(agRoot, pMsg1);
 2437       break;
 2438     }
 2439     case OPC_OUB_COMBINED_SATA_COMP:
 2440     {
 2441       agsaSATACoalescedCompletionRsp_t    *pIomb;
 2442       agsaIORequestDesc_t       *pRequest;
 2443       bit32                     tag;
 2444       bit32                     count;
 2445 
 2446     #ifdef SALL_API_TEST
 2447       saRoot->LLCounters.IOCounter.numSSPCompleted++;
 2448       SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p %d\n",
 2449          pMsg1, saRoot->LLCounters.IOCounter.numSSPCompleted));
 2450     #else
 2451       SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP Response received IOMB=%p\n", pMsg1));
 2452     #endif
 2453 
 2454       pIomb = (agsaSATACoalescedCompletionRsp_t *)pMsg1;
 2455       /* get Tag */
 2456       for (count = 0; count < pIomb->coalescedCount; count++)
 2457       {
 2458         tag = pIomb->stpComplCxt[count].tag;
 2459         pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
 2460         SA_ASSERT((pRequest), "pRequest");
 2461 
 2462         if(pRequest == agNULL)
 2463         {
 2464           SA_DBG1(("mpiParseOBIomb,OPC_OUB_COMBINED_SATA_COMP Resp IOMB tag=0x%x, status=0x%x, param=0x%x\n", tag, OSSA_IO_SUCCESS, 0));
 2465           return(AGSA_RC_FAILURE);
 2466         }
 2467         SA_ASSERT((pRequest->valid), "pRequest->valid");
 2468 
 2469         SA_DBG3(("mpiParseOBIomb, OPC_OUB_COMBINED_SATA_COMP IOMB tag=0x%x, status=0x%x, param=0x%x\n", tag, OSSA_IO_SUCCESS, 0));
 2470 
 2471         /* Completion of SATA without Response Data */
 2472         siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, 0);
 2473       }
 2474       break;
 2475     }
 2476     case OPC_OUB_SATA_COMP:
 2477     {
 2478 #ifdef SALL_API_TEST
 2479       saRoot->LLCounters.IOCounter.numSataCompleted++;
 2480       SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p %d\n",
 2481              pMsg1, saRoot->LLCounters.IOCounter.numSataCompleted));
 2482 #else
 2483       SA_DBG3(("mpiParseOBIomb, SATA_COMP Response received IOMB=%p\n", pMsg1));
 2484 #endif
 2485       /* process the response message */
 2486       mpiSATACompletion(agRoot, pMsg1);
 2487       break;
 2488     }
 2489     case OPC_OUB_SSP_ABORT_RSP:
 2490     {
 2491 #ifdef SALL_API_TEST
 2492       saRoot->LLCounters.IOCounter.numSSPAbortedCB++;
 2493 #else
 2494       SA_DBG3(("mpiParseOBIomb, SSP_ABORT Response received IOMB=%p\n", pMsg1));
 2495 #endif
 2496       /* process the response message */
 2497       parserStatus = mpiSSPAbortRsp(agRoot, (agsaSSPAbortRsp_t *)pMsg1);
 2498       if(parserStatus !=  AGSA_RC_SUCCESS)
 2499       {
 2500          SA_DBG3(("mpiParseOBIomb, mpiSSPAbortRsp FAIL IOMB=%p\n", pMsg1));
 2501       }
 2502 
 2503       break;
 2504     }
 2505     case OPC_OUB_SATA_ABORT_RSP:
 2506     {
 2507 #ifdef SALL_API_TEST
 2508       saRoot->LLCounters.IOCounter.numSataAbortedCB++;
 2509 #else
 2510       SA_DBG3(("mpiParseOBIomb, SATA_ABORT Response received IOMB=%p\n", pMsg1));
 2511 #endif
 2512       /* process the response message */
 2513       mpiSATAAbortRsp(agRoot, (agsaSATAAbortRsp_t *)pMsg1);
 2514       break;
 2515     }
 2516     case OPC_OUB_SATA_EVENT:
 2517     {
 2518       SA_DBG3(("mpiParseOBIomb, SATA_EVENT Response received IOMB=%p\n", pMsg1));
 2519       /* process the response message */
 2520       mpiSATAEvent(agRoot, (agsaSATAEventRsp_t *)pMsg1);
 2521       break;
 2522     }
 2523     case OPC_OUB_SSP_EVENT:
 2524     {
 2525       SA_DBG3(("mpiParseOBIomb, SSP_EVENT Response received IOMB=%p\n", pMsg1));
 2526       /* process the response message */
 2527       mpiSSPEvent(agRoot, (agsaSSPEventRsp_t *)pMsg1);
 2528       break;
 2529     }
 2530     case OPC_OUB_SMP_COMP:
 2531     {
 2532 #ifdef SALL_API_TEST
 2533       saRoot->LLCounters.IOCounter.numSMPCompleted++;
 2534       SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p, %d\n",
 2535              pMsg1, saRoot->LLCounters.IOCounter.numSMPCompleted));
 2536 #else
 2537       SA_DBG3(("mpiParseOBIomb, SMP_COMP Response received IOMB=%p\n", pMsg1));
 2538 #endif
 2539       /* process the response message */
 2540       mpiSMPCompletion(agRoot, (agsaSMPCompletionRsp_t *)pMsg1);
 2541       break;
 2542     }
 2543     case OPC_OUB_ECHO:
 2544     {
 2545 #ifdef SALL_API_TEST
 2546       saRoot->LLCounters.IOCounter.numEchoCB++;
 2547       SA_DBG3(("mpiParseOBIomb, ECHO Response received %d\n", saRoot->LLCounters.IOCounter.numEchoCB));
 2548 #else
 2549       SA_DBG3(("mpiParseOBIomb, ECHO Response received\n"));
 2550 #endif
 2551       /* process the response message */
 2552       mpiEchoRsp(agRoot, (agsaEchoRsp_t *)pMsg1);
 2553       break;
 2554     }
 2555     case OPC_OUB_GET_NVMD_DATA:
 2556     {
 2557       SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_NVMD_DATA received IOMB=%p\n", pMsg1));
 2558       /* process the response message */
 2559       mpiGetNVMDataRsp(agRoot, (agsaGetNVMDataRsp_t *)pMsg1);
 2560       break;
 2561     }
 2562     case OPC_OUB_SPC_HW_EVENT:
 2563     {
 2564       SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
 2565       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_HW_EVENT Response received IOMB=%p\n", pMsg1));
 2566       /* process the response message */
 2567       mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1);
 2568       break;
 2569     }
 2570     case OPC_OUB_HW_EVENT:
 2571     {
 2572       SA_DBG3(("mpiParseOBIomb, HW_EVENT Response received IOMB=%p\n", pMsg1));
 2573       /* process the response message */
 2574       mpiHWevent(agRoot, (agsaHWEvent_SPC_OUB_t *)pMsg1);
 2575       break;
 2576     }
 2577     case OPC_OUB_PHY_START_RESPONSE:
 2578     {
 2579       SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_START_RESPONSE Response received IOMB=%p\n", pMsg1));
 2580       /* process the response message */
 2581       mpiPhyStartEvent( agRoot, (agsaHWEvent_Phy_OUB_t  *)pMsg1  );
 2582 
 2583       break;
 2584     }
 2585     case OPC_OUB_PHY_STOP_RESPONSE:
 2586     {
 2587       SA_DBG1(("mpiParseOBIomb, OPC_OUB_PHY_STOP_RESPONSE Response received IOMB=%p\n", pMsg1));
 2588       /* process the response message */
 2589       mpiPhyStopEvent( agRoot, (agsaHWEvent_Phy_OUB_t  *)pMsg1  );
 2590       break;
 2591     }
 2592 
 2593     case OPC_OUB_LOCAL_PHY_CNTRL:
 2594     {
 2595       SA_DBG3(("mpiParseOBIomb, PHY CONTROL Response received IOMB=%p\n", pMsg1));
 2596       /* process the response message */
 2597       mpiPhyCntrlRsp(agRoot, (agsaLocalPhyCntrlRsp_t *)pMsg1);
 2598       break;
 2599     }
 2600     case OPC_OUB_SPC_DEV_REGIST:
 2601     {
 2602       SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
 2603       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SPC_DEV_REGIST Response received IOMB=%p\n", pMsg1));
 2604       /* process the response message */
 2605       mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1);
 2606       break;
 2607     }
 2608     case OPC_OUB_DEV_REGIST:
 2609     {
 2610       SA_DBG2(("mpiParseOBIomb, DEV_REGISTRATION Response received IOMB=%p\n", pMsg1));
 2611       /* process the response message */
 2612       mpiDeviceRegRsp(agRoot, (agsaDeviceRegistrationRsp_t *)pMsg1);
 2613       break;
 2614     }
 2615     case OPC_OUB_DEREG_DEV:
 2616     {
 2617       SA_DBG3(("mpiParseOBIomb, DEREGISTRATION DEVICE Response received IOMB=%p\n", pMsg1));
 2618       /* process the response message */
 2619       mpiDeregDevHandleRsp(agRoot, (agsaDeregDevHandleRsp_t *)pMsg1);
 2620       break;
 2621     }
 2622     case OPC_OUB_GET_DEV_HANDLE:
 2623     {
 2624       SA_DBG3(("mpiParseOBIomb, GET_DEV_HANDLE Response received IOMB=%p\n", pMsg1));
 2625       /* process the response message */
 2626       mpiGetDevHandleRsp(agRoot, (agsaGetDevHandleRsp_t *)pMsg1);
 2627       break;
 2628     }
 2629     case OPC_OUB_SPC_DEV_HANDLE_ARRIV:
 2630     {
 2631       SA_DBG3(("mpiParseOBIomb, SPC_DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1));
 2632       /* process the response message */
 2633       mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1);
 2634       break;
 2635     }
 2636     case OPC_OUB_DEV_HANDLE_ARRIV:
 2637     {
 2638       SA_DBG3(("mpiParseOBIomb, DEV_HANDLE_ARRIV Response received IOMB=%p\n", pMsg1));
 2639       /* process the response message */
 2640       mpiDeviceHandleArrived(agRoot, (agsaDeviceHandleArrivedNotify_t *)pMsg1);
 2641       break;
 2642     }
 2643     case OPC_OUB_SSP_RECV_EVENT:
 2644     {
 2645       SA_DBG3(("mpiParseOBIomb, SSP_RECV_EVENT Response received IOMB=%p\n", pMsg1));
 2646       /* process the response message */
 2647       mpiSSPReqReceivedNotify(agRoot, (agsaSSPReqReceivedNotify_t *)pMsg1);
 2648       break;
 2649     }
 2650     case OPC_OUB_DEV_INFO:
 2651     {
 2652       SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
 2653       SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1));
 2654       /* process the response message */
 2655       mpiGetDevInfoRsp(agRoot, (agsaGetDevInfoRspV_t *)pMsg1);
 2656       break;
 2657     }
 2658     case OPC_OUB_GET_PHY_PROFILE_RSP:
 2659     {
 2660       SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
 2661       SA_DBG2(("mpiParseOBIomb, OPC_OUB_GET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1));
 2662       /* process the response message */
 2663       mpiGetPhyProfileRsp(agRoot, (agsaGetPhyProfileRspV_t *)pMsg1);
 2664       break;
 2665     }
 2666     case OPC_OUB_SET_PHY_PROFILE_RSP:
 2667     {
 2668       SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
 2669       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_PHY_PROFILE_RSP Response received IOMB=%p\n", pMsg1));
 2670       /* process the response message */
 2671       mpiSetPhyProfileRsp(agRoot, (agsaSetPhyProfileRspV_t *)pMsg1);
 2672       break;
 2673     }
 2674     case OPC_OUB_SPC_DEV_INFO:
 2675     {
 2676       SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
 2677       SA_DBG3(("mpiParseOBIomb, DEV_INFO Response received IOMB=%p\n", pMsg1));
 2678       /* process the response message */
 2679       mpiGetDevInfoRspSpc(agRoot, (agsaGetDevInfoRsp_t *)pMsg1);
 2680       break;
 2681     }
 2682     case OPC_OUB_FW_FLASH_UPDATE:
 2683     {
 2684       SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_FLASH_UPDATE Response received IOMB=%p\n", pMsg1));
 2685       /* process the response message */
 2686       mpiFwFlashUpdateRsp(agRoot, (agsaFwFlashUpdateRsp_t *)pMsg1);
 2687       break;
 2688     }
 2689     case OPC_OUB_FLASH_OP_EXT_RSP:
 2690     {
 2691       SA_DBG3(("mpiParseOBIomb, OPC_OUB_FLASH_OP_EXT_RSP Response received IOMB=%p\n", pMsg1));
 2692       /* process the response message */
 2693       mpiFwExtFlashUpdateRsp(agRoot, (agsaFwFlashOpExtRsp_t *)pMsg1);
 2694       break;
 2695     }
 2696 #ifdef SPC_ENABLE_PROFILE
 2697     case OPC_OUB_FW_PROFILE:
 2698     {
 2699       SA_DBG3(("mpiParseOBIomb, OPC_OUB_FW_PROFILE Response received IOMB=%p\n", pMsg1));
 2700       /* process the response message */
 2701       mpiFwProfileRsp(agRoot, (agsaFwProfileRsp_t *)pMsg1);
 2702       break;
 2703     }
 2704 #endif
 2705     case OPC_OUB_SET_NVMD_DATA:
 2706     {
 2707       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_NVMD_DATA received IOMB=%p\n", pMsg1));
 2708       /* process the response message */
 2709       mpiSetNVMDataRsp(agRoot, (agsaSetNVMDataRsp_t *)pMsg1);
 2710       break;
 2711     }
 2712     case OPC_OUB_GPIO_RESPONSE:
 2713     {
 2714       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
 2715       /* process the response message */
 2716       mpiGPIORsp(agRoot, (agsaGPIORsp_t *)pMsg1);
 2717       break;
 2718     }
 2719     case OPC_OUB_GPIO_EVENT:
 2720     {
 2721       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
 2722       /* process the response message */
 2723       mpiGPIOEventRsp(agRoot, (agsaGPIOEvent_t *)pMsg1);
 2724       break;
 2725     }
 2726     case OPC_OUB_GENERAL_EVENT:
 2727     {
 2728       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_GENERAL_EVENT Response received IOMB=%p\n", pMsg1));
 2729       /* process the response message */
 2730       mpiGeneralEventRsp(agRoot, (agsaGeneralEventRsp_t *)pMsg1);
 2731       break;
 2732     }
 2733     case OPC_OUB_SAS_DIAG_MODE_START_END:
 2734     {
 2735       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_MODE_START_END Response received IOMB=%p\n", pMsg1));
 2736       /* process the response message */
 2737       mpiSASDiagStartEndRsp(agRoot, (agsaSASDiagStartEndRsp_t *)pMsg1);
 2738       break;
 2739     }
 2740     case OPC_OUB_SAS_DIAG_EXECUTE:
 2741     {
 2742       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_DIAG_EXECUTE_RSP Response received IOMB=%p\n", pMsg1));
 2743       /* process the response message */
 2744       mpiSASDiagExecuteRsp(agRoot, (agsaSASDiagExecuteRsp_t *)pMsg1);
 2745       break;
 2746     }
 2747     case OPC_OUB_GET_TIME_STAMP:
 2748     {
 2749       SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_TIME_STAMP Response received IOMB=%p\n", pMsg1));
 2750       /* process the response message */
 2751       mpiGetTimeStampRsp(agRoot, (agsaGetTimeStampRsp_t *)pMsg1);
 2752       break;
 2753     }
 2754 
 2755     case OPC_OUB_SPC_SAS_HW_EVENT_ACK:
 2756     {
 2757       SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
 2758       SA_DBG3(("mpiParseOBIomb,OPC_OUB_SPC_SAS_HW_EVENT_ACK  Response received IOMB=%p\n", pMsg1));
 2759       /* process the response message */
 2760       mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1);
 2761       break;
 2762     }
 2763 
 2764     case OPC_OUB_SAS_HW_EVENT_ACK:
 2765     {
 2766       SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
 2767       SA_DBG1(("mpiParseOBIomb, OPC_OUB_SAS_HW_EVENT_ACK Response received IOMB=%p\n", pMsg1));
 2768       /* process the response message */
 2769       mpiSASHwEventAckRsp(agRoot, (agsaSASHwEventAckRsp_t *)pMsg1);
 2770       break;
 2771     }
 2772     case OPC_OUB_PORT_CONTROL:
 2773     {
 2774       SA_DBG1(("mpiParseOBIomb, OPC_OUB_PORT_CONTROL Response received IOMB=%p\n", pMsg1));
 2775       /* process the response message */
 2776       mpiPortControlRsp(agRoot, (agsaPortControlRsp_t *)pMsg1);
 2777       break;
 2778     }
 2779     case OPC_OUB_SMP_ABORT_RSP:
 2780     {
 2781 #ifdef SALL_API_TEST
 2782       saRoot->LLCounters.IOCounter.numSMPAbortedCB++;
 2783       SA_DBG3(("mpiParseOBIomb, SMP_ABORT Response received IOMB=%p, %d\n",
 2784              pMsg1, saRoot->LLCounters.IOCounter.numSMPAbortedCB));
 2785 #else
 2786       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SMP_ABORT_RSP Response received IOMB=%p\n", pMsg1));
 2787 #endif
 2788       /* process the response message */
 2789       mpiSMPAbortRsp(agRoot, (agsaSMPAbortRsp_t *)pMsg1);
 2790       break;
 2791     }
 2792     case OPC_OUB_DEVICE_HANDLE_REMOVAL:
 2793     {
 2794       SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEVICE_HANDLE_REMOVAL received IOMB=%p\n", pMsg1));
 2795       /* process the response message */
 2796       mpiDeviceHandleRemoval(agRoot, (agsaDeviceHandleRemoval_t *)pMsg1);
 2797       break;
 2798     }
 2799     case OPC_OUB_SET_DEVICE_STATE:
 2800     {
 2801       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEVICE_STATE received IOMB=%p\n", pMsg1));
 2802       /* process the response message */
 2803       mpiSetDeviceStateRsp(agRoot, (agsaSetDeviceStateRsp_t *)pMsg1);
 2804       break;
 2805     }
 2806     case OPC_OUB_GET_DEVICE_STATE:
 2807     {
 2808       SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DEVICE_STATE received IOMB=%p\n", pMsg1));
 2809       /* process the response message */
 2810       mpiGetDeviceStateRsp(agRoot, (agsaGetDeviceStateRsp_t *)pMsg1);
 2811       break;
 2812     }
 2813     case OPC_OUB_SET_DEV_INFO:
 2814     {
 2815       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_DEV_INFO received IOMB=%p\n", pMsg1));
 2816       /* process the response message */
 2817       mpiSetDevInfoRsp(agRoot, (agsaSetDeviceInfoRsp_t *)pMsg1);
 2818       break;
 2819     }
 2820     case OPC_OUB_SAS_RE_INITIALIZE:
 2821     {
 2822       SA_ASSERT((smIS_SPC(agRoot)), "smIS_SPC");
 2823       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SAS_RE_INITIALIZE received IOMB=%p\n", pMsg1));
 2824       /* process the response message */
 2825       mpiSasReInitializeRsp(agRoot, (agsaSasReInitializeRsp_t *)pMsg1);
 2826       break;
 2827     }
 2828 
 2829     case OPC_OUB_SGPIO_RESPONSE:
 2830     {
 2831       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SGPIO_RESPONSE Response received IOMB=%p\n", pMsg1));
 2832       /* process the response message */
 2833       mpiSGpioRsp(agRoot, (agsaSGpioRsp_t *)pMsg1);
 2834       break;
 2835     }
 2836 
 2837     case OPC_OUB_PCIE_DIAG_EXECUTE:
 2838     {
 2839       SA_DBG3(("mpiParseOBIomb, OPC_OUB_PCIE_DIAG_EXECUTE Response received IOMB=%p\n", pMsg1));
 2840       /* process the response message */
 2841       mpiPCIeDiagExecuteRsp(agRoot, (agsaPCIeDiagExecuteRsp_t *)pMsg1);
 2842       break;
 2843     }
 2844 
 2845     case OPC_OUB_GET_VIST_CAP_RSP:
 2846     {
 2847       SA_DBG3(("mpiParseOBIomb, OPC_INB_GET_VIST_CAP Response received IOMB=%p\n", pMsg1));
 2848       /* process the response message */
 2849       mpiGetVHistRsp(agRoot, (agsaGetVHistCapRsp_t *)pMsg1);
 2850       break;
 2851     }
 2852     case 2104:
 2853     {
 2854       if(smIS_SPC6V(agRoot))
 2855       {
 2856         SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_DFE_DATA_RSP Response received IOMB=%p\n", pMsg1));
 2857         /* process the response message */
 2858         mpiGetDFEDataRsp(agRoot, (agsaGetDDEFDataRsp_t *)pMsg1);
 2859       }
 2860       if(smIS_SPC12V(agRoot))
 2861       {
 2862         SA_DBG3(("mpiParseOBIomb, OPC_INB_GET_VIST_CAP Response received IOMB=%p\n", pMsg1));
 2863         /* process the response message */
 2864         mpiGetVHistRsp(agRoot, (agsaGetVHistCapRsp_t *)pMsg1);
 2865       }  
 2866       else
 2867       {
 2868         SA_DBG1(("mpiParseOBIomb, 2104  Response received IOMB=%p\n", pMsg1));
 2869         /* process the response message */
 2870       }
 2871       break;
 2872     }
 2873     case OPC_OUB_SET_CONTROLLER_CONFIG:
 2874     {
 2875       SA_DBG3(("mpiParseOBIomb, OPC_OUB_SET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1));
 2876       mpiSetControllerConfigRsp(agRoot, (agsaSetControllerConfigRsp_t *)pMsg1);
 2877       break;
 2878     }
 2879     case OPC_OUB_GET_CONTROLLER_CONFIG:
 2880     {
 2881       SA_DBG3(("mpiParseOBIomb, OPC_OUB_GET_CONTROLLER_CONFIG Response received IOMB=%p\n", pMsg1));
 2882       mpiGetControllerConfigRsp(agRoot, (agsaGetControllerConfigRsp_t *)pMsg1);
 2883       break;
 2884     }
 2885     case OPC_OUB_KEK_MANAGEMENT:
 2886     {
 2887       SA_DBG3(("mpiParseOBIomb, OPC_OUB_KEK_MANAGEMENT Response received IOMB=%p\n", pMsg1));
 2888       mpiKekManagementRsp(agRoot, (agsaKekManagementRsp_t *)pMsg1);
 2889       break;
 2890     }
 2891     case OPC_OUB_DEK_MANAGEMENT:
 2892     {
 2893       SA_DBG3(("mpiParseOBIomb, OPC_OUB_DEK_MANAGEMENT Response received IOMB=%p\n", pMsg1));
 2894       mpiDekManagementRsp(agRoot, (agsaDekManagementRsp_t *)pMsg1);
 2895       break;
 2896     }
 2897     case OPC_OUB_OPR_MGMT:
 2898     {
 2899       SA_DBG1(("mpiParseOBIomb, OPC_OUB_OPR_MGMT Response received IOMB=%p\n", pMsg1));
 2900       mpiOperatorManagementRsp(agRoot, (agsaOperatorMangmenRsp_t *)pMsg1);
 2901       break;
 2902     }
 2903     case OPC_OUB_ENC_TEST_EXECUTE:
 2904     {
 2905       SA_DBG1(("mpiParseOBIomb, OPC_OUB_ENC_TEST_EXECUTE Response received IOMB=%p\n", pMsg1));
 2906       mpiBistRsp(agRoot, (agsaEncryptBistRsp_t *)pMsg1);
 2907       break;
 2908     }
 2909     case OPC_OUB_SET_OPERATOR:
 2910     {
 2911       SA_DBG1(("mpiParseOBIomb, OPC_OUB_SET_OPERATOR Response received IOMB=%p\n", pMsg1));
 2912       mpiSetOperatorRsp(agRoot, (agsaSetOperatorRsp_t *)pMsg1);
 2913       break;
 2914     }
 2915     case OPC_OUB_GET_OPERATOR:
 2916     {
 2917       SA_DBG1(("mpiParseOBIomb, OPC_OUB_GET_OPERATOR Response received IOMB=%p\n", pMsg1));
 2918       mpiGetOperatorRsp(agRoot, (agsaGetOperatorRsp_t *)pMsg1);
 2919       break;
 2920     }
 2921     case OPC_OUB_DIF_ENC_OFFLOAD_RSP:
 2922     {
 2923       SA_ASSERT((smIS_SPCV(agRoot)), "smIS_SPCV");
 2924       SA_DBG1(("mpiParseOBIomb, OPC_OUB_DIF_ENC_OFFLOAD_RSP Response received IOMB=%p\n", pMsg1));
 2925       /* process the response message */
 2926       mpiDifEncOffloadRsp(agRoot, (agsaDifEncOffloadRspV_t *)pMsg1);
 2927       break;
 2928     }
 2929     default:
 2930     {
 2931 #ifdef SALL_API_TEST
 2932       saRoot->LLCounters.IOCounter.numUNKNWRespIOMB++;
 2933       SA_DBG1(("mpiParseOBIomb, UnKnown Response received IOMB=%p, %d\n",
 2934              pMsg1, saRoot->LLCounters.IOCounter.numUNKNWRespIOMB));
 2935 #else
 2936       SA_DBG1(("mpiParseOBIomb, Unknown IOMB Response received opcode 0x%X IOMB=%p\n",opcode, pMsg1));
 2937 #endif
 2938       break;
 2939     }
 2940   } /* switch */
 2941 
 2942   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2f");
 2943 
 2944   return ret;
 2945 
 2946 }
 2947 
 2948 
 2949 /******************************************************************************/
 2950 /*! \brief SPC MPI SATA Completion
 2951  *
 2952  *  This function handles the SATA completion.
 2953  *
 2954  *  \param agRoot       Handles for this instance of SAS/SATA LLL
 2955  *  \param pIomb1       Pointer of Message1
 2956  *  \param bc           buffer count
 2957  *
 2958  *  \return The read value
 2959  *
 2960  */
 2961 /*******************************************************************************/
 2962 GLOBAL FORCEINLINE
 2963 bit32 mpiSATACompletion(
 2964   agsaRoot_t    *agRoot,
 2965   bit32         *pIomb1
 2966   )
 2967 {
 2968   bit32                     ret = AGSA_RC_SUCCESS;
 2969   agsaLLRoot_t              *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 2970   bit32                     status;
 2971   bit32                     tag;
 2972   bit32                     param;
 2973   agsaIORequestDesc_t       *pRequest;
 2974   bit32                     *agFirstDword;
 2975   bit32                     *pResp;
 2976 
 2977   smTraceFuncEnter(hpDBG_VERY_LOUD,"2s");
 2978 
 2979   OSSA_READ_LE_32(AGROOT, &tag, pIomb1, OSSA_OFFSET_OF(agsaSATACompletionRsp_t, tag)) ;
 2980   OSSA_READ_LE_32(AGROOT, &status, pIomb1, OSSA_OFFSET_OF(agsaSATACompletionRsp_t, status)) ;
 2981   OSSA_READ_LE_32(AGROOT, &param, pIomb1, OSSA_OFFSET_OF(agsaSATACompletionRsp_t, param)) ;
 2982 
 2983   SA_DBG3(("mpiSATACompletion: start, HTAG=0x%x\n", tag));
 2984 
 2985   /* get IOrequest from IOMap */
 2986   pRequest  = (agsaIORequestDesc_t*)saRoot->IOMap[tag].IORequest;
 2987   SA_ASSERT((pRequest), "pRequest");
 2988 
 2989   if(agNULL == pRequest)
 2990   {
 2991     SA_DBG1(("mpiSATACompletion: agNULL == pRequest tag 0x%X status 0x%X\n",tag, status ));
 2992     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2s");
 2993     return AGSA_RC_FAILURE;
 2994   }
 2995 
 2996   SA_ASSERT((pRequest->valid), "pRequest->valid");
 2997   if(!pRequest->valid)
 2998   {
 2999     SA_DBG1(("mpiSATACompletion: not valid IOMB tag=0x%x status=0x%x param=0x%x Device =0x%x\n", tag, status, param,
 3000     pRequest->pDevice ? pRequest->pDevice->DeviceMapIndex : -1));
 3001   }
 3002 
 3003   switch (status)
 3004   {
 3005     case OSSA_IO_SUCCESS:
 3006     {
 3007       SA_DBG3(("mpiSATACompletion: OSSA_IO_SUCCESS, param=0x%x\n", param));
 3008       if (!param)
 3009       {
 3010         /* SATA request completion */
 3011         siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, 0);
 3012       }
 3013       else
 3014       {
 3015         /* param number bytes of SATA Rsp */
 3016         agFirstDword  = &pIomb1[3];
 3017         pResp         = &pIomb1[4];
 3018 
 3019         /* CB function to the up layer */
 3020         /* Response Length not include firstDW */
 3021         saRoot->IoErrorCount.agOSSA_IO_COMPLETED_ERROR_SCSI_STATUS++;
 3022         SA_DBG2(("mpiSATACompletion: param 0x%x agFirstDwordResp 0x%x Resp 0x%x tag 0x%x\n",param,*agFirstDword,*pResp ,tag));
 3023         siEventSATAResponseWtDataRcvd(agRoot, pRequest, agFirstDword, pResp, (param - 4));
 3024       }
 3025 
 3026       break;
 3027     }
 3028     case OSSA_IO_ABORTED:
 3029     {
 3030       SA_DBG2(("mpiSATACompletion: OSSA_IO_ABORTED tag 0x%X\n", tag));
 3031       saRoot->IoErrorCount.agOSSA_IO_ABORTED++;
 3032       siAbnormal(agRoot, pRequest, status, param, 0);
 3033       break;
 3034     }
 3035     case OSSA_IO_UNDERFLOW:
 3036     {
 3037       /* SATA Completion with error */
 3038       SA_DBG1(("mpiSATACompletion, OSSA_IO_UNDERFLOW tag 0x%X\n", tag));
 3039       /*underflow means underrun, treat it as success*/
 3040       saRoot->IoErrorCount.agOSSA_IO_UNDERFLOW++;
 3041       siAbnormal(agRoot, pRequest, status, param, 0);
 3042       break;
 3043     }
 3044     case OSSA_IO_NO_DEVICE:
 3045     {
 3046       SA_DBG1(("mpiSATACompletion, OSSA_IO_NO_DEVICE tag 0x%X\n", tag));
 3047       saRoot->IoErrorCount.agOSSA_IO_NO_DEVICE++;
 3048       siAbnormal(agRoot, pRequest, status, 0, 0);
 3049       break;
 3050     }
 3051     case OSSA_IO_XFER_ERROR_BREAK:
 3052     {
 3053       SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_BREAK SPC tag 0x%X\n", tag));
 3054       saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_BREAK++;
 3055       siAbnormal(agRoot, pRequest, status, 0, 0);
 3056       break;
 3057     }
 3058     case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
 3059     {
 3060       SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_PHY_NOT_READY tag 0x%X\n", tag));
 3061       saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
 3062       siAbnormal(agRoot, pRequest, status, 0, 0);
 3063       break;
 3064     }
 3065     case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
 3066     {
 3067       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED tag 0x%X\n", tag));
 3068       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
 3069       siAbnormal(agRoot, pRequest, status, 0, 0);
 3070       break;
 3071     }
 3072     case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
 3073     {
 3074       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION tag 0x%X\n", tag));
 3075       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
 3076       siAbnormal(agRoot, pRequest, status, 0, 0);
 3077       break;
 3078     }
 3079     case OSSA_IO_OPEN_CNX_ERROR_BREAK:
 3080     {
 3081       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_BREAK SPC tag 0x%X\n", tag));
 3082       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
 3083       siAbnormal(agRoot, pRequest, status, 0, 0);
 3084       break;
 3085     }
 3086     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
 3087     {
 3088       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS tag 0x%X\n", tag));
 3089       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
 3090       siAbnormal(agRoot, pRequest, status, 0, 0);
 3091       break;
 3092     }
 3093     case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
 3094     {
 3095       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION tag 0x%X\n", tag));
 3096       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
 3097       siAbnormal(agRoot, pRequest, status, 0, 0);
 3098       break;
 3099     }
 3100     case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
 3101     {
 3102       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED tag 0x%X\n", tag));
 3103       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
 3104       siAbnormal(agRoot, pRequest, status, 0, 0);
 3105       break;
 3106     }
 3107     case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
 3108     {
 3109       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY tag 0x%X\n", tag));
 3110       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY++;
 3111       siAbnormal(agRoot, pRequest, status, 0, 0);
 3112       break;
 3113     }
 3114     case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
 3115     {
 3116       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION tag 0x%X\n", tag));
 3117       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
 3118       siAbnormal(agRoot, pRequest, status, 0, 0);
 3119       break;
 3120     }
 3121     case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
 3122     {
 3123       SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_NAK_RECEIVED tag 0x%X\n", tag));
 3124       saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++;
 3125       siAbnormal(agRoot, pRequest, status, 0, 0);
 3126       break;
 3127     }
 3128     case OSSA_IO_XFER_ERROR_DMA:
 3129     {
 3130        SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_DMA tag 0x%X\n", tag));
 3131        saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_DMA++;
 3132        siAbnormal(agRoot, pRequest, status, 0, 0);
 3133        break;
 3134     }
 3135     case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT:
 3136     {
 3137       SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT tag 0x%X\n", tag));
 3138       saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT++;
 3139       siAbnormal(agRoot, pRequest, status, 0, 0);
 3140       break;
 3141     }
 3142     case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE:
 3143     {
 3144       SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE tag 0x%X\n", tag));
 3145       saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE++;
 3146       siAbnormal(agRoot, pRequest, status, 0, 0);
 3147       break;
 3148     }
 3149     case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
 3150     {
 3151        SA_DBG1(("mpiSATACompletion, OSSA_IO_XFER_OPEN_RETRY_TIMEOUT tag 0x%X\n", tag));
 3152        saRoot->IoErrorCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
 3153        siAbnormal(agRoot, pRequest, status, 0, 0);
 3154        break;
 3155     }
 3156     case OSSA_IO_PORT_IN_RESET:
 3157     {
 3158       SA_DBG1(("mpiSATACompletion: OSSA_IO_PORT_IN_RESET tag 0x%X\n", tag));
 3159       saRoot->IoErrorCount.agOSSA_IO_PORT_IN_RESET++;
 3160       siAbnormal(agRoot, pRequest, status, 0, 0);
 3161       break;
 3162     }
 3163     case OSSA_IO_DS_NON_OPERATIONAL:
 3164     {
 3165       SA_DBG1(("mpiSATACompletion: OSSA_IO_DS_NON_OPERATIONAL tag 0x%X\n", tag));
 3166       saRoot->IoErrorCount.agOSSA_IO_DS_NON_OPERATIONAL++;
 3167       siAbnormal(agRoot, pRequest, status, 0, 0);
 3168       break;
 3169     }
 3170     case OSSA_IO_DS_IN_RECOVERY:
 3171     {
 3172       SA_DBG1(("mpiSATACompletion: OSSA_IO_DS_IN_RECOVERY tag 0x%X\n", tag));
 3173       saRoot->IoErrorCount.agOSSA_IO_DS_IN_RECOVERY++;
 3174       siAbnormal(agRoot, pRequest, status, 0, 0);
 3175       break;
 3176     }
 3177     case OSSA_IO_DS_IN_ERROR:
 3178     {
 3179       SA_DBG1(("mpiSATACompletion: OSSA_IO_DS_IN_ERROR tag 0x%X\n", tag));
 3180       saRoot->IoErrorCount.agOSSA_IO_DS_IN_ERROR++;
 3181       siAbnormal(agRoot, pRequest, status, 0, 0);
 3182       break;
 3183     }
 3184 
 3185     case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY:
 3186     {
 3187       SA_DBG1(("mpiSATACompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY tag 0x%X\n", tag));
 3188       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY++;
 3189       siAbnormal(agRoot, pRequest, status, 0, 0);
 3190       break;
 3191     }
 3192     case OSSA_IO_ABORT_IN_PROGRESS:
 3193     {
 3194       SA_DBG1(("mpiSATACompletion: OSSA_IO_ABORT_IN_PROGRESS tag 0x%X\n", tag));
 3195       saRoot->IoErrorCount.agOSSA_IO_ABORT_IN_PROGRESS++;
 3196       siAbnormal(agRoot, pRequest, status, 0, 0);
 3197       break;
 3198     }
 3199     case OSSA_IO_ABORT_DELAYED:
 3200     {
 3201       SA_DBG1(("mpiSATACompletion: OSSA_IO_ABORT_DELAYED tag 0x%X\n", tag));
 3202       saRoot->IoErrorCount.agOSSA_IO_ABORT_DELAYED++;
 3203       siAbnormal(agRoot, pRequest, status, 0, 0);
 3204       break;
 3205     }
 3206     case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT:
 3207     {
 3208       SA_DBG1(("mpiSATACompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT tag 0x%X\n", tag));
 3209       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT++;
 3210       siAbnormal(agRoot, pRequest, status, 0, 0);
 3211       break;
 3212     }
 3213     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
 3214     {
 3215       SA_DBG1(("mpiSATACompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x\n", tag));
 3216       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
 3217       siAbnormal(agRoot, pRequest, status, 0, 0);
 3218       break;
 3219     }
 3220     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
 3221     {
 3222       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO tag 0x%x\n", tag));
 3223       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++;
 3224       siAbnormal(agRoot, pRequest, status, 0, 0 );
 3225       break;
 3226     }
 3227     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
 3228     {
 3229       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST tag 0x%x\n", tag));
 3230       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
 3231       siAbnormal(agRoot, pRequest, status, 0, 0 );
 3232       break;
 3233     }
 3234     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
 3235     {
 3236       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE tag 0x%x\n", tag));
 3237       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++;
 3238       siAbnormal(agRoot, pRequest, status, 0, 0 );
 3239       break;
 3240     }
 3241     case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
 3242     {
 3243       SA_DBG1(("mpiSATACompletion, OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED tag 0x%x\n", tag));
 3244       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
 3245       siAbnormal(agRoot, pRequest, status, 0, 0 );
 3246       break;
 3247     }
 3248     case OSSA_IO_DS_INVALID:
 3249     {
 3250       SA_DBG1(("mpiSATACompletion: OSSA_IO_DS_INVALID tag 0x%X\n", tag));
 3251       saRoot->IoErrorCount.agOSSA_IO_DS_INVALID++;
 3252       siAbnormal(agRoot, pRequest, status, 0, 0);
 3253       break;
 3254     }
 3255     case OSSA_IO_XFER_ERR_LAST_PIO_DATAIN_CRC_ERR:
 3256     {
 3257       SA_DBG1(("mpiSATACompletion: OSSA_IO_XFER_ERR_LAST_PIO_DATAIN_CRC_ERR tag 0x%X\n", tag));
 3258       saRoot->IoErrorCount.agOSSA_IO_XFER_ERR_LAST_PIO_DATAIN_CRC_ERR++;
 3259       siAbnormal(agRoot, pRequest, status, 0, 0);
 3260       break;
 3261     }
 3262     case OSSA_MPI_IO_RQE_BUSY_FULL:
 3263     {
 3264       SA_DBG1(("mpiSATACompletion: OSSA_MPI_IO_RQE_BUSY_FULL tag 0x%X\n", tag));
 3265       saRoot->IoErrorCount.agOSSA_MPI_IO_RQE_BUSY_FULL++;
 3266       siAbnormal(agRoot, pRequest, status, 0, 0);
 3267       break;
 3268     }
 3269 #ifdef REMOVED
 3270     case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
 3271     {
 3272       SA_DBG1(("mpiSATACompletion: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN tag 0x%x\n", tag));
 3273       saRoot->IoErrorCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++;
 3274       siAbnormal(agRoot, pRequest, status, 0, 0);
 3275       break;
 3276     }
 3277 #endif
 3278     case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
 3279     {
 3280       SA_DBG1(("mpiSATACompletion: OPC_OUB_SATA_COMP:OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE \n"));
 3281       saRoot->IoErrorCount.agOSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE++;
 3282       siAbnormal(agRoot, pRequest, status, 0, 0);
 3283       break;
 3284     }
 3285     case OSSA_MPI_ERR_ATAPI_DEVICE_BUSY:
 3286     {
 3287       SA_DBG1(("mpiSATACompletion: OSSA_MPI_ERR_ATAPI_DEVICE_BUSY tag 0x%X\n", tag));
 3288       saRoot->IoErrorCount.agOSSA_MPI_ERR_ATAPI_DEVICE_BUSY++;
 3289       siAbnormal(agRoot, pRequest, status, param, 0 );
 3290       break;
 3291     }
 3292     case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
 3293     {
 3294       SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS tag 0x%X\n", tag));
 3295       saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS++;
 3296       siAbnormal(agRoot, pRequest, status, 0, 0);
 3297       break;
 3298     }
 3299     case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
 3300     {
 3301       SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID tag 0x%X\n", tag));
 3302       saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS++;
 3303       siAbnormal(agRoot, pRequest, status, 0, 0);
 3304       break;
 3305     }
 3306     case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
 3307     {
 3308       SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH tag 0x%X\n", tag));
 3309       saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_IV_MISMATCH++;
 3310       siAbnormal(agRoot, pRequest, status, 0, 0);
 3311       break;
 3312     }
 3313     case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
 3314     {
 3315       SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR tag 0x%X\n", tag));
 3316       saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR++;
 3317       siAbnormal(agRoot, pRequest, status, 0, 0);
 3318       break;
 3319     }
 3320     case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED:
 3321     {
 3322       SA_DBG1(("mpiSATACompletion: OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED tag 0x%X\n", tag));
 3323       saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED++;
 3324       siAbnormal(agRoot, pRequest, status, 0, 0);
 3325       break;
 3326     }
 3327 
 3328     case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
 3329     {
 3330       SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH tag 0x%X\n", tag));
 3331       saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH++;
 3332       siAbnormal(agRoot, pRequest, status, 0, 0);
 3333       break;
 3334     }
 3335     case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS:
 3336     {
 3337       SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS tag 0x%X\n", tag));
 3338       saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS++;
 3339       siAbnormal(agRoot, pRequest, status, 0, 0);
 3340       break;
 3341     }
 3342     case OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE:
 3343     {
 3344       SA_DBG1(("mpiSATACompletion: OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE tag 0x%X\n", tag));
 3345       saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS++;
 3346       siAbnormal(agRoot, pRequest, status, 0, 0);
 3347       break;
 3348     }
 3349 
 3350     default:
 3351     {
 3352       SA_DBG1(("mpiSATACompletion: Unknown status  0x%x tag 0x%x\n", status, tag));
 3353       saRoot->IoErrorCount.agOSSA_IO_UNKNOWN_ERROR++;
 3354       siAbnormal(agRoot, pRequest, status, param, 0);
 3355       break;
 3356     }
 3357   }
 3358 
 3359   /* The HTag should equal to the IOMB tag */
 3360   if (pRequest->HTag != tag)
 3361   {
 3362     SA_DBG1(("mpiSATACompletion: Error Htag %d not equal IOMBtag %d\n", pRequest->HTag, tag));
 3363   }
 3364 
 3365   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2s");
 3366   return ret;
 3367 }
 3368 
 3369 /******************************************************************************/
 3370 /*! \brief SPC MPI SSP Completion
 3371  *
 3372  *  This function handles the SSP completion.
 3373  *
 3374  *  \param agRoot       Handles for this instance of SAS/SATA LLL
 3375  *  \param pIomb1       Pointer of Message1
 3376  *  \param bc           buffer count
 3377  *
 3378  *  \return The read value
 3379  *
 3380  */
 3381 /*******************************************************************************/
 3382 GLOBAL FORCEINLINE
 3383 bit32 mpiSSPCompletion(
 3384   agsaRoot_t    *agRoot,
 3385   bit32         *pIomb1
 3386   )
 3387 {
 3388   agsaLLRoot_t              *saRoot   = (agsaLLRoot_t *)(agRoot->sdkData);
 3389   agsaSSPCompletionRsp_t    *pIomb    = (agsaSSPCompletionRsp_t *)pIomb1;
 3390   agsaIORequestDesc_t       *pRequest = agNULL;
 3391   agsaSSPResponseInfoUnit_t *pRespIU  = agNULL;
 3392   bit32                      tag      = 0;
 3393   bit32                      sspTag   = 0;
 3394   bit32                      status, param = 0;
 3395   bit32                      ret = AGSA_RC_SUCCESS;
 3396 
 3397   smTraceFuncEnter(hpDBG_VERY_LOUD, "5A");
 3398 
 3399   /* get Tag */
 3400   OSSA_READ_LE_32(agRoot, &tag, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionRsp_t, tag));
 3401   OSSA_READ_LE_32(agRoot, &status, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionRsp_t, status));
 3402   OSSA_READ_LE_32(agRoot, &param, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionRsp_t, param));
 3403   OSSA_READ_LE_32(agRoot, &sspTag, pIomb, OSSA_OFFSET_OF(agsaSSPCompletionRsp_t, SSPTag));
 3404   /* get SSP_START IOrequest from IOMap */
 3405   pRequest = (agsaIORequestDesc_t *)saRoot->IOMap[tag].IORequest;
 3406   SA_ASSERT((pRequest), "pRequest");
 3407 
 3408   if(pRequest == agNULL)
 3409   {
 3410     SA_DBG1(("mpiSSPCompletion,AGSA_RC_FAILURE SSP Resp IOMB tag=0x%x, status=0x%x, param=0x%x, SSPTag=0x%x\n", tag, status, param, sspTag));
 3411     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5A");
 3412     return(AGSA_RC_FAILURE);
 3413   }
 3414   SA_ASSERT((pRequest->valid), "pRequest->valid");
 3415 
 3416   if(!pRequest->valid)
 3417   {
 3418     SA_DBG1(("mpiSSPCompletion, SSP Resp IOMB tag=0x%x, status=0x%x, param=0x%x, SSPTag=0x%x Device =0x%x\n", tag, status, param, sspTag,
 3419     pRequest->pDevice ? pRequest->pDevice->DeviceMapIndex : -1));
 3420   }
 3421 
 3422   switch (status)
 3423   {
 3424     case OSSA_IO_SUCCESS:
 3425     {
 3426       if (!param)
 3427       {
 3428         /* Completion of SSP without Response Data */
 3429         siIODone( agRoot, pRequest, OSSA_IO_SUCCESS, sspTag);
 3430       }
 3431       else
 3432       {
 3433         /* Get SSP Response with Response Data */
 3434         pRespIU = (agsaSSPResponseInfoUnit_t *)&(pIomb->SSPrsp);
 3435         if (pRespIU->status == 0x02 || pRespIU->status == 0x18 ||
 3436             pRespIU->status == 0x30 || pRespIU->status == 0x40 )
 3437         {
 3438           /* SCSI status is CHECK_CONDITION, RESV_CONFLICT, ACA_ACTIVE, TASK_ABORTED */
 3439           saRoot->IoErrorCount.agOSSA_IO_COMPLETED_ERROR_SCSI_STATUS++;
 3440           SA_DBG2(("mpiSSPCompletion: pRespIU->status 0x%x tag 0x%x\n", pRespIU->status,tag));
 3441         }
 3442         siEventSSPResponseWtDataRcvd(agRoot, pRequest, pRespIU, param, sspTag);
 3443       }
 3444 
 3445       break;
 3446     }
 3447 
 3448     case OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME:
 3449     {
 3450       SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3451       saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME++;
 3452       /* Get SSP Response with Response Data */
 3453       pRespIU = (agsaSSPResponseInfoUnit_t *)&(pIomb->SSPrsp);
 3454       if (pRespIU->status == 0x02 || pRespIU->status == 0x18 ||
 3455           pRespIU->status == 0x30 || pRespIU->status == 0x40 )
 3456       {
 3457         /* SCSI status is CHECK_CONDITION, RESV_CONFLICT, ACA_ACTIVE, TASK_ABORTED */
 3458         saRoot->IoErrorCount.agOSSA_IO_COMPLETED_ERROR_SCSI_STATUS++;
 3459         SA_DBG2(("mpiSSPCompletion: pRespIU->status 0x%x tag 0x%x\n", pRespIU->status,tag));
 3460       }
 3461       siEventSSPResponseWtDataRcvd(agRoot, pRequest, pRespIU, param, sspTag);
 3462 
 3463       break;
 3464      }
 3465 
 3466      case OSSA_IO_ABORTED:
 3467      {
 3468 #ifdef SALL_API_TEST
 3469        saRoot->LLCounters.IOCounter.numSSPAborted++;
 3470        SA_DBG3(("mpiSSPCompletion, OSSA_IO_ABORTED Response received IOMB=%p %d\n",
 3471               pIomb1, saRoot->LLCounters.IOCounter.numSSPAborted));
 3472 #endif
 3473        SA_DBG2(("mpiSSPCompletion, OSSA_IO_ABORTED IOMB tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3474        saRoot->IoErrorCount.agOSSA_IO_ABORTED++;
 3475        /* SSP Abort CB */
 3476        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3477        break;
 3478      }
 3479      case OSSA_IO_UNDERFLOW:
 3480      {
 3481        /* SSP Completion with error */
 3482        SA_DBG2(("mpiSSPCompletion, OSSA_IO_UNDERFLOW tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3483        /*saRoot->IoErrorCount.agOSSA_IO_UNDERFLOW++;*/
 3484        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3485        break;
 3486      }
 3487      case OSSA_IO_NO_DEVICE:
 3488      {
 3489        SA_DBG1(("mpiSSPCompletion: OSSA_IO_NO_DEVICE tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3490        saRoot->IoErrorCount.agOSSA_IO_NO_DEVICE++;
 3491        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3492        break;
 3493      }
 3494      case OSSA_IO_XFER_ERROR_BREAK:
 3495      {
 3496        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_BREAK tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3497        saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_BREAK++;
 3498        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3499        break;
 3500      }
 3501      case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
 3502      {
 3503        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_PHY_NOT_READY tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3504        saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_PHY_NOT_READY++;
 3505        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3506        break;
 3507      }
 3508      case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
 3509      {
 3510        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3511        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED++;
 3512        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3513        break;
 3514      }
 3515      case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
 3516      {
 3517        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION++;
 3518        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3519        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3520        break;
 3521      }
 3522      case OSSA_IO_OPEN_CNX_ERROR_BREAK:
 3523      {
 3524        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_BREAK tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3525        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BREAK++;
 3526        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3527        break;
 3528      }
 3529      case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
 3530      {
 3531        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3532        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS++;
 3533        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3534        break;
 3535      }
 3536      case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
 3537      {
 3538        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3539        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION++;
 3540        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3541        break;
 3542      }
 3543      case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
 3544      {
 3545        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3546        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED++;
 3547        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3548        break;
 3549      }
 3550      case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
 3551      {
 3552        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3553        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION++;
 3554        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3555        break;
 3556      }
 3557      case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
 3558      {
 3559        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_NAK_RECEIVED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3560        saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_NAK_RECEIVED++;
 3561        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3562        break;
 3563      }
 3564      case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT:
 3565      {
 3566        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3567        saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT++;
 3568        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3569        break;
 3570      }
 3571      case OSSA_IO_XFER_ERROR_DMA:
 3572      {
 3573        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_DMA tag 0x%x ssptag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3574        saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_DMA++;
 3575        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3576        break;
 3577      }
 3578      case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
 3579      {
 3580        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3581        saRoot->IoErrorCount.agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT++;
 3582        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3583        break;
 3584      }
 3585      case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
 3586      {
 3587        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3588        saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE++;
 3589        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3590        break;
 3591      }
 3592      case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
 3593      {
 3594        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3595        saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH++;
 3596        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3597        break;
 3598      }
 3599      case OSSA_IO_PORT_IN_RESET:
 3600      {
 3601        SA_DBG1(("mpiSSPCompletion: OSSA_IO_PORT_IN_RESET tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3602        saRoot->IoErrorCount.agOSSA_IO_PORT_IN_RESET++;
 3603        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3604        break;
 3605      }
 3606      case OSSA_IO_DS_NON_OPERATIONAL:
 3607      {
 3608        SA_DBG1(("mpiSSPCompletion: OSSA_IO_DS_NON_OPERATIONAL tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3609        saRoot->IoErrorCount.agOSSA_IO_DS_NON_OPERATIONAL++;
 3610        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3611        break;
 3612      }
 3613      case OSSA_IO_DS_IN_RECOVERY:
 3614      {
 3615        SA_DBG1(("mpiSSPCompletion: OSSA_IO_DS_IN_RECOVERY tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3616        saRoot->IoErrorCount.agOSSA_IO_DS_IN_RECOVERY++;
 3617        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3618        break;
 3619      }
 3620      case OSSA_IO_TM_TAG_NOT_FOUND:
 3621      {
 3622        SA_DBG1(("mpiSSPCompletion: OSSA_IO_TM_TAG_NOT_FOUND tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3623        saRoot->IoErrorCount.agOSSA_IO_TM_TAG_NOT_FOUND++;
 3624        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3625        break;
 3626      }
 3627      case OSSA_IO_XFER_PIO_SETUP_ERROR:
 3628      {
 3629        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_PIO_SETUP_ERROR tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3630        saRoot->IoErrorCount.agOSSA_IO_XFER_PIO_SETUP_ERROR++;
 3631        /* not allowed case. Therefore, return failed status */
 3632        siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag);
 3633        break;
 3634      }
 3635      case OSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR:
 3636      {
 3637        SA_DBG1(("mpiSSPCompletion: OSSA_IO_SSP_IU_ZERO_LEN_ERROR tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3638        saRoot->IoErrorCount.agOSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR++;
 3639        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3640        break;
 3641      }
 3642      case OSSA_IO_DS_IN_ERROR:
 3643      {
 3644        SA_DBG1(("mpiSSPCompletion: OSSA_IO_DS_IN_ERROR tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3645        saRoot->IoErrorCount.agOSSA_IO_DS_IN_ERROR++;
 3646        /* not allowed case. Therefore, return failed status */
 3647        siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag);
 3648        break;
 3649      }
 3650      case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY:
 3651      {
 3652        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3653        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY++;
 3654        /* not allowed case. Therefore, return failed status */
 3655        siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag);
 3656        break;
 3657      }
 3658      case OSSA_IO_ABORT_IN_PROGRESS:
 3659      {
 3660        SA_DBG1(("mpiSSPCompletion: OSSA_IO_ABORT_IN_PROGRESS tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3661        saRoot->IoErrorCount.agOSSA_IO_ABORT_IN_PROGRESS++;
 3662        /* not allowed case. Therefore, return failed status */
 3663        siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag);
 3664        break;
 3665      }
 3666      case OSSA_IO_ABORT_DELAYED:
 3667      {
 3668        SA_DBG1(("mpiSSPCompletion: OSSA_IO_ABORT_DELAYED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3669        saRoot->IoErrorCount.agOSSA_IO_ABORT_DELAYED++;
 3670        /* not allowed case. Therefore, return failed status */
 3671        siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag);
 3672        break;
 3673      }
 3674      case OSSA_IO_INVALID_LENGTH:
 3675      {
 3676        SA_DBG1(("mpiSSPCompletion: OSSA_IO_INVALID_LENGTH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3677        saRoot->IoErrorCount.agOSSA_IO_INVALID_LENGTH++;
 3678        /* not allowed case. Therefore, return failed status */
 3679        siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag);
 3680        break;
 3681      }
 3682      case OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT:
 3683      {
 3684        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3685        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT++;
 3686        /* not allowed case. Therefore, return failed status */
 3687        siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag);
 3688        break;
 3689      }
 3690      case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
 3691      {
 3692        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED HTAG = 0x%x ssptag = 0x%x\n", tag, sspTag));
 3693        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED++;
 3694        siAbnormal(agRoot, pRequest, status, 0, sspTag);
 3695        break;
 3696      }
 3697      case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
 3698      {
 3699        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3700        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO++;
 3701        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3702        break;
 3703      }
 3704      case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
 3705      {
 3706        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3707        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST++;
 3708        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3709        break;
 3710      }
 3711      case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
 3712      {
 3713        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3714        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE++;
 3715        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3716        break;
 3717      }
 3718      case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
 3719      {
 3720        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3721        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED++;
 3722        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3723        break;
 3724      }
 3725      case OSSA_IO_DS_INVALID:
 3726      {
 3727        SA_DBG1(("mpiSSPCompletion: OSSA_IO_DS_INVALID tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3728        saRoot->IoErrorCount.agOSSA_IO_DS_INVALID++;
 3729        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3730        break;
 3731      }
 3732      case OSSA_MPI_IO_RQE_BUSY_FULL:
 3733      {
 3734        SA_DBG1(("mpiSSPCompletion: OSSA_MPI_IO_RQE_BUSY_FULL tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3735        saRoot->IoErrorCount.agOSSA_MPI_IO_RQE_BUSY_FULL++;
 3736        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3737        break;
 3738      }
 3739      case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
 3740      {
 3741        SA_DBG1(("mpiSSPCompletion: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3742        saRoot->IoErrorCount.agOSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE++;
 3743        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3744        break;
 3745      }
 3746      case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
 3747      {
 3748        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3749        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS++;
 3750        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3751        break;
 3752      }
 3753      case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
 3754      {
 3755        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3756        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH++;
 3757        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3758        break;
 3759      }
 3760      case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
 3761      {
 3762        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3763        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID++;
 3764        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3765        break;
 3766      }
 3767      case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
 3768      {
 3769        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3770        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_IV_MISMATCH++;
 3771        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3772        break;
 3773      }
 3774      case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
 3775      {
 3776        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3777        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR++;
 3778        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3779        break;
 3780      }
 3781      case OSSA_IO_XFR_ERROR_INTERNAL_RAM:
 3782      {
 3783        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_INTERNAL_RAM tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3784        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_INTERNAL_RAM++;
 3785        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3786        break;
 3787      }
 3788      case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS:
 3789      {
 3790        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3791        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS++;
 3792        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3793        break;
 3794      }
 3795      case OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE:
 3796      {
 3797        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3798        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE++;
 3799        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3800        break;
 3801      }
 3802 #ifdef SA_TESTBASE_EXTRA
 3803      /* TestBase */
 3804      case OSSA_IO_HOST_BST_INVALID:
 3805      {
 3806         SA_DBG1(("mpiParseOBIomb, OPC_OUB_SSP_COMP: OSSA_IO_HOST_BST_INVALID 0x%x\n", status));
 3807         siAbnormal(agRoot, pRequest, status, param, sspTag);
 3808         break;
 3809      }
 3810 #endif /*  SA_TESTBASE_EXTRA */
 3811      case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
 3812      {
 3813         SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DIF_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3814         saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DIF_MISMATCH++;
 3815         siDifAbnormal(agRoot, pRequest, status, param, sspTag, pIomb1);
 3816         break;
 3817      }
 3818      case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
 3819      {
 3820        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3821        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH++;
 3822        siDifAbnormal(agRoot, pRequest, status, param, sspTag, pIomb1);
 3823        break;
 3824      }
 3825      case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
 3826      {
 3827        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3828        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH++;
 3829        siDifAbnormal(agRoot, pRequest, status, param, sspTag, pIomb1);
 3830        break;
 3831      }
 3832      case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
 3833      {
 3834        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3835        saRoot->IoErrorCount.agOSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH++;
 3836        siDifAbnormal(agRoot, pRequest, status, param, sspTag, pIomb1);
 3837        break;
 3838      }
 3839      case OSSA_IO_XFER_ERROR_DIF_INTERNAL_ERROR:
 3840      {
 3841        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERROR_DIF_INTERNAL_ERROR tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3842        saRoot->IoErrorCount.agOSSA_IO_XFER_ERROR_DIF_INTERNAL_ERROR++;
 3843        siDifAbnormal(agRoot, pRequest, status, param, sspTag, pIomb1);
 3844        break;
 3845      }
 3846      case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
 3847      {
 3848        SA_DBG1(("mpiSSPCompletion: OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3849        saRoot->IoErrorCount.agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN++;
 3850        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3851        break;
 3852      }
 3853      case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED:
 3854      {
 3855        SA_DBG1(("mpiSSPCompletion: OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3856        saRoot->IoErrorCount.agOSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED++;
 3857        siAbnormal(agRoot, pRequest, status, param, sspTag);
 3858        break;
 3859      }
 3860      default:
 3861      {
 3862        SA_DBG1(("mpiSSPCompletion: Unknown tag 0x%x sspTag 0x%x status 0x%x param 0x%x\n", tag,sspTag,status,param));
 3863        /* not allowed case. Therefore, return failed status */
 3864        saRoot->IoErrorCount.agOSSA_IO_UNKNOWN_ERROR++;
 3865        siAbnormal(agRoot, pRequest, OSSA_IO_FAILED, param, sspTag);
 3866        break;
 3867      }
 3868    }
 3869 
 3870    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5A");
 3871    return ret;
 3872 }

Cache object: 06171c7f51f9e23c8c47be32a6786030


[ 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.