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/sainit.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 sainit.c
   24  *  \brief The file implements the functions to initialize the LL layer
   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 #ifdef SA_ENABLE_TRACE_FUNCTIONS
   34 #ifdef siTraceFileID
   35 #undef siTraceFileID
   36 #endif
   37 #define siTraceFileID 'F'
   38 #endif
   39 
   40 bit32 gLLDebugLevel         = 3;
   41 
   42 #if defined(SALLSDK_DEBUG)
   43 bit32 gLLDebugLevelSet      = 0; // block reinitialize from updating
   44 bit32 gLLLogFuncDebugLevel  = 0;
   45 bit32 gLLSoftResetCounter   = 0;
   46 #endif
   47 
   48 bit32 gPollForMissingInt;
   49 
   50 #ifdef FW_EVT_LOG_TST
   51 void  *eventLogAddress = NULL;
   52 #endif
   53 
   54 extern bit32 gWait_3;
   55 extern bit32 gWait_2;
   56 bit32 gFPGA_TEST = 0; // If set unblock fpga functions
   57 
   58 /******************************************************************************/
   59 /*! \brief Get the memory and lock requirement from LL layer
   60  *
   61  *  Get the memory and lock requirement from LL layer
   62  *
   63  *  \param agRoot             Handles for this instance of SAS/SATA hardware
   64  *  \param swConfig           Pointer to the software configuration
   65  *  \param memoryRequirement  Point to the data structure that holds the different
   66  *                                       chunks of memory that are required
   67  *  \param usecsPerTick       micro-seconds per tick for the LL layer
   68  *  \param maxNumLocks        maximum number of locks for the LL layer
   69  *
   70  *  \return -void-
   71  *
   72  */
   73 /*******************************************************************************/
   74 GLOBAL void saGetRequirements(
   75   agsaRoot_t              *agRoot,
   76   agsaSwConfig_t          *swConfig,
   77   agsaMemoryRequirement_t *memoryRequirement,
   78   bit32                   *usecsPerTick,
   79   bit32                   *maxNumLocks
   80   )
   81 {
   82   bit32               memoryReqCount = 0;
   83   bit32               i;
   84   static mpiConfig_t  mpiConfig;
   85   static mpiMemReq_t  mpiMemoryRequirement;
   86 
   87 
   88   /* sanity check */
   89   SA_ASSERT((agNULL != swConfig), "");
   90   SA_ASSERT((agNULL != memoryRequirement), "");
   91   SA_ASSERT((agNULL != usecsPerTick), "");
   92   SA_ASSERT((agNULL != maxNumLocks), "");
   93 
   94   si_memset(&mpiMemoryRequirement, 0, sizeof(mpiMemReq_t));
   95   si_memset(&mpiConfig, 0, sizeof(mpiConfig_t));
   96 
   97   SA_DBG1(("saGetRequirements:agRoot %p swConfig %p memoryRequirement %p usecsPerTick %p maxNumLocks %p\n",agRoot, swConfig,memoryRequirement,usecsPerTick,maxNumLocks));
   98   SA_DBG1(("saGetRequirements: usecsPerTick 0x%x (%d)\n",*usecsPerTick,*usecsPerTick));
   99 
  100   /* Get Resource Requirements for SPC MPI */
  101   /* Set the default/specified requirements swConfig from TD layer */
  102   siConfiguration(agRoot, &mpiConfig, agNULL, swConfig);
  103   mpiRequirementsGet(&mpiConfig, &mpiMemoryRequirement);
  104 
  105   /* memory requirement for saRoot, CACHE memory */
  106   memoryRequirement->agMemory[LLROOT_MEM_INDEX].singleElementLength = sizeof(agsaLLRoot_t);
  107   memoryRequirement->agMemory[LLROOT_MEM_INDEX].numElements = 1;
  108   memoryRequirement->agMemory[LLROOT_MEM_INDEX].totalLength = sizeof(agsaLLRoot_t);
  109   memoryRequirement->agMemory[LLROOT_MEM_INDEX].alignment = sizeof(void *);
  110   memoryRequirement->agMemory[LLROOT_MEM_INDEX].type = AGSA_CACHED_MEM;
  111   memoryReqCount ++;
  112 
  113   SA_DBG1(("saGetRequirements: agMemory[LLROOT_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
  114            memoryRequirement->agMemory[LLROOT_MEM_INDEX].singleElementLength,
  115            memoryRequirement->agMemory[LLROOT_MEM_INDEX].totalLength,
  116            memoryRequirement->agMemory[LLROOT_MEM_INDEX].alignment,
  117            memoryRequirement->agMemory[LLROOT_MEM_INDEX].type ));
  118 
  119   /* memory requirement for Device Links, CACHE memory */
  120   memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].singleElementLength = sizeof(agsaDeviceDesc_t);
  121   memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].numElements = swConfig->numDevHandles;
  122   memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].totalLength = sizeof(agsaDeviceDesc_t)
  123                                                                 * swConfig->numDevHandles;
  124   memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].alignment = sizeof(void *);
  125   memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].type = AGSA_CACHED_MEM;
  126   memoryReqCount ++;
  127   SA_DBG1(("saGetRequirements: agMemory[DEVICELINK_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
  128            memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].singleElementLength,
  129            memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].totalLength,
  130            memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].alignment,
  131            memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].type ));
  132 
  133   /* memory requirement for IORequest Links, CACHE memory */
  134   memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].singleElementLength = sizeof(agsaIORequestDesc_t);
  135   /*
  136   Add SA_RESERVED_REQUEST_COUNT to guarantee quality of service
  137   */
  138   memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].numElements = swConfig->maxActiveIOs + SA_RESERVED_REQUEST_COUNT;
  139   memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].totalLength = sizeof(agsaIORequestDesc_t) *
  140                 memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].numElements;
  141   memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].alignment = sizeof(void *);
  142   memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].type = AGSA_CACHED_MEM;
  143   memoryReqCount ++;
  144 
  145   SA_DBG1(("saGetRequirements: agMemory[IOREQLINK_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
  146            memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].singleElementLength,
  147            memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].totalLength,
  148            memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].alignment,
  149            memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].type ));
  150 
  151   /* memory requirement for Timer Links, CACHE memory */
  152   memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].singleElementLength = sizeof(agsaTimerDesc_t);
  153   memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].numElements = NUM_TIMERS;
  154   memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].totalLength = sizeof(agsaTimerDesc_t) * NUM_TIMERS;
  155   memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].alignment = sizeof(void *);
  156   memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].type = AGSA_CACHED_MEM;
  157   memoryReqCount ++;
  158   SA_DBG1(("saGetRequirements: agMemory[TIMERLINK_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
  159            memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].singleElementLength,
  160            memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].totalLength,
  161            memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].alignment,
  162            memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].type ));
  163 
  164 #ifdef SA_ENABLE_TRACE_FUNCTIONS
  165 
  166   /* memory requirement for LL trace memory */
  167   memoryRequirement->agMemory[LL_FUNCTION_TRACE].singleElementLength = 1;
  168   memoryRequirement->agMemory[LL_FUNCTION_TRACE].numElements = swConfig->TraceBufferSize;
  169   memoryRequirement->agMemory[LL_FUNCTION_TRACE].totalLength = swConfig->TraceBufferSize;
  170   memoryRequirement->agMemory[LL_FUNCTION_TRACE].alignment = sizeof(void *);
  171   memoryRequirement->agMemory[LL_FUNCTION_TRACE].type = AGSA_CACHED_MEM;
  172   memoryReqCount ++;
  173 
  174   SA_DBG1(("saGetRequirements: agMemory[LL_FUNCTION_TRACE] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
  175            memoryRequirement->agMemory[LL_FUNCTION_TRACE].singleElementLength,
  176            memoryRequirement->agMemory[LL_FUNCTION_TRACE].totalLength,
  177            memoryRequirement->agMemory[LL_FUNCTION_TRACE].alignment,
  178            memoryRequirement->agMemory[LL_FUNCTION_TRACE].type ));
  179 
  180 #endif /* END SA_ENABLE_TRACE_FUNCTIONS */
  181 
  182 #ifdef FAST_IO_TEST
  183   {
  184   agsaMem_t *agMemory = memoryRequirement->agMemory;
  185 
  186   /* memory requirement for Super IO CACHE memory */
  187   agMemory[LL_FAST_IO].singleElementLength = sizeof(saFastRequest_t);
  188   agMemory[LL_FAST_IO].numElements = LL_FAST_IO_SIZE;
  189   agMemory[LL_FAST_IO].totalLength = LL_FAST_IO_SIZE *
  190                                      agMemory[LL_FAST_IO].singleElementLength;
  191   agMemory[LL_FAST_IO].alignment = sizeof(void*);
  192   agMemory[LL_FAST_IO].type = AGSA_CACHED_MEM;
  193   memoryReqCount ++;
  194 
  195   SA_DBG1(("saGetRequirements: agMemory[LL_FAST_IO] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
  196            memoryRequirement->agMemory[LL_FAST_IO].singleElementLength,
  197            memoryRequirement->agMemory[LL_FAST_IO].totalLength,
  198            memoryRequirement->agMemory[LL_FAST_IO].alignment,
  199            memoryRequirement->agMemory[LL_FAST_IO].type ));
  200 
  201   }
  202 #endif
  203 
  204 #ifdef SA_ENABLE_HDA_FUNCTIONS
  205   {
  206   agsaMem_t *agMemory = memoryRequirement->agMemory;
  207 
  208   /* memory requirement for HDA FW image */
  209   agMemory[HDA_DMA_BUFFER].singleElementLength = (1024 * 1024); /* must be greater than size of aap1 fw image */
  210   agMemory[HDA_DMA_BUFFER].numElements = 1;
  211   agMemory[HDA_DMA_BUFFER].totalLength = agMemory[HDA_DMA_BUFFER].numElements *
  212                                      agMemory[HDA_DMA_BUFFER].singleElementLength;
  213   agMemory[HDA_DMA_BUFFER].alignment = 32;
  214   agMemory[HDA_DMA_BUFFER].type = AGSA_DMA_MEM;
  215   memoryReqCount ++;
  216   SA_DBG1(("saGetRequirements: agMemory[HDA_DMA_BUFFER] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
  217            memoryRequirement->agMemory[HDA_DMA_BUFFER].singleElementLength,
  218            memoryRequirement->agMemory[HDA_DMA_BUFFER].totalLength,
  219            memoryRequirement->agMemory[HDA_DMA_BUFFER].alignment,
  220            memoryRequirement->agMemory[HDA_DMA_BUFFER].type ));
  221   }
  222 #endif /* SA_ENABLE_HDA_FUNCTIONS */
  223 
  224   /* memory requirement for MPI MSGU layer, DMA memory */
  225   for ( i = 0; i < mpiMemoryRequirement.count; i ++ )
  226   {
  227     memoryRequirement->agMemory[memoryReqCount].singleElementLength = mpiMemoryRequirement.region[i].elementSize;
  228     memoryRequirement->agMemory[memoryReqCount].numElements         = mpiMemoryRequirement.region[i].numElements;
  229     memoryRequirement->agMemory[memoryReqCount].totalLength         = mpiMemoryRequirement.region[i].totalLength;
  230     memoryRequirement->agMemory[memoryReqCount].alignment           = mpiMemoryRequirement.region[i].alignment;
  231     memoryRequirement->agMemory[memoryReqCount].type                = mpiMemoryRequirement.region[i].type;
  232     SA_DBG1(("saGetRequirements:MPI agMemory[%d] singleElementLength = 0x%x  totalLength = 0x%x align = 0x%x type %x\n",
  233           memoryReqCount,
  234           memoryRequirement->agMemory[memoryReqCount].singleElementLength,
  235           memoryRequirement->agMemory[memoryReqCount].totalLength,
  236           memoryRequirement->agMemory[memoryReqCount].alignment,
  237           memoryRequirement->agMemory[memoryReqCount].type ));
  238     memoryReqCount ++;
  239   }
  240 
  241 
  242   /* requirement for locks */
  243   if (swConfig->param3 == agNULL)
  244   {
  245     *maxNumLocks = (LL_IOREQ_IBQ_LOCK + AGSA_MAX_INBOUND_Q );
  246     SA_DBG1(("saGetRequirements: param3 == agNULL maxNumLocks   %d\n", *maxNumLocks ));
  247   }
  248   else
  249   {
  250     agsaQueueConfig_t *queueConfig;
  251     queueConfig = (agsaQueueConfig_t *)swConfig->param3;
  252     *maxNumLocks = (LL_IOREQ_IBQ_LOCK_PARM + queueConfig->numInboundQueues );
  253     SA_DBG1(("saGetRequirements: maxNumLocks   %d\n", *maxNumLocks ));
  254   }
  255 
  256 
  257   /* setup the time tick */
  258   *usecsPerTick = SA_USECS_PER_TICK;
  259 
  260   SA_ASSERT(memoryReqCount < AGSA_NUM_MEM_CHUNKS, "saGetRequirements: Exceed max number of memory place holder");
  261 
  262   /* set up memory requirement count */
  263   memoryRequirement->count = memoryReqCount;
  264 
  265   swConfig->legacyInt_X = 1;
  266   swConfig->max_MSI_InterruptVectors = 32;
  267   swConfig->max_MSIX_InterruptVectors = 64;//16;
  268 
  269   SA_DBG1(("saGetRequirements:  swConfig->stallUsec  %d\n",swConfig->stallUsec  ));
  270 
  271 #ifdef SA_CONFIG_MDFD_REGISTRY
  272   SA_DBG1(("saGetRequirements:  swConfig->disableMDF %d\n",swConfig->disableMDF));
  273 #endif /*SA_CONFIG_MDFD_REGISTRY*/
  274   /*SA_DBG1(("saGetRequirements:  swConfig->enableDIF  %d\n",swConfig->enableDIF  ));*/
  275   /*SA_DBG1(("saGetRequirements:  swConfig->enableEncryption  %d\n",swConfig->enableEncryption  ));*/
  276 #ifdef SA_ENABLE_HDA_FUNCTIONS
  277   swConfig->hostDirectAccessSupport = 1;
  278   swConfig->hostDirectAccessMode = 0;
  279 #else
  280   swConfig->hostDirectAccessSupport = 0;
  281   swConfig->hostDirectAccessMode = 0;
  282 #endif
  283 
  284 }
  285 
  286 /******************************************************************************/
  287 /*! \brief Initialize the Hardware
  288  *
  289  *  Initialize the Hardware
  290  *
  291  *  \param agRoot             Handles for this instance of SAS/SATA hardware
  292  *  \param memoryAllocated    Point to the data structure that holds the different
  293                                         chunks of memory that are required
  294  *  \param hwConfig           Pointer to the hardware configuration
  295  *  \param swConfig           Pointer to the software configuration
  296  *  \param usecsPerTick       micro-seconds per tick for the LL layer
  297  *
  298  *  \return If initialization is successful
  299  *          - \e AGSA_RC_SUCCESS initialization is successful
  300  *          - \e AGSA_RC_FAILURE initialization is not successful
  301  */
  302 /*******************************************************************************/
  303 GLOBAL bit32 saInitialize(
  304   agsaRoot_t              *agRoot,
  305   agsaMemoryRequirement_t *memoryAllocated,
  306   agsaHwConfig_t          *hwConfig,
  307   agsaSwConfig_t          *swConfig,
  308   bit32                   usecsPerTick
  309   )
  310 {
  311   agsaLLRoot_t          *saRoot;
  312   agsaDeviceDesc_t      *pDeviceDesc;
  313   agsaIORequestDesc_t   *pRequestDesc;
  314   agsaTimerDesc_t       *pTimerDesc;
  315   agsaPort_t            *pPort;
  316   agsaPortMap_t         *pPortMap;
  317   agsaDeviceMap_t       *pDeviceMap;
  318   agsaIOMap_t           *pIOMap;
  319   bit32                 maxNumIODevices;
  320   bit32                 i, j;
  321   static mpiMemReq_t    mpiMemoryAllocated;
  322   bit32                 Tried_NO_HDA = agFALSE;
  323   bit32                 Double_Reset_HDA = agFALSE;
  324   bit32                 ret = AGSA_RC_SUCCESS;
  325 #ifdef FAST_IO_TEST
  326   void   *fr; /* saFastRequest_t */
  327   bit32  size;
  328   bit32  alignment;
  329 #endif
  330 
  331   /* sanity check */
  332   SA_ASSERT((agNULL != agRoot), "");
  333   SA_ASSERT((agNULL != memoryAllocated), "");
  334   SA_ASSERT((agNULL != hwConfig), "");
  335   SA_ASSERT((agNULL != swConfig), "");
  336   SA_ASSERT((LLROOT_MEM_INDEX < memoryAllocated->count), "");
  337   SA_ASSERT((DEVICELINK_MEM_INDEX < memoryAllocated->count), "");
  338   SA_ASSERT((IOREQLINK_MEM_INDEX < memoryAllocated->count), "");
  339   SA_ASSERT((TIMERLINK_MEM_INDEX < memoryAllocated->count), "");
  340 
  341   si_memset(&mpiMemoryAllocated, 0, sizeof(mpiMemReq_t));
  342 
  343   si_macro_check(agRoot);
  344 
  345   SA_DBG1(("saInitialize: WAIT_INCREMENT %d\n", WAIT_INCREMENT ));
  346   SA_DBG1(("saInitialize: usecsPerTick %d\n", usecsPerTick ));
  347   if(! smIS_SPC(agRoot))
  348   {
  349     if(! smIS_SPCV(agRoot))
  350     {
  351       SA_DBG1(("saInitialize: ossaHwRegReadConfig32 ID  reads as %08X\n", ossaHwRegReadConfig32(agRoot,0 ) ));
  352       SA_DBG1(("saInitialize: expect %08X or %08X or\n",  VEN_DEV_SPCV, VEN_DEV_SPCVE));
  353       SA_DBG1(("saInitialize: expect %08X or %08X or\n",  VEN_DEV_SPCVP, VEN_DEV_SPCVEP));
  354       SA_DBG1(("saInitialize: expect %08X or %08X\n",     VEN_DEV_ADAPVEP, VEN_DEV_ADAPVP));
  355       return AGSA_RC_FAILURE;
  356     }
  357   }
  358 
  359   if(  smIS_SPC(agRoot) && smIS_SPCV(agRoot))
  360   {
  361       SA_DBG1(("saInitialize: Macro error !smIS_SPC %d smIS_SPCv %d smIS_SFC %d\n",smIS_SPC(agRoot),smIS_SPCV(agRoot), smIS_SFC(agRoot) ));
  362       return AGSA_RC_FAILURE;
  363   }
  364 
  365   /* Check the memory allocated */
  366   for ( i = 0; i < memoryAllocated->count; i ++ )
  367   {
  368     /* If memory allocation failed  */
  369     if (memoryAllocated->agMemory[i].singleElementLength &&
  370         memoryAllocated->agMemory[i].numElements)
  371     {
  372       if ( (0 != memoryAllocated->agMemory[i].numElements)
  373           && (0 == memoryAllocated->agMemory[i].totalLength) )
  374       {
  375         /* return failure */
  376         SA_DBG1(("saInitialize:AGSA_RC_FAILURE Memory[%d]  singleElementLength = 0x%x  numElements = 0x%x NOT allocated\n",
  377           i,
  378           memoryAllocated->agMemory[i].singleElementLength,
  379           memoryAllocated->agMemory[i].numElements));
  380         ret = AGSA_RC_FAILURE;
  381         return ret;
  382       }
  383       else
  384       {
  385         SA_DBG1(("saInitialize: Memory[%d] singleElementLength = 0x%x  numElements = 0x%x allocated %p\n",
  386           i,
  387           memoryAllocated->agMemory[i].singleElementLength,
  388           memoryAllocated->agMemory[i].numElements,
  389           memoryAllocated->agMemory[i].virtPtr));
  390       }
  391     }
  392   }
  393 
  394   /* Get the saRoot memory address */
  395   saRoot = (agsaLLRoot_t *) (memoryAllocated->agMemory[LLROOT_MEM_INDEX].virtPtr);
  396   SA_ASSERT((agNULL != saRoot), "saRoot");
  397   if(agNULL == saRoot)
  398   {
  399     SA_DBG1(("saInitialize:AGSA_RC_FAILURE saRoot\n"));
  400     return AGSA_RC_FAILURE;
  401   }
  402 
  403   agRoot->sdkData = (void *) saRoot;
  404 
  405   SA_DBG1(("saInitialize: saRoot %p\n",saRoot));
  406 
  407   if ( (memoryAllocated != &saRoot->memoryAllocated) ||
  408        (hwConfig != &saRoot->hwConfig) ||
  409        (swConfig != &saRoot->swConfig) )
  410   {
  411     agsaMemoryRequirement_t *memA = &saRoot->memoryAllocated;
  412     agsaHwConfig_t          *hwC  = &saRoot->hwConfig;
  413     agsaSwConfig_t          *swC  = &saRoot->swConfig;
  414 
  415     /* Copy data here */
  416 
  417     *memA   = *memoryAllocated;
  418     *hwC    = *hwConfig;
  419     *swC    = *swConfig;
  420   }
  421 
  422 
  423 #if defined(SALLSDK_DEBUG)
  424   if(gLLDebugLevelSet == 0)
  425   {
  426     gLLDebugLevelSet = 1;
  427     gLLDebugLevel = swConfig->sallDebugLevel & 0xF;
  428     SA_DBG1(("saInitialize:  gLLDebugLevel  %x\n",gLLDebugLevel));
  429   }
  430 #endif /* SALLSDK_DEBUG */
  431 
  432 #ifdef SA_ENABLE_TRACE_FUNCTIONS
  433 
  434   saRoot->TraceBufferLength = memoryAllocated->agMemory[LL_FUNCTION_TRACE].totalLength;
  435   saRoot->TraceBuffer = memoryAllocated->agMemory[LL_FUNCTION_TRACE].virtPtr;
  436 
  437   siEnableTracing ( agRoot );
  438 /*
  439 */
  440 
  441 #endif /* SA_ENABLE_TRACE_FUNCTIONS */
  442 
  443 #ifdef FAST_IO_TEST
  444   {
  445   agsaMem_t *agMemory = memoryAllocated->agMemory;
  446 
  447   /* memory requirement for Super IO CACHE memory */
  448   size = sizeof(saRoot->freeFastReq) / sizeof(saRoot->freeFastReq[0]);
  449 
  450   SA_ASSERT(size == agMemory[LL_FAST_IO].numElements, "");
  451   SA_ASSERT(agMemory[LL_FAST_IO].virtPtr, "");
  452   SA_ASSERT((agMemory[LL_FAST_IO].singleElementLength ==
  453     sizeof(saFastRequest_t)) &&
  454     (agMemory[LL_FAST_IO].numElements == LL_FAST_IO_SIZE) &&
  455     (agMemory[LL_FAST_IO].totalLength == agMemory[LL_FAST_IO].numElements *
  456                                  agMemory[LL_FAST_IO].singleElementLength), "");
  457 
  458   for (i = 0, alignment = agMemory[LL_FAST_IO].alignment,
  459        fr = agMemory[LL_FAST_IO].virtPtr;
  460        i < size; i++,
  461        fr = (void*)((bitptr)fr + (bitptr)(((bit32)sizeof(saFastRequest_t) +
  462                     alignment - 1) & ~(alignment - 1))))
  463   {
  464     saRoot->freeFastReq[i] = fr;
  465   }
  466   saRoot->freeFastIdx = size;
  467   }
  468 #endif /* FAST_IO_TEST*/
  469 
  470   smTraceFuncEnter(hpDBG_VERY_LOUD, "m1");
  471 
  472   SA_DBG1(("saInitialize: swConfig->PortRecoveryResetTimer    %x\n",swConfig->PortRecoveryResetTimer ));
  473 
  474   SA_DBG1(("saInitialize: hwDEVICE_ID_VENDID            0x%08x\n", ossaHwRegReadConfig32(agRoot,0)));
  475   SA_DBG1(("saInitialize: CFGSTAT CFGCMD                0x%08x\n", ossaHwRegReadConfig32(agRoot,4)));
  476   SA_DBG1(("saInitialize: CLSCODE REVID                 0x%08x\n", ossaHwRegReadConfig32(agRoot,8)));
  477   SA_DBG1(("saInitialize: BIST DT HDRTYPE LATTIM CLSIZE 0x%08x\n", ossaHwRegReadConfig32(agRoot,12)));
  478   SA_DBG1(("saInitialize: hwSVID                        0x%08x\n", ossaHwRegReadConfig32(agRoot,44)));
  479 
  480 
  481 #ifdef SA_ENABLE_PCI_TRIGGER
  482 
  483    SA_DBG1(("saInitialize: SA_ENABLE_PCI_TRIGGER  a       0x%08x %p\n", saRoot->swConfig.PCI_trigger,&saRoot->swConfig.PCI_trigger));
  484 
  485   if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_INIT_TEST )
  486   {
  487     SA_DBG1(("saInitialize: SA_ENABLE_PCI_TRIGGER         0x%08x %p\n", saRoot->swConfig.PCI_trigger,&saRoot->swConfig.PCI_trigger));
  488     saRoot->swConfig.PCI_trigger &= ~PCI_TRIGGER_INIT_TEST;
  489     siPCITriger(agRoot);
  490   }
  491 #endif /* SA_ENABLE_PCI_TRIGGER */
  492 
  493 
  494   saRoot->ChipId = (ossaHwRegReadConfig32(agRoot,0) & 0xFFFF0000);
  495 
  496   SA_DBG1(("saInitialize: saRoot->ChipId                0x%08x\n", saRoot->ChipId));
  497   siUpdateBarOffsetTable(agRoot,saRoot->ChipId);
  498 
  499   if(saRoot->ChipId == VEN_DEV_SPC)
  500   {
  501     if(!  smIS_SPC(agRoot))
  502     {
  503       SA_DBG1(("saInitialize: smIS_SPC macro fail !!!!\n" ));
  504       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m1");
  505       return AGSA_RC_FAILURE;
  506     }
  507 
  508     SA_DBG1(("saInitialize:  SPC \n" ));
  509   }
  510   else if(saRoot->ChipId == VEN_DEV_HIL )
  511   {
  512     SA_DBG1(("saInitialize:  SPC HIL\n" ));
  513     if(!  smIS_SPC(agRoot))
  514     {
  515       SA_DBG1(("saInitialize: smIS_SPC macro fail !!!!\n" ));
  516       smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m1");
  517       return AGSA_RC_FAILURE;
  518     }
  519   }
  520   else if(saRoot->ChipId == VEN_DEV_SPCV)
  521   {
  522     SA_DBG1(("saInitialize:  SPC V\n" ));
  523     if(!  smIS_SPCV(agRoot))
  524     {
  525       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  526       smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m1");
  527       return AGSA_RC_FAILURE;
  528     }
  529   }
  530   else if(saRoot->ChipId == VEN_DEV_SPCVE)
  531   {
  532     SA_DBG1(("saInitialize:  SPC VE\n" ));
  533     if(!  smIS_SPCV(agRoot))
  534     {
  535       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  536       smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "m1");
  537       return AGSA_RC_FAILURE;
  538     }
  539   }
  540   else if(saRoot->ChipId == VEN_DEV_SPCVP)
  541   {
  542     SA_DBG1(("saInitialize:  SPC VP\n" ));
  543     if(!  smIS_SPCV(agRoot))
  544     {
  545       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  546       smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "m1");
  547       return AGSA_RC_FAILURE;
  548     }
  549   }
  550   else if(saRoot->ChipId == VEN_DEV_SPCVEP)
  551   {
  552     SA_DBG1(("saInitialize:  SPC VEP\n" ));
  553     if(!  smIS_SPCV(agRoot))
  554     {
  555       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  556       smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "m1");
  557       return AGSA_RC_FAILURE;
  558     }
  559   }
  560   else if(saRoot->ChipId == VEN_DEV_ADAPVP)
  561   {
  562     SA_DBG1(("saInitialize: Adaptec 8088\n" ));
  563   }
  564   else if(saRoot->ChipId == VEN_DEV_ADAPVEP)
  565   {
  566     SA_DBG1(("saInitialize: Adaptec 8089\n" ));
  567   }
  568   else if(saRoot->ChipId == VEN_DEV_SPC12V)
  569   {
  570     SA_DBG1(("saInitialize:  SPC 12V\n" ));
  571     if(!  smIS_SPCV(agRoot))
  572     {
  573       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  574       smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "m1");
  575       return AGSA_RC_FAILURE;
  576     }
  577   }
  578   else if(saRoot->ChipId == VEN_DEV_SPC12VE)
  579   {
  580     SA_DBG1(("saInitialize:  SPC 12VE\n" ));
  581     if(!  smIS_SPCV(agRoot))
  582     {
  583       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  584       smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "m1");
  585       return AGSA_RC_FAILURE;
  586     }
  587   }
  588   else if(saRoot->ChipId == VEN_DEV_SPC12VP)
  589   {
  590     SA_DBG1(("saInitialize:  SPC 12VP\n" ));
  591     if(!  smIS_SPCV(agRoot))
  592     {
  593       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  594       smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "m1");
  595       return AGSA_RC_FAILURE;
  596     }
  597   }
  598   else if(saRoot->ChipId == VEN_DEV_SPC12VEP)
  599   {
  600     SA_DBG1(("saInitialize:  SPC 12VEP\n" ));
  601     if(!  smIS_SPCV(agRoot))
  602     {
  603       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  604       smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "m1");
  605       return AGSA_RC_FAILURE;
  606     }
  607   }
  608   else if(saRoot->ChipId == VEN_DEV_SPC12ADP)
  609   {
  610     SA_DBG1(("saInitialize:  SPC 12ADP\n" ));
  611     if(!  smIS_SPCV(agRoot))
  612     {
  613       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  614       smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "m1");
  615       return AGSA_RC_FAILURE;
  616     }
  617   }
  618   else if(saRoot->ChipId == VEN_DEV_SPC12ADPE)
  619   {
  620     SA_DBG1(("saInitialize:  SPC 12ADPE\n" ));
  621     if(!  smIS_SPCV(agRoot))
  622     {
  623       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  624       smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "m1");
  625       return AGSA_RC_FAILURE;
  626     }
  627   }
  628   else if(saRoot->ChipId == VEN_DEV_SPC12ADPP)
  629   {
  630     SA_DBG1(("saInitialize:  SPC 12ADPP\n" ));
  631     if(!  smIS_SPCV(agRoot))
  632     {
  633       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  634       smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "m1");
  635       return AGSA_RC_FAILURE;
  636     }
  637   }
  638   else if(saRoot->ChipId == VEN_DEV_SPC12ADPEP)
  639   {
  640     SA_DBG1(("saInitialize:  SPC 12ADPEP\n" ));
  641     if(!  smIS_SPCV(agRoot))
  642     {
  643       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  644       smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "m1");
  645       return AGSA_RC_FAILURE;
  646     }
  647   }
  648   else if(saRoot->ChipId == VEN_DEV_SPC12SATA)
  649   {
  650     SA_DBG1(("saInitialize:  SPC12SATA\n" ));
  651     if(!  smIS_SPCV(agRoot))
  652     {
  653       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  654       smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "m1");
  655       return AGSA_RC_FAILURE;
  656     }
  657   }
  658   else if(saRoot->ChipId ==  VEN_DEV_9015)
  659   {
  660     SA_DBG1(("saInitialize:  SPC 12V FPGA\n" ));
  661     if(!  smIS_SPCV(agRoot))
  662     {
  663       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  664       smTraceFuncExit(hpDBG_VERY_LOUD, 'p', "m1");
  665       return AGSA_RC_FAILURE;
  666     }
  667   }
  668   else if(saRoot->ChipId ==  VEN_DEV_9060)
  669   {
  670     SA_DBG1(("saInitialize:  SPC 12V FPGA B\n" ));
  671     if(!  smIS_SPCV(agRoot))
  672     {
  673       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
  674       smTraceFuncExit(hpDBG_VERY_LOUD, 'q', "m1");
  675       return AGSA_RC_FAILURE;
  676     }
  677   }
  678   else if(saRoot->ChipId == VEN_DEV_SFC)
  679   {
  680     SA_DBG1(("saInitialize: SFC \n" ));
  681   }
  682   else
  683   {
  684     SA_DBG1(("saInitialize saRoot->ChipId %8X expect %8X or %8X\n", saRoot->ChipId,VEN_DEV_SPC, VEN_DEV_SPCV));
  685     SA_ASSERT(0, "ChipId");
  686     smTraceFuncExit(hpDBG_VERY_LOUD, 'r', "m1");
  687     return AGSA_RC_FAILURE;
  688   }
  689 
  690   if( smIS_SPC(agRoot))
  691   {
  692     SA_DBG1(("saInitialize: Rev is A %d B %d C %d\n",smIsCfgSpcREV_A(agRoot),smIsCfgSpcREV_B(agRoot),smIsCfgSpcREV_C(agRoot)));
  693   }
  694   else
  695   {
  696     SA_DBG1(("saInitialize: Rev is A %d B %d C %d\n",smIsCfgVREV_A(agRoot),smIsCfgVREV_B(agRoot),smIsCfgVREV_C(agRoot)));
  697   }
  698 
  699   if( smIS_SPC(agRoot))
  700   {
  701     SA_DBG1(("saInitialize: LINK_CTRL 0x%08x Speed 0x%X Lanes 0x%X \n", ossaHwRegReadConfig32(agRoot,128),
  702       ((ossaHwRegReadConfig32(agRoot,128) & 0x000F0000) >> 16),
  703       ((ossaHwRegReadConfig32(agRoot,128) & 0x0FF00000) >> 20) ));
  704   }
  705   else
  706   {
  707     SA_DBG1(("saInitialize: LINK_CTRL 0x%08x Speed 0x%X Lanes 0x%X \n", ossaHwRegReadConfig32(agRoot,208),
  708       ((ossaHwRegReadConfig32(agRoot,208) & 0x000F0000) >> 16),
  709       ((ossaHwRegReadConfig32(agRoot,208) & 0x0FF00000) >> 20) ));
  710   }
  711 
  712   SA_DBG1(("saInitialize: V_SoftResetRegister  %08X\n",  ossaHwRegReadExt(agRoot, PCIBAR0, V_SoftResetRegister )));
  713 
  714 /*
  715   SA_DBG1(("saInitialize:TOP_BOOT_STRAP STRAP_BIT %X\n",  ossaHwRegReadExt(agRoot, PCIBAR1, 0) ));
  716 
  717   SA_DBG1(("SPC_REG_TOP_DEVICE_ID  %8X expect %08X\n",  ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_TOP_DEVICE_ID), SPC_TOP_DEVICE_ID));
  718   SA_DBG1(("SPC_REG_TOP_DEVICE_ID  %8X expect %08X\n",  siHalRegReadExt( agRoot, GEN_SPC_REG_TOP_DEVICE_ID,SPC_REG_TOP_DEVICE_ID ) , SPC_TOP_DEVICE_ID));
  719 
  720   SA_DBG1(("SPC_REG_TOP_BOOT_STRAP %8X expect %08X\n",  ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_TOP_BOOT_STRAP), SPC_TOP_BOOT_STRAP));
  721 
  722   SA_DBG1(("swConfig->numSASDevHandles =%d\n", swConfig->numDevHandles));
  723 */
  724   smTrace(hpDBG_VERY_LOUD,"29",swConfig->numDevHandles);
  725   /* TP:29 swConfig->numDevHandles */
  726 
  727   /* Setup Device link */
  728   /* Save the information of allocated device Link memory */
  729   saRoot->deviceLinkMem = memoryAllocated->agMemory[DEVICELINK_MEM_INDEX];
  730   if(agNULL == saRoot->deviceLinkMem.virtPtr)
  731   {
  732     SA_ASSERT(0, "deviceLinkMem");
  733     smTraceFuncExit(hpDBG_VERY_LOUD, 'q', "m1");
  734     return AGSA_RC_FAILURE;
  735   }
  736 
  737   si_memset(saRoot->deviceLinkMem.virtPtr, 0, saRoot->deviceLinkMem.totalLength);
  738   SA_DBG2(("saInitialize: [%d] saRoot->deviceLinkMem VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
  739     DEVICELINK_MEM_INDEX,
  740     saRoot->deviceLinkMem.virtPtr,
  741     saRoot->deviceLinkMem.phyAddrLower,
  742     saRoot->deviceLinkMem.numElements,
  743     saRoot->deviceLinkMem.totalLength,
  744     saRoot->deviceLinkMem.type));
  745 
  746   maxNumIODevices = swConfig->numDevHandles;
  747   SA_DBG2(("saInitialize:  maxNumIODevices=%d, swConfig->numDevHandles=%d \n",
  748     maxNumIODevices,
  749     swConfig->numDevHandles));
  750 
  751 #ifdef SA_ENABLE_PCI_TRIGGER
  752   SA_DBG1(("saInitialize:  swConfig->PCI_trigger= 0x%x\n", swConfig->PCI_trigger));
  753 #endif /* SA_ENABLE_PCI_TRIGGER */
  754 
  755   /* Setup free IO Devices link list */
  756   saLlistInitialize(&(saRoot->freeDevicesList));
  757   for ( i = 0; i < (bit32) maxNumIODevices; i ++ )
  758   {
  759     /* get the pointer to the device descriptor */
  760     pDeviceDesc = (agsaDeviceDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->deviceLinkMem), i);
  761     /* Initialize device descriptor */
  762     saLlinkInitialize(&(pDeviceDesc->linkNode));
  763 
  764     pDeviceDesc->initiatorDevHandle.osData    = agNULL;
  765     pDeviceDesc->initiatorDevHandle.sdkData   = agNULL;
  766     pDeviceDesc->targetDevHandle.osData       = agNULL;
  767     pDeviceDesc->targetDevHandle.sdkData      = agNULL;
  768     pDeviceDesc->deviceType                   = SAS_SATA_UNKNOWN_DEVICE;
  769     pDeviceDesc->pPort                        = agNULL;
  770     pDeviceDesc->DeviceMapIndex               = 0;
  771 
  772     saLlistInitialize(&(pDeviceDesc->pendingIORequests));
  773 
  774     /* Add the device descriptor to the free IO device link list */
  775     saLlistAdd(&(saRoot->freeDevicesList), &(pDeviceDesc->linkNode));
  776   }
  777 
  778   /* Setup IO Request link */
  779   /* Save the information of allocated IO Request Link memory */
  780   saRoot->IORequestMem = memoryAllocated->agMemory[IOREQLINK_MEM_INDEX];
  781   si_memset(saRoot->IORequestMem.virtPtr, 0, saRoot->IORequestMem.totalLength);
  782 
  783   SA_DBG2(("saInitialize: [%d] saRoot->IORequestMem  VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
  784     IOREQLINK_MEM_INDEX,
  785     saRoot->IORequestMem.virtPtr,
  786     saRoot->IORequestMem.phyAddrLower,
  787     saRoot->IORequestMem.numElements,
  788     saRoot->IORequestMem.totalLength,
  789     saRoot->IORequestMem.type));
  790 
  791   /* Setup free IO  Request link list */
  792   saLlistIOInitialize(&(saRoot->freeIORequests));
  793   saLlistIOInitialize(&(saRoot->freeReservedRequests));
  794   for ( i = 0; i < swConfig->maxActiveIOs; i ++ )
  795   {
  796     /* get the pointer to the request descriptor */
  797     pRequestDesc = (agsaIORequestDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->IORequestMem), i);
  798     /* Initialize request descriptor */
  799     saLlinkInitialize(&(pRequestDesc->linkNode));
  800 
  801     pRequestDesc->valid             = agFALSE;
  802     pRequestDesc->requestType       = AGSA_REQ_TYPE_UNKNOWN;
  803     pRequestDesc->pIORequestContext = agNULL;
  804     pRequestDesc->HTag              = i;
  805     pRequestDesc->pDevice           = agNULL;
  806     pRequestDesc->pPort             = agNULL;
  807 
  808     /* Add the request descriptor to the free Reserved Request link list */
  809   /* SMP request must get service so reserve one request when first SMP completes */
  810     if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
  811     {
  812       saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequestDesc->linkNode));
  813     }
  814     else
  815     {
  816     /* Add the request descriptor to the free IO Request link list */
  817       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequestDesc->linkNode));
  818     }
  819 
  820   }
  821 
  822   /* Setup timer link */
  823   /* Save the information of allocated timer Link memory */
  824   saRoot->timerLinkMem = memoryAllocated->agMemory[TIMERLINK_MEM_INDEX];
  825   si_memset(saRoot->timerLinkMem.virtPtr, 0, saRoot->timerLinkMem.totalLength);
  826   SA_DBG2(("saInitialize: [%d] saRoot->timerLinkMem  VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
  827     TIMERLINK_MEM_INDEX,
  828     saRoot->timerLinkMem.virtPtr,
  829     saRoot->timerLinkMem.phyAddrLower,
  830     saRoot->timerLinkMem.numElements,
  831     saRoot->timerLinkMem.totalLength,
  832     saRoot->timerLinkMem.type ));
  833 
  834   /* Setup free timer link list */
  835   saLlistInitialize(&(saRoot->freeTimers));
  836   for ( i = 0; i < NUM_TIMERS; i ++ )
  837   {
  838     /* get the pointer to the timer descriptor */
  839     pTimerDesc = (agsaTimerDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->timerLinkMem), i);
  840     /* Initialize timer descriptor */
  841     saLlinkInitialize(&(pTimerDesc->linkNode));
  842 
  843     pTimerDesc->valid         = agFALSE;
  844     pTimerDesc->timeoutTick   = 0;
  845     pTimerDesc->pfnTimeout    = agNULL;
  846     pTimerDesc->Event         = 0;
  847     pTimerDesc->pParm         = agNULL;
  848 
  849     /* Add the timer descriptor to the free timer link list */
  850     saLlistAdd(&(saRoot->freeTimers), &(pTimerDesc->linkNode));
  851   }
  852   /* Setup valid timer link list */
  853   saLlistInitialize(&(saRoot->validTimers));
  854 
  855   /* Setup Phys */
  856   /* Setup PhyCount */
  857   saRoot->phyCount = (bit8) hwConfig->phyCount;
  858   /* Init Phy data structure */
  859   for ( i = 0; i < saRoot->phyCount; i ++ )
  860   {
  861     saRoot->phys[i].pPort = agNULL;
  862     saRoot->phys[i].phyId = (bit8) i;
  863 
  864     /* setup phy status is PHY_STOPPED */
  865     PHY_STATUS_SET(&(saRoot->phys[i]), PHY_STOPPED);
  866   }
  867 
  868   /* Setup Ports */
  869   /* Setup PortCount */
  870   saRoot->portCount = saRoot->phyCount;
  871   /* Setup free port link list */
  872   saLlistInitialize(&(saRoot->freePorts));
  873   for ( i = 0; i < saRoot->portCount; i ++ )
  874   {
  875     /* get the pointer to the port */
  876     pPort = &(saRoot->ports[i]);
  877     /* Initialize port */
  878     saLlinkInitialize(&(pPort->linkNode));
  879 
  880     pPort->portContext.osData   = agNULL;
  881     pPort->portContext.sdkData  = pPort;
  882     pPort->portId         = 0;
  883     pPort->portIdx        = (bit8) i;
  884     pPort->status         = PORT_NORMAL;
  885 
  886     for ( j = 0; j < saRoot->phyCount; j ++ )
  887     {
  888       pPort->phyMap[j] = agFALSE;
  889     }
  890 
  891     saLlistInitialize(&(pPort->listSASATADevices));
  892 
  893     /* Add the port to the free port link list */
  894     saLlistAdd(&(saRoot->freePorts), &(pPort->linkNode));
  895   }
  896   /* Setup valid port link list */
  897   saLlistInitialize(&(saRoot->validPorts));
  898 
  899   /* Init sysIntsActive - default is interrupt enable */
  900   saRoot->sysIntsActive = agFALSE;
  901 
  902   /* setup timer tick granunarity */
  903   saRoot->usecsPerTick = usecsPerTick;
  904 
  905   /* setup smallest timer increment for stall */
  906   saRoot->minStallusecs = swConfig->stallUsec;
  907 
  908   SA_DBG1(("saInitialize: WAIT_INCREMENT %d\n" ,WAIT_INCREMENT ));
  909   if (0 == WAIT_INCREMENT)
  910   {
  911     saRoot->minStallusecs = WAIT_INCREMENT_DEFAULT;
  912   }
  913 
  914   /* initialize LL timer tick */
  915   saRoot->timeTick = 0;
  916 
  917   /* initialize device (de)registration callback fns */
  918   saRoot->DeviceRegistrationCB = agNULL;
  919   saRoot->DeviceDeregistrationCB = agNULL;
  920 
  921   /* Initialize the PortMap for port context */
  922   for ( i = 0; i < saRoot->portCount; i ++ )
  923   {
  924     pPortMap = &(saRoot->PortMap[i]);
  925 
  926     pPortMap->PortContext   = agNULL;
  927     pPortMap->PortID        = PORT_MARK_OFF;
  928     pPortMap->PortStatus    = PORT_NORMAL;
  929     saRoot->autoDeregDeviceflag[i] = 0;
  930   }
  931 
  932   /* Initialize the DeviceMap for device handle */
  933   for ( i = 0; i < MAX_IO_DEVICE_ENTRIES; i ++ )
  934   {
  935     pDeviceMap = &(saRoot->DeviceMap[i]);
  936 
  937     pDeviceMap->DeviceHandle  = agNULL;
  938     pDeviceMap->DeviceIdFromFW   =  i;
  939   }
  940 
  941   /* Initialize the IOMap for IOrequest */
  942   for ( i = 0; i < MAX_ACTIVE_IO_REQUESTS; i ++ )
  943   {
  944     pIOMap = &(saRoot->IOMap[i]);
  945 
  946     pIOMap->IORequest   = agNULL;
  947     pIOMap->Tag         = MARK_OFF;
  948   }
  949 
  950   /* setup mpi configuration */
  951   if (!swConfig->param3)
  952   {
  953     /* default configuration */
  954     siConfiguration(agRoot, &saRoot->mpiConfig, hwConfig, swConfig);
  955   }
  956   else
  957   {
  958     /* get from TD layer and save it */
  959     agsaQueueConfig_t *dCFG = &saRoot->QueueConfig;
  960     agsaQueueConfig_t *sCFG = (agsaQueueConfig_t *)swConfig->param3;
  961 
  962     if (dCFG != sCFG)
  963     {
  964       *dCFG = *sCFG;
  965 
  966       if ((hwConfig->hwInterruptCoalescingTimer) || (hwConfig->hwInterruptCoalescingControl))
  967       {
  968         for ( i = 0; i < sCFG->numOutboundQueues; i ++ )
  969         {
  970           /* disable FW assisted coalescing */
  971           sCFG->outboundQueues[i].interruptDelay = 0;
  972           sCFG->outboundQueues[i].interruptCount = 0;
  973         }
  974 
  975         if(smIS_SPC(agRoot))
  976         {
  977           if (hwConfig->hwInterruptCoalescingTimer == 0)
  978           {
  979             hwConfig->hwInterruptCoalescingTimer = 1;
  980             SA_DBG1(("saInitialize:InterruptCoalescingTimer should not be zero. Force to 1\n"));
  981           }
  982         }
  983       }
  984       ret = siConfiguration(agRoot, &saRoot->mpiConfig, hwConfig, swConfig);
  985       if (AGSA_RC_FAILURE == ret)
  986       {
  987         SA_DBG1(("saInitialize failure queue number=%d\n", saRoot->QueueConfig.numInboundQueues));
  988         agRoot->sdkData = agNULL;
  989         smTraceFuncExit(hpDBG_VERY_LOUD, 'r', "m1");
  990         return ret;
  991       }
  992     }
  993   }
  994 
  995 
  996   saRoot->swConfig.param3 = &saRoot->QueueConfig;
  997 
  998   mpiMemoryAllocated.count = memoryAllocated->count - MPI_MEM_INDEX;
  999   for ( i = 0; i < mpiMemoryAllocated.count; i ++ )
 1000   {
 1001     mpiMemoryAllocated.region[i].virtPtr        = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].virtPtr;
 1002     mpiMemoryAllocated.region[i].appHandle      = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].osHandle;
 1003     mpiMemoryAllocated.region[i].physAddrUpper  = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].phyAddrUpper;
 1004     mpiMemoryAllocated.region[i].physAddrLower  = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].phyAddrLower;
 1005     mpiMemoryAllocated.region[i].totalLength    = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].totalLength;
 1006     mpiMemoryAllocated.region[i].numElements    = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].numElements;
 1007     mpiMemoryAllocated.region[i].elementSize    = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].singleElementLength;
 1008     mpiMemoryAllocated.region[i].alignment      = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].alignment;
 1009     mpiMemoryAllocated.region[i].type           = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].type;
 1010     SA_DBG2(("saInitialize: memoryAllocated->agMemory[%d] VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
 1011       (MPI_IBQ_OBQ_INDEX + i),
 1012       memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].virtPtr,
 1013       memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].phyAddrLower,
 1014       memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].numElements,
 1015       memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].totalLength,
 1016       memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].type));
 1017 
 1018     /* set to zeros */
 1019     SA_DBG1(("saInitialize: Zero memory region %d virt %p allocated %d\n",
 1020             i,mpiMemoryAllocated.region[i].virtPtr,    mpiMemoryAllocated.region[i].totalLength));
 1021     si_memset(mpiMemoryAllocated.region[i].virtPtr , 0,mpiMemoryAllocated.region[i].totalLength);
 1022 
 1023   }
 1024 
 1025   if ((!swConfig->max_MSI_InterruptVectors) &&
 1026       (!swConfig->max_MSIX_InterruptVectors) &&
 1027       (!swConfig->legacyInt_X))
 1028   {
 1029     /* polling mode */
 1030     SA_DBG1(("saInitialize: configured as polling mode\n"));
 1031   }
 1032   else
 1033   {
 1034 
 1035     SA_DBG1(("saInitialize: swConfig->max_MSI_InterruptVectors %d\n",swConfig->max_MSI_InterruptVectors));
 1036     SA_DBG1(("saInitialize: swConfig->max_MSIX_InterruptVectors %d\n",swConfig->max_MSIX_InterruptVectors));
 1037 
 1038     if ((swConfig->legacyInt_X > 1) || (swConfig->max_MSI_InterruptVectors > 32) ||
 1039       (swConfig->max_MSIX_InterruptVectors > 64))
 1040     {
 1041       /* error */
 1042       agRoot->sdkData = agNULL;
 1043       SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors A\n"));
 1044       smTraceFuncExit(hpDBG_VERY_LOUD, 's', "m1");
 1045       return AGSA_RC_FAILURE;
 1046     }
 1047     if ((swConfig->legacyInt_X) && (swConfig->max_MSI_InterruptVectors))
 1048     {
 1049       /* error */
 1050       agRoot->sdkData = agNULL;
 1051       SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors B\n"));
 1052       smTraceFuncExit(hpDBG_VERY_LOUD, 't', "m1");
 1053       return AGSA_RC_FAILURE;
 1054     }
 1055     else if ((swConfig->legacyInt_X) && (swConfig->max_MSIX_InterruptVectors))
 1056     {
 1057       /* error */
 1058       agRoot->sdkData = agNULL;
 1059       SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors C\n"));
 1060       smTraceFuncExit(hpDBG_VERY_LOUD, 'u', "m1");
 1061       return AGSA_RC_FAILURE;
 1062     }
 1063     else if ((swConfig->max_MSI_InterruptVectors) && (swConfig->max_MSIX_InterruptVectors))
 1064     {
 1065       /* error */
 1066       agRoot->sdkData = agNULL;
 1067       SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors D\n"));
 1068       smTraceFuncExit(hpDBG_VERY_LOUD, 'v', "m1");
 1069       return AGSA_RC_FAILURE;
 1070     }
 1071   }
 1072 
 1073   /* This section sets common interrupt for Legacy(IRQ) and MSI and MSIX types */
 1074   if(smIS_SPC(agRoot))
 1075   {
 1076     SA_DBG1(("saInitialize:  SPC  interrupts\n" ));
 1077 
 1078     if (swConfig->legacyInt_X)
 1079     {
 1080       saRoot->OurInterrupt       = siOurLegacyInterrupt;      /* Called in ISR*/
 1081       saRoot->DisableInterrupts  = siDisableLegacyInterrupts; /* Called in ISR*/
 1082       saRoot->ReEnableInterrupts = siReenableLegacyInterrupts;/* Called in Delayed Int handler*/
 1083     }
 1084     else if (swConfig->max_MSIX_InterruptVectors)
 1085     {
 1086       saRoot->OurInterrupt       = siOurMSIXInterrupt;
 1087       saRoot->DisableInterrupts  = siDisableMSIXInterrupts;
 1088       saRoot->ReEnableInterrupts = siReenableMSIXInterrupts;
 1089     }
 1090     else if (swConfig->max_MSI_InterruptVectors)
 1091     {
 1092       saRoot->OurInterrupt       = siOurMSIInterrupt;
 1093       saRoot->DisableInterrupts  = siDisableMSIInterrupts;
 1094       saRoot->ReEnableInterrupts = siReenableMSIInterrupts;
 1095     }
 1096     else
 1097     {
 1098       /* polling mode */
 1099       saRoot->OurInterrupt       = siOurLegacyInterrupt;      /* Called in ISR*/
 1100       saRoot->DisableInterrupts  = siDisableLegacyInterrupts; /* Called in ISR*/
 1101       saRoot->ReEnableInterrupts = siReenableLegacyInterrupts;/* Called in Delayed Int handler*/
 1102     }
 1103   }
 1104   else
 1105   {
 1106     SA_DBG1(("saInitialize:  SPC V interrupts\n" ));
 1107     if (swConfig->legacyInt_X )
 1108     {
 1109       SA_DBG1(("saInitialize:  SPC V legacyInt_X\n" ));
 1110       saRoot->OurInterrupt       = siOurLegacy_V_Interrupt;      /* Called in ISR*/
 1111       saRoot->DisableInterrupts  = siDisableLegacy_V_Interrupts; /* Called in ISR*/
 1112       saRoot->ReEnableInterrupts = siReenableLegacy_V_Interrupts;/* Called in Delayed Int handler*/
 1113     }
 1114     else if (swConfig->max_MSIX_InterruptVectors)
 1115     {
 1116       SA_DBG1(("saInitialize:  SPC V max_MSIX_InterruptVectors %X\n", swConfig->max_MSIX_InterruptVectors));
 1117       saRoot->OurInterrupt       = siOurMSIX_V_Interrupt;       /* */
 1118       saRoot->DisableInterrupts  = siDisableMSIX_V_Interrupts;
 1119       saRoot->ReEnableInterrupts = siReenableMSIX_V_Interrupts;
 1120     }
 1121     else if (swConfig->max_MSI_InterruptVectors)
 1122     {
 1123       SA_DBG1(("saInitialize:  SPC V max_MSI_InterruptVectors\n" ));
 1124       saRoot->OurInterrupt       = siOurMSIX_V_Interrupt;        /* */
 1125       saRoot->DisableInterrupts  = siDisableMSIX_V_Interrupts;
 1126       saRoot->ReEnableInterrupts = siReenableMSIX_V_Interrupts;
 1127     }
 1128     else
 1129     {
 1130       /* polling mode */
 1131       SA_DBG1(("saInitialize:  SPC V polling mode\n" ));
 1132       saRoot->OurInterrupt       = siOurLegacy_V_Interrupt;      /* Called in ISR*/
 1133       saRoot->DisableInterrupts  = siDisableLegacy_V_Interrupts; /* Called in ISR*/
 1134       saRoot->ReEnableInterrupts = siReenableLegacy_V_Interrupts;/* Called in Delayed Int handler*/
 1135     }
 1136     SA_DBG1(("saInitialize:  SPC V\n" ));
 1137   }
 1138 
 1139   saRoot->Use64bit =  (saRoot->QueueConfig.numOutboundQueues > 32 ) ? 1 : 0;
 1140   if( smIS64bInt(agRoot))
 1141   {
 1142     SA_DBG1(("saInitialize: Use 64 bits for interrupts %d %d\n" ,saRoot->Use64bit, saRoot->QueueConfig.numOutboundQueues ));
 1143   }
 1144   else
 1145   {
 1146     SA_DBG1(("saInitialize: Use 32 bits for interrupts %d %d\n",saRoot->Use64bit , saRoot->QueueConfig.numOutboundQueues  ));
 1147   }
 1148 
 1149 #ifdef SA_LL_IBQ_PROTECT
 1150   SA_DBG1(("saInitialize: Inbound locking defined since LL_IOREQ_IBQ0_LOCK %d\n",LL_IOREQ_IBQ0_LOCK));
 1151 #endif /* SA_LL_IBQ_PROTECT */
 1152 
 1153   /* Disable interrupt */
 1154   saRoot->DisableInterrupts(agRoot, 0);
 1155   SA_DBG1(("saInitialize: DisableInterrupts sysIntsActive %X\n" ,saRoot->sysIntsActive));
 1156 
 1157 #ifdef SA_FW_TEST_BUNCH_STARTS
 1158   saRoot->BunchStarts_Enable        = FALSE;
 1159   saRoot->BunchStarts_Threshold     = 5;
 1160   saRoot->BunchStarts_Pending       = 0;
 1161   saRoot->BunchStarts_TimeoutTicks  = 10;  // N x 100 ms 
 1162 #endif /* SA_FW_TEST_BUNCH_STARTS */
 1163 
 1164   /* clear the interrupt vector bitmap */
 1165   for ( i = 0; i < MAX_NUM_VECTOR; i ++ )
 1166   {
 1167     saRoot->interruptVecIndexBitMap[i] = 0;
 1168     saRoot->interruptVecIndexBitMap1[i] = 0;
 1169   }
 1170 
 1171 #if defined(SALLSDK_DEBUG)
 1172   smTrace(hpDBG_VERY_LOUD,"2Y",0);
 1173   /* TP:2Y SCRATCH_PAD */
 1174 
 1175   SA_DBG1(("saInitialize: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_0)));
 1176   SA_DBG1(("saInitialize: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1)));
 1177   SA_DBG1(("saInitialize: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_2)));
 1178   SA_DBG1(("saInitialize: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3)));
 1179 #endif /* SALLSDK_DEBUG */
 1180 
 1181   if(smIS_SPCV(agRoot))
 1182   {
 1183     bit32 ScratchPad1 =0;
 1184     bit32 ScratchPad3 =0;
 1185 
 1186     ScratchPad1 = ossaHwRegRead(agRoot,V_Scratchpad_1_Register);
 1187     ScratchPad3 = ossaHwRegRead(agRoot,V_Scratchpad_3_Register);
 1188     if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) ==  SCRATCH_PAD1_V_RAAE_MASK)
 1189     {
 1190       if(((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_DIS_ERR ) ||
 1191          ((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_ENA_ERR )    )
 1192       {
 1193         SA_DBG1(("saInitialize:Warning Encryption Issue SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3)));
 1194       }
 1195     }
 1196   }
 1197 
 1198   if( smIS_SPC(agRoot))
 1199   {
 1200 #ifdef SA_ENABLE_HDA_FUNCTIONS
 1201     TryWithHDA_ON:
 1202     Double_Reset_HDA = TRUE;
 1203 
 1204     if (swConfig->hostDirectAccessSupport)
 1205     {
 1206       if (AGSA_RC_FAILURE == siHDAMode(agRoot, swConfig->hostDirectAccessMode, (agsaFwImg_t *)swConfig->param4))
 1207       {
 1208         SA_DBG1(("saInitialize:AGSA_RC_FAILURE siHDAMode\n"));
 1209         agRoot->sdkData = agNULL;
 1210         smTraceFuncExit(hpDBG_VERY_LOUD, 'w', "m1");
 1211         return AGSA_RC_FAILURE;
 1212       }
 1213       else
 1214       {
 1215         SA_DBG1(("saInitialize:1 Going to HDA mode HDA 0x%X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET)));
 1216         if(Double_Reset_HDA == agFALSE)
 1217         {
 1218           siSpcSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
 1219           SA_DBG1(("saInitialize: Double_Reset_HDA HDA 0x%X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET)));
 1220           Double_Reset_HDA = TRUE;
 1221           goto TryWithHDA_ON;
 1222         }
 1223       }
 1224     }
 1225     else
 1226     {
 1227       /* check FW is running */
 1228       if (BOOTTLOADERHDA_IDLE == (ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS))
 1229       {
 1230         /* HDA mode */
 1231         SA_DBG1(("saInitialize: No HDA mode enable and FW is not running.\n"));
 1232         if(Tried_NO_HDA != agTRUE )
 1233         {
 1234 
 1235           Tried_NO_HDA = TRUE;
 1236           swConfig->hostDirectAccessSupport = 1;
 1237           swConfig->hostDirectAccessMode = 1;
 1238           siSpcSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
 1239           SA_DBG1(("saInitialize: 2 Going to HDA mode HDA %X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET)));
 1240           goto TryWithHDA_ON;
 1241         }
 1242         else
 1243         {
 1244           SA_DBG1(("saInitialize: could not start HDA mode HDA %X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET)));
 1245           smTraceFuncExit(hpDBG_VERY_LOUD, 'x', "m1");
 1246 
 1247           return AGSA_RC_FAILURE;
 1248         }
 1249         smTraceFuncExit(hpDBG_VERY_LOUD, 'y', "m1");
 1250         return AGSA_RC_FAILURE;
 1251       }
 1252     }
 1253 #else /* SA_ENABLE_HDA_FUNCTIONS */
 1254     /* check FW is running */
 1255     if (BOOTTLOADERHDA_IDLE == (ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS) )
 1256     {
 1257       /* HDA mode */
 1258       SA_DBG1(("saInitialize: No HDA mode enable and FW is not running.\n"));
 1259       smTraceFuncExit(hpDBG_VERY_LOUD, 'z', "m1");
 1260       return AGSA_RC_FAILURE;
 1261     }
 1262 #endif /* SA_ENABLE_HDA_FUNCTIONS */
 1263   }
 1264   else
 1265   {
 1266     SA_DBG1(("saInitialize: SPCv swConfig->hostDirectAccessMode %d swConfig->hostDirectAccessSupport %d\n",swConfig->hostDirectAccessMode,swConfig->hostDirectAccessSupport));
 1267     if (swConfig->hostDirectAccessSupport)
 1268     {
 1269       bit32 hda_status;
 1270       bit32 soft_reset_status = AGSA_RC_SUCCESS;
 1271 
 1272       SA_DBG1(("saInitialize: SPCv load HDA\n"));
 1273 
 1274       hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28));
 1275 
 1276       SA_DBG1(("saInitialize: hda_status 0x%x\n",hda_status));
 1277 
 1278       siScratchDump(agRoot);
 1279 
 1280       if( swConfig->hostDirectAccessMode == 0)
 1281       {
 1282         soft_reset_status = siSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
 1283         if(soft_reset_status !=  AGSA_RC_SUCCESS)
 1284         {
 1285           agRoot->sdkData = agNULL;
 1286           SA_DBG1(("saInitialize:AGSA_RC_FAILURE soft_reset_status\n"));
 1287 
 1288           smTraceFuncExit(hpDBG_VERY_LOUD, 'A', "m1");
 1289           return AGSA_RC_FAILURE;
 1290         }
 1291       }
 1292 
 1293       if((hda_status  & SPC_V_HDAR_RSPCODE_MASK)  != SPC_V_HDAR_IDLE)
 1294       {
 1295         SA_DBG1(("saInitialize: hda_status not SPC_V_HDAR_IDLE 0x%08x\n", hda_status));
 1296         soft_reset_status = siSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
 1297         hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28));
 1298         if((hda_status  & SPC_V_HDAR_RSPCODE_MASK)  != SPC_V_HDAR_IDLE)
 1299         {
 1300           SA_DBG1(("saInitialize: 2 reset hda_status not SPC_V_HDAR_IDLE 0x%08x\n", hda_status));
 1301         }
 1302       }
 1303       if(soft_reset_status !=  AGSA_RC_SUCCESS)
 1304       {
 1305         agRoot->sdkData = agNULL;
 1306         SA_DBG1(("saInitialize:AGSA_RC_FAILURE soft_reset_status A\n"));
 1307         smTraceFuncExit(hpDBG_VERY_LOUD, 'B', "m1");
 1308         return AGSA_RC_FAILURE;
 1309       }
 1310 
 1311 #ifdef SA_ENABLE_HDA_FUNCTIONS
 1312       if (AGSA_RC_FAILURE == siHDAMode_V(agRoot, swConfig->hostDirectAccessMode, (agsaFwImg_t *)swConfig->param4))
 1313       {
 1314         SA_DBG1(("saInitialize:AGSA_RC_FAILURE siHDAMode_V\n"));
 1315 
 1316         siChipResetV(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
 1317         agRoot->sdkData = agNULL;
 1318         smTraceFuncExit(hpDBG_VERY_LOUD, 'C', "m1");
 1319         return AGSA_RC_FAILURE;
 1320       }
 1321 #endif /* SA_ENABLE_HDA_FUNCTIONS */
 1322 
 1323     }
 1324     else
 1325     {
 1326       SA_DBG1(("saInitialize: SPCv normal\n"));
 1327     }
 1328 
 1329   }
 1330 
 1331   /* copy the table to the LL layer */
 1332   si_memcpy(&saRoot->mpiConfig.phyAnalogConfig, &hwConfig->phyAnalogConfig, sizeof(agsaPhyAnalogSetupTable_t));
 1333 
 1334 #ifdef SALL_API_TEST
 1335   /* Initialize the LL IO counter */
 1336   si_memset(&saRoot->LLCounters, 0, sizeof(agsaIOCountInfo_t));
 1337 #endif
 1338 
 1339   si_memset(&saRoot->IoErrorCount, 0, sizeof(agsaIOErrorEventStats_t));
 1340   si_memset(&saRoot->IoEventCount, 0, sizeof(agsaIOErrorEventStats_t));
 1341   if(smIS_SPC(agRoot))
 1342   {
 1343           if( smIS_spc8081(agRoot))
 1344           {
 1345                 if (AGSA_RC_FAILURE == siBar4Shift(agRoot, MBIC_GSM_SM_BASE))
 1346                 {
 1347                   SA_DBG1(("saInitialize: siBar4Shift FAILED ******************************************\n"));
 1348                 }
 1349           }
 1350         siSpcSoftReset(agRoot, SPC_SOFT_RESET_SIGNATURE);
 1351   }
 1352   if(smIS_SPCV(agRoot))
 1353   {
 1354         SA_DBG1(("saInitialize: saRoot->ChipId == VEN_DEV_SPCV\n"));
 1355         siChipResetV(agRoot, SPC_SOFT_RESET_SIGNATURE);
 1356   }     
 1357 
 1358   /* MPI Initialization */
 1359   ret = mpiInitialize(agRoot, &mpiMemoryAllocated, &saRoot->mpiConfig);
 1360   SA_DBG1(("saInitialize: MaxOutstandingIO 0x%x swConfig->maxActiveIOs 0x%x\n", saRoot->ControllerInfo.maxPendingIO,saRoot->swConfig.maxActiveIOs ));
 1361 
 1362 #ifdef SA_ENABLE_HDA_FUNCTIONS
 1363   if( ret  == AGSA_RC_FAILURE && Tried_NO_HDA == agFALSE && smIS_SPC(agRoot))
 1364   { /* FW not flashed  */
 1365     Tried_NO_HDA=agTRUE;
 1366     swConfig->hostDirectAccessSupport = 1;
 1367     swConfig->hostDirectAccessMode = 1;
 1368     siSoftReset(agRoot, SPC_SOFT_RESET_SIGNATURE);
 1369     SA_DBG1(("saInitialize: 3 Going to HDA mode HDA %X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET)));
 1370     goto TryWithHDA_ON;
 1371   }
 1372 
 1373 #endif /* SA_ENABLE_HDA_FUNCTIONS */
 1374 
 1375   if( ret  == AGSA_RC_FAILURE)
 1376   {
 1377     SA_DBG1(("saInitialize:  AGSA_RC_FAILURE mpiInitialize\n"));
 1378     SA_DBG1(("saInitialize: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_0_Register)));
 1379     SA_DBG1(("saInitialize: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_1_Register)));
 1380     SA_DBG1(("saInitialize: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_2_Register)));
 1381     SA_DBG1(("saInitialize: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_3_Register)));
 1382 
 1383     if(saRoot->swConfig.fatalErrorInterruptEnable)
 1384     {
 1385       ossaDisableInterrupts(agRoot,saRoot->swConfig.fatalErrorInterruptVector );
 1386     }
 1387 
 1388     agRoot->sdkData = agNULL;
 1389     smTraceFuncExit(hpDBG_VERY_LOUD, 'D', "m1");
 1390     return ret;
 1391   }
 1392 
 1393   /* setup hardware interrupt coalescing control and timer registers */
 1394   if(smIS_SPCV(agRoot))
 1395   {
 1396       SA_DBG1(("saInitialize: SPC_V Not set hwInterruptCoalescingTimer\n" ));
 1397       SA_DBG1(("saInitialize: SPC_V Not set hwInterruptCoalescingControl\n" ));
 1398   }
 1399   else
 1400   {
 1401       ossaHwRegWriteExt(agRoot, PCIBAR1, SPC_ICTIMER,hwConfig->hwInterruptCoalescingTimer );
 1402       ossaHwRegWriteExt(agRoot, PCIBAR1, SPC_ICCONTROL, hwConfig->hwInterruptCoalescingControl);
 1403   }
 1404 
 1405 
 1406   SA_DBG1(("saInitialize: swConfig->fatalErrorInterruptEnable  %X\n",swConfig->fatalErrorInterruptEnable));
 1407 
 1408   SA_DBG1(("saInitialize: saRoot->swConfig.fatalErrorInterruptVector  %X\n",saRoot->swConfig.fatalErrorInterruptVector));
 1409   SA_DBG1(("saInitialize: swConfig->max_MSI_InterruptVectors   %X\n",swConfig->max_MSI_InterruptVectors));
 1410   SA_DBG1(("saInitialize: swConfig->max_MSIX_InterruptVectors  %X\n",swConfig->max_MSIX_InterruptVectors));
 1411   SA_DBG1(("saInitialize: swConfig->legacyInt_X                %X\n",swConfig->legacyInt_X));
 1412   SA_DBG1(("saInitialize: swConfig->hostDirectAccessSupport    %X\n",swConfig->hostDirectAccessSupport));
 1413   SA_DBG1(("saInitialize: swConfig->hostDirectAccessMode       %X\n",swConfig->hostDirectAccessMode));
 1414 
 1415 #ifdef SA_CONFIG_MDFD_REGISTRY
 1416   SA_DBG1(("saInitialize: swConfig->disableMDF                 %X\n",swConfig->disableMDF));
 1417 #endif /*SA_CONFIG_MDFD_REGISTRY*/
 1418   /*SA_DBG1(("saInitialize: swConfig->enableDIF                  %X\n",swConfig->enableDIF));*/
 1419   /*SA_DBG1(("saInitialize: swConfig->enableEncryption           %X\n",swConfig->enableEncryption));*/
 1420 
 1421 
 1422   /* log message if failure */
 1423   if (AGSA_RC_FAILURE == ret)
 1424   {
 1425     SA_DBG1(("saInitialize:AGSA_RC_FAILURE mpiInitialize\n"));
 1426     /* Assign chip status */
 1427     saRoot->chipStatus = CHIP_FATAL_ERROR;
 1428   }
 1429   else
 1430   {
 1431     /* Assign chip status */
 1432     saRoot->chipStatus = CHIP_NORMAL;
 1433 #ifdef SA_FW_TIMER_READS_STATUS
 1434     siTimerAdd(agRoot,SA_FW_TIMER_READS_STATUS_INTERVAL, siReadControllerStatus,0,agNULL  );
 1435 #endif /* SA_FW_TIMER_READS_STATUS */
 1436   }
 1437 
 1438 
 1439   if( ret == AGSA_RC_SUCCESS || ret == AGSA_RC_VERSION_UNTESTED)
 1440   {
 1441     if(gPollForMissingInt)
 1442     {
 1443       mpiOCQueue_t         *circularQ;
 1444       SA_DBG1(("saInitialize:  saRoot->sysIntsActive %X\n",saRoot->sysIntsActive));
 1445 
 1446       circularQ = &saRoot->outboundQueue[0];
 1447       OSSA_READ_LE_32(circularQ->agRoot, &circularQ->producerIdx, circularQ->piPointer, 0);
 1448       SA_DBG1(("saInitialize: PI 0x%03x CI 0x%03x\n",circularQ->producerIdx, circularQ->consumerIdx));
 1449     }
 1450   }
 1451 
 1452   /* If fatal error interrupt enable we need checking it during the interrupt */
 1453   SA_DBG1(("saInitialize: swConfig.fatalErrorInterruptEnable %d\n",saRoot->swConfig.fatalErrorInterruptEnable));
 1454   SA_DBG1(("saInitialize: swConfig.fatalErrorInterruptVector %d\n",saRoot->swConfig.fatalErrorInterruptVector));
 1455   SA_DBG1(("saInitialize: swConfig->max_MSIX_InterruptVectors  %X\n",swConfig->max_MSIX_InterruptVectors));
 1456 
 1457   if(saRoot->swConfig.fatalErrorInterruptEnable)
 1458   {
 1459 
 1460     SA_DBG1(("saInitialize: Doorbell_Set  %08X U %08X\n",
 1461                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register),
 1462                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU)));
 1463     SA_DBG1(("saInitialize: Doorbell_Mask %08X U %08X\n",
 1464                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ),
 1465                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU )));
 1466 
 1467     ossaReenableInterrupts(agRoot,saRoot->swConfig.fatalErrorInterruptVector );
 1468 
 1469     SA_DBG1(("saInitialize: Doorbell_Set  %08X U %08X\n",
 1470                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register),
 1471                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU)));
 1472     SA_DBG1(("saInitialize: Doorbell_Mask %08X U %08X\n",
 1473                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ),
 1474                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU )));
 1475   }
 1476 
 1477 
 1478   SA_DBG1(("saInitialize: siDumpActiveIORequests\n"));
 1479   siDumpActiveIORequests(agRoot, saRoot->swConfig.maxActiveIOs);
 1480 
 1481   smTraceFuncExit(hpDBG_VERY_LOUD, 'E', "m1");
 1482   /* return */
 1483   return ret;
 1484 }
 1485 
 1486 
 1487 
 1488 #ifdef SA_FW_TIMER_READS_STATUS
 1489 
 1490 bit32 siReadControllerStatus(
 1491                                   agsaRoot_t      *agRoot,
 1492                                   bit32           Event,
 1493                                   void *          pParm
 1494                                   )
 1495 {
 1496   bit32 to_ret =0;
 1497   agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 1498   mpiReadGSTable(agRoot,  &saRoot->mpiGSTable);
 1499 
 1500   if(smIS_SPCV_2_IOP(agRoot))
 1501   {
 1502     if(saRoot->Iop1Tcnt_last  == saRoot->mpiGSTable.Iop1Tcnt )
 1503     SA_DBG2(("siReadControllerStatus: Iop1 %d STUCK\n", saRoot->mpiGSTable.Iop1Tcnt));
 1504   }
 1505 
 1506   if( saRoot->MsguTcnt_last == saRoot->mpiGSTable.MsguTcnt || saRoot->IopTcnt_last  == saRoot->mpiGSTable.IopTcnt )
 1507   {
 1508     SA_DBG1(("siReadControllerStatus: Msgu %d Iop %d\n",saRoot->mpiGSTable.MsguTcnt, saRoot->mpiGSTable.IopTcnt));
 1509     saFatalInterruptHandler(agRoot,  saRoot->swConfig.fatalErrorInterruptVector  );
 1510   }
 1511   SA_DBG2(("siReadControllerStatus: Msgu %d Iop %d\n",saRoot->mpiGSTable.MsguTcnt, saRoot->mpiGSTable.IopTcnt));
 1512 
 1513   saRoot->MsguTcnt_last = saRoot->mpiGSTable.MsguTcnt;
 1514   saRoot->IopTcnt_last  = saRoot->mpiGSTable.IopTcnt;
 1515   saRoot->Iop1Tcnt_last = saRoot->mpiGSTable.Iop1Tcnt;
 1516 
 1517 
 1518   if(gPollForMissingInt)
 1519   {
 1520     mpiOCQueue_t         *circularQ;
 1521     SA_DBG4(("siReadControllerStatus:  saRoot->sysIntsActive %X\n",saRoot->sysIntsActive));
 1522 
 1523     circularQ = &saRoot->outboundQueue[0];
 1524     OSSA_READ_LE_32(circularQ->agRoot, &circularQ->producerIdx, circularQ->piPointer, 0);
 1525     if(circularQ->producerIdx != circularQ->consumerIdx)
 1526     {
 1527       SA_DBG1(("siReadControllerStatus:  saRoot->sysIntsActive %X\n",saRoot->sysIntsActive));
 1528       SA_DBG1(("siReadControllerStatus: PI 0x%03x CI 0x%03x\n",circularQ->producerIdx, circularQ->consumerIdx));
 1529 
 1530       SA_DBG1(("siReadControllerStatus:IN MSGU_READ_ODMR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODMR, V_Outbound_Doorbell_Mask_Set_Register )));
 1531       SA_DBG1(("siReadControllerStatus:MSGU_READ_ODR  %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODR, V_Outbound_Doorbell_Set_Register)));
 1532       ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Clear_Register, 0xFFFFFFFF );
 1533 
 1534     }
 1535   }
 1536 
 1537   siTimerAdd(agRoot,SA_FW_TIMER_READS_STATUS_INTERVAL, siReadControllerStatus,Event,pParm  );
 1538 
 1539   return(to_ret);
 1540 }
 1541 
 1542 #endif /* SA_FW_TIMER_READS_STATUS */
 1543 
 1544 /******************************************************************************/
 1545 /*! \brief Routine to do SPC configuration with default or specified values
 1546  *
 1547  *  Set up configuration table in LL Layer
 1548  *
 1549  *  \param agRoot    handles for this instance of SAS/SATA hardware
 1550  *  \param mpiConfig MPI Configuration
 1551  *  \param swConfig  Pointer to the software configuration
 1552  *
 1553  *  \return -void-
 1554  */
 1555 /*******************************************************************************/
 1556 GLOBAL bit32 siConfiguration(
 1557   agsaRoot_t      *agRoot,
 1558   mpiConfig_t     *mpiConfig,
 1559   agsaHwConfig_t  *hwConfig,
 1560   agsaSwConfig_t  *swConfig
 1561   )
 1562 {
 1563   agsaQueueConfig_t *queueConfig;
 1564   bit32             intOption, enable64 = 0;
 1565   bit8              i;
 1566 
 1567 
 1568   /* sanity check */
 1569   SA_ASSERT( (agNULL != agRoot), "");
 1570 
 1571   smTraceFuncEnter(hpDBG_VERY_LOUD,"m2");
 1572 
 1573   si_memset(mpiConfig, 0, sizeof(mpiConfig_t));
 1574   SA_DBG1(("siConfiguration: si_memset mpiConfig\n"));
 1575 
 1576 #if defined(SALLSDK_DEBUG)
 1577   sidump_swConfig(swConfig);
 1578 #endif
 1579   mpiConfig->mainConfig.custset                      = swConfig->FWConfig;
 1580 
 1581   SA_DBG1(("siConfiguration:custset              %8X  %8X\n",mpiConfig->mainConfig.custset,swConfig->FWConfig));
 1582 
 1583   if (swConfig->param3 == agNULL)
 1584   {
 1585     SA_DBG1(("siConfiguration: swConfig->param3 == agNULL\n"));
 1586     /* initialize the mpiConfig */
 1587     /* We configure the Host main part of configuration table */
 1588     mpiConfig->mainConfig.iQNPPD_HPPD_GEvent          = 0;
 1589     mpiConfig->mainConfig.outboundHWEventPID0_3       = 0;
 1590     mpiConfig->mainConfig.outboundHWEventPID4_7       = 0;
 1591     mpiConfig->mainConfig.outboundNCQEventPID0_3      = 0;
 1592     mpiConfig->mainConfig.outboundNCQEventPID4_7      = 0;
 1593     mpiConfig->mainConfig.outboundTargetITNexusEventPID0_3 = 0;
 1594     mpiConfig->mainConfig.outboundTargetITNexusEventPID4_7 = 0;
 1595     mpiConfig->mainConfig.outboundTargetSSPEventPID0_3 = 0;
 1596     mpiConfig->mainConfig.outboundTargetSSPEventPID4_7 = 0;
 1597 
 1598     mpiConfig->mainConfig.ioAbortDelay                    = 0;
 1599 
 1600     mpiConfig->mainConfig.upperEventLogAddress        = 0;
 1601     mpiConfig->mainConfig.lowerEventLogAddress        = 0;
 1602     mpiConfig->mainConfig.eventLogSize                = MPI_LOGSIZE;
 1603     mpiConfig->mainConfig.eventLogOption              = 0;
 1604     mpiConfig->mainConfig.upperIOPeventLogAddress     = 0;
 1605     mpiConfig->mainConfig.lowerIOPeventLogAddress     = 0;
 1606     mpiConfig->mainConfig.IOPeventLogSize             = MPI_LOGSIZE;
 1607     mpiConfig->mainConfig.IOPeventLogOption           = 0;
 1608     mpiConfig->mainConfig.FatalErrorInterrupt         = 0;
 1609 
 1610     /* save the default value */
 1611     mpiConfig->numInboundQueues = AGSA_MAX_INBOUND_Q;
 1612     mpiConfig->numOutboundQueues = AGSA_MAX_OUTBOUND_Q;
 1613     mpiConfig->maxNumInboundQueues = AGSA_MAX_INBOUND_Q;
 1614     mpiConfig->maxNumOutboundQueues = AGSA_MAX_OUTBOUND_Q;
 1615 
 1616     /* configure inbound queues */
 1617     for ( i = 0; i < AGSA_MAX_INBOUND_Q; i ++ )
 1618     {
 1619       mpiConfig->inboundQueues[i].numElements   = INBOUND_DEPTH_SIZE;
 1620       mpiConfig->inboundQueues[i].elementSize   = IOMB_SIZE64;
 1621       mpiConfig->inboundQueues[i].priority      = MPI_QUEUE_NORMAL;
 1622     }
 1623 
 1624     /* configure outbound queues */
 1625     for ( i = 0; i < AGSA_MAX_OUTBOUND_Q; i ++ )
 1626     {
 1627       mpiConfig->outboundQueues[i].numElements        = OUTBOUND_DEPTH_SIZE;
 1628       mpiConfig->outboundQueues[i].elementSize        = IOMB_SIZE64;
 1629       mpiConfig->outboundQueues[i].interruptVector    = 0;
 1630       mpiConfig->outboundQueues[i].interruptDelay     = 0;
 1631       mpiConfig->outboundQueues[i].interruptThreshold = 0;
 1632       /* always enable OQ interrupt */
 1633       mpiConfig->outboundQueues[i].interruptEnable    = 1;
 1634     }
 1635   }
 1636   else
 1637   { /* Parm3 is not null  */
 1638     queueConfig = (agsaQueueConfig_t *)swConfig->param3;
 1639 
 1640 #if defined(SALLSDK_DEBUG)
 1641     sidump_Q_config( queueConfig );
 1642 #endif
 1643 
 1644     SA_DBG1(("siConfiguration: swConfig->param3 == %p\n",queueConfig));
 1645 
 1646     if ((queueConfig->numInboundQueues > AGSA_MAX_INBOUND_Q) ||
 1647       (queueConfig->numOutboundQueues > AGSA_MAX_OUTBOUND_Q))
 1648     {
 1649       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m2");
 1650       SA_DBG1(("siConfiguration:AGSA_RC_FAILURE MAX_Q\n"));
 1651 
 1652       return AGSA_RC_FAILURE;
 1653     }
 1654 
 1655     if ((queueConfig->numInboundQueues  == 0 ||
 1656          queueConfig->numOutboundQueues == 0    ))
 1657     {
 1658       smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m2");
 1659       SA_DBG1(("siConfiguration:AGSA_RC_FAILURE NO_Q\n"));
 1660       return AGSA_RC_FAILURE;
 1661     }
 1662     mpiConfig->mainConfig.eventLogSize = swConfig->sizefEventLog1 * KBYTES;
 1663     mpiConfig->mainConfig.eventLogOption  = swConfig->eventLog1Option;
 1664     mpiConfig->mainConfig.IOPeventLogSize = swConfig->sizefEventLog2 * KBYTES;
 1665     mpiConfig->mainConfig.IOPeventLogOption = swConfig->eventLog2Option;
 1666 
 1667     if ((queueConfig->numInboundQueues > IQ_NUM_32) || (queueConfig->numOutboundQueues > OQ_NUM_32))
 1668     {
 1669       enable64 = 1;
 1670     }
 1671 
 1672     if (agNULL == hwConfig)
 1673     {
 1674       intOption = 0;
 1675     }
 1676     else
 1677     {
 1678 
 1679 #if defined(SALLSDK_DEBUG)
 1680       sidump_hwConfig(hwConfig);
 1681 #endif
 1682 
 1683 
 1684       if(smIS_SPCV(agRoot))
 1685       {
 1686         intOption = 0;
 1687       }
 1688       else
 1689       {
 1690         intOption = hwConfig->intReassertionOption & INT_OPTION;
 1691       }
 1692 
 1693     }
 1694 
 1695     /* Enable SGPIO */
 1696     swConfig->sgpioSupportEnable = 1;
 1697         
 1698     /* set bit for normal priority or high priority path */
 1699     /* set fatal error interrupt enable and vector */
 1700     /* set Interrupt Reassertion enable and 64 IQ/OQ enable */
 1701     mpiConfig->mainConfig.FatalErrorInterrupt =
 1702                                  (swConfig->fatalErrorInterruptEnable)                       /* bit 0*/     |
 1703          (hwConfig == agNULL ? 0: (hwConfig->hwOption & HW_CFG_PICI_EFFECTIVE_ADDRESS ? (0x1 << SHIFT1): 0))|
 1704                                      (swConfig->sgpioSupportEnable                    ? (0x1 << SHIFT2): 0) |
 1705     /* compile option SA_ENABLE_POISION_TLP */(SA_PTNFE_POISION_TLP                          << SHIFT3)     |
 1706 #ifdef SA_CONFIG_MDFD_REGISTRY
 1707                                             (swConfig->disableMDF                     ? (0x1 << SHIFT4): 0) |
 1708 #else
 1709     /* compile option SA_DISABLE_MDFD       */   (SA_MDFD_MULTI_DATA_FETCH                      << SHIFT4)  |
 1710 #endif /*SA_CONFIG_MDFD_REGISTRY*/
 1711     /* compile option SA_DISABLE_OB_COAL    */(SA_OUTBOUND_COALESCE                          << SHIFT5)     |
 1712     /* compile option SA_ENABLE_ARBTE       */(SA_ARBTE                                      << SHIFT6)     |
 1713                                ((swConfig->fatalErrorInterruptVector & FATAL_ERROR_INT_BITS) << SHIFT8)     |
 1714                                               (enable64                                      << SHIFT16)    |
 1715                                               (intOption                                     << SHIFT17);
 1716 
 1717 
 1718     SA_DBG1(("siConfiguration: swConfig->fatalErrorInterruptEnable  %X\n",swConfig->fatalErrorInterruptEnable));
 1719     SA_DBG1(("siConfiguration: swConfig->fatalErrorInterruptVector  %X\n",swConfig->fatalErrorInterruptVector));
 1720 
 1721 
 1722 
 1723     /* initialize the mpiConfig */
 1724     /* We configure the Host main part of configuration table */
 1725     mpiConfig->mainConfig.outboundTargetITNexusEventPID0_3 = 0;
 1726     mpiConfig->mainConfig.outboundTargetITNexusEventPID4_7 = 0;
 1727     mpiConfig->mainConfig.outboundTargetSSPEventPID0_3 = 0;
 1728     mpiConfig->mainConfig.outboundTargetSSPEventPID4_7 = 0;
 1729     mpiConfig->mainConfig.ioAbortDelay = 0;
 1730     mpiConfig->mainConfig.PortRecoveryTimerPortResetTimer = swConfig->PortRecoveryResetTimer;
 1731 
 1732     /* get parameter from queueConfig */
 1733     mpiConfig->mainConfig.iQNPPD_HPPD_GEvent          = queueConfig->iqNormalPriorityProcessingDepth |
 1734                                                         (queueConfig->iqHighPriorityProcessingDepth << SHIFT8) |
 1735                                                         (queueConfig->generalEventQueue << SHIFT16) |
 1736                                                         (queueConfig->tgtDeviceRemovedEventQueue << SHIFT24);
 1737 
 1738     mpiConfig->mainConfig.outboundHWEventPID0_3       = queueConfig->sasHwEventQueue[0] |
 1739                                                         (queueConfig->sasHwEventQueue[1] << SHIFT8)  |
 1740                                                         (queueConfig->sasHwEventQueue[2] << SHIFT16) |
 1741                                                         (queueConfig->sasHwEventQueue[3] << SHIFT24);
 1742     mpiConfig->mainConfig.outboundHWEventPID4_7       = queueConfig->sasHwEventQueue[4] |
 1743                                                         (queueConfig->sasHwEventQueue[5] << SHIFT8)  |
 1744                                                         (queueConfig->sasHwEventQueue[6] << SHIFT16) |
 1745                                                         (queueConfig->sasHwEventQueue[7] << SHIFT24);
 1746     mpiConfig->mainConfig.outboundNCQEventPID0_3      = queueConfig->sataNCQErrorEventQueue[0] |
 1747                                                         (queueConfig->sataNCQErrorEventQueue[1] << SHIFT8)  |
 1748                                                         (queueConfig->sataNCQErrorEventQueue[2] << SHIFT16) |
 1749                                                         (queueConfig->sataNCQErrorEventQueue[3] << SHIFT24);
 1750     mpiConfig->mainConfig.outboundNCQEventPID4_7      = queueConfig->sataNCQErrorEventQueue[4] |
 1751                                                         (queueConfig->sataNCQErrorEventQueue[5] << SHIFT8)  |
 1752                                                         (queueConfig->sataNCQErrorEventQueue[6] << SHIFT16) |
 1753                                                         (queueConfig->sataNCQErrorEventQueue[7] << SHIFT24);
 1754     /* save it */
 1755     mpiConfig->numInboundQueues = queueConfig->numInboundQueues;
 1756     mpiConfig->numOutboundQueues = queueConfig->numOutboundQueues;
 1757     mpiConfig->queueOption = queueConfig->queueOption;
 1758 
 1759     SA_DBG2(("siConfiguration: numInboundQueues=%d numOutboundQueues=%d\n",
 1760     queueConfig->numInboundQueues,
 1761     queueConfig->numOutboundQueues));
 1762 
 1763     /* configure inbound queues */
 1764     /* We configure the size of queue based on swConfig */
 1765     for( i = 0; i < queueConfig->numInboundQueues; i ++ )
 1766     {
 1767       mpiConfig->inboundQueues[i].numElements   = (bit16)queueConfig->inboundQueues[i].elementCount;
 1768       mpiConfig->inboundQueues[i].elementSize   = (bit16)queueConfig->inboundQueues[i].elementSize;
 1769       mpiConfig->inboundQueues[i].priority      = queueConfig->inboundQueues[i].priority;
 1770 
 1771       SA_DBG2(("siConfiguration: IBQ%d:elementCount=%d elementSize=%d priority=%d Total Size 0x%X\n",
 1772       i,
 1773       queueConfig->inboundQueues[i].elementCount,
 1774       queueConfig->inboundQueues[i].elementSize,
 1775       queueConfig->inboundQueues[i].priority,
 1776       queueConfig->inboundQueues[i].elementCount * queueConfig->inboundQueues[i].elementSize ));
 1777     }
 1778 
 1779     /* configura outbound queues */
 1780     /* We configure the size of queue based on swConfig */
 1781     for( i = 0; i < queueConfig->numOutboundQueues; i ++ )
 1782     {
 1783       mpiConfig->outboundQueues[i].numElements        = (bit16)queueConfig->outboundQueues[i].elementCount;
 1784       mpiConfig->outboundQueues[i].elementSize        = (bit16)queueConfig->outboundQueues[i].elementSize;
 1785       mpiConfig->outboundQueues[i].interruptVector    = (bit8)queueConfig->outboundQueues[i].interruptVectorIndex;
 1786       mpiConfig->outboundQueues[i].interruptDelay     = (bit16)queueConfig->outboundQueues[i].interruptDelay;
 1787       mpiConfig->outboundQueues[i].interruptThreshold = (bit8)queueConfig->outboundQueues[i].interruptCount;
 1788       mpiConfig->outboundQueues[i].interruptEnable    = (bit32)queueConfig->outboundQueues[i].interruptEnable;
 1789 
 1790       SA_DBG2(("siConfiguration: OBQ%d:elementCount=%d elementSize=%d interruptCount=%d interruptEnable=%d\n",
 1791       i,
 1792       queueConfig->outboundQueues[i].elementCount,
 1793       queueConfig->outboundQueues[i].elementSize,
 1794       queueConfig->outboundQueues[i].interruptCount,
 1795       queueConfig->outboundQueues[i].interruptEnable));
 1796     }
 1797   }
 1798 
 1799   SA_DBG1(("siConfiguration:mpiConfig->mainConfig.FatalErrorInterrupt 0x%X\n",mpiConfig->mainConfig.FatalErrorInterrupt));
 1800   SA_DBG1(("siConfiguration:swConfig->fatalErrorInterruptVector       0x%X\n",swConfig->fatalErrorInterruptVector));
 1801   SA_DBG1(("siConfiguration:enable64                                  0x%X\n",enable64));
 1802   SA_DBG1(("siConfiguration:PortRecoveryResetTimer                    0x%X\n",swConfig->PortRecoveryResetTimer));
 1803 
 1804   smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m2");
 1805 
 1806   /* return */
 1807   return AGSA_RC_SUCCESS;
 1808 }
 1809 
 1810 #ifdef FW_EVT_LOG_TST
 1811 void saLogDump(agsaRoot_t *agRoot,
 1812                U32    *eventLogSize,
 1813                U32   **eventLogAddress_)
 1814 {
 1815   agsaLLRoot_t *saRoot =  (agsaLLRoot_t *)(agRoot->sdkData);
 1816   //mpiConfig_t  *mpiConfig = &saRoot->mpiConfig;
 1817   mpiHostLLConfigDescriptor_t *mpiConfig = &saRoot->mainConfigTable;
 1818 
 1819   *eventLogAddress_ = (U32*)eventLogAddress;
 1820   *eventLogSize = (U32)mpiConfig->eventLogSize;
 1821 }
 1822 #endif
 1823 
 1824 /*******************************************************************************/
 1825 /** \fn mpiInitialize(agsaRoot *agRoot, mpiMemReq_t* memoryAllocated, mpiConfig_t* config)
 1826  *  \brief Initializes the MPI Message Unit
 1827  *  \param agRoot           Pointer to a data structure containing LL layer context handles
 1828  *  \param memoryAllocated  Data structure that holds the different chunks of memory that are allocated
 1829  *  \param config           MPI configuration
 1830  *
 1831  * This function is called to initialize SPC_HOST_MPI internal data structures and the SPC hardware.
 1832  * This function is competed synch->ronously (there is no callback)
 1833  *
 1834  * Return:
 1835  *         AGSA_RC_SUCCESS if initialization succeeded.
 1836  *         AGSA_RC_FAILURE if initialization failed.
 1837  */
 1838 /*******************************************************************************/
 1839 GLOBAL bit32 mpiInitialize(agsaRoot_t *agRoot,
 1840                            mpiMemReq_t* memoryAllocated,
 1841                            mpiConfig_t* config)
 1842 {
 1843   static spc_configMainDescriptor_t mainCfg;              /* main part of MPI configuration */
 1844   static spc_inboundQueueDescriptor_t inQueueCfg;         /* Inbound queue HW configuration structure */
 1845   static spc_outboundQueueDescriptor_t outQueueCfg;       /* Outbound queue HW configuration structure */
 1846   bit16 qIdx, i, indexoffset;                      /* Queue index */
 1847   bit16 mIdx = 0;                                  /* Memory region index */
 1848   bit32 MSGUCfgTblDWIdx, GSTLenMPIS;
 1849   bit32 MSGUCfgTblBase, ret = AGSA_RC_SUCCESS;
 1850   bit32 value, togglevalue;
 1851   bit32 saveOffset;
 1852   bit32 inboundoffset, outboundoffset;
 1853   bit8  pcibar;
 1854   bit16 maxinbound = AGSA_MAX_INBOUND_Q;
 1855   bit16 maxoutbound = AGSA_MAX_OUTBOUND_Q;
 1856   bit32 OB_CIPCIBar;
 1857   bit32 IB_PIPCIBar;
 1858   bit32 max_wait_time;
 1859   bit32 max_wait_count;
 1860   bit32 memOffset;
 1861   agsaLLRoot_t *saRoot;
 1862   mpiICQueue_t *circularIQ = agNULL;
 1863   mpiOCQueue_t *circularOQ;
 1864 
 1865   bit32 mpiUnInitFailed = 0;
 1866   bit32 mpiStartToggleFailed = 0;
 1867 
 1868 
 1869 #if defined(SALLSDK_DEBUG)
 1870  bit8 phycount = AGSA_MAX_VALID_PHYS;
 1871 #endif /* SALLSDK_DEBUG */
 1872 
 1873   SA_DBG1(("mpiInitialize: Entering\n"));
 1874   SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null");
 1875   SA_ASSERT(NULL != memoryAllocated, "memoryAllocated argument cannot be null");
 1876   SA_ASSERT(NULL != config, "config argument cannot be null");
 1877   SA_ASSERT(0 == (sizeof(spc_inboundQueueDescriptor_t) % 4), "spc_inboundQueueDescriptor_t type size has to be divisible by 4");
 1878 
 1879   saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 1880 
 1881   si_memset(&mainCfg,0,sizeof(spc_configMainDescriptor_t));
 1882   si_memset(&inQueueCfg,0,sizeof(spc_inboundQueueDescriptor_t));
 1883   si_memset(&outQueueCfg,0,sizeof(spc_outboundQueueDescriptor_t));
 1884 
 1885   SA_ASSERT((agNULL !=saRoot ), "");
 1886   if(saRoot == agNULL)
 1887   {
 1888     SA_DBG1(("mpiInitialize: saRoot == agNULL\n"));
 1889     return(AGSA_RC_FAILURE);
 1890   }
 1891   smTraceFuncEnter(hpDBG_VERY_LOUD,"m3");
 1892 
 1893   /*Shift BAR 4 for SPC HAILEAH*/
 1894   if(smIS_SPC(agRoot))
 1895   {
 1896     if( smIS_HIL(agRoot))
 1897     {
 1898       if (AGSA_RC_FAILURE == siBar4Shift(agRoot, MBIC_GSM_SM_BASE))
 1899       {
 1900         SA_DBG1(("mpiInitialize: siBar4Shift FAILED ******************************************\n"));
 1901         return AGSA_RC_FAILURE;
 1902       }
 1903     }
 1904   }
 1905 
 1906   /* Wait for the SPC Configuration Table to be ready */
 1907   ret = mpiWaitForConfigTable(agRoot, &mainCfg);
 1908   if (AGSA_RC_FAILURE == ret)
 1909   {
 1910     /* return error if MPI Configuration Table not ready */
 1911     SA_DBG1(("mpiInitialize: mpiWaitForConfigTable FAILED ******************************************\n"));
 1912     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m3");
 1913     return ret;
 1914   }
 1915 
 1916   /* read scratch pad0 to get PCI BAR and offset of configuration table */
 1917   MSGUCfgTblBase = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 1918   /* get PCI BAR */
 1919   MSGUCfgTblBase = (MSGUCfgTblBase & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
 1920   /* get pci Bar index */
 1921   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, MSGUCfgTblBase);
 1922 
 1923   SA_DBG1(("mpiInitialize: MSGUCfgTblBase = 0x%x\n", MSGUCfgTblBase));
 1924 #if defined(SALLSDK_DEBUG)
 1925   /* get Phy count from configuration table */
 1926   phycount = (bit8)((mainCfg.ContrlCapFlag & PHY_COUNT_BITS) >> SHIFT19);
 1927 
 1928   SA_DBG1(("mpiInitialize: Number of PHYs = 0x%x\n", phycount));
 1929 
 1930   smTrace(hpDBG_VERY_LOUD,"70",phycount);
 1931   /* TP:70 phycount */
 1932 #endif /* SALLSDK_DEBUG */
 1933 
 1934   /* get High Priority IQ support flag */
 1935   if (mainCfg.ContrlCapFlag & HP_SUPPORT_BIT)
 1936   {
 1937     SA_DBG1(("mpiInitialize: High Priority IQ support from SPC\n"));
 1938   }
 1939   /* get Interrupt Coalescing Support flag */
 1940   if (mainCfg.ContrlCapFlag & INT_COL_BIT)
 1941   {
 1942     SA_DBG1(("mpiInitialize: Interrupt Coalescing support from SPC\n"));
 1943   }
 1944 
 1945   /* get configured the number of inbound/outbound queues */
 1946   if (memoryAllocated->count == TOTAL_MPI_MEM_CHUNKS)
 1947   {
 1948     config->maxNumInboundQueues  = AGSA_MAX_INBOUND_Q;
 1949     config->maxNumOutboundQueues = AGSA_MAX_OUTBOUND_Q;
 1950   }
 1951   else
 1952   {
 1953     config->maxNumInboundQueues  = config->numInboundQueues;
 1954     config->maxNumOutboundQueues = config->numOutboundQueues;
 1955     maxinbound  = config->numInboundQueues;
 1956     maxoutbound = config->numOutboundQueues;
 1957   }
 1958 
 1959   SA_DBG1(("mpiInitialize: Number of IQ %d\n", maxinbound));
 1960   SA_DBG1(("mpiInitialize: Number of OQ %d\n", maxoutbound));
 1961 
 1962   /* get inbound queue offset */
 1963   inboundoffset = mainCfg.inboundQueueOffset;
 1964   /* get outbound queue offset */
 1965   outboundoffset = mainCfg.outboundQueueOffset;
 1966 
 1967   if(smIS_SPCV(agRoot))
 1968   {
 1969     SA_DBG2(("mpiInitialize: Offset of IQ %d\n", (inboundoffset & 0xFF000000) >> 24));
 1970     SA_DBG2(("mpiInitialize: Offset of OQ %d\n", (outboundoffset & 0xFF000000) >> 24));
 1971     inboundoffset &= 0x00FFFFFF;
 1972     outboundoffset &= 0x00FFFFFF;
 1973   }
 1974   /* get offset of the configuration table */
 1975   MSGUCfgTblDWIdx = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 1976   MSGUCfgTblDWIdx = MSGUCfgTblDWIdx & SCRATCH_PAD0_OFFSET_MASK;
 1977 
 1978   saveOffset = MSGUCfgTblDWIdx;
 1979 
 1980   /* Checks if the configuration memory region size is the same as the mpiConfigMain */
 1981   if(memoryAllocated->region[mIdx].totalLength != sizeof(bit8) * config->mainConfig.eventLogSize)
 1982   {
 1983     SA_DBG1(("ERROR: The memory region [%d] 0x%X != 0x%X does not have the size of the MSGU event log ******************************************\n",
 1984       mIdx,memoryAllocated->region[mIdx].totalLength,config->mainConfig.eventLogSize));
 1985     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m3");
 1986     return AGSA_RC_FAILURE;
 1987   }
 1988 
 1989   mainCfg.iQNPPD_HPPD_GEvent               = config->mainConfig.iQNPPD_HPPD_GEvent;
 1990 
 1991   if(smIS_SPCV(agRoot))
 1992   {
 1993     mainCfg.outboundHWEventPID0_3            = 0;
 1994     mainCfg.outboundHWEventPID4_7            = 0;
 1995     mainCfg.outboundNCQEventPID0_3           = 0;
 1996     mainCfg.outboundNCQEventPID4_7           = 0;
 1997     mainCfg.outboundTargetITNexusEventPID0_3 = 0;
 1998     mainCfg.outboundTargetITNexusEventPID4_7 = 0;
 1999     mainCfg.outboundTargetSSPEventPID0_3     = 0;
 2000     mainCfg.outboundTargetSSPEventPID4_7     = 0;
 2001     mainCfg.ioAbortDelay                     = 0;  /* SPCV reserved */
 2002     mainCfg.custset                          = 0;
 2003     mainCfg.portRecoveryResetTimer           = config->mainConfig.PortRecoveryTimerPortResetTimer;
 2004     SA_DBG1(("mpiInitialize:custset V                %8X\n",mainCfg.custset));
 2005     SA_DBG1(("mpiInitialize:portRecoveryResetTimer V %8X\n",mainCfg.portRecoveryResetTimer));
 2006 
 2007     mainCfg.interruptReassertionDelay        = saRoot->hwConfig.intReassertionOption;
 2008     SA_DBG1(("mpiInitialize:interruptReassertionDelay V %8X\n", mainCfg.interruptReassertionDelay));
 2009 
 2010 
 2011   }
 2012   else
 2013   {
 2014     mainCfg.outboundHWEventPID0_3            = config->mainConfig.outboundHWEventPID0_3;
 2015     mainCfg.outboundHWEventPID4_7            = config->mainConfig.outboundHWEventPID4_7;
 2016     mainCfg.outboundNCQEventPID0_3           = config->mainConfig.outboundNCQEventPID0_3;
 2017     mainCfg.outboundNCQEventPID4_7           = config->mainConfig.outboundNCQEventPID4_7;
 2018     mainCfg.outboundTargetITNexusEventPID0_3 = config->mainConfig.outboundTargetITNexusEventPID0_3;
 2019     mainCfg.outboundTargetITNexusEventPID4_7 = config->mainConfig.outboundTargetITNexusEventPID4_7;
 2020     mainCfg.outboundTargetSSPEventPID0_3     = config->mainConfig.outboundTargetSSPEventPID0_3;
 2021     mainCfg.outboundTargetSSPEventPID4_7     = config->mainConfig.outboundTargetSSPEventPID4_7;
 2022     mainCfg.ioAbortDelay                     = config->mainConfig.ioAbortDelay;
 2023     mainCfg.custset                          = config->mainConfig.custset;
 2024 
 2025     SA_DBG1(("mpiInitialize:custset spc     %8X\n",mainCfg.custset));
 2026 
 2027   }
 2028 #ifdef FW_EVT_LOG_TST
 2029   eventLogAddress = memoryAllocated->region[mIdx].virtPtr;
 2030 #endif
 2031   mainCfg.upperEventLogAddress             = memoryAllocated->region[mIdx].physAddrUpper;
 2032   mainCfg.lowerEventLogAddress             = memoryAllocated->region[mIdx].physAddrLower;
 2033   mainCfg.eventLogSize                     = config->mainConfig.eventLogSize;
 2034   mainCfg.eventLogOption                   = config->mainConfig.eventLogOption;
 2035 
 2036   mIdx++;
 2037 
 2038   /* Checks if the configuration memory region size is the same as the mpiConfigMain */
 2039   if(memoryAllocated->region[mIdx].totalLength != sizeof(bit8) * config->mainConfig.IOPeventLogSize)
 2040   {
 2041     SA_DBG1(("ERROR: The memory region does not have the size of the IOP event log\n"));
 2042     smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m3");
 2043     return AGSA_RC_FAILURE;
 2044   }
 2045 
 2046   mainCfg.upperIOPeventLogAddress     = memoryAllocated->region[mIdx].physAddrUpper;
 2047   mainCfg.lowerIOPeventLogAddress     = memoryAllocated->region[mIdx].physAddrLower;
 2048   mainCfg.IOPeventLogSize             = config->mainConfig.IOPeventLogSize;
 2049   mainCfg.IOPeventLogOption           = config->mainConfig.IOPeventLogOption;
 2050   mainCfg.FatalErrorInterrupt         = config->mainConfig.FatalErrorInterrupt;
 2051 
 2052   SA_DBG1(("mpiInitialize: iQNPPD_HPPD_GEvent 0x%x\n", mainCfg.iQNPPD_HPPD_GEvent));
 2053   if(smIS_SPCV(agRoot))
 2054   {
 2055   }
 2056   else
 2057   {
 2058     SA_DBG3(("mpiInitialize: outboundHWEventPID0_3 0x%x\n", mainCfg.outboundHWEventPID0_3));
 2059     SA_DBG3(("mpiInitialize: outboundHWEventPID4_7 0x%x\n", mainCfg.outboundHWEventPID4_7));
 2060     SA_DBG3(("mpiInitialize: outboundNCQEventPID0_3 0x%x\n", mainCfg.outboundNCQEventPID0_3));
 2061     SA_DBG3(("mpiInitialize: outboundNCQEventPID4_7 0x%x\n", mainCfg.outboundNCQEventPID4_7));
 2062     SA_DBG3(("mpiInitialize: outboundTargetITNexusEventPID0_3 0x%x\n", mainCfg.outboundTargetITNexusEventPID0_3));
 2063     SA_DBG3(("mpiInitialize: outboundTargetITNexusEventPID4_7 0x%x\n", mainCfg.outboundTargetITNexusEventPID4_7));
 2064     SA_DBG3(("mpiInitialize: outboundTargetSSPEventPID0_3 0x%x\n", mainCfg.outboundTargetSSPEventPID0_3));
 2065     SA_DBG3(("mpiInitialize: outboundTargetSSPEventPID4_7 0x%x\n", mainCfg.outboundTargetSSPEventPID4_7));
 2066   }
 2067 
 2068   SA_DBG3(("mpiInitialize: upperEventLogAddress 0x%x\n", mainCfg.upperEventLogAddress));
 2069   SA_DBG3(("mpiInitialize: lowerEventLogAddress 0x%x\n", mainCfg.lowerEventLogAddress));
 2070   SA_DBG3(("mpiInitialize: eventLogSize 0x%x\n", mainCfg.eventLogSize));
 2071   SA_DBG3(("mpiInitialize: eventLogOption 0x%x\n", mainCfg.eventLogOption));
 2072 #ifdef FW_EVT_LOG_TST
 2073   SA_DBG3(("mpiInitialize: eventLogAddress 0x%p\n", eventLogAddress));
 2074 #endif
 2075   SA_DBG3(("mpiInitialize: upperIOPLogAddress 0x%x\n", mainCfg.upperIOPeventLogAddress));
 2076   SA_DBG3(("mpiInitialize: lowerIOPLogAddress 0x%x\n", mainCfg.lowerIOPeventLogAddress));
 2077   SA_DBG3(("mpiInitialize: IOPeventLogSize 0x%x\n", mainCfg.IOPeventLogSize));
 2078   SA_DBG3(("mpiInitialize: IOPeventLogOption 0x%x\n", mainCfg.IOPeventLogOption));
 2079   SA_DBG3(("mpiInitialize: FatalErrorInterrupt 0x%x\n", mainCfg.FatalErrorInterrupt));
 2080   SA_DBG3(("mpiInitialize: HDAModeFlags 0x%x\n", mainCfg.HDAModeFlags));
 2081   SA_DBG3(("mpiInitialize: analogSetupTblOffset 0x%08x\n", mainCfg.analogSetupTblOffset));
 2082 
 2083   saRoot->mainConfigTable.iQNPPD_HPPD_GEvent               = mainCfg.iQNPPD_HPPD_GEvent;
 2084 
 2085   if(smIS_SPCV(agRoot))
 2086   {
 2087   /* SPCV - reserved fields */
 2088     saRoot->mainConfigTable.outboundHWEventPID0_3            = 0;
 2089     saRoot->mainConfigTable.outboundHWEventPID4_7            = 0;
 2090     saRoot->mainConfigTable.outboundNCQEventPID0_3           = 0;
 2091     saRoot->mainConfigTable.outboundNCQEventPID4_7           = 0;
 2092     saRoot->mainConfigTable.outboundTargetITNexusEventPID0_3 = 0;
 2093     saRoot->mainConfigTable.outboundTargetITNexusEventPID4_7 = 0;
 2094     saRoot->mainConfigTable.outboundTargetSSPEventPID0_3     = 0;
 2095     saRoot->mainConfigTable.outboundTargetSSPEventPID4_7     = 0;
 2096     saRoot->mainConfigTable.ioAbortDelay                     = 0;
 2097     saRoot->mainConfigTable.custset                          = 0;
 2098 
 2099   }
 2100   else
 2101   {
 2102     saRoot->mainConfigTable.outboundHWEventPID0_3            = mainCfg.outboundHWEventPID0_3;
 2103     saRoot->mainConfigTable.outboundHWEventPID4_7            = mainCfg.outboundHWEventPID4_7;
 2104     saRoot->mainConfigTable.outboundNCQEventPID0_3           = mainCfg.outboundNCQEventPID0_3;
 2105     saRoot->mainConfigTable.outboundNCQEventPID4_7           = mainCfg.outboundNCQEventPID4_7;
 2106     saRoot->mainConfigTable.outboundTargetITNexusEventPID0_3 = mainCfg.outboundTargetITNexusEventPID0_3;
 2107     saRoot->mainConfigTable.outboundTargetITNexusEventPID4_7 = mainCfg.outboundTargetITNexusEventPID4_7;
 2108     saRoot->mainConfigTable.outboundTargetSSPEventPID0_3     = mainCfg.outboundTargetSSPEventPID0_3;
 2109     saRoot->mainConfigTable.outboundTargetSSPEventPID4_7     = mainCfg.outboundTargetSSPEventPID4_7;
 2110     saRoot->mainConfigTable.ioAbortDelay                     = mainCfg.ioAbortDelay;
 2111     saRoot->mainConfigTable.custset                          = mainCfg.custset;
 2112 
 2113   }
 2114 
 2115   saRoot->mainConfigTable.upperEventLogAddress             = mainCfg.upperEventLogAddress;
 2116   saRoot->mainConfigTable.lowerEventLogAddress             = mainCfg.lowerEventLogAddress;
 2117   saRoot->mainConfigTable.eventLogSize                     = mainCfg.eventLogSize;
 2118   saRoot->mainConfigTable.eventLogOption                   = mainCfg.eventLogOption;
 2119   saRoot->mainConfigTable.upperIOPeventLogAddress          = mainCfg.upperIOPeventLogAddress;
 2120   saRoot->mainConfigTable.lowerIOPeventLogAddress          = mainCfg.lowerIOPeventLogAddress;
 2121   saRoot->mainConfigTable.IOPeventLogSize                  = mainCfg.IOPeventLogSize;
 2122   saRoot->mainConfigTable.IOPeventLogOption                = mainCfg.IOPeventLogOption;
 2123   saRoot->mainConfigTable.FatalErrorInterrupt              = mainCfg.FatalErrorInterrupt;
 2124 
 2125 
 2126   if(smIS_SPCV(agRoot))
 2127   {
 2128     ;/* SPCV - reserved fields */
 2129   }
 2130   else
 2131   {
 2132     saRoot->mainConfigTable.HDAModeFlags                     = mainCfg.HDAModeFlags;
 2133   }
 2134 
 2135   saRoot->mainConfigTable.analogSetupTblOffset             = mainCfg.analogSetupTblOffset;
 2136 
 2137   smTrace(hpDBG_VERY_LOUD,"71",mIdx);
 2138   /* TP:71 71 mIdx  */
 2139 
 2140 
 2141 
 2142   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IQNPPD_HPPD_OFFSET),
 2143                      mainCfg.iQNPPD_HPPD_GEvent);
 2144 
 2145   SA_DBG3(("mpiInitialize: Offset 0x%08x mainCfg.iQNPPD_HPPD_GEvent 0x%x\n", (bit32)(MSGUCfgTblDWIdx + MAIN_IQNPPD_HPPD_OFFSET), mainCfg.iQNPPD_HPPD_GEvent));
 2146 
 2147   if(smIS_SPC6V(agRoot))
 2148   {
 2149     if(smIsCfgVREV_B(agRoot))
 2150     {
 2151       ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY),
 2152                      MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE);
 2153 
 2154       SA_DBG1(("mpiInitialize:SPCV - MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE\n" ));
 2155     }
 2156     if(smIsCfgVREV_C(agRoot))
 2157     {
 2158       SA_DBG1(("mpiInitialize:SPCV - END_TO_END_CRC On\n" ));
 2159     }
 2160     SA_DBG3(("mpiInitialize:SPCV - rest reserved field  \n" ));
 2161     ;/* SPCV - reserved field */
 2162   }
 2163   else if(smIS_SPC(agRoot))
 2164   {
 2165     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_HW_EVENT_PID03_OFFSET),
 2166                        mainCfg.outboundHWEventPID0_3);
 2167     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_HW_EVENT_PID47_OFFSET),
 2168                        mainCfg.outboundHWEventPID4_7);
 2169     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_NCQ_EVENT_PID03_OFFSET),
 2170                        mainCfg.outboundNCQEventPID0_3);
 2171     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_NCQ_EVENT_PID47_OFFSET),
 2172                        mainCfg.outboundNCQEventPID4_7);
 2173     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_TITNX_EVENT_PID03_OFFSET),
 2174                        mainCfg.outboundTargetITNexusEventPID0_3);
 2175     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_TITNX_EVENT_PID47_OFFSET),
 2176                        mainCfg.outboundTargetITNexusEventPID4_7);
 2177     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_SSP_EVENT_PID03_OFFSET),
 2178                        mainCfg.outboundTargetSSPEventPID0_3);
 2179     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_SSP_EVENT_PID47_OFFSET),
 2180                        mainCfg.outboundTargetSSPEventPID4_7);
 2181     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_CUSTOMER_SETTING),
 2182                        mainCfg.custset);
 2183   }else
 2184   {
 2185     if(smIsCfgVREV_A(agRoot))
 2186     {
 2187        ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY),
 2188                      MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE);  /* */
 2189        SA_DBG1(("mpiInitialize:SPCV12G - offset MAIN_IO_ABORT_DELAY 0x%x value MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE 0x%x\n",MAIN_IO_ABORT_DELAY ,MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE));
 2190        SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC OFF for rev A %d\n",smIsCfgVREV_A(agRoot) ));
 2191     }
 2192     else if(smIsCfgVREV_B(agRoot))
 2193     {
 2194        SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC ON rev B %d ****************************\n",smIsCfgVREV_B(agRoot) ));
 2195        /*ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY),
 2196                      MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE); 
 2197        */
 2198     }
 2199     else if(smIsCfgVREV_C(agRoot))
 2200     {
 2201        SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC on rev C %d\n",smIsCfgVREV_C(agRoot) ));
 2202     }
 2203     else
 2204     {
 2205        ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY),
 2206                      MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE);
 2207        SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC Off unknown rev 0x%x\n", ossaHwRegReadConfig32((agRoot), 8 )));
 2208     }
 2209   }
 2210 
 2211   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_HI),       mainCfg.upperEventLogAddress);
 2212   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_LO),       mainCfg.lowerEventLogAddress);
 2213   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_BUFF_SIZE),     mainCfg.eventLogSize);
 2214   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_OPTION),        mainCfg.eventLogOption);
 2215   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_HI),   mainCfg.upperIOPeventLogAddress);
 2216   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_LO),   mainCfg.lowerIOPeventLogAddress);
 2217   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_BUFF_SIZE), mainCfg.IOPeventLogSize);
 2218   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_OPTION),    mainCfg.IOPeventLogOption);
 2219   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_INTERRUPT),   mainCfg.FatalErrorInterrupt);
 2220   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_PRECTD_PRESETD),          mainCfg.portRecoveryResetTimer);
 2221 
 2222   SA_DBG3(("mpiInitialize: Offset 0x%08x upperEventLogAddress    0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_HI), mainCfg.upperEventLogAddress ));
 2223   SA_DBG3(("mpiInitialize: Offset 0x%08x lowerEventLogAddress    0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_LO), mainCfg.lowerEventLogAddress ));
 2224   SA_DBG3(("mpiInitialize: Offset 0x%08x eventLogSize            0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_BUFF_SIZE), mainCfg.eventLogSize ));
 2225   SA_DBG3(("mpiInitialize: Offset 0x%08x eventLogOption          0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_OPTION), mainCfg.eventLogOption ));
 2226   SA_DBG3(("mpiInitialize: Offset 0x%08x upperIOPeventLogAddress 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_HI), mainCfg.upperIOPeventLogAddress ));
 2227   SA_DBG3(("mpiInitialize: Offset 0x%08x lowerIOPeventLogAddress 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_LO), mainCfg.lowerIOPeventLogAddress ));
 2228   SA_DBG3(("mpiInitialize: Offset 0x%08x IOPeventLogSize         0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_BUFF_SIZE), mainCfg.IOPeventLogSize ));
 2229   SA_DBG3(("mpiInitialize: Offset 0x%08x IOPeventLogOption       0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_OPTION), mainCfg.IOPeventLogOption ));
 2230   SA_DBG3(("mpiInitialize: Offset 0x%08x FatalErrorInterrupt     0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_INTERRUPT), mainCfg.FatalErrorInterrupt ));
 2231   SA_DBG3(("mpiInitialize: Offset 0x%08x PortRecoveryResetTimer  0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_PRECTD_PRESETD), mainCfg.portRecoveryResetTimer ));
 2232 
 2233   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IRAD_RESERVED),           mainCfg.interruptReassertionDelay);
 2234   SA_DBG3(("mpiInitialize: Offset 0x%08x InterruptReassertionDelay 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IRAD_RESERVED), mainCfg.interruptReassertionDelay ));
 2235 
 2236   mIdx++;
 2237 
 2238   /* skip the ci and pi memory region */
 2239   mIdx++;
 2240   mIdx++;
 2241 
 2242   smTrace(hpDBG_VERY_LOUD,"72",mIdx);
 2243   /* TP:72 mIdx  */
 2244   smTrace(hpDBG_VERY_LOUD,"Bc",maxinbound);
 2245   /* TP:Bc  maxinbound  */
 2246   smTrace(hpDBG_VERY_LOUD,"Bd",pcibar);
 2247   /* TP:Bd pcibar   */
 2248 
 2249   /* index offset */
 2250   indexoffset = 0;
 2251   memOffset   = 0;
 2252 
 2253   /* Memory regions for the inbound queues */
 2254   for(qIdx = 0; qIdx < maxinbound; qIdx++)
 2255   {
 2256     /* point back to the begin then plus offset to next queue */
 2257     smTrace(hpDBG_VERY_LOUD,"Bd",pcibar);
 2258     /* TP:Bd pcibar   */
 2259     MSGUCfgTblDWIdx = saveOffset;
 2260     MSGUCfgTblDWIdx += inboundoffset;
 2261     MSGUCfgTblDWIdx += (sizeof(spc_inboundQueueDescriptor_t) * qIdx);
 2262     SA_DBG1(("mpiInitialize: A saveOffset 0x%x MSGUCfgTblDWIdx 0x%x\n",saveOffset ,MSGUCfgTblDWIdx));
 2263 
 2264     /* if the MPI configuration says that this queue is disabled ... */
 2265     if(0 == config->inboundQueues[qIdx].numElements)
 2266     {
 2267       /* ... Clears the configuration table for this queue */
 2268 
 2269       inQueueCfg.elementPriSizeCount= 0;
 2270       inQueueCfg.upperBaseAddress = 0;
 2271       inQueueCfg.lowerBaseAddress = 0;
 2272       inQueueCfg.ciUpperBaseAddress = 0;
 2273       inQueueCfg.ciLowerBaseAddress = 0;
 2274       /* skip inQueueCfg.PIPCIBar (PM8000 write access) */
 2275       /* skip inQueueCfg.PIOffset (PM8000 write access) */
 2276 
 2277       /* Update the inbound configuration table in SPC GSM */
 2278       mpiUpdateIBQueueCfgTable(agRoot, &inQueueCfg, MSGUCfgTblDWIdx, pcibar);
 2279     }
 2280 
 2281     /* If the queue is enabled, then ... */
 2282     else
 2283     {
 2284       bit32 memSize = config->inboundQueues[qIdx].numElements * config->inboundQueues[qIdx].elementSize;
 2285       bit32 remainder = memSize & 127;
 2286 
 2287       /* Calculate the size of this queue padded to 128 bytes */
 2288       if (remainder > 0)
 2289       {
 2290         memSize += (128 - remainder);
 2291       }
 2292 
 2293       /* ... first checks that the memory region has the right size */
 2294       if( (memoryAllocated->region[mIdx].totalLength - memOffset < memSize) ||
 2295           (NULL == memoryAllocated->region[mIdx].virtPtr) ||
 2296           (0 == memoryAllocated->region[mIdx].totalLength))
 2297       {
 2298         SA_DBG1(("mpiInitialize: ERROR The memory region does not have the right size for this inbound queue"));
 2299         smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "m3");
 2300         return AGSA_RC_FAILURE;
 2301       }
 2302       else
 2303       {
 2304         /* Then, using the MPI configuration argument, initializes the corresponding element on the saRoot */
 2305         saRoot->inboundQueue[qIdx].numElements  = config->inboundQueues[qIdx].numElements;
 2306         saRoot->inboundQueue[qIdx].elementSize  = config->inboundQueues[qIdx].elementSize;
 2307         saRoot->inboundQueue[qIdx].priority     = config->inboundQueues[qIdx].priority;
 2308         si_memcpy(&saRoot->inboundQueue[qIdx].memoryRegion, &memoryAllocated->region[mIdx], sizeof(mpiMem_t));
 2309         saRoot->inboundQueue[qIdx].memoryRegion.virtPtr =
 2310           (bit8 *)saRoot->inboundQueue[qIdx].memoryRegion.virtPtr + memOffset;
 2311         saRoot->inboundQueue[qIdx].memoryRegion.physAddrLower += memOffset;
 2312         saRoot->inboundQueue[qIdx].memoryRegion.elementSize = memSize;
 2313         saRoot->inboundQueue[qIdx].memoryRegion.totalLength = memSize;
 2314         saRoot->inboundQueue[qIdx].memoryRegion.numElements = 1;
 2315 
 2316         /* Initialize the local copy of PIs, CIs */
 2317         SA_DBG1(("mpiInitialize: queue %d PI CI zero\n",qIdx));
 2318         saRoot->inboundQueue[qIdx].producerIdx = 0;
 2319         saRoot->inboundQueue[qIdx].consumerIdx = 0;
 2320         saRoot->inboundQueue[qIdx].agRoot = agRoot;
 2321 
 2322         /* MPI memory region for inbound CIs are 2 */
 2323         saRoot->inboundQueue[qIdx].ciPointer = (((bit8 *)(memoryAllocated->region[MPI_CI_INDEX].virtPtr)) + qIdx * 4);
 2324         /* ... and in the local structure we will use to copy to the HW configuration table */
 2325 
 2326         /* CI base address */
 2327         inQueueCfg.elementPriSizeCount= config->inboundQueues[qIdx].numElements |
 2328                                         (config->inboundQueues[qIdx].elementSize << SHIFT16) |
 2329                                         (config->inboundQueues[qIdx].priority << SHIFT30);
 2330         inQueueCfg.upperBaseAddress   = saRoot->inboundQueue[qIdx].memoryRegion.physAddrUpper;
 2331         inQueueCfg.lowerBaseAddress   = saRoot->inboundQueue[qIdx].memoryRegion.physAddrLower;
 2332         inQueueCfg.ciUpperBaseAddress = memoryAllocated->region[MPI_CI_INDEX].physAddrUpper;
 2333         inQueueCfg.ciLowerBaseAddress = memoryAllocated->region[MPI_CI_INDEX].physAddrLower + qIdx * 4;
 2334 
 2335         /* write the configured data of inbound queue to SPC GSM */
 2336         mpiUpdateIBQueueCfgTable(agRoot, &inQueueCfg, MSGUCfgTblDWIdx, pcibar);
 2337         /* get inbound PI PCI Bar and Offset */
 2338         /* get the PI PCI Bar offset and convert it to logical BAR */
 2339         IB_PIPCIBar = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + IB_PIPCI_BAR));
 2340         saRoot->inboundQueue[qIdx].PIPCIBar     = mpiGetPCIBarIndex(agRoot, IB_PIPCIBar);
 2341         saRoot->inboundQueue[qIdx].PIPCIOffset  = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + IB_PIPCI_BAR_OFFSET));
 2342         saRoot->inboundQueue[qIdx].qNumber      = qIdx;
 2343 
 2344         memOffset += memSize;
 2345 
 2346         if ((0 == ((qIdx + 1) % MAX_QUEUE_EACH_MEM)) ||
 2347             (qIdx == (maxinbound - 1)))
 2348         {
 2349           mIdx++;
 2350           indexoffset += MAX_QUEUE_EACH_MEM;
 2351           memOffset = 0;
 2352         }
 2353 
 2354       } /* else for memeory ok */
 2355     } /* queue enable */
 2356   } /* loop for inbound queue */
 2357 
 2358   smTrace(hpDBG_VERY_LOUD,"73",0);
 2359   /* TP:73  outbound queues  */
 2360 
 2361   /* index offset */
 2362   indexoffset = 0;
 2363   memOffset = 0;
 2364   /* Let's process the memory regions for the outbound queues */
 2365   for(qIdx = 0; qIdx < maxoutbound; qIdx++)
 2366   {
 2367     /* point back to the begin then plus offset to next queue */
 2368     MSGUCfgTblDWIdx  = saveOffset;
 2369     MSGUCfgTblDWIdx += outboundoffset;
 2370     MSGUCfgTblDWIdx += (sizeof(spc_outboundQueueDescriptor_t) * qIdx);
 2371 
 2372     /* if the MPI configuration says that this queue is disabled ... */
 2373     if(0 == config->outboundQueues[qIdx].numElements)
 2374     {
 2375       /* ... Clears the configuration table for this queue */
 2376       outQueueCfg.upperBaseAddress   = 0;
 2377       outQueueCfg.lowerBaseAddress   = 0;
 2378       outQueueCfg.piUpperBaseAddress = 0;
 2379       outQueueCfg.piLowerBaseAddress = 0;
 2380       /* skip outQueueCfg.CIPCIBar = 0; read access only */
 2381       /* skip outQueueCfg.CIOffset = 0; read access only */
 2382       outQueueCfg.elementSizeCount     = 0;
 2383       outQueueCfg.interruptVecCntDelay = 0;
 2384 
 2385       /* Updated the configuration table in SPC GSM */
 2386       mpiUpdateOBQueueCfgTable(agRoot, &outQueueCfg, MSGUCfgTblDWIdx, pcibar);
 2387     }
 2388 
 2389     /* If the outbound queue is enabled, then ... */
 2390     else
 2391     {
 2392       bit32 memSize = config->outboundQueues[qIdx].numElements * config->outboundQueues[qIdx].elementSize;
 2393       bit32 remainder = memSize & 127;
 2394 
 2395       /* Calculate the size of this queue padded to 128 bytes */
 2396       if (remainder > 0)
 2397       {
 2398           memSize += (128 - remainder);
 2399       }
 2400 
 2401       /* ... first checks that the memory region has the right size */
 2402       if((memoryAllocated->region[mIdx].totalLength - memOffset < memSize) ||
 2403          (NULL == memoryAllocated->region[mIdx].virtPtr) ||
 2404          (0 == memoryAllocated->region[mIdx].totalLength))
 2405       {
 2406         SA_DBG1(("ERROR: The memory region does not have the right size for this outbound queue"));
 2407         smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "m3");
 2408         return AGSA_RC_FAILURE;
 2409       }
 2410       else
 2411       {
 2412         /* Then, using the MPI configuration argument, initializes the corresponding element on the MPI context ... */
 2413         saRoot->outboundQueue[qIdx].numElements  = config->outboundQueues[qIdx].numElements;
 2414         saRoot->outboundQueue[qIdx].elementSize  = config->outboundQueues[qIdx].elementSize;
 2415         si_memcpy(&saRoot->outboundQueue[qIdx].memoryRegion, &memoryAllocated->region[mIdx], sizeof(mpiMem_t));
 2416         saRoot->outboundQueue[qIdx].memoryRegion.virtPtr =
 2417             (bit8 *)saRoot->outboundQueue[qIdx].memoryRegion.virtPtr + memOffset;
 2418         saRoot->outboundQueue[qIdx].memoryRegion.physAddrLower += memOffset;
 2419         saRoot->outboundQueue[qIdx].memoryRegion.elementSize = memSize;
 2420         saRoot->outboundQueue[qIdx].memoryRegion.totalLength = memSize;
 2421         saRoot->outboundQueue[qIdx].memoryRegion.numElements = 1;
 2422         saRoot->outboundQueue[qIdx].producerIdx = 0;
 2423         saRoot->outboundQueue[qIdx].consumerIdx = 0;
 2424         saRoot->outboundQueue[qIdx].agRoot = agRoot;
 2425 
 2426         /* MPI memory region for outbound PIs are 3 */
 2427         saRoot->outboundQueue[qIdx].piPointer = (((bit8 *)(memoryAllocated->region[MPI_CI_INDEX + 1].virtPtr))+ qIdx * 4);
 2428         /* ... and in the local structure we will use to copy to the HW configuration table */
 2429         outQueueCfg.upperBaseAddress = saRoot->outboundQueue[qIdx].memoryRegion.physAddrUpper;
 2430         outQueueCfg.lowerBaseAddress = saRoot->outboundQueue[qIdx].memoryRegion.physAddrLower;
 2431 
 2432         /* PI base address */
 2433         outQueueCfg.piUpperBaseAddress = memoryAllocated->region[MPI_CI_INDEX + 1].physAddrUpper;
 2434         outQueueCfg.piLowerBaseAddress = memoryAllocated->region[MPI_CI_INDEX + 1].physAddrLower + qIdx * 4;
 2435         outQueueCfg.elementSizeCount = config->outboundQueues[qIdx].numElements |
 2436                                        (config->outboundQueues[qIdx].elementSize << SHIFT16);
 2437 
 2438         /* enable/disable interrupt - use saSystemInterruptsActive() API */
 2439         /* instead of ossaHwRegWrite(agRoot, MSGU_ODMR, 0); */
 2440         /* Outbound Doorbell Auto disable */
 2441         /* LL does not use ossaHwRegWriteExt(agRoot, PCIBAR1, SPC_ODAR, 0xffffffff); */
 2442         if (config->outboundQueues[qIdx].interruptEnable)
 2443         {
 2444           /* enable interrupt flag bit30 of outbound table */
 2445           outQueueCfg.elementSizeCount |= OB_PROPERTY_INT_ENABLE;
 2446         }
 2447         if(smIS_SPCV(agRoot))
 2448         {
 2449           outQueueCfg.interruptVecCntDelay = ((config->outboundQueues[qIdx].interruptVector    & INT_VEC_BITS  ) << SHIFT24);
 2450         }
 2451         else
 2452         {
 2453           outQueueCfg.interruptVecCntDelay =  (config->outboundQueues[qIdx].interruptDelay     & INT_DELAY_BITS)             |
 2454                                              ((config->outboundQueues[qIdx].interruptThreshold & INT_THR_BITS  ) << SHIFT16) |
 2455                                              ((config->outboundQueues[qIdx].interruptVector    & INT_VEC_BITS  ) << SHIFT24);
 2456         }
 2457 
 2458         /* create a VectorIndex Bit Map */
 2459         if (qIdx < OQ_NUM_32)
 2460         {
 2461           saRoot->interruptVecIndexBitMap[config->outboundQueues[qIdx].interruptVector] |= (1 << qIdx);
 2462           SA_DBG2(("mpiInitialize:below 32 saRoot->interruptVecIndexBitMap[config->outboundQueues[qIdx].interruptVector] 0x%08x\n",saRoot->interruptVecIndexBitMap[config->outboundQueues[qIdx].interruptVector]));
 2463         }
 2464         else
 2465         {
 2466           saRoot->interruptVecIndexBitMap1[config->outboundQueues[qIdx].interruptVector] |= (1 << (qIdx - OQ_NUM_32));
 2467           SA_DBG2(("mpiInitialize:Above 32 saRoot->interruptVecIndexBitMap1[config->outboundQueues[qIdx].interruptVector] 0x%08x\n",saRoot->interruptVecIndexBitMap1[config->outboundQueues[qIdx].interruptVector]));
 2468         }
 2469         /* Update the outbound configuration table */
 2470         mpiUpdateOBQueueCfgTable(agRoot, &outQueueCfg, MSGUCfgTblDWIdx, pcibar);
 2471 
 2472         /* read the CI PCIBar offset and convert it to logical bar */
 2473         OB_CIPCIBar = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + OB_CIPCI_BAR));
 2474         saRoot->outboundQueue[qIdx].CIPCIBar    = mpiGetPCIBarIndex(agRoot, OB_CIPCIBar);
 2475         saRoot->outboundQueue[qIdx].CIPCIOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + OB_CIPCI_BAR_OFFSET));
 2476         saRoot->outboundQueue[qIdx].DIntTOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + OB_DYNAMIC_COALES_OFFSET));
 2477         saRoot->outboundQueue[qIdx].qNumber      = qIdx;
 2478 
 2479         memOffset += memSize;
 2480 
 2481         if ((0 == ((qIdx + 1) % MAX_QUEUE_EACH_MEM)) ||
 2482             (qIdx == (maxoutbound - 1)))
 2483         {
 2484           mIdx++;
 2485           indexoffset += MAX_QUEUE_EACH_MEM;
 2486           memOffset =0;
 2487         }
 2488       }
 2489     }
 2490   }
 2491 
 2492   /* calculate number of vectors */
 2493   saRoot->numInterruptVectors = 0;
 2494   for (qIdx = 0; qIdx < MAX_NUM_VECTOR; qIdx++)
 2495   {
 2496     if ((saRoot->interruptVecIndexBitMap[qIdx]) || (saRoot->interruptVecIndexBitMap1[qIdx]))
 2497     {
 2498       (saRoot->numInterruptVectors)++;
 2499     }
 2500   }
 2501 
 2502   SA_DBG2(("mpiInitialize:(saRoot->numInterruptVectors) 0x%x\n",(saRoot->numInterruptVectors)));
 2503 
 2504   if(smIS_SPCV(agRoot))
 2505   {
 2506     /* setup interrupt vector table  */
 2507     mpiWrIntVecTable(agRoot,config);
 2508   }
 2509 
 2510   if(smIS_SPCV(agRoot))
 2511   {
 2512     mpiWrAnalogSetupTable(agRoot,config);
 2513   }
 2514 
 2515   /* setup phy analog registers */
 2516   mpiWriteCALAll(agRoot, &config->phyAnalogConfig);
 2517 
 2518   {
 2519     bit32 pcibar = 0;
 2520     bit32 TableOffset;
 2521     pcibar = siGetPciBar(agRoot);
 2522     TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 2523     TableOffset &= SCRATCH_PAD0_OFFSET_MASK;
 2524     SA_DBG1(("mpiInitialize: mpiContextTable TableOffset 0x%08X contains 0x%08X\n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset )));
 2525 
 2526     SA_ASSERT( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) == 0x53434D50), "Config table signiture");
 2527 
 2528     SA_DBG1(("mpiInitialize: AGSA_MPI_MAIN_CONFIGURATION_TABLE           0x%08X\n", 0));
 2529     SA_DBG1(("mpiInitialize: AGSA_MPI_GENERAL_STATUS_TABLE               0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_GST_OFFSET) & 0xFFFF )));
 2530     SA_DBG1(("mpiInitialize: AGSA_MPI_INBOUND_QUEUE_CONFIGURATION_TABLE  0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_IBQ_OFFSET)  & 0xFFFF)));
 2531     SA_DBG1(("mpiInitialize: AGSA_MPI_OUTBOUND_QUEUE_CONFIGURATION_TABLE 0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_OBQ_OFFSET)  & 0xFFFF)));
 2532     SA_DBG1(("mpiInitialize: AGSA_MPI_SAS_PHY_ANALOG_SETUP_TABLE         0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_ANALOG_SETUP_OFFSET) & 0xFFFF )));
 2533     SA_DBG1(("mpiInitialize: AGSA_MPI_INTERRUPT_VECTOR_TABLE             0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_INT_VEC_TABLE_OFFSET) & 0xFFFF)));
 2534     SA_DBG1(("mpiInitialize: AGSA_MPI_PER_SAS_PHY_ATTRIBUTE_TABLE        0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_PHY_ATTRIBUTE_OFFSET) & 0xFFFF)));
 2535     SA_DBG1(("mpiInitialize: AGSA_MPI_OUTBOUND_QUEUE_FAILOVER_TABLE      0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_MOQFOT_MOQFOES) & 0xFFFF)));
 2536 
 2537   }
 2538 
 2539   if(agNULL !=  saRoot->swConfig.mpiContextTable )
 2540   {
 2541     agsaMPIContext_t * context = (agsaMPIContext_t * )saRoot->swConfig.mpiContextTable;
 2542     bit32 length = saRoot->swConfig.mpiContextTablelen;
 2543     bit32 pcibar = 0;
 2544     bit32 TableOffset;
 2545     pcibar = siGetPciBar(agRoot);
 2546     TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 2547     TableOffset &= SCRATCH_PAD0_OFFSET_MASK;
 2548     SA_DBG1(("mpiInitialize: mpiContextTable TableOffset 0x%08X contains 0x%08X\n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset )));
 2549 
 2550     SA_ASSERT( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) == 0x53434D50), "Config table signiture");
 2551     if ( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) != 0x53434D50))
 2552     {
 2553       SA_DBG1(("mpiInitialize: TableOffset 0x%x reads 0x%x expect 0x%x \n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset ),0x53434D50));
 2554     }
 2555 
 2556     if(context )
 2557     {
 2558       SA_DBG1(("mpiInitialize: MPITableType 0x%x context->offset 0x%x context->value 0x%x\n",context->MPITableType,context->offset,context->value));
 2559       while( length != 0)
 2560       {
 2561         switch(context->MPITableType)
 2562         {
 2563 
 2564         bit32 OffsetInMain;
 2565         case AGSA_MPI_MAIN_CONFIGURATION_TABLE:
 2566           SA_DBG1(("mpiInitialize:  AGSA_MPI_MAIN_CONFIGURATION_TABLE %d 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset, context->offset, context->value));
 2567           OffsetInMain = TableOffset;
 2568           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4) , context->value);
 2569           break;
 2570         case AGSA_MPI_GENERAL_STATUS_TABLE:
 2571           SA_DBG1(("mpiInitialize: AGSA_MPI_GENERAL_STATUS_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType ,TableOffset+MAIN_GST_OFFSET, context->offset, context->value  ));
 2572           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_GST_OFFSET ) & 0xFFFF) + TableOffset;
 2573           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
 2574           break;
 2575         case AGSA_MPI_INBOUND_QUEUE_CONFIGURATION_TABLE:
 2576           SA_DBG1(("mpiInitialize: AGSA_MPI_INBOUND_QUEUE_CONFIGURATION_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_IBQ_OFFSET, context->offset, context->value));
 2577           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_IBQ_OFFSET ) & 0xFFFF)  + TableOffset;
 2578           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
 2579           break;
 2580         case AGSA_MPI_OUTBOUND_QUEUE_CONFIGURATION_TABLE:
 2581           SA_DBG1(("mpiInitialize: AGSA_MPI_OUTBOUND_QUEUE_CONFIGURATION_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_OBQ_OFFSET, context->offset, context->value));
 2582           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_OBQ_OFFSET ) & 0xFFFF)  + TableOffset;
 2583           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
 2584           break;
 2585         case AGSA_MPI_SAS_PHY_ANALOG_SETUP_TABLE:
 2586           SA_DBG1(("mpiInitialize: AGSA_MPI_SAS_PHY_ANALOG_SETUP_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_ANALOG_SETUP_OFFSET, context->offset, context->value));
 2587           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+ MAIN_ANALOG_SETUP_OFFSET) & 0xFFFF)  + TableOffset;
 2588           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
 2589           break;
 2590         case AGSA_MPI_INTERRUPT_VECTOR_TABLE:
 2591           SA_DBG1(("mpiInitialize: AGSA_MPI_INTERRUPT_VECTOR_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_INT_VEC_TABLE_OFFSET, context->offset, context->value));
 2592           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+ MAIN_INT_VEC_TABLE_OFFSET) & 0xFFFF)  + TableOffset;
 2593           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
 2594           break;
 2595         case AGSA_MPI_PER_SAS_PHY_ATTRIBUTE_TABLE:
 2596           SA_DBG1(("mpiInitialize: AGSA_MPI_PER_SAS_PHY_ATTRIBUTE_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_PHY_ATTRIBUTE_OFFSET, context->offset, context->value));
 2597           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_PHY_ATTRIBUTE_OFFSET ) & 0xFFFF)  + TableOffset;
 2598           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
 2599           break;
 2600         case AGSA_MPI_OUTBOUND_QUEUE_FAILOVER_TABLE:
 2601           SA_DBG1(("mpiInitialize: AGSA_MPI_OUTBOUND_QUEUE_FAILOVER_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_MOQFOT_MOQFOES, context->offset, context->value));
 2602           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_MOQFOT_MOQFOES ) & 0xFFFF)  + TableOffset;
 2603           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
 2604           break;
 2605         default:
 2606           SA_DBG1(("mpiInitialize: error MPITableType unknown %d offset 0x%x value 0x%x\n",context->MPITableType, context->offset, context->value));
 2607           break;
 2608         }
 2609         if(smIS_SPC12V(agRoot))
 2610         {
 2611           if (saRoot->ControllerInfo.fwInterfaceRev > 0x301 )
 2612           {
 2613             SA_DBG1(("mpiInitialize: MAIN_AWT_MIDRANGE 0x%08X\n",
 2614                     ossaHwRegReadExt(agRoot, pcibar, TableOffset + MAIN_AWT_MIDRANGE)
 2615                      ));
 2616           }
 2617         }
 2618         if(length >= sizeof(agsaMPIContext_t))
 2619         {
 2620           length -= sizeof(agsaMPIContext_t);
 2621           context++;
 2622 
 2623         }
 2624         else
 2625         {
 2626           length = 0;
 2627         }
 2628       }
 2629 
 2630     }
 2631 
 2632     SA_DBG1(("mpiInitialize:  context %p saRoot->swConfig.mpiContextTable %p %d\n",context,saRoot->swConfig.mpiContextTable,context == saRoot->swConfig.mpiContextTable ? 1 : 0));
 2633 
 2634     if ( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) != 0x53434D50))
 2635     {
 2636       SA_DBG1(("mpiInitialize:TableOffset 0x%x reads 0x%x expect 0x%x \n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset ),0x53434D50));
 2637     }
 2638 
 2639     SA_ASSERT( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) == 0x53434D50), "Config table signiture After");
 2640   }
 2641   /* At this point the Message Unit configuration table is set up. Now we need to ring the doorbell */
 2642   togglevalue = 0;
 2643 
 2644   smTrace(hpDBG_VERY_LOUD,"74",  siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET ));
 2645   /* TP:74 Doorbell */
 2646 
 2647   /* Write bit0=1 to Inbound DoorBell Register to tell the SPC FW the table is updated */
 2648   siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, SPC_MSGU_CFG_TABLE_UPDATE);
 2649 
 2650   if(siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET ) & SPC_MSGU_CFG_TABLE_UPDATE)
 2651   {
 2652     SA_DBG1(("mpiInitialize: SPC_MSGU_CFG_TABLE_UPDATE (0x%X) \n",  siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET)));
 2653   }
 2654   else
 2655   {
 2656     SA_DBG1(("mpiInitialize: SPC_MSGU_CFG_TABLE_UPDATE not set (0x%X)\n",  siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET)));
 2657     ossaStallThread(agRoot, WAIT_INCREMENT);
 2658   }
 2659 
 2660   smTrace(hpDBG_VERY_LOUD,"A5",  siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET ));
 2661   /* TP:A5 Doorbell */
 2662 
 2663 /*
 2664 //  ossaHwRegWrite(agRoot, MSGU_IBDB_SET, SPC_MSGU_CFG_TABLE_UPDATE);
 2665   MSGU_WRITE_IDR(SPC_MSGU_CFG_TABLE_UPDATE);
 2666 */
 2667 
 2668 
 2669   /* wait until Inbound DoorBell Clear Register toggled */
 2670 WaitLonger:
 2671   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
 2672   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 2673   do
 2674   {
 2675     ossaStallThread(agRoot, WAIT_INCREMENT);
 2676     value = MSGU_READ_IDR;
 2677     value &= SPC_MSGU_CFG_TABLE_UPDATE;
 2678   } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT));
 2679 
 2680   smTrace(hpDBG_VERY_LOUD,"80", max_wait_count);
 2681   /* TP:80 TP max_wait_count */
 2682   if (!max_wait_count &&  mpiStartToggleFailed < 5 )
 2683   {
 2684      SA_DBG1(("mpiInitialize: mpiStartToggleFailed  count %d\n", mpiStartToggleFailed));
 2685      mpiStartToggleFailed++;
 2686     goto WaitLonger;
 2687   }
 2688 
 2689   if (!max_wait_count )
 2690   {
 2691 
 2692     SA_DBG1(("mpiInitialize: TIMEOUT:IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue));
 2693     MSGUCfgTblDWIdx = saveOffset;
 2694     GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)MSGUCfgTblDWIdx + (bit32)(mainCfg.GSTOffset + GST_GSTLEN_MPIS_OFFSET));
 2695     SA_DBG1(("mpiInitialize: MPI State = 0x%x\n", GSTLenMPIS));
 2696     smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "m3");
 2697     return AGSA_RC_FAILURE;
 2698   }
 2699   smTrace(hpDBG_VERY_LOUD,"81", mpiStartToggleFailed );
 2700   /* TP:81 TP */
 2701 
 2702   /* check the MPI-State for initialization */
 2703   MSGUCfgTblDWIdx = saveOffset;
 2704   GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)MSGUCfgTblDWIdx + (bit32)(mainCfg.GSTOffset + GST_GSTLEN_MPIS_OFFSET));
 2705   if ( (GST_MPI_STATE_UNINIT == (GSTLenMPIS & GST_MPI_STATE_MASK)) && ( mpiUnInitFailed < 5 ) )
 2706   {
 2707     SA_DBG1(("mpiInitialize: MPI State = 0x%x mpiUnInitFailed count %d\n", GSTLenMPIS & GST_MPI_STATE_MASK,mpiUnInitFailed));
 2708     ossaStallThread(agRoot, (20 * 1000));
 2709 
 2710     mpiUnInitFailed++;
 2711     goto WaitLonger;
 2712   }
 2713 
 2714   if (GST_MPI_STATE_INIT != (GSTLenMPIS & GST_MPI_STATE_MASK))
 2715   {
 2716     SA_DBG1(("mpiInitialize: Error Not GST_MPI_STATE_INIT MPI State = 0x%x\n", GSTLenMPIS & GST_MPI_STATE_MASK));
 2717     smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "m3");
 2718     return AGSA_RC_FAILURE;
 2719   }
 2720   smTrace(hpDBG_VERY_LOUD,"82", 0);
 2721   /* TP:82 TP */
 2722 
 2723   /* check MPI Initialization error */
 2724   GSTLenMPIS = GSTLenMPIS >> SHIFT16;
 2725   if (0x0000 != GSTLenMPIS)
 2726   {
 2727     SA_DBG1(("mpiInitialize: MPI Error = 0x%x\n", GSTLenMPIS));
 2728     smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "m3");
 2729     return AGSA_RC_FAILURE;
 2730   }
 2731   smTrace(hpDBG_VERY_LOUD,"83", 0);
 2732   /* TP:83 TP */
 2733 
 2734   /* reread IQ PI offset from SPC if IQ/OQ > 32 */
 2735   if ((maxinbound > IQ_NUM_32) || (maxoutbound > OQ_NUM_32))
 2736   {
 2737     for(qIdx = 0; qIdx < maxinbound; qIdx++)
 2738     {
 2739       /* point back to the begin then plus offset to next queue */
 2740       MSGUCfgTblDWIdx = saveOffset;
 2741       MSGUCfgTblDWIdx += inboundoffset;
 2742       MSGUCfgTblDWIdx += (sizeof(spc_inboundQueueDescriptor_t) * qIdx);
 2743       saRoot->inboundQueue[qIdx].PIPCIOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + IB_PIPCI_BAR_OFFSET));
 2744     }
 2745   }
 2746   smTrace(hpDBG_VERY_LOUD,"84", 0);
 2747   /* TP:84 TP */
 2748 
 2749   /* at least one inbound queue and one outbound queue enabled */
 2750   if ((0 == config->inboundQueues[0].numElements) || (0 == config->outboundQueues[0].numElements))
 2751   {
 2752     SA_DBG1(("mpiInitialize: Error,IQ0 or OQ0 have to enable\n"));
 2753     smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "m3");
 2754     return AGSA_RC_FAILURE;
 2755   }
 2756   smTrace(hpDBG_VERY_LOUD,"85", 0);
 2757   /* TP:85 TP */
 2758 
 2759   /* clean the inbound queues */
 2760   for (i = 0; i < config->numInboundQueues; i ++)
 2761   {
 2762     if(0 != config->inboundQueues[i].numElements)
 2763     {
 2764       circularIQ = &saRoot->inboundQueue[i];
 2765       si_memset(circularIQ->memoryRegion.virtPtr, 0, circularIQ->memoryRegion.totalLength);
 2766       si_memset(saRoot->inboundQueue[i].ciPointer, 0, sizeof(bit32));
 2767 
 2768       if(smIS_SPCV(agRoot))
 2769       {
 2770         ossaHwRegWriteExt(circularIQ->agRoot, circularIQ->PIPCIBar, circularIQ->PIPCIOffset, 0);
 2771         SA_DBG1(("mpiInitialize:  SPC V writes IQ %2d offset 0x%x\n",i ,circularIQ->PIPCIOffset));
 2772       }
 2773     }
 2774   }
 2775   smTrace(hpDBG_VERY_LOUD,"86", 0);
 2776   /* TP:86 TP */
 2777 
 2778   /* clean the outbound queues */
 2779   for (i = 0; i < config->numOutboundQueues; i ++)
 2780   {
 2781     if(0 != config->outboundQueues[i].numElements)
 2782     {
 2783       circularOQ = &saRoot->outboundQueue[i];
 2784       si_memset(circularOQ->memoryRegion.virtPtr, 0, circularOQ->memoryRegion.totalLength);
 2785       si_memset(saRoot->outboundQueue[i].piPointer, 0, sizeof(bit32));
 2786       if(smIS_SPCV(agRoot))
 2787       {
 2788         ossaHwRegWriteExt(circularOQ->agRoot, circularOQ->CIPCIBar, circularOQ->CIPCIOffset, 0);
 2789         SA_DBG2(("mpiInitialize:  SPC V writes OQ %2d offset 0x%x\n",i ,circularOQ->CIPCIOffset));
 2790       }
 2791 
 2792     }
 2793   }
 2794 
 2795 
 2796   smTrace(hpDBG_VERY_LOUD,"75",0);
 2797   /* TP:75 AAP1 IOP */
 2798 
 2799   /* read back AAP1 and IOP event log address and size */
 2800   MSGUCfgTblDWIdx = saveOffset;
 2801   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_HI));
 2802   saRoot->mainConfigTable.upperEventLogAddress = value;
 2803   SA_DBG1(("mpiInitialize: upperEventLogAddress 0x%x\n", value));
 2804   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_LO));
 2805   saRoot->mainConfigTable.lowerEventLogAddress = value;
 2806   SA_DBG1(("mpiInitialize: lowerEventLogAddress 0x%x\n", value));
 2807   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_BUFF_SIZE));
 2808   saRoot->mainConfigTable.eventLogSize = value;
 2809   SA_DBG1(("mpiInitialize: eventLogSize 0x%x\n", value));
 2810   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_OPTION));
 2811   saRoot->mainConfigTable.eventLogOption = value;
 2812   SA_DBG1(("mpiInitialize: eventLogOption 0x%x\n", value));
 2813   SA_DBG1(("mpiInitialize: EventLog dd /p %08X`%08X L %x\n",saRoot->mainConfigTable.upperEventLogAddress,saRoot->mainConfigTable.lowerEventLogAddress,saRoot->mainConfigTable.eventLogSize/4 ));
 2814 
 2815   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_HI));
 2816   saRoot->mainConfigTable.upperIOPeventLogAddress = value;
 2817   SA_DBG1(("mpiInitialize: upperIOPLogAddress 0x%x\n", value));
 2818   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_LO));
 2819   saRoot->mainConfigTable.lowerIOPeventLogAddress = value;
 2820   SA_DBG1(("mpiInitialize: lowerIOPLogAddress 0x%x\n", value));
 2821   SA_DBG1(("mpiInitialize: IOPLog   dd /p %08X`%08X L %x\n",saRoot->mainConfigTable.upperIOPeventLogAddress,saRoot->mainConfigTable.lowerIOPeventLogAddress,saRoot->mainConfigTable.IOPeventLogSize/4 ));
 2822   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_BUFF_SIZE));
 2823   saRoot->mainConfigTable.IOPeventLogSize = value;
 2824   SA_DBG1(("mpiInitialize: IOPeventLogSize 0x%x\n", value));
 2825   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_OPTION));
 2826   saRoot->mainConfigTable.IOPeventLogOption = value;
 2827   SA_DBG1(("mpiInitialize: IOPeventLogOption 0x%x\n", value));
 2828   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_INTERRUPT));
 2829 
 2830 #ifdef SA_PRINTOUT_IN_WINDBG
 2831 #ifndef DBG
 2832   DbgPrint("mpiInitialize: EventLog (%d) dd /p %08X`%08X L %x\n",
 2833           saRoot->mainConfigTable.eventLogOption,
 2834           saRoot->mainConfigTable.upperEventLogAddress,
 2835           saRoot->mainConfigTable.lowerEventLogAddress,
 2836           saRoot->mainConfigTable.eventLogSize/4 );
 2837   DbgPrint("mpiInitialize: IOPLog   (%d) dd /p %08X`%08X L %x\n",
 2838           saRoot->mainConfigTable.IOPeventLogOption,
 2839           saRoot->mainConfigTable.upperIOPeventLogAddress,
 2840           saRoot->mainConfigTable.lowerIOPeventLogAddress,
 2841           saRoot->mainConfigTable.IOPeventLogSize/4 );
 2842 #endif /* DBG  */
 2843 #endif /* SA_PRINTOUT_IN_WINDBG  */
 2844 
 2845   saRoot->mainConfigTable.FatalErrorInterrupt = value;
 2846   smTrace(hpDBG_VERY_LOUD,"76",value);
 2847   /* TP:76 FatalErrorInterrupt */
 2848 
 2849   SA_DBG1(("mpiInitialize: hwConfig->hwOption %X\n", saRoot->hwConfig.hwOption  ));
 2850 
 2851   SA_DBG1(("mpiInitialize: FatalErrorInterrupt 0x%x\n", value));
 2852 
 2853   /* read back Register Dump offset and length */
 2854   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_OFFSET));
 2855   saRoot->mainConfigTable.FatalErrorDumpOffset0 = value;
 2856   SA_DBG1(("mpiInitialize: FatalErrorDumpOffset0 0x%x\n", value));
 2857   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_LENGTH));
 2858   saRoot->mainConfigTable.FatalErrorDumpLength0 = value;
 2859   SA_DBG1(("mpiInitialize: FatalErrorDumpLength0 0x%x\n", value));
 2860   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_OFFSET));
 2861   saRoot->mainConfigTable.FatalErrorDumpOffset1 = value;
 2862   SA_DBG1(("mpiInitialize: FatalErrorDumpOffset1 0x%x\n", value));
 2863   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_LENGTH));
 2864   saRoot->mainConfigTable.FatalErrorDumpLength1 = value;
 2865   SA_DBG1(("mpiInitialize: FatalErrorDumpLength1 0x%x\n", value));
 2866 
 2867   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_PRECTD_PRESETD));
 2868   saRoot->mainConfigTable.PortRecoveryTimerPortResetTimer = value;
 2869 
 2870   SA_DBG1(("mpiInitialize: PortRecoveryTimerPortResetTimer 0x%x\n", value));
 2871   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IRAD_RESERVED));
 2872   saRoot->mainConfigTable.InterruptReassertionDelay = value;
 2873 
 2874   SA_DBG1(("mpiInitialize: InterruptReassertionDelay 0x%x\n", value));
 2875 
 2876 
 2877   if(smIS_SPCV(agRoot))
 2878   {
 2879     bit32 sp1;
 2880     sp1= ossaHwRegRead(agRoot,V_Scratchpad_1_Register );
 2881     if(SCRATCH_PAD1_V_ERROR_STATE(sp1))
 2882     {
 2883       SA_DBG1(("mpiInitialize: SCRATCH_PAD1_V_ERROR_STAT 0x%x\n",sp1 ));
 2884       ret = AGSA_RC_FAILURE;
 2885     }
 2886 
 2887   }
 2888 
 2889   smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "m3");
 2890   return ret;
 2891 }
 2892 
 2893 /*******************************************************************************/
 2894 /** \fn mpiWaitForConfigTable(agsaRoot_t *agRoot, spc_configMainDescriptor_t *config)
 2895  *  \brief Reading and Writing the Configuration Table
 2896  *  \param agsaRoot Pointer to a data structure containing LL layer context handles
 2897  *  \param config   Pointer to Configuration Table
 2898  *
 2899  * Return:
 2900  *         AGSA_RC_SUCCESS if read the configuration table from SPC sucessful
 2901  *         AGSA_RC_FAILURE if read the configuration table from SPC failed
 2902  */
 2903 /*******************************************************************************/
 2904 GLOBAL bit32 mpiWaitForConfigTable(agsaRoot_t                 *agRoot,
 2905                                    spc_configMainDescriptor_t *config)
 2906 {
 2907   agsaLLRoot_t  *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
 2908   bit32    MSGUCfgTblBase, ret = AGSA_RC_SUCCESS;
 2909   bit32    CfgTblDWIdx;
 2910   bit32    value, value1;
 2911   bit32    max_wait_time;
 2912   bit32    max_wait_count;
 2913   bit32    Signature, ExpSignature;
 2914   bit8     pcibar;
 2915 
 2916   SA_DBG2(("mpiWaitForConfigTable: Entering\n"));
 2917   SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null");
 2918 
 2919   smTraceFuncEnter(hpDBG_VERY_LOUD,"m4");
 2920 
 2921 
 2922   /* check error state */
 2923   value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1);
 2924   value1 = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2);
 2925 
 2926   if( smIS_SPC(agRoot) )
 2927   {
 2928     SA_DBG1(("mpiWaitForConfigTable: Waiting for SPC FW becoming ready.P1 0x%X P2 0x%X\n",value,value1));
 2929 
 2930   /* check AAP error */
 2931   if (SCRATCH_PAD1_ERR == (value & SCRATCH_PAD_STATE_MASK))
 2932   {
 2933     /* error state */
 2934     SA_DBG1(("mpiWaitForConfigTable: AAP error state and code 0x%x, ScratchPad2=0x%x\n", value, value1));
 2935 #if defined(SALLSDK_DEBUG)
 2936     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
 2937     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3)));
 2938 #endif
 2939     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m4");
 2940     return AGSA_RC_FAILURE;
 2941   }
 2942 
 2943   /* check IOP error */
 2944   if (SCRATCH_PAD2_ERR == (value1 & SCRATCH_PAD_STATE_MASK))
 2945   {
 2946     /* error state */
 2947     SA_DBG1(("mpiWaitForConfigTable: IOP error state and code 0x%x, ScratchPad1=0x%x\n", value1, value));
 2948 #if defined(SALLSDK_DEBUG)
 2949     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
 2950     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3)));
 2951 #endif
 2952     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m4");
 2953     return AGSA_RC_FAILURE;
 2954   }
 2955 
 2956   /* bit 4-31 of scratch pad1 should be zeros if it is not in error state */
 2957 #ifdef DONT_DO /*                                                                        */
 2958   if (value & SCRATCH_PAD1_STATE_MASK)
 2959   {
 2960     /* error case */
 2961     SA_DBG1(("mpiWaitForConfigTable: wrong state failure, scratchPad1 0x%x\n", value));
 2962     SA_DBG1(("mpiWaitForConfigTable: ScratchPad0 AAP error code 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
 2963 #if defined(SALLSDK_DEBUG)
 2964     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD2 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_0)));
 2965     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3)));
 2966 #endif
 2967     smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m4");
 2968     return AGSA_RC_FAILURE;
 2969   }
 2970 
 2971   /* bit 4-31 of scratch pad2 should be zeros if it is not in error state */
 2972   if (value1 & SCRATCH_PAD2_STATE_MASK)
 2973   {
 2974     /* error case */
 2975     SA_DBG1(("mpiWaitForConfigTable: wrong state failure, scratchPad2 0x%x\n", value1));
 2976     SA_DBG1(("mpiWaitForConfigTable: ScratchPad3 IOP error code 0x%x\n",siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3) ));
 2977 #if defined(SALLSDK_DEBUG)
 2978     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
 2979     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD1 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1)));
 2980 #endif
 2981     smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "m4");
 2982 
 2983     return AGSA_RC_FAILURE;
 2984   }
 2985 #endif /* DONT_DO */
 2986 
 2987   /* checking the fw and IOP in ready state */
 2988   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec timeout */
 2989   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 2990   /* wait until scratch pad 1 and 2 registers in ready state  */
 2991   do
 2992   {
 2993     ossaStallThread(agRoot, WAIT_INCREMENT);
 2994     value =siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1) & SCRATCH_PAD1_RDY;
 2995     value1 =siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2)  & SCRATCH_PAD2_RDY;
 2996     if(smIS_SPCV(agRoot))
 2997     {
 2998       SA_DBG1(("mpiWaitForConfigTable:VEN_DEV_SPCV force  SCRATCH_PAD2 RDY 1 %08X 2 %08X\n" ,value,value1));
 2999       value1 =3;
 3000     }
 3001 
 3002     if ((max_wait_count -= WAIT_INCREMENT) == 0)
 3003     {
 3004       SA_DBG1(("mpiWaitForConfigTable: Timeout!! SCRATCH_PAD1/2 value = 0x%x 0x%x\n", value, value1));
 3005       break;
 3006     }
 3007   } while ((value != SCRATCH_PAD1_RDY) || (value1 != SCRATCH_PAD2_RDY));
 3008 
 3009   if (!max_wait_count)
 3010   {
 3011     SA_DBG1(("mpiWaitForConfigTable: timeout failure\n"));
 3012 #if defined(SALLSDK_DEBUG)
 3013     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
 3014     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3)));
 3015 #endif
 3016     smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "m4");
 3017     return AGSA_RC_FAILURE;
 3018   }
 3019 
 3020   }else
 3021   {
 3022 
 3023     if(((value & SCRATCH_PAD1_V_BOOTSTATE_HDA_SEEPROM ) == SCRATCH_PAD1_V_BOOTSTATE_HDA_SEEPROM))
 3024     {
 3025       SA_DBG1(("mpiWaitForConfigTable: HDA mode set in SEEPROM SP1 0x%X\n",value));
 3026     }
 3027     if(((value & SCRATCH_PAD1_V_READY) != SCRATCH_PAD1_V_READY) ||
 3028        (value == 0xffffffff))
 3029     {
 3030       SA_DBG1(("mpiWaitForConfigTable: Waiting for _V_ FW becoming ready.P1 0x%X P2 0x%X\n",value,value1));
 3031 
 3032       /* checking the fw and IOP in ready state */
 3033       max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec timeout */
 3034       max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 3035       /* wait until scratch pad 1 and 2 registers in ready state  */
 3036       do
 3037       {
 3038         ossaStallThread(agRoot, WAIT_INCREMENT);
 3039         value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1);
 3040         value1 = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2);
 3041 
 3042         if ((max_wait_count -= WAIT_INCREMENT) == 0)
 3043         {
 3044           SA_DBG1(("mpiWaitForConfigTable: Timeout!! SCRATCH_PAD1/2 value = 0x%x 0x%x\n", value, value1));
 3045           return AGSA_RC_FAILURE;
 3046         }
 3047       } while (((value & SCRATCH_PAD1_V_READY) != SCRATCH_PAD1_V_READY) ||
 3048                (value == 0xffffffff));
 3049     }
 3050   }
 3051 
 3052 
 3053   SA_DBG1(("mpiWaitForConfigTable: FW Ready, SCRATCH_PAD1/2 value = 0x%x 0x%x\n", value, value1));
 3054 
 3055   /* read scratch pad0 to get PCI BAR and offset of configuration table */
 3056   MSGUCfgTblBase = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 3057   /* get offset */
 3058   CfgTblDWIdx = MSGUCfgTblBase & SCRATCH_PAD0_OFFSET_MASK;
 3059   /* get PCI BAR */
 3060   MSGUCfgTblBase = (MSGUCfgTblBase & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
 3061 
 3062   if(smIS_SPC(agRoot))
 3063   {
 3064     if( smIS_spc8081(agRoot))
 3065     {
 3066       if (BAR4 != MSGUCfgTblBase)
 3067       {
 3068         SA_DBG1(("mpiWaitForConfigTable: smIS_spc8081 PCI BAR is not BAR4, bar=0x%x - failure\n", MSGUCfgTblBase));
 3069         smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "m4");
 3070         return AGSA_RC_FAILURE;
 3071       }
 3072     }
 3073     else
 3074     {
 3075       if (BAR5 != MSGUCfgTblBase)
 3076       {
 3077         SA_DBG1(("mpiWaitForConfigTable: PCI BAR is not BAR5, bar=0x%x - failure\n", MSGUCfgTblBase));
 3078         smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "m4");
 3079         return AGSA_RC_FAILURE;
 3080       }
 3081     }
 3082   }
 3083 
 3084   /* convert the PCI BAR to logical bar number */
 3085   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, MSGUCfgTblBase);
 3086 
 3087   /* read signature from the configuration table */
 3088   Signature = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx);
 3089 
 3090   /* Error return if the signature is not "PMCS" */
 3091   ExpSignature = ('P') | ('M' << SHIFT8) | ('C' << SHIFT16) | ('S' << SHIFT24);
 3092 
 3093   if (Signature != ExpSignature)
 3094   {
 3095     SA_DBG1(("mpiWaitForConfigTable: Signature value = 0x%x\n", Signature));
 3096     smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "m4");
 3097     return AGSA_RC_FAILURE;
 3098   }
 3099 
 3100   /* save Signature */
 3101   si_memcpy(&config->Signature, &Signature, sizeof(Signature));
 3102 
 3103   /* read Interface Revsion from the configuration table */
 3104   config->InterfaceRev = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_INTERFACE_REVISION);
 3105 
 3106   /* read FW Revsion from the configuration table */
 3107   config->FWRevision = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FW_REVISION);
 3108 
 3109   /* read Max Outstanding IO from the configuration table */
 3110   config->MaxOutstandingIO = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_MAX_OUTSTANDING_IO_OFFSET);
 3111 
 3112   /* read Max SGL and Max Devices from the configuration table */
 3113   config->MDevMaxSGL = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_MAX_SGL_OFFSET);
 3114 
 3115   /* read Controller Cap Flags from the configuration table */
 3116   config->ContrlCapFlag = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_CNTRL_CAP_OFFSET);
 3117 
 3118   /* read GST Table Offset from the configuration table */
 3119   config->GSTOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_GST_OFFSET);
 3120 
 3121   /* read Inbound Queue Offset from the configuration table */
 3122   config->inboundQueueOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_IBQ_OFFSET);
 3123 
 3124   /* read Outbound Queue Offset from the configuration table */
 3125   config->outboundQueueOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_OBQ_OFFSET);
 3126 
 3127 
 3128   if(smIS_SPCV(agRoot))
 3129   {
 3130     ;/* SPCV - reserved field */
 3131   }
 3132   else
 3133   {
 3134     /* read HDA Flags from the configuration table */
 3135     config->HDAModeFlags = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_HDA_FLAGS_OFFSET);
 3136   }
 3137 
 3138   /* read analog Setting offset from the configuration table */
 3139   config->analogSetupTblOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_ANALOG_SETUP_OFFSET);
 3140 
 3141   if(smIS_SPCV(agRoot))
 3142   {
 3143     ;/* SPCV - reserved field */
 3144     /* read interrupt vector table offset */
 3145     config->InterruptVecTblOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_INT_VEC_TABLE_OFFSET);
 3146     /* read phy attribute table offset */
 3147     config->phyAttributeTblOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_PHY_ATTRIBUTE_OFFSET);
 3148     SA_DBG1(("mpiWaitForConfigTable: INT Vector Tble Offset = 0x%x\n", config->InterruptVecTblOffset));
 3149     SA_DBG1(("mpiWaitForConfigTable: Phy Attribute Tble Offset = 0x%x\n", config->phyAttributeTblOffset));
 3150   }
 3151   else
 3152   {
 3153     ;/* SPC - Not used */
 3154   }
 3155 
 3156   /* read Error Dump Offset and Length */
 3157   config->FatalErrorDumpOffset0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_OFFSET);
 3158   config->FatalErrorDumpLength0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_LENGTH);
 3159   config->FatalErrorDumpOffset1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_OFFSET);
 3160   config->FatalErrorDumpLength1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_LENGTH);
 3161 
 3162   SA_DBG1(("mpiWaitForConfigTable: Interface Revision value = 0x%08x\n", config->InterfaceRev));
 3163   SA_DBG1(("mpiWaitForConfigTable: FW Revision value = 0x%08x\n", config->FWRevision));
 3164   
 3165   if(smIS_SPC(agRoot))
 3166   {
 3167     SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%08x\n", STSDK_LL_SPC_VERSION));
 3168   }
 3169   if(smIS_SPC6V(agRoot))
 3170   {
 3171     SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%08x\n",STSDK_LL_VERSION ));
 3172   }
 3173   if(smIS_SPC12V(agRoot))
 3174   {
 3175     SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%08x\n",STSDK_LL_12G_VERSION ));
 3176   }
 3177 
 3178   SA_DBG1(("mpiWaitForConfigTable: MaxOutstandingIO value = 0x%08x\n", config->MaxOutstandingIO));
 3179   SA_DBG1(("mpiWaitForConfigTable: MDevMaxSGL value = 0x%08x\n", config->MDevMaxSGL));
 3180   SA_DBG1(("mpiWaitForConfigTable: ContrlCapFlag value = 0x%08x\n", config->ContrlCapFlag));
 3181   SA_DBG1(("mpiWaitForConfigTable: GSTOffset value = 0x%08x\n", config->GSTOffset));
 3182   SA_DBG1(("mpiWaitForConfigTable: inboundQueueOffset value = 0x%08x\n", config->inboundQueueOffset));
 3183   SA_DBG1(("mpiWaitForConfigTable: outboundQueueOffset value = 0x%08x\n", config->outboundQueueOffset));
 3184   SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpOffset0 value = 0x%08x\n", config->FatalErrorDumpOffset0));
 3185   SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpLength0 value = 0x%08x\n", config->FatalErrorDumpLength0));
 3186   SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpOffset1 value = 0x%08x\n", config->FatalErrorDumpOffset1));
 3187   SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpLength1 value = 0x%08x\n", config->FatalErrorDumpLength1));
 3188 
 3189 
 3190   SA_DBG1(("mpiWaitForConfigTable: HDAModeFlags value = 0x%08x\n", config->HDAModeFlags));
 3191   SA_DBG1(("mpiWaitForConfigTable: analogSetupTblOffset value = 0x%08x\n", config->analogSetupTblOffset));
 3192 
 3193   /* check interface version */
 3194 
 3195   if(smIS_SPC6V(agRoot))
 3196   {
 3197     if (config->InterfaceRev != STSDK_LL_INTERFACE_VERSION)
 3198     {
 3199       SA_DBG1(("mpiWaitForConfigTable: V sTSDK interface ver. 0x%x does not match InterfaceRev 0x%x warning!\n", STSDK_LL_INTERFACE_VERSION, config->InterfaceRev));
 3200       ret = AGSA_RC_VERSION_UNTESTED;
 3201       if ((config->InterfaceRev & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK) != (STSDK_LL_INTERFACE_VERSION & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK))
 3202       {
 3203         SA_DBG1(("mpiWaitForConfigTable: V sTSDK interface ver. 0x%x incompatible with InterfaceRev 0x%x warning!\n", STSDK_LL_INTERFACE_VERSION, config->InterfaceRev));
 3204         ret = AGSA_RC_VERSION_INCOMPATIBLE;
 3205         smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "m4");
 3206         return ret;
 3207       }
 3208     }
 3209   }
 3210   else if(smIS_SPC12V(agRoot))
 3211   {
 3212     if (config->InterfaceRev != STSDK_LL_12G_INTERFACE_VERSION)
 3213     {
 3214       SA_DBG1(("mpiWaitForConfigTable: 12g V sTSDK interface ver. 0x%x does not match InterfaceRev 0x%x warning!\n", STSDK_LL_12G_INTERFACE_VERSION, config->InterfaceRev));
 3215       ret = AGSA_RC_VERSION_UNTESTED;
 3216       if ((config->InterfaceRev & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK) != (STSDK_LL_12G_INTERFACE_VERSION & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK))
 3217       {
 3218         SA_DBG1(("mpiWaitForConfigTable: V sTSDK interface ver. 0x%x incompatible with InterfaceRev 0x%x warning!\n", STSDK_LL_12G_INTERFACE_VERSION, config->InterfaceRev));
 3219         ret = AGSA_RC_VERSION_INCOMPATIBLE;
 3220         ret = AGSA_RC_VERSION_UNTESTED;
 3221         smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "m4");
 3222         return ret;
 3223       }
 3224     }
 3225   }
 3226   else
 3227   {
 3228     if (config->InterfaceRev != STSDK_LL_OLD_INTERFACE_VERSION)
 3229     {
 3230       SA_DBG1(("mpiWaitForConfigTable: SPC sTSDK interface ver. 0x%08x not compatible with InterfaceRev 0x%x warning!\n", STSDK_LL_INTERFACE_VERSION, config->InterfaceRev));
 3231       ret = AGSA_RC_VERSION_INCOMPATIBLE;
 3232       smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "m4");
 3233       return ret;
 3234     }
 3235 
 3236   }
 3237 
 3238 
 3239   /* Check FW versions */
 3240   if(smIS_SPC6V(agRoot))
 3241   {
 3242     SA_DBG1(("mpiWaitForConfigTable:6 sTSDK ver. sa.h 0x%08x config 0x%08x\n", STSDK_LL_VERSION, config->FWRevision));
 3243     /* check FW and LL sTSDK version */
 3244     if (config->FWRevision !=  MATCHING_V_FW_VERSION )
 3245     {
 3246       if (config->FWRevision >  MATCHING_V_FW_VERSION)
 3247       {
 3248         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x hadn't tested with FW ver. 0x%08x warning!\n", STSDK_LL_VERSION, config->FWRevision));
 3249         ret = AGSA_RC_VERSION_UNTESTED;
 3250       }
 3251 
 3252       else if (config->FWRevision <  MIN_FW_SPCVE_VERSION_SUPPORTED)
 3253       {
 3254         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x not compatible with FW ver. 0x%08x warning!\n", STSDK_LL_VERSION, config->FWRevision));
 3255         ret = AGSA_RC_VERSION_INCOMPATIBLE;
 3256         smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "m4");
 3257         return ret;
 3258       }
 3259       else
 3260       {
 3261         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x mismatch with FW ver. 0x%08x warning!\n",STSDK_LL_VERSION , config->FWRevision));
 3262         ret = AGSA_RC_VERSION_UNTESTED;
 3263       }
 3264     }
 3265   }else if(smIS_SPC12V(agRoot))
 3266   {
 3267     SA_DBG1(("mpiWaitForConfigTable:12 sTSDK ver. sa.h 0x%08x config 0x%08x\n", STSDK_LL_12G_VERSION, config->FWRevision));
 3268     /* check FW and LL sTSDK version */
 3269     if (config->FWRevision !=  MATCHING_12G_V_FW_VERSION )
 3270     {
 3271       if (config->FWRevision >  MATCHING_12G_V_FW_VERSION)
 3272       {
 3273         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x hadn't tested with FW ver. 0x%08x warning!\n", STSDK_LL_12G_VERSION, config->FWRevision));
 3274         ret = AGSA_RC_VERSION_UNTESTED;
 3275       }
 3276 
 3277       else if (config->FWRevision <  MIN_FW_12G_SPCVE_VERSION_SUPPORTED)
 3278       {
 3279         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x not compatible with FW ver. 0x%08x warning!\n", STSDK_LL_12G_VERSION, config->FWRevision));
 3280         ret = AGSA_RC_VERSION_INCOMPATIBLE;
 3281         smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "m4");
 3282         return ret;
 3283       }
 3284       else
 3285       {
 3286         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x mismatch with FW ver. 0x%08x warning!\n",STSDK_LL_12G_VERSION , config->FWRevision));
 3287         ret = AGSA_RC_VERSION_UNTESTED;
 3288       }
 3289     }
 3290   }
 3291   else
 3292   {
 3293     if (config->FWRevision != MATCHING_SPC_FW_VERSION )
 3294     {
 3295       if (config->FWRevision >  MATCHING_SPC_FW_VERSION)
 3296       {
 3297         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x hadn't tested with FW ver. 0x%08x warning!\n", STSDK_LL_SPC_VERSION, config->FWRevision));
 3298         ret = AGSA_RC_VERSION_UNTESTED;
 3299       }
 3300       else if (config->FWRevision <  MIN_FW_SPC_VERSION_SUPPORTED)
 3301       {
 3302         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x not compatible with FW ver. 0x%08x warning!\n", STSDK_LL_SPC_VERSION, config->FWRevision));
 3303         ret = AGSA_RC_VERSION_INCOMPATIBLE;
 3304         smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "m4");
 3305         return ret;
 3306       }
 3307       else
 3308       {
 3309         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x mismatch with FW ver. 0x%08x warning!\n",STSDK_LL_SPC_VERSION , config->FWRevision));
 3310         ret = AGSA_RC_VERSION_UNTESTED;
 3311       }
 3312     }
 3313   }
 3314   SA_DBG1(("mpiWaitForConfigTable: ILA version 0x%08X\n",  ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_ILAT_ILAV_ILASMRN_ILAMRN_ILAMJN) ));
 3315 
 3316 
 3317   if(smIS_SPC12V(agRoot))
 3318   {
 3319     if (config->InterfaceRev > 0x301 )
 3320     {
 3321       SA_DBG1(("mpiWaitForConfigTable: MAIN_INACTIVE_ILA_REVSION 0x%08X\n",  ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_INACTIVE_ILA_REVSION) ));
 3322       SA_DBG1(("mpiWaitForConfigTable: MAIN_SEEPROM_REVSION 0x%08X\n",  ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_SEEPROM_REVSION) ));
 3323     }
 3324   }
 3325 
 3326   if(smIS_SPC12V(agRoot))
 3327   {
 3328     if (config->InterfaceRev > 0x301 )
 3329     {
 3330       SA_DBG1(("mpiWaitForConfigTable: MAIN_AWT_MIDRANGE 0x%08X\n",  ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_AWT_MIDRANGE) ));
 3331     }
 3332   }
 3333 
 3334 
 3335   if(smIS_SFC(agRoot))
 3336   {
 3337     /* always success for SFC*/
 3338     ret = AGSA_RC_SUCCESS;
 3339   }
 3340 
 3341   if (agNULL != saRoot)
 3342   {
 3343     /* save the information */
 3344     saRoot->ControllerInfo.signature = Signature;
 3345     saRoot->ControllerInfo.fwInterfaceRev = config->InterfaceRev;
 3346 
 3347     if(smIS_SPCV(agRoot))
 3348     {
 3349       saRoot->ControllerInfo.hwRevision = (ossaHwRegReadConfig32(agRoot,8) & 0xFF);
 3350       SA_DBG1(("mpiWaitForConfigTable: hwRevision 0x%x\n",saRoot->ControllerInfo.hwRevision  ));
 3351     }
 3352     else
 3353     {
 3354       saRoot->ControllerInfo.hwRevision = SPC_READ_DEV_REV;
 3355     }
 3356 
 3357     saRoot->ControllerInfo.fwRevision = config->FWRevision;
 3358     saRoot->ControllerInfo.ilaRevision  = config->ilaRevision;
 3359     saRoot->ControllerInfo.maxPendingIO = config->MaxOutstandingIO;
 3360     saRoot->ControllerInfo.maxSgElements = config->MDevMaxSGL & 0xFFFF;
 3361     saRoot->ControllerInfo.maxDevices = (config->MDevMaxSGL & MAX_DEV_BITS) >> SHIFT16;
 3362     saRoot->ControllerInfo.queueSupport = config->ContrlCapFlag & Q_SUPPORT_BITS;
 3363     saRoot->ControllerInfo.phyCount = (bit8)((config->ContrlCapFlag & PHY_COUNT_BITS) >> SHIFT19);
 3364     saRoot->ControllerInfo.sasSpecsSupport = (config->ContrlCapFlag & SAS_SPEC_BITS) >> SHIFT25;
 3365     SA_DBG1(("mpiWaitForConfigTable: MaxOutstandingIO 0x%x swConfig->maxActiveIOs 0x%x\n", config->MaxOutstandingIO,saRoot->swConfig.maxActiveIOs ));
 3366 
 3367     if(smIS_SPCV(agRoot))
 3368     {
 3369       ;/* SPCV - reserved field */
 3370     }
 3371     else
 3372     {
 3373       saRoot->ControllerInfo.controllerSetting = (bit8)config->HDAModeFlags;
 3374     }
 3375 
 3376     saRoot->ControllerInfo.sdkInterfaceRev = STSDK_LL_INTERFACE_VERSION;
 3377     saRoot->ControllerInfo.sdkRevision = STSDK_LL_VERSION;
 3378     saRoot->mainConfigTable.regDumpPCIBAR = pcibar;
 3379     saRoot->mainConfigTable.FatalErrorDumpOffset0 = config->FatalErrorDumpOffset0;
 3380     saRoot->mainConfigTable.FatalErrorDumpLength0 = config->FatalErrorDumpLength0;
 3381     saRoot->mainConfigTable.FatalErrorDumpOffset1 = config->FatalErrorDumpOffset1;
 3382     saRoot->mainConfigTable.FatalErrorDumpLength1 = config->FatalErrorDumpLength1;
 3383 
 3384     if(smIS_SPCV(agRoot))
 3385     {
 3386       ;/* SPCV - reserved field */
 3387     }
 3388     else
 3389     {
 3390       saRoot->mainConfigTable.HDAModeFlags = config->HDAModeFlags;
 3391     }
 3392 
 3393     saRoot->mainConfigTable.analogSetupTblOffset = config->analogSetupTblOffset;
 3394 
 3395     if(smIS_SPCV(agRoot))
 3396     {
 3397       saRoot->mainConfigTable.InterruptVecTblOffset = config->InterruptVecTblOffset;
 3398       saRoot->mainConfigTable.phyAttributeTblOffset = config->phyAttributeTblOffset;
 3399       saRoot->mainConfigTable.PortRecoveryTimerPortResetTimer = config->portRecoveryResetTimer;
 3400     }
 3401 
 3402     SA_DBG1(("mpiWaitForConfigTable: Signature = 0x%x\n", Signature));
 3403     SA_DBG1(("mpiWaitForConfigTable: hwRevision = 0x%x\n", saRoot->ControllerInfo.hwRevision));
 3404     SA_DBG1(("mpiWaitForConfigTable: FW Revision = 0x%x\n", config->FWRevision));
 3405     SA_DBG1(("mpiWaitForConfigTable: Max Sgl = 0x%x\n", saRoot->ControllerInfo.maxSgElements));
 3406     SA_DBG1(("mpiWaitForConfigTable: Max Device = 0x%x\n", saRoot->ControllerInfo.maxDevices));
 3407     SA_DBG1(("mpiWaitForConfigTable: Queue Support = 0x%x\n", saRoot->ControllerInfo.queueSupport));
 3408     SA_DBG1(("mpiWaitForConfigTable: Phy Count = 0x%x\n", saRoot->ControllerInfo.phyCount));
 3409     SA_DBG1(("mpiWaitForConfigTable: sas Specs Support = 0x%x\n", saRoot->ControllerInfo.sasSpecsSupport));
 3410 
 3411   }
 3412 
 3413 
 3414   if(ret != AGSA_RC_SUCCESS )
 3415   {
 3416     SA_DBG1(("mpiWaitForConfigTable: return 0x%x not AGSA_RC_SUCCESS warning!\n", ret));
 3417   }
 3418 
 3419 
 3420   smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "m4");
 3421   return ret;
 3422 }
 3423 
 3424 /*******************************************************************************/
 3425 /** \fn mpiUnInitConfigTable(agsaRoot_t *agRoot, spc_configMainDescriptor_t *config)
 3426  *  \brief UnInitialization Configuration Table
 3427  *  \param agsaRoot Pointer to a data structure containing LL layer context handles
 3428  *
 3429  * Return:
 3430  *         AGSA_RC_SUCCESS if Un-initialize the configuration table sucessful
 3431  *         AGSA_RC_FAILURE if Un-initialize the configuration table failed
 3432  */
 3433 /*******************************************************************************/
 3434 GLOBAL bit32 mpiUnInitConfigTable(agsaRoot_t *agRoot)
 3435 {
 3436   bit32    MSGUCfgTblBase;
 3437   bit32    CfgTblDWIdx, GSTOffset, GSTLenMPIS;
 3438   bit32    value, togglevalue;
 3439   bit32    max_wait_time;
 3440   bit32    max_wait_count;
 3441   bit8     pcibar;
 3442 
 3443   smTraceFuncEnter(hpDBG_VERY_LOUD,"m7");
 3444   SA_DBG1(("mpiUnInitConfigTable: agRoot %p\n",agRoot));
 3445   SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null");
 3446 
 3447   togglevalue = 0;
 3448 
 3449   /* read scratch pad0 to get PCI BAR and offset of configuration table */
 3450   MSGUCfgTblBase =siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 3451 
 3452   if(MSGUCfgTblBase == 0xFFFFFFFF)
 3453   {
 3454     SA_DBG1(("mpiUnInitConfigTable: MSGUCfgTblBase = 0x%x AGSA_RC_FAILURE\n",MSGUCfgTblBase));
 3455     return AGSA_RC_FAILURE;
 3456   }
 3457 
 3458   /* get offset */
 3459   CfgTblDWIdx = MSGUCfgTblBase & SCRATCH_PAD0_OFFSET_MASK;
 3460   /* get PCI BAR */
 3461   MSGUCfgTblBase = (MSGUCfgTblBase & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
 3462 
 3463   /* convert the PCI BAR to logical bar number */
 3464   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, MSGUCfgTblBase);
 3465 
 3466   /* Write bit 1 to Inbound DoorBell Register */
 3467   siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, SPC_MSGU_CFG_TABLE_RESET);
 3468 
 3469   /* wait until Inbound DoorBell Clear Register toggled */
 3470   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
 3471   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 3472   do
 3473   {
 3474     ossaStallThread(agRoot, WAIT_INCREMENT);
 3475     value = MSGU_READ_IDR;
 3476     value &= SPC_MSGU_CFG_TABLE_RESET;
 3477   } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT));
 3478 
 3479   if (!max_wait_count)
 3480   {
 3481     SA_DBG1(("mpiUnInitConfigTable: TIMEOUT:IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue));
 3482     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m7");
 3483 
 3484     if(smIS_SPC(agRoot) )
 3485     {
 3486       return AGSA_RC_FAILURE;
 3487     }
 3488 
 3489   }
 3490 
 3491   /* check the MPI-State for termination in progress */
 3492   /* wait until Inbound DoorBell Clear Register toggled */
 3493   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
 3494   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 3495   GSTOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_GST_OFFSET);
 3496   do
 3497   {
 3498     ossaStallThread(agRoot, WAIT_INCREMENT);
 3499 
 3500     if(GSTOffset == 0xFFFFFFFF)
 3501     {
 3502       SA_DBG1(("mpiUnInitConfigTable:AGSA_RC_FAILURE GSTOffset = 0x%x\n",GSTOffset));
 3503       return AGSA_RC_FAILURE;
 3504     }
 3505 
 3506     GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + (bit32)(GSTOffset + GST_GSTLEN_MPIS_OFFSET));
 3507     if (GST_MPI_STATE_UNINIT == (GSTLenMPIS & GST_MPI_STATE_MASK))
 3508     {
 3509       break;
 3510     }
 3511   } while (max_wait_count -= WAIT_INCREMENT);
 3512 
 3513   if (!max_wait_count)
 3514   {
 3515     SA_DBG1(("mpiUnInitConfigTable: TIMEOUT, MPI State = 0x%x\n", GSTLenMPIS & GST_MPI_STATE_MASK));
 3516 #if defined(SALLSDK_DEBUG)
 3517 
 3518     SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_0)));
 3519     SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1)));
 3520     SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_2)));
 3521     SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3)));
 3522 #endif
 3523 
 3524     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m7");
 3525     return AGSA_RC_FAILURE;
 3526   }
 3527 
 3528   smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m7");
 3529   return AGSA_RC_SUCCESS;
 3530 }
 3531 
 3532 /*******************************************************************************/
 3533 /** \fn void mpiUpdateIBQueueCfgTable(agsaRoot_t *agRoot, spc_inboundQueueDescriptor_t *outQueueCfg,
 3534  *                               bit32 QueueTableOffset,bit8 pcibar)
 3535  *  \brief Writing to the inbound queue of the Configuration Table
 3536  *  \param agsaRoot Pointer to a data structure containing both application and LL layer context handles
 3537  *  \param outQueueCfg      Pointer to inbuond configuration area
 3538  *  \param QueueTableOffset Queue configuration table offset
 3539  *  \param pcibar           PCI BAR
 3540  *
 3541  * Return:
 3542  *         None
 3543  */
 3544 /*******************************************************************************/
 3545 GLOBAL void mpiUpdateIBQueueCfgTable(agsaRoot_t             *agRoot,
 3546                               spc_inboundQueueDescriptor_t  *inQueueCfg,
 3547                               bit32                         QueueTableOffset,
 3548                               bit8                          pcibar)
 3549 {
 3550   smTraceFuncEnter(hpDBG_VERY_LOUD,"m5");
 3551 
 3552   smTrace(hpDBG_VERY_LOUD,"Ba",QueueTableOffset);
 3553   /* TP:Ba QueueTableOffset */
 3554   smTrace(hpDBG_VERY_LOUD,"Bb",pcibar);
 3555   /* TP:Bb pcibar */
 3556 
 3557   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_PROPERITY_OFFSET), inQueueCfg->elementPriSizeCount);
 3558   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_BASE_ADDR_HI_OFFSET), inQueueCfg->upperBaseAddress);
 3559   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_BASE_ADDR_LO_OFFSET), inQueueCfg->lowerBaseAddress);
 3560   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_CI_BASE_ADDR_HI_OFFSET), inQueueCfg->ciUpperBaseAddress);
 3561   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_CI_BASE_ADDR_LO_OFFSET), inQueueCfg->ciLowerBaseAddress);
 3562 
 3563 
 3564   SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x elementPriSizeCount 0x%x\n",(bit32)(QueueTableOffset + IB_PROPERITY_OFFSET), inQueueCfg->elementPriSizeCount));
 3565   SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x upperBaseAddress    0x%x\n",(bit32)(QueueTableOffset + IB_BASE_ADDR_HI_OFFSET), inQueueCfg->upperBaseAddress));
 3566   SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x lowerBaseAddress    0x%x\n",(bit32)(QueueTableOffset + IB_BASE_ADDR_LO_OFFSET), inQueueCfg->lowerBaseAddress));
 3567   SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x ciUpperBaseAddress  0x%x\n",(bit32)(QueueTableOffset + IB_CI_BASE_ADDR_HI_OFFSET), inQueueCfg->ciUpperBaseAddress));
 3568   SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x ciLowerBaseAddress  0x%x\n",(bit32)(QueueTableOffset + IB_CI_BASE_ADDR_LO_OFFSET), inQueueCfg->ciLowerBaseAddress));
 3569 
 3570   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m5");
 3571 }
 3572 
 3573 /*******************************************************************************/
 3574 /** \fn void mpiUpdateOBQueueCfgTable(agsaRoot_t *agRoot, spc_outboundQueueDescriptor_t *outQueueCfg,
 3575  *                               bit32 QueueTableOffset,bit8 pcibar)
 3576  *  \brief Writing to the inbound queue of the Configuration Table
 3577  *  \param agsaRoot         Pointer to a data structure containing both application
 3578  *                          and LL layer context handles
 3579  *  \param outQueueCfg      Pointer to outbuond configuration area
 3580  *  \param QueueTableOffset Queue configuration table offset
 3581  *  \param pcibar           PCI BAR
 3582  *
 3583  * Return:
 3584  *         None
 3585  */
 3586 /*******************************************************************************/
 3587 GLOBAL void mpiUpdateOBQueueCfgTable(agsaRoot_t             *agRoot,
 3588                               spc_outboundQueueDescriptor_t *outQueueCfg,
 3589                               bit32                         QueueTableOffset,
 3590                               bit8                          pcibar)
 3591 {
 3592 
 3593   smTraceFuncEnter(hpDBG_VERY_LOUD,"m8");
 3594 
 3595   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_PROPERITY_OFFSET), outQueueCfg->elementSizeCount);
 3596   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_BASE_ADDR_HI_OFFSET), outQueueCfg->upperBaseAddress);
 3597   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_BASE_ADDR_LO_OFFSET), outQueueCfg->lowerBaseAddress);
 3598   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_PI_BASE_ADDR_HI_OFFSET), outQueueCfg->piUpperBaseAddress);
 3599   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_PI_BASE_ADDR_LO_OFFSET), outQueueCfg->piLowerBaseAddress);
 3600   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_INTERRUPT_COALES_OFFSET), outQueueCfg->interruptVecCntDelay);
 3601 
 3602   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x elementSizeCount     0x%x\n",(bit32)(QueueTableOffset + OB_PROPERITY_OFFSET), outQueueCfg->elementSizeCount));
 3603   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x upperBaseAddress     0x%x\n",(bit32)(QueueTableOffset + OB_BASE_ADDR_HI_OFFSET), outQueueCfg->upperBaseAddress));
 3604   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x lowerBaseAddress     0x%x\n",(bit32)(QueueTableOffset + OB_BASE_ADDR_LO_OFFSET), outQueueCfg->lowerBaseAddress));
 3605   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x piUpperBaseAddress   0x%x\n",(bit32)(QueueTableOffset + OB_PI_BASE_ADDR_HI_OFFSET), outQueueCfg->piUpperBaseAddress));
 3606   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x piLowerBaseAddress   0x%x\n",(bit32)(QueueTableOffset + OB_PI_BASE_ADDR_LO_OFFSET), outQueueCfg->piLowerBaseAddress));
 3607   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x interruptVecCntDelay 0x%x\n",(bit32)(QueueTableOffset + OB_INTERRUPT_COALES_OFFSET), outQueueCfg->interruptVecCntDelay));
 3608   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m8");
 3609 }
 3610 
 3611 
 3612 
 3613 /*******************************************************************************/
 3614 /** \fn void mpiUpdateOBQueueCfgTable(agsaRoot_t *agRoot, spc_outboundQueueDescriptor_t *outQueueCfg,
 3615  *                               bit32 QueueTableOffset,bit8 pcibar)
 3616  *  \brief Writing to the inbound queue of the Configuration Table
 3617  *  \param agsaRoot         Pointer to a data structure containing both application
 3618  *                          and LL layer context handles
 3619  *  \param outQueueCfg      Pointer to outbuond configuration area
 3620  *  \param QueueTableOffset Queue configuration table offset
 3621  *  \param pcibar           PCI BAR
 3622  *
 3623  * Return:
 3624  *         None
 3625  */
 3626 /*******************************************************************************/
 3627 GLOBAL void mpiUpdateFatalErrorTable(agsaRoot_t             *agRoot,
 3628                               bit32                         FerrTableOffset,
 3629                               bit32                         lowerBaseAddress,
 3630                               bit32                         upperBaseAddress,
 3631                               bit32                         length,
 3632                               bit8                          pcibar)
 3633 {
 3634 
 3635   smTraceFuncEnter(hpDBG_VERY_LOUD,"2U");
 3636 
 3637   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LO_OFFSET), lowerBaseAddress);
 3638   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HI_OFFSET), upperBaseAddress);
 3639   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LENGTH), length);
 3640   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HANDSHAKE), 0);
 3641   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_STATUS), 0);
 3642 
 3643 
 3644   SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x  MPI_FATAL_EDUMP_TABLE_LO_OFFSET 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LO_OFFSET, lowerBaseAddress));
 3645   SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x  MPI_FATAL_EDUMP_TABLE_HI_OFFSET 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HI_OFFSET,upperBaseAddress ));
 3646   SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x  MPI_FATAL_EDUMP_TABLE_LENGTH    0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LENGTH, length));
 3647   SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x  MPI_FATAL_EDUMP_TABLE_HANDSHAKE 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HANDSHAKE,0 ));
 3648   SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x  MPI_FATAL_EDUMP_TABLE_STATUS    0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_STATUS,0 ));
 3649   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2U");
 3650 }
 3651 
 3652 
 3653 /*******************************************************************************/
 3654 /** \fn bit32 mpiGetPCIBarIndex(agsaRoot_t *agRoot, pciBar)
 3655  *  \brief Get PCI BAR Index from PCI BAR
 3656  *  \param agsaRoot Pointer to a data structure containing both application and LL layer context handles
 3657  *  \param pciBar - PCI BAR
 3658  *
 3659  * Return:
 3660  *         PCI BAR Index
 3661  */
 3662 /*******************************************************************************/
 3663 GLOBAL bit32 mpiGetPCIBarIndex(agsaRoot_t *agRoot, bit32 pciBar)
 3664 {
 3665   switch(pciBar)
 3666   {
 3667   case BAR0:
 3668   case BAR1:
 3669       pciBar = PCIBAR0;
 3670       break;
 3671   case BAR2:
 3672   case BAR3:
 3673       pciBar = PCIBAR1;
 3674       break;
 3675   case BAR4:
 3676       pciBar = PCIBAR2;
 3677       break;
 3678   case BAR5:
 3679       pciBar = PCIBAR3;
 3680       break;
 3681   default:
 3682       pciBar = PCIBAR0;
 3683       break;
 3684   }
 3685 
 3686   return pciBar;
 3687 }
 3688 
 3689 /*******************************************************************************/
 3690 /** \fn void mpiReadGSTTable(agsaRoot_t *agRoot, spc_GSTableDescriptor_t *mpiGSTable)
 3691  *  \brief Reading the General Status Table
 3692  *
 3693  *  \param agsaRoot         Handles for this instance of SAS/SATA LLL
 3694  *  \param mpiGSTable       Pointer of General Status Table
 3695  *
 3696  * Return:
 3697  *         None
 3698  */
 3699 /*******************************************************************************/
 3700 GLOBAL void mpiReadGSTable(agsaRoot_t             *agRoot,
 3701                          spc_GSTableDescriptor_t  *mpiGSTable)
 3702 {
 3703   bit32 CFGTableOffset, TableOffset;
 3704   bit32 GSTableOffset;
 3705   bit8  i, pcibar;
 3706 
 3707   smTraceFuncEnter(hpDBG_VERY_LOUD,"m9");
 3708 
 3709   /* get offset of the configuration table */
 3710   TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 3711 
 3712   if(0xFFFFFFFF ==  TableOffset)
 3713   {
 3714     SA_ASSERT(0xFFFFFFFF ==  TableOffset, "Chip PCI dead");
 3715 
 3716     SA_DBG1(("mpiReadGSTable: Chip PCI dead  TableOffset 0x%x\n", TableOffset));
 3717     return;
 3718   }
 3719 
 3720 //  SA_DBG1(("mpiReadGSTable: TableOffset 0x%x\n", TableOffset));
 3721   CFGTableOffset = TableOffset & SCRATCH_PAD0_OFFSET_MASK;
 3722 
 3723   /* get PCI BAR */
 3724   TableOffset = (TableOffset & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
 3725   /* convert the PCI BAR to logical bar number */
 3726   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, TableOffset);
 3727 
 3728   /* read GST Table Offset from the configuration table */
 3729   GSTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_GST_OFFSET);
 3730 //  SA_DBG1(("mpiReadGSTable: GSTableOffset 0x%x\n",GSTableOffset ));
 3731 
 3732   GSTableOffset = CFGTableOffset + GSTableOffset;
 3733 
 3734   mpiGSTable->GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_GSTLEN_MPIS_OFFSET));
 3735   mpiGSTable->IQFreezeState0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IQ_FREEZE_STATE0_OFFSET));
 3736   mpiGSTable->IQFreezeState1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IQ_FREEZE_STATE1_OFFSET));
 3737   mpiGSTable->MsguTcnt       = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_MSGUTCNT_OFFSET));
 3738   mpiGSTable->IopTcnt        = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IOPTCNT_OFFSET));
 3739   mpiGSTable->Iop1Tcnt       = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IOP1TCNT_OFFSET));
 3740 
 3741   SA_DBG4(("mpiReadGSTable: GSTLenMPIS     0x%x\n", mpiGSTable->GSTLenMPIS));
 3742   SA_DBG4(("mpiReadGSTable: GSTLen         0x%x\n", (mpiGSTable->GSTLenMPIS & 0xfff8) >> SHIFT3));
 3743   SA_DBG4(("mpiReadGSTable: IQFreezeState0 0x%x\n", mpiGSTable->IQFreezeState0));
 3744   SA_DBG4(("mpiReadGSTable: IQFreezeState1 0x%x\n", mpiGSTable->IQFreezeState1));
 3745   SA_DBG4(("mpiReadGSTable: MsguTcnt       0x%x\n", mpiGSTable->MsguTcnt));
 3746   SA_DBG4(("mpiReadGSTable: IopTcnt        0x%x\n", mpiGSTable->IopTcnt));
 3747   SA_DBG4(("mpiReadGSTable: Iop1Tcnt       0x%x\n", mpiGSTable->Iop1Tcnt));
 3748 
 3749 
 3750   if(smIS_SPCV(agRoot))
 3751   {
 3752     /***** read Phy State from SAS Phy Attribute Table */
 3753     TableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_PHY_ATTRIBUTE_OFFSET);
 3754     TableOffset &= 0x00FFFFFF;
 3755     TableOffset = TableOffset + CFGTableOffset;
 3756     for (i = 0; i < 8; i++)
 3757     {
 3758       mpiGSTable->PhyState[i] = ossaHwRegReadExt(agRoot, pcibar, (bit32)(TableOffset + i * sizeof(phyAttrb_t)));
 3759       SA_DBG4(("mpiReadGSTable: PhyState[0x%x] 0x%x\n", i, mpiGSTable->PhyState[i]));
 3760     }
 3761   }
 3762   else
 3763   {
 3764     for (i = 0; i < 8; i++)
 3765     {
 3766       mpiGSTable->PhyState[i] = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_PHYSTATE_OFFSET + i * 4));
 3767       SA_DBG4(("mpiReadGSTable: PhyState[0x%x] 0x%x\n", i, mpiGSTable->PhyState[i]));
 3768     }
 3769   }
 3770 
 3771   mpiGSTable->GPIOpins = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_GPIO_PINS_OFFSET));
 3772   SA_DBG4(("mpiReadGSTable: GPIOpins 0x%x\n", mpiGSTable->GPIOpins));
 3773 
 3774   for (i = 0; i < 8; i++)
 3775   {
 3776     mpiGSTable->recoverErrInfo[i] = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_RERRINFO_OFFSET));
 3777     SA_DBG4(("mpiReadGSTable: recoverErrInfo[0x%x] 0x%x\n", i, mpiGSTable->recoverErrInfo[i]));
 3778   }
 3779 
 3780   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m9");
 3781 
 3782 }
 3783 
 3784 /*******************************************************************************/
 3785 /** \fn void siInitResources(agsaRoot_t *agRoot)
 3786  *  Initialization of LL resources
 3787  *
 3788  *  \param agsaRoot         Handles for this instance of SAS/SATA LLL
 3789  *  \param memoryAllocated  Point to the data structure that holds the different
 3790  *                          chunks of memory that are required
 3791  *
 3792  * Return:
 3793  *         None
 3794  */
 3795 /*******************************************************************************/
 3796 GLOBAL void siInitResources(agsaRoot_t              *agRoot,
 3797                             agsaMemoryRequirement_t *memoryAllocated,
 3798                             agsaHwConfig_t          *hwConfig,
 3799                             agsaSwConfig_t          *swConfig,
 3800                             bit32                   usecsPerTick)
 3801 {
 3802   agsaLLRoot_t          *saRoot;
 3803   agsaDeviceDesc_t      *pDeviceDesc;
 3804   agsaIORequestDesc_t   *pRequestDesc;
 3805   agsaTimerDesc_t       *pTimerDesc;
 3806   agsaPort_t            *pPort;
 3807   agsaPortMap_t         *pPortMap;
 3808   agsaDeviceMap_t       *pDeviceMap;
 3809   agsaIOMap_t           *pIOMap;
 3810   bit32                 maxNumIODevices;
 3811   bit32                 i, j;
 3812   mpiICQueue_t          *circularIQ;
 3813   mpiOCQueue_t          *circularOQ;
 3814 
 3815   if (agNULL == agRoot)
 3816   {
 3817     return;
 3818   }
 3819 
 3820   /* Get the saRoot memory address */
 3821   saRoot = (agsaLLRoot_t *) (memoryAllocated->agMemory[LLROOT_MEM_INDEX].virtPtr);
 3822   agRoot->sdkData = (void *) saRoot;
 3823 
 3824   /* Setup Device link */
 3825   /* Save the information of allocated device Link memory */
 3826   saRoot->deviceLinkMem = memoryAllocated->agMemory[DEVICELINK_MEM_INDEX];
 3827   si_memset(saRoot->deviceLinkMem.virtPtr, 0, saRoot->deviceLinkMem.totalLength);
 3828   SA_DBG2(("siInitResources: [%d] saRoot->deviceLinkMem VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n" ,
 3829     DEVICELINK_MEM_INDEX,
 3830     saRoot->deviceLinkMem.virtPtr,
 3831     saRoot->deviceLinkMem.phyAddrLower,
 3832     saRoot->deviceLinkMem.numElements,
 3833     saRoot->deviceLinkMem.totalLength,
 3834     saRoot->deviceLinkMem.type));
 3835 
 3836   maxNumIODevices = swConfig->numDevHandles;
 3837   SA_DBG2(("siInitResources:  maxNumIODevices=%d, swConfig->numDevHandles=%d \n",
 3838     maxNumIODevices,
 3839     swConfig->numDevHandles));
 3840 
 3841   /* Setup free IO Devices link list */
 3842   saLlistInitialize(&(saRoot->freeDevicesList));
 3843   for ( i = 0; i < (bit32) maxNumIODevices; i ++ )
 3844   {
 3845     /* get the pointer to the device descriptor */
 3846     pDeviceDesc = (agsaDeviceDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->deviceLinkMem), i);
 3847     /* Initialize device descriptor */
 3848     saLlinkInitialize(&(pDeviceDesc->linkNode));
 3849 
 3850     pDeviceDesc->initiatorDevHandle.osData    = agNULL;
 3851     pDeviceDesc->initiatorDevHandle.sdkData   = agNULL;
 3852     pDeviceDesc->targetDevHandle.osData       = agNULL;
 3853     pDeviceDesc->targetDevHandle.sdkData      = agNULL;
 3854     pDeviceDesc->deviceType                   = SAS_SATA_UNKNOWN_DEVICE;
 3855     pDeviceDesc->pPort                        = agNULL;
 3856     pDeviceDesc->DeviceMapIndex               = 0;
 3857 
 3858     saLlistInitialize(&(pDeviceDesc->pendingIORequests));
 3859 
 3860     /* Add the device descriptor to the free IO device link list */
 3861     saLlistAdd(&(saRoot->freeDevicesList), &(pDeviceDesc->linkNode));
 3862   }
 3863 
 3864   /* Setup IO Request link */
 3865   /* Save the information of allocated IO Request Link memory */
 3866   saRoot->IORequestMem = memoryAllocated->agMemory[IOREQLINK_MEM_INDEX];
 3867   si_memset(saRoot->IORequestMem.virtPtr, 0, saRoot->IORequestMem.totalLength);
 3868 
 3869   SA_DBG2(("siInitResources: [%d] saRoot->IORequestMem  VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
 3870     IOREQLINK_MEM_INDEX,
 3871     saRoot->IORequestMem.virtPtr,
 3872     saRoot->IORequestMem.phyAddrLower,
 3873     saRoot->IORequestMem.numElements,
 3874     saRoot->IORequestMem.totalLength,
 3875     saRoot->IORequestMem.type));
 3876 
 3877   /* Setup free IO  Request link list */
 3878   saLlistIOInitialize(&(saRoot->freeIORequests));
 3879   saLlistIOInitialize(&(saRoot->freeReservedRequests));
 3880   for ( i = 0; i < swConfig->maxActiveIOs; i ++ )
 3881   {
 3882     /* get the pointer to the request descriptor */
 3883     pRequestDesc = (agsaIORequestDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->IORequestMem), i);
 3884     /* Initialize request descriptor */
 3885     saLlinkIOInitialize(&(pRequestDesc->linkNode));
 3886 
 3887     pRequestDesc->valid             = agFALSE;
 3888     pRequestDesc->requestType       = AGSA_REQ_TYPE_UNKNOWN;
 3889     pRequestDesc->pIORequestContext = agNULL;
 3890     pRequestDesc->HTag              = i;
 3891     pRequestDesc->pDevice           = agNULL;
 3892     pRequestDesc->pPort             = agNULL;
 3893 
 3894     /* Add the request descriptor to the free IO Request link list */
 3895     /* Add the request descriptor to the free Reserved Request link list */
 3896   /* SMP request must get service so reserve one request when first SMP completes */
 3897     if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
 3898     {
 3899       saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequestDesc->linkNode));
 3900     }
 3901     else
 3902     {
 3903       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequestDesc->linkNode));
 3904     }
 3905   }
 3906 
 3907 
 3908   /* Setup timer link */
 3909   /* Save the information of allocated timer Link memory */
 3910   saRoot->timerLinkMem = memoryAllocated->agMemory[TIMERLINK_MEM_INDEX];
 3911   si_memset(saRoot->timerLinkMem.virtPtr, 0, saRoot->timerLinkMem.totalLength);
 3912   SA_DBG2(("siInitResources: [%d] saRoot->timerLinkMem  VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
 3913     TIMERLINK_MEM_INDEX,
 3914     saRoot->timerLinkMem.virtPtr,
 3915     saRoot->timerLinkMem.phyAddrLower,
 3916     saRoot->timerLinkMem.numElements,
 3917     saRoot->timerLinkMem.totalLength,
 3918     saRoot->timerLinkMem.type));
 3919 
 3920   /* Setup free timer link list */
 3921   saLlistInitialize(&(saRoot->freeTimers));
 3922   for ( i = 0; i < NUM_TIMERS; i ++ )
 3923   {
 3924     /* get the pointer to the timer descriptor */
 3925     pTimerDesc = (agsaTimerDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->timerLinkMem), i);
 3926     /* Initialize timer descriptor */
 3927     saLlinkInitialize(&(pTimerDesc->linkNode));
 3928 
 3929     pTimerDesc->valid         = agFALSE;
 3930     pTimerDesc->timeoutTick   = 0;
 3931     pTimerDesc->pfnTimeout    = agNULL;
 3932     pTimerDesc->Event         = 0;
 3933     pTimerDesc->pParm         = agNULL;
 3934 
 3935     /* Add the timer descriptor to the free timer link list */
 3936     saLlistAdd(&(saRoot->freeTimers), &(pTimerDesc->linkNode));
 3937   }
 3938   /* Setup valid timer link list */
 3939   saLlistInitialize(&(saRoot->validTimers));
 3940 
 3941   /* Setup Phys */
 3942   /* Setup PhyCount */
 3943   saRoot->phyCount = (bit8) hwConfig->phyCount;
 3944   /* Init Phy data structure */
 3945   for ( i = 0; i < saRoot->phyCount; i ++ )
 3946   {
 3947     saRoot->phys[i].pPort = agNULL;
 3948     saRoot->phys[i].phyId = (bit8) i;
 3949 
 3950     /* setup phy status is PHY_STOPPED */
 3951     PHY_STATUS_SET(&(saRoot->phys[i]), PHY_STOPPED);
 3952   }
 3953 
 3954   /* Setup Ports */
 3955   /* Setup PortCount */
 3956   saRoot->portCount = saRoot->phyCount;
 3957   /* Setup free port link list */
 3958   saLlistInitialize(&(saRoot->freePorts));
 3959   for ( i = 0; i < saRoot->portCount; i ++ )
 3960   {
 3961     /* get the pointer to the port */
 3962     pPort = &(saRoot->ports[i]);
 3963     /* Initialize port */
 3964     saLlinkInitialize(&(pPort->linkNode));
 3965 
 3966     pPort->portContext.osData   = agNULL;
 3967     pPort->portContext.sdkData  = pPort;
 3968     pPort->portId         = 0;
 3969     pPort->portIdx        = (bit8) i;
 3970     pPort->status         = PORT_NORMAL;
 3971 
 3972     for ( j = 0; j < saRoot->phyCount; j ++ )
 3973     {
 3974       pPort->phyMap[j] = agFALSE;
 3975     }
 3976 
 3977     saLlistInitialize(&(pPort->listSASATADevices));
 3978 
 3979     /* Add the port to the free port link list */
 3980     saLlistAdd(&(saRoot->freePorts), &(pPort->linkNode));
 3981   }
 3982   /* Setup valid port link list */
 3983   saLlistInitialize(&(saRoot->validPorts));
 3984 
 3985   /* Init sysIntsActive */
 3986   saRoot->sysIntsActive = agFALSE;
 3987 
 3988   /* setup timer tick granunarity */
 3989   saRoot->usecsPerTick = usecsPerTick;
 3990 
 3991   /* initialize LL timer tick */
 3992   saRoot->timeTick = 0;
 3993 
 3994   /* initialize device (de)registration callback fns */
 3995   saRoot->DeviceRegistrationCB = agNULL;
 3996   saRoot->DeviceDeregistrationCB = agNULL;
 3997 
 3998   /* Initialize the PortMap for port context */
 3999   for ( i = 0; i < saRoot->portCount; i ++ )
 4000   {
 4001     pPortMap = &(saRoot->PortMap[i]);
 4002 
 4003     pPortMap->PortContext   = agNULL;
 4004     pPortMap->PortID        = PORT_MARK_OFF;
 4005     pPortMap->PortStatus    = PORT_NORMAL;
 4006     saRoot->autoDeregDeviceflag[i] = 0;
 4007   }
 4008 
 4009   /* Initialize the DeviceMap for device handle */
 4010   for ( i = 0; i < MAX_IO_DEVICE_ENTRIES; i ++ )
 4011   {
 4012     pDeviceMap = &(saRoot->DeviceMap[i]);
 4013 
 4014     pDeviceMap->DeviceHandle  = agNULL;
 4015     pDeviceMap->DeviceIdFromFW   =  i;
 4016   }
 4017 
 4018   /* Initialize the IOMap for IOrequest */
 4019   for ( i = 0; i < MAX_ACTIVE_IO_REQUESTS; i ++ )
 4020   {
 4021     pIOMap = &(saRoot->IOMap[i]);
 4022 
 4023     pIOMap->IORequest   = agNULL;
 4024     pIOMap->Tag         = MARK_OFF;
 4025   }
 4026 
 4027   /* clean the inbound queues */
 4028   for (i = 0; i < saRoot->QueueConfig.numInboundQueues; i ++)
 4029   {
 4030     if(0 != saRoot->inboundQueue[i].numElements)
 4031     {
 4032       circularIQ = &saRoot->inboundQueue[i];
 4033       si_memset(circularIQ->memoryRegion.virtPtr, 0, circularIQ->memoryRegion.totalLength);
 4034       si_memset(saRoot->inboundQueue[i].ciPointer, 0, sizeof(bit32));
 4035     }
 4036   }
 4037   /* clean the outbound queues */
 4038   for (i = 0; i < saRoot->QueueConfig.numOutboundQueues; i ++)
 4039   {
 4040     if(0 != saRoot->outboundQueue[i].numElements)
 4041     {
 4042       circularOQ = &saRoot->outboundQueue[i];
 4043       si_memset(circularOQ->memoryRegion.virtPtr, 0, circularOQ->memoryRegion.totalLength);
 4044       si_memset(saRoot->outboundQueue[i].piPointer, 0, sizeof(bit32));
 4045       circularOQ->producerIdx = 0;
 4046       circularOQ->consumerIdx = 0;
 4047       SA_DBG3(("siInitResource: Q %d  Clean PI 0x%03x CI 0x%03x\n", i,circularOQ->producerIdx, circularOQ->consumerIdx));
 4048     }
 4049   }
 4050 
 4051   return;
 4052 }
 4053 
 4054 /*******************************************************************************/
 4055 /** \fn void mpiReadCALTable(agsaRoot_t *agRoot,
 4056  *                           spc_SPASTable_t *mpiCALTable, bit32 index)
 4057  *  \brief Reading the Phy Analog Setup Register Table
 4058  *  \param agsaRoot    Handles for this instance of SAS/SATA LLL
 4059  *  \param mpiCALTable Pointer of Phy Calibration Table
 4060  *
 4061  * Return:
 4062  *         None
 4063  */
 4064 /*******************************************************************************/
 4065 GLOBAL void mpiReadCALTable(agsaRoot_t      *agRoot,
 4066                             spc_SPASTable_t *mpiCALTable,
 4067                             bit32           index)
 4068 {
 4069   bit32 CFGTableOffset, TableOffset;
 4070   bit32 CALTableOffset;
 4071   bit8  pcibar;
 4072 
 4073   /* get offset of the configuration table */
 4074   TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 4075 
 4076   CFGTableOffset = TableOffset & SCRATCH_PAD0_OFFSET_MASK;
 4077 
 4078   /* get PCI BAR */
 4079   TableOffset = (TableOffset & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
 4080   /* convert the PCI BAR to logical bar number */
 4081   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, TableOffset);
 4082 
 4083   /* read Calibration Table Offset from the configuration table */
 4084   CALTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_ANALOG_SETUP_OFFSET);
 4085   if(smIS_SPCV(agRoot))
 4086   {
 4087     CALTableOffset &= 0x00FFFFFF;
 4088   }
 4089   CALTableOffset = CFGTableOffset + CALTableOffset + (index * ANALOG_SETUP_ENTRY_SIZE * 4);
 4090 
 4091   mpiCALTable->spaReg0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG1_OFFSET));
 4092   mpiCALTable->spaReg1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG2_OFFSET));
 4093   mpiCALTable->spaReg2 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG3_OFFSET));
 4094   mpiCALTable->spaReg3 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_CFG_OFFSET));
 4095   mpiCALTable->spaReg4 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG1_OFFSET));
 4096   mpiCALTable->spaReg5 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG2_OFFSET));
 4097   mpiCALTable->spaReg6 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG1_OFFSET));
 4098   mpiCALTable->spaReg7 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG2_OFFSET));
 4099 
 4100   SA_DBG3(("mpiReadCALTable: spaReg0 0x%x\n", mpiCALTable->spaReg0));
 4101   SA_DBG3(("mpiReadCALTable: spaReg1 0x%x\n", mpiCALTable->spaReg1));
 4102   SA_DBG3(("mpiReadCALTable: spaReg2 0x%x\n", mpiCALTable->spaReg2));
 4103   SA_DBG3(("mpiReadCALTable: spaReg3 0x%x\n", mpiCALTable->spaReg3));
 4104   SA_DBG3(("mpiReadCALTable: spaReg4 0x%x\n", mpiCALTable->spaReg4));
 4105   SA_DBG3(("mpiReadCALTable: spaReg5 0x%x\n", mpiCALTable->spaReg5));
 4106   SA_DBG3(("mpiReadCALTable: spaReg6 0x%x\n", mpiCALTable->spaReg6));
 4107   SA_DBG3(("mpiReadCALTable: spaReg7 0x%x\n", mpiCALTable->spaReg7));
 4108 }
 4109 
 4110 /*******************************************************************************/
 4111 /** \fn void mpiWriteCALTable(agsaRoot_t *agRoot,
 4112  *                            spc_SPASTable_t *mpiCALTable, index)
 4113  *  \brief Writing the Phy Analog Setup Register Table
 4114  *  \param agsaRoot    Handles for this instance of SAS/SATA LLL
 4115  *  \param mpiCALTable Pointer of Phy Calibration Table
 4116  *
 4117  * Return:
 4118  *         None
 4119  */
 4120 /*******************************************************************************/
 4121 GLOBAL void mpiWriteCALTable(agsaRoot_t     *agRoot,
 4122                             spc_SPASTable_t *mpiCALTable,
 4123                             bit32           index)
 4124 {
 4125   bit32 CFGTableOffset, TableOffset;
 4126   bit32 CALTableOffset;
 4127   bit8  pcibar;
 4128 
 4129   smTraceFuncEnter(hpDBG_VERY_LOUD,"m6");
 4130 
 4131   /* get offset of the configuration table */
 4132   TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 4133 
 4134   CFGTableOffset = TableOffset & SCRATCH_PAD0_OFFSET_MASK;
 4135 
 4136   /* get PCI BAR */
 4137   TableOffset = (TableOffset & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
 4138   /* convert the PCI BAR to logical bar number */
 4139   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, TableOffset);
 4140 
 4141   /* read Calibration Table Offset from the configuration table */
 4142   CALTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_ANALOG_SETUP_OFFSET);
 4143   if(smIS_SPCV(agRoot))
 4144   {
 4145     CALTableOffset &= 0x00FFFFFF;
 4146   }
 4147   CALTableOffset = CFGTableOffset + CALTableOffset + (index * ANALOG_SETUP_ENTRY_SIZE * 4);
 4148 
 4149   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG1_OFFSET), mpiCALTable->spaReg0);
 4150   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG2_OFFSET), mpiCALTable->spaReg1);
 4151   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG3_OFFSET), mpiCALTable->spaReg2);
 4152   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_CFG_OFFSET),       mpiCALTable->spaReg3);
 4153   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG1_OFFSET), mpiCALTable->spaReg4);
 4154   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG2_OFFSET), mpiCALTable->spaReg5);
 4155   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG1_OFFSET),      mpiCALTable->spaReg6);
 4156   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG2_OFFSET),      mpiCALTable->spaReg7);
 4157 
 4158   SA_DBG4(("mpiWriteCALTable: Offset 0x%08x  spaReg0 0x%x 0x%x 0x%x 0x%x\n",(bit32)(CALTableOffset + TX_PORT_CFG1_OFFSET), mpiCALTable->spaReg0, mpiCALTable->spaReg1, mpiCALTable->spaReg2, mpiCALTable->spaReg3));
 4159   SA_DBG4(("mpiWriteCALTable: Offset 0x%08x  spaReg4 0x%x 0x%x 0x%x 0x%x\n",(bit32)(CALTableOffset + RV_PORT_CFG1_OFFSET), mpiCALTable->spaReg4, mpiCALTable->spaReg5, mpiCALTable->spaReg6, mpiCALTable->spaReg7));
 4160 
 4161   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m6");
 4162 }
 4163 
 4164 /*******************************************************************************/
 4165 /** \fn void mpiWriteCALAll(agsaRoot_t *agRoot,
 4166  *                          agsaPhyAnalogSetupTable_t *mpiCALTable)
 4167  *  \brief Writing the Phy Analog Setup Register Table
 4168  *  \param agsaRoot    Handles for this instance of SAS/SATA LLL
 4169  *  \param mpiCALTable Pointer of Phy Calibration Table
 4170  *
 4171  * Return:
 4172  *         None
 4173  */
 4174 /*******************************************************************************/
 4175 GLOBAL void mpiWriteCALAll(agsaRoot_t     *agRoot,
 4176                            agsaPhyAnalogSetupTable_t *mpiCALTable)
 4177 {
 4178   bit8 i;
 4179   smTraceFuncEnter(hpDBG_VERY_LOUD,"mz");
 4180 
 4181   if(smIS_SPCV(agRoot))
 4182   {
 4183     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "mz");
 4184     return;
 4185   }
 4186 
 4187   for (i = 0; i < MAX_INDEX; i++)
 4188   {
 4189     mpiWriteCALTable(agRoot, (spc_SPASTable_t *)&mpiCALTable->phyAnalogSetupRegisters[i], i);
 4190   }
 4191   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "mz");
 4192 }
 4193 
 4194 GLOBAL void mpiWrAnalogSetupTable(agsaRoot_t *agRoot,
 4195                                    mpiConfig_t      *config
 4196                                  )
 4197 {
 4198 
 4199   bit32 AnalogTableBase,CFGTableOffset, value,phy;
 4200   bit32 AnalogtableSize;
 4201   bit8  pcibar;
 4202   value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 4203   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, value);
 4204 
 4205   CFGTableOffset = value & SCRATCH_PAD0_OFFSET_MASK;
 4206   AnalogtableSize  = AnalogTableBase = ossaHwRegReadExt(agRoot,pcibar , (bit32)CFGTableOffset + MAIN_ANALOG_SETUP_OFFSET);
 4207   AnalogtableSize &= 0xFF000000;
 4208   AnalogtableSize >>= SHIFT24;
 4209   AnalogTableBase &= 0x00FFFFFF;
 4210 
 4211   AnalogTableBase = CFGTableOffset + AnalogTableBase;
 4212 
 4213 //   config->phyAnalogConfig.phyAnalogSetupRegisters[0].spaRegister0 = 0;
 4214   SA_DBG1(("mpiWrAnalogSetupTable:Analogtable Base Offset %08X pcibar %d\n",AnalogTableBase, pcibar ));
 4215 
 4216   SA_DBG1(("mpiWrAnalogSetupTable:%d %d\n",(int)sizeof(agsaPhyAnalogSetupRegisters_t), AnalogtableSize));
 4217 
 4218   for(phy = 0; phy < 10; phy++) /* upto 10 phys See PM*/
 4219   {
 4220       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 0 ),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister0 );
 4221       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 4 ),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister1 );
 4222       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 8 ),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister2 );
 4223       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 12),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister3 );
 4224       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 16),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister4 );
 4225       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 20),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister5 );
 4226       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 24),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister6 );
 4227       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 28),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister7 );
 4228       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 32),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister8 );
 4229       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 36),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister9 );
 4230 
 4231       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister0 0x%x 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) + 0,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister0 ,ossaHwRegReadExt(agRoot, pcibar,AnalogTableBase + ( AnalogtableSize * phy)+ 0 )));
 4232       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister1 0x%x 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) + 4,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister1 ,ossaHwRegReadExt(agRoot, pcibar,AnalogTableBase + ( AnalogtableSize * phy)+ 4 )));
 4233       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister2 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) + 8,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister2 ));
 4234       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister3 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +12,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister3 ));
 4235       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister4 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +16,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister4 ));
 4236       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister5 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +20,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister5 ));
 4237       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister6 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +24,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister6 ));
 4238       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister7 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +28,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister7 ));
 4239       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister8 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +32,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister8 ));
 4240       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister9 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +36,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister9 ));
 4241   }
 4242 
 4243 }
 4244 
 4245 
 4246 GLOBAL void mpiWrIntVecTable(agsaRoot_t *agRoot,
 4247                             mpiConfig_t* config
 4248                             )
 4249 {
 4250   bit32 CFGTableOffset, value;
 4251   bit32 INTVTableOffset;
 4252   bit32 ValuetoWrite;
 4253   bit8  pcibar, i,obq;
 4254 
 4255   /* get offset of the configuration table */
 4256   value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 4257 
 4258   CFGTableOffset = value & SCRATCH_PAD0_OFFSET_MASK;
 4259 
 4260   /* get PCI BAR */
 4261   value = (value & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
 4262   /* convert the PCI BAR to logical bar number */
 4263   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, value);
 4264 
 4265   /* read Interrupt Table Offset from the main configuration table */
 4266   INTVTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_INT_VEC_TABLE_OFFSET);
 4267   INTVTableOffset &= 0x00FFFFFF;
 4268   INTVTableOffset = CFGTableOffset + INTVTableOffset;
 4269   SA_DBG1(("mpiWrIntVecTable: Base Offset %08X\n",(bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO ) ));
 4270 
 4271   for (i = 0; i < MAX_NUM_VECTOR; i ++)
 4272   {
 4273     bit32 found=0;
 4274     for (obq = 0; obq < MAX_NUM_VECTOR; obq++)
 4275     { /* find OBQ for  vector i */
 4276       if( config->outboundQueues[obq].interruptVector == i )
 4277       {
 4278         found=1;
 4279         break;
 4280       }
 4281     }
 4282 
 4283     if(!found )
 4284     {
 4285       continue;
 4286     }
 4287 
 4288     ValuetoWrite = (( config->outboundQueues[obq].interruptDelay << SHIFT15) | config->outboundQueues[obq].interruptThreshold  );
 4289 
 4290     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t)), ValuetoWrite );
 4291 
 4292     SA_DBG3(("mpiWrIntVecTable: Q %d interruptDelay 0x%X interruptThreshold 0x%X \n",i,
 4293              config->outboundQueues[i].interruptDelay,  config->outboundQueues[i].interruptThreshold ));
 4294 
 4295     SA_DBG3(("mpiWrIntVecTable: %d INT_VT_Coal_CNT_TO Bar %d Offset %3X Writing 0x%08x\n",i,
 4296             pcibar,
 4297             (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t)),
 4298             ValuetoWrite));
 4299 
 4300   }
 4301 
 4302   for (i = 0; i < MAX_NUM_VECTOR; i++)
 4303   {
 4304     /* read interrupt colescing control and timer  */
 4305     value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t)));
 4306     SA_DBG4(("mpiWrIntVecTable: Offset 0x%08x Interrupt Colescing iccict[%02d] 0x%x\n", (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t)), i, value));
 4307   }
 4308 }
 4309 
 4310 GLOBAL void mpiWrPhyAttrbTable(agsaRoot_t *agRoot, sasPhyAttribute_t *phyAttrib)
 4311 {
 4312   bit32 CFGTableOffset, value;
 4313   bit32 PHYTableOffset;
 4314   bit8  pcibar, i;
 4315 
 4316   /* get offset of the configuration table */
 4317   value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
 4318 
 4319   CFGTableOffset = value & SCRATCH_PAD0_OFFSET_MASK;
 4320 
 4321   /* get PCI BAR */
 4322   value = (value & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
 4323   /* convert the PCI BAR to logical bar number */
 4324   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, value);
 4325 
 4326   /* read Phy Attribute Table Offset from the configuration table */
 4327   PHYTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_PHY_ATTRIBUTE_OFFSET);
 4328 
 4329   PHYTableOffset &=0x00FFFFFF;
 4330 
 4331   PHYTableOffset = CFGTableOffset + PHYTableOffset + PHY_EVENT_OQ;
 4332 
 4333   SA_DBG1(("mpiWrPhyAttrbTable: PHYTableOffset 0x%08x\n", PHYTableOffset));
 4334 
 4335   /* write OQ event per phy */
 4336   for (i = 0; i < MAX_VALID_PHYS; i ++)
 4337   {
 4338     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(PHYTableOffset + i * sizeof(phyAttrb_t)), phyAttrib->phyAttribute[i].phyEventOQ);
 4339 
 4340   SA_DBG3(("mpiWrPhyAttrbTable:%d Offset 0x%08x phyAttribute 0x%x\n",i,(bit32)(PHYTableOffset + i * sizeof(phyAttrb_t)), phyAttrib->phyAttribute[i].phyEventOQ ));
 4341 
 4342 
 4343   }
 4344 
 4345   for (i = 0; i < MAX_VALID_PHYS; i ++)
 4346   {
 4347     value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(PHYTableOffset + i * sizeof(phyAttrb_t)));
 4348   SA_DBG1(("mpiWrPhyAttrbTable: OQ Event per phy[%x] 0x%x\n", i, value));
 4349   }
 4350 }
 4351 
 4352 
 4353 #ifdef TEST /******************************************************************/
 4354 /*******************************************************************************/
 4355 /** \fn mpiFreezeInboundQueue(agsaRoot_t *agRoot)
 4356  *  \brief Freeze the inbound queue
 4357  *
 4358  *  \param agRoot             Handles for this instance of SAS/SATA hardware
 4359  *  \param bitMapQueueNum0    bit map for inbound queue number 0 - 31 to freeze
 4360  *  \param bitMapQueueNum1    bit map for inbound queue number 32 - 63 to freeze
 4361  *
 4362  * Return:
 4363  *         AGSA_RC_SUCCESS if Un-initialize the configuration table sucessful
 4364  *         AGSA_RC_FAILURE if Un-initialize the configuration table failed
 4365  */
 4366 /*******************************************************************************/
 4367 GLOBAL bit32 mpiFreezeInboundQueue(agsaRoot_t *agRoot, bit32 bitMapQueueNum0, bit32 bitMapQueueNum1)
 4368 {
 4369   bit32    value, togglevalue;
 4370   bit32    max_wait_time;
 4371   bit32    max_wait_count;
 4372 
 4373   SA_DBG2(("Entering function:mpiFreezeInboundQueue\n"));
 4374   SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null");
 4375 
 4376   togglevalue = 0;
 4377 
 4378   if (bitMapQueueNum0)
 4379   {
 4380     /* update the inbound queue number to HOST_SCRATCH_PAD1 register for queue 0 to 31 */
 4381     SA_DBG1(("mpiFreezeInboundQueue: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
 4382     SA_DBG1(("mpiFreezeInboundQueue: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3)));
 4383 
 4384     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_1);
 4385     value |= bitMapQueueNum0;
 4386     siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_1, MSGU_HOST_SCRATCH_PAD_1, value);
 4387   }
 4388 
 4389   if (bitMapQueueNum1)
 4390   {
 4391     /* update the inbound queue number to HOST_SCRATCH_PAD2 register for queue 32 to 63 */
 4392     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2);
 4393     value |= bitMapQueueNum1;
 4394     siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_2, MSGU_HOST_SCRATCH_PAD_2, value);
 4395   }
 4396 
 4397   /* Write bit 2 to Inbound DoorBell Register */
 4398   siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, IBDB_IBQ_FREEZE);
 4399 
 4400   /* wait until Inbound DoorBell Clear Register toggled */
 4401   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
 4402   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 4403   do
 4404   {
 4405     ossaStallThread(agRoot, WAIT_INCREMENT);
 4406     /* Read Inbound DoorBell Register - for RevB */
 4407 //    value = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_IBDB_SET);
 4408     value = MSGU_READ_IDR;
 4409     value &= IBDB_IBQ_FREEZE;
 4410   } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT));
 4411 
 4412   if (!max_wait_count)
 4413   {
 4414     SA_DBG1(("mpiFreezeInboundQueue: IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue));
 4415     return AGSA_RC_FAILURE;
 4416   }
 4417 
 4418   return AGSA_RC_SUCCESS;
 4419 }
 4420 
 4421 /******************************************************************************/
 4422 /** \fn mpiUnFreezeInboundQueue(agsaRoot_t *agRoot)
 4423  *  \brief Freeze the inbound queue
 4424  *
 4425  *  \param agRoot             Handles for this instance of SAS/SATA hardware
 4426  *  \param bitMapQueueNum0    bit map for inbound queue number 0 - 31 to freeze
 4427  *  \param bitMapQueueNum1    bit map for inbound queue number 32 - 63 to freeze
 4428  *
 4429  * Return:
 4430  *         AGSA_RC_SUCCESS if Un-initialize the configuration table sucessful
 4431  *         AGSA_RC_FAILURE if Un-initialize the configuration table failed
 4432  */
 4433 /******************************************************************************/
 4434 GLOBAL bit32 mpiUnFreezeInboundQueue(agsaRoot_t *agRoot, bit32 bitMapQueueNum0, bit32 bitMapQueueNum1)
 4435 {
 4436   bit32    value, togglevalue;
 4437   bit32    max_wait_time;
 4438   bit32    max_wait_count;
 4439 
 4440   SA_DBG2(("Entering function:mpiUnFreezeInboundQueue\n"));
 4441   SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null");
 4442 
 4443   togglevalue = 0;
 4444 
 4445   if (bitMapQueueNum0)
 4446   {
 4447     /* update the inbound queue number to HOST_SCRATCH_PAD1 register - for queue 0 to 31 */
 4448     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1);
 4449     value |= bitMapQueueNum0;
 4450     siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_1, MSGU_HOST_SCRATCH_PAD_1, value);
 4451   }
 4452 
 4453   if (bitMapQueueNum1)
 4454   {
 4455     /* update the inbound queue number to HOST_SCRATCH_PAD2 register - for queue 32 to 63 */
 4456     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2);
 4457     value |= bitMapQueueNum1;
 4458     siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_2, MSGU_HOST_SCRATCH_PAD_2, value);
 4459   }
 4460 
 4461   /* Write bit 2 to Inbound DoorBell Register */
 4462   siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, IBDB_IBQ_UNFREEZE);
 4463 
 4464   /* wait until Inbound DoorBell Clear Register toggled */
 4465   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
 4466   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 4467   do
 4468   {
 4469     ossaStallThread(agRoot, WAIT_INCREMENT);
 4470     /* Read Inbound DoorBell Register - for RevB */
 4471     value = MSGU_READ_IDR;
 4472     value &= IBDB_IBQ_UNFREEZE;
 4473   } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT));
 4474 
 4475   if (!max_wait_count)
 4476   {
 4477     SA_DBG1(("mpiUnFreezeInboundQueue: IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue));
 4478     return AGSA_RC_FAILURE;
 4479   }
 4480 
 4481   return AGSA_RC_SUCCESS;
 4482 }
 4483 
 4484 #endif /* TEST ****************************************************************/
 4485 
 4486 GLOBAL bit32 si_check_V_HDA(agsaRoot_t *agRoot)
 4487 {
 4488   bit32 ret = AGSA_RC_SUCCESS;
 4489   bit32 hda_status = 0;
 4490 
 4491   hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28));
 4492 
 4493   SA_DBG1(("si_check_V_HDA: hda_status 0x%08X\n",hda_status ));
 4494 
 4495   if((hda_status  & SPC_V_HDAR_RSPCODE_MASK)  == SPC_V_HDAR_IDLE)
 4496   {
 4497     /* HDA mode */
 4498     SA_DBG1(("si_check_V_HDA: HDA mode, value = 0x%x\n", hda_status));
 4499     ret = AGSA_RC_HDA_NO_FW_RUNNING;
 4500   }
 4501 
 4502 
 4503   return(ret);
 4504 }
 4505 GLOBAL bit32  si_check_V_Ready(agsaRoot_t *agRoot)
 4506 {
 4507   bit32 ret = AGSA_RC_SUCCESS;
 4508   bit32    SCRATCH_PAD1;
 4509   bit32    max_wait_time;
 4510   bit32    max_wait_count;
 4511 /* ILA */
 4512   max_wait_time = (200 * 1000); /* wait 200 milliseconds */
 4513   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 4514   do
 4515   {
 4516     ossaStallThread(agRoot, WAIT_INCREMENT);
 4517     SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
 4518   } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK) != SCRATCH_PAD1_V_ILA_MASK) && (max_wait_count -= WAIT_INCREMENT));
 4519 
 4520   if (!max_wait_count)
 4521   {
 4522     SA_DBG1(("si_check_V_Ready: SCRATCH_PAD1_V_ILA_MASK (0x%x)  not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_ILA_MASK, SCRATCH_PAD1));
 4523     return( AGSA_RC_FAILURE);
 4524   }
 4525   /* RAAE */
 4526   max_wait_time = (200 * 1000); /* wait 200 milliseconds */
 4527   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 4528   do
 4529   {
 4530     ossaStallThread(agRoot, WAIT_INCREMENT);
 4531     SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
 4532   } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK) != SCRATCH_PAD1_V_RAAE_MASK) && (max_wait_count -= WAIT_INCREMENT));
 4533 
 4534   if (!max_wait_count)
 4535   {
 4536     SA_DBG1(("si_check_V_Ready: SCRATCH_PAD1_V_RAAE_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_RAAE_MASK, SCRATCH_PAD1));
 4537     return( AGSA_RC_FAILURE);
 4538 
 4539   }
 4540   /* IOP0 */
 4541   max_wait_time = (200 * 1000); /* wait 200 milliseconds */
 4542   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 4543   do
 4544   {
 4545     ossaStallThread(agRoot, WAIT_INCREMENT);
 4546     SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
 4547   } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK) != SCRATCH_PAD1_V_IOP0_MASK) && (max_wait_count -= WAIT_INCREMENT));
 4548 
 4549   if (!max_wait_count)
 4550   {
 4551     SA_DBG1(("si_check_V_Ready: SCRATCH_PAD1_V_IOP0_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_IOP0_MASK ,SCRATCH_PAD1));
 4552     return( AGSA_RC_FAILURE);
 4553 
 4554   }
 4555 
 4556   /* IOP1 */
 4557   max_wait_time = (200 * 1000); /* wait 200 milliseconds */
 4558   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
 4559   do
 4560   {
 4561     ossaStallThread(agRoot, WAIT_INCREMENT);
 4562     SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
 4563   } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP1_MASK) != SCRATCH_PAD1_V_IOP1_MASK) && (max_wait_count -= WAIT_INCREMENT));
 4564 
 4565   if (!max_wait_count)
 4566   {
 4567     SA_DBG1(("si_check_V_Ready: SCRATCH_PAD1_V_IOP1_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_IOP1_MASK, SCRATCH_PAD1));
 4568     // return( AGSA_RC_FAILURE);
 4569   }
 4570 
 4571   return(ret);
 4572 }
 4573 
 4574 GLOBAL bit32 siScratchDump(agsaRoot_t *agRoot)
 4575 {
 4576   bit32 SCRATCH_PAD1;
 4577   bit32 ret =0;
 4578 #ifdef SALLSDK_DEBUG
 4579   bit32 SCRATCH_PAD2;
 4580   bit32 SCRATCH_PAD3;
 4581   bit32 SCRATCH_PAD0;
 4582 
 4583   SCRATCH_PAD0 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_0);
 4584   SCRATCH_PAD2 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_2);
 4585   SCRATCH_PAD3 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3);
 4586 #endif  /* SALLSDK_DEBUG */
 4587   SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
 4588   SA_DBG1(("siScratchDump: SCRATCH_PAD 0 0x%08x 1 0x%08x 2 0x%08x 3 0x%08x\n",SCRATCH_PAD0,SCRATCH_PAD1,SCRATCH_PAD2,SCRATCH_PAD3 ));
 4589 
 4590   if((SCRATCH_PAD1 & SCRATCH_PAD1_V_RESERVED) == SCRATCH_PAD1_V_RESERVED  )
 4591   {
 4592     SA_DBG1(("siScratchDump: SCRATCH_PAD1 SCRATCH_PAD1_V_RESERVED 0x%08x\n", SCRATCH_PAD1_V_RESERVED));
 4593   }
 4594   else
 4595   {
 4596     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK) == SCRATCH_PAD1_V_RAAE_MASK  )
 4597     {
 4598       SA_DBG1(("siScratchDump: SCRATCH_PAD1 valid 0x%08x\n",SCRATCH_PAD0 ));
 4599       SA_DBG1(("siScratchDump: RAAE ready 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK));
 4600     }
 4601     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK) == SCRATCH_PAD1_V_ILA_MASK)
 4602     {
 4603       SA_DBG1(("siScratchDump: ILA  ready 0x%08x\n", SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK));
 4604     }
 4605 
 4606     if(SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK)
 4607     {
 4608       SA_DBG1(("siScratchDump: BOOTSTATE not success 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK));
 4609     }
 4610 
 4611     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK) == SCRATCH_PAD1_V_IOP0_MASK)
 4612     {
 4613       SA_DBG1(("siScratchDump: IOP0 ready 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK));
 4614     }
 4615     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP1_MASK) == SCRATCH_PAD1_V_IOP1_MASK)
 4616     {
 4617       SA_DBG1(("siScratchDump: IOP1 ready 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP1_MASK ));
 4618     }
 4619     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_READY) == SCRATCH_PAD1_V_READY)
 4620     {
 4621       SA_DBG1(("siScratchDump: SCRATCH_PAD1_V_READY  0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_READY ));
 4622     }
 4623     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK) == SCRATCH_PAD1_V_BOOTSTATE_MASK)
 4624     {
 4625       SA_DBG1(("siScratchDump: SCRATCH_PAD1_V_BOOTSTATE_MASK  0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK ));
 4626     }
 4627   }
 4628   return(ret);
 4629 
 4630 }
 4631 
 4632 
 4633 void si_macro_check(agsaRoot_t *agRoot)
 4634 {
 4635 
 4636   SA_DBG1(("si_macro_check:smIS_SPC      %d\n",smIS_SPC(agRoot)  ));
 4637   SA_DBG1(("si_macro_check:smIS_HIL      %d\n",smIS_HIL(agRoot)  ));
 4638   SA_DBG1(("si_macro_check:smIS_SFC      %d\n",smIS_SFC(agRoot)  ));
 4639 
 4640   SA_DBG1(("si_macro_check:smIS_spc8001  %d\n",smIS_spc8001(agRoot)  ));
 4641   SA_DBG1(("si_macro_check:smIS_spc8081  %d\n",smIS_spc8081(agRoot)  ));
 4642 
 4643   SA_DBG1(("si_macro_check:smIS_SPCV8008 %d\n",smIS_SPCV8008(agRoot)  ));
 4644   SA_DBG1(("si_macro_check:smIS_SPCV8009 %d\n",smIS_SPCV8009(agRoot)  ));
 4645   SA_DBG1(("si_macro_check:smIS_SPCV8018 %d\n",smIS_SPCV8018(agRoot)  ));
 4646   SA_DBG1(("si_macro_check:smIS_SPCV8019 %d\n",smIS_SPCV8019(agRoot)  ));
 4647   SA_DBG1(("si_macro_check:smIS_ADAP8088 %d\n",smIS_ADAP8088(agRoot)  ));
 4648   SA_DBG1(("si_macro_check:smIS_ADAP8089 %d\n",smIS_ADAP8089(agRoot)  ));
 4649   SA_DBG1(("si_macro_check:smIS_SPCV8070 %d\n",smIS_SPCV8070(agRoot)  ));
 4650   SA_DBG1(("si_macro_check:smIS_SPCV8071 %d\n",smIS_SPCV8071(agRoot)  ));
 4651   SA_DBG1(("si_macro_check:smIS_SPCV8072 %d\n",smIS_SPCV8072(agRoot)  ));
 4652   SA_DBG1(("si_macro_check:smIS_SPCV8073 %d\n",smIS_SPCV8073(agRoot)  ));
 4653   SA_DBG1(("si_macro_check:smIS_SPCV8074 %d\n",smIS_SPCV8074(agRoot)  ));
 4654   SA_DBG1(("si_macro_check:smIS_SPCV8075 %d\n",smIS_SPCV8075(agRoot)  ));
 4655   SA_DBG1(("si_macro_check:smIS_SPCV8076 %d\n",smIS_SPCV8076(agRoot)  ));
 4656   SA_DBG1(("si_macro_check:smIS_SPCV8077 %d\n",smIS_SPCV8077(agRoot)  ));
 4657   SA_DBG1(("si_macro_check:smIS_SPCV9015 %d\n",smIS_SPCV9015(agRoot)  ));
 4658   SA_DBG1(("si_macro_check:smIS_SPCV9060 %d\n",smIS_SPCV9060(agRoot)  ));
 4659   SA_DBG1(("si_macro_check:smIS_SPCV     %d\n",smIS_SPCV(agRoot)      ));
 4660 
 4661   SA_DBG1(("si_macro_check:smIS64bInt    %d\n", smIS64bInt(agRoot)    ));
 4662 
 4663 }
 4664 

Cache object: 4b2b38b3ae8498f08862aff1c8465091


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