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


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

FreeBSD/Linux Kernel Cross Reference
sys/dev/pms/RefTisa/tisa/sassata/common/tdport.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
   24  *
   25  * tdport.c
   26  * This file contains port realted functions such as tiCOMPortStart()
   27  *
   28  */
   29 #include <sys/cdefs.h>
   30 __FBSDID("$FreeBSD$");
   31 #include <dev/pms/config.h>
   32 
   33 #include <dev/pms/freebsd/driver/common/osenv.h>
   34 #include <dev/pms/freebsd/driver/common/ostypes.h>
   35 #include <dev/pms/freebsd/driver/common/osdebug.h>
   36 
   37 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
   38 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
   39 #include <dev/pms/RefTisa/sallsdk/spc/sadefs.h>
   40 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
   41 
   42 #include <dev/pms/RefTisa/tisa/api/titypes.h>
   43 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
   44 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
   45 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
   46 
   47 #ifdef FDS_SM
   48 #include <dev/pms/RefTisa/sat/api/sm.h>
   49 #include <dev/pms/RefTisa/sat/api/smapi.h>
   50 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
   51 #endif
   52 
   53 #ifdef FDS_DM
   54 #include <dev/pms/RefTisa/discovery/api/dm.h>
   55 #include <dev/pms/RefTisa/discovery/api/dmapi.h>
   56 #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
   57 #endif
   58 
   59 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
   60 #include <dev/pms/freebsd/driver/common/osstring.h>
   61 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
   62 
   63 #ifdef INITIATOR_DRIVER
   64 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
   65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
   66 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
   67 #endif
   68 
   69 #ifdef TARGET_DRIVER
   70 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
   71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
   72 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
   73 #endif
   74 
   75 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
   76 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
   77 
   78 #ifndef TURN_OFF_HDA
   79 #include <dev/pms/RefTisa/sallsdk/hda/64k/aap1img.h> /* SPC HDA */
   80 #include <dev/pms/RefTisa/sallsdk/hda/64k/ilaimg.h>
   81 #include <dev/pms/RefTisa/sallsdk/hda/64k/iopimg.h>
   82 #include <dev/pms/RefTisa/sallsdk/hda/64k/istrimg.h>
   83 
   84 #include <dev/pms/RefTisa/sallsdk/hda/64k/aap18008.h>   /* SPCv HDA */
   85 #include <dev/pms/RefTisa/sallsdk/hda/64k/iop8008.h>
   86 
   87 #include <dev/pms/RefTisa/sallsdk/hda/64k/ila8008.h> /* Ila common to SPCv SPCvp versions */
   88 
   89 #include <dev/pms/RefTisa/sallsdk/hda/64k/raae8070.h>   /* SPCv 12g HDA */
   90 #include <dev/pms/RefTisa/sallsdk/hda/64k/iop8070.h>
   91 #include <dev/pms/RefTisa/sallsdk/hda/64k/ila8070.h> /* Ila 12g  SPCv SPCvp versions */
   92 
   93 #endif /* TURN_OFF_HDA */
   94 
   95 
   96 bit32 gSSC_Disable = 0;
   97 bit32 volatile sgpioResponseSet = 0;
   98 
   99 #ifdef ECHO_TESTING
  100 /* temporary to test saEchoCommand() */
  101 bit8 gEcho;
  102 #endif
  103 bit32 tiCOMConfigureSgpio(
  104                         tiRoot_t    *tiRoot,
  105                         bit8        enableSgpio
  106                         );
  107 
  108 
  109 /*****************************************************************************
  110 *! \brief tdsaGetSwConfigParams
  111 *
  112 *  Purpose:  This function reads software configuration parameters from the
  113 *            configuration file
  114 *
  115 *  \param  tiRoot:            Pointer to driver/port instance.
  116 *
  117 *  \return: None
  118 *
  119 *  \note -
  120 *
  121 *****************************************************************************/
  122 osGLOBAL void
  123 tdsaGetSwConfigParams(
  124                       tiRoot_t *tiRoot
  125                       )
  126 {
  127   tdsaRoot_t     *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
  128   tdsaContext_t  *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
  129   agsaSwConfig_t *SwConfig;
  130   agsaQueueConfig_t   *QueueConfig;
  131   char           *buffer;
  132   bit32          buffLen;
  133   bit32          lenRecv = 0;
  134   char           *pLastUsedChar = agNULL;
  135   char           tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
  136   char           globalStr[]     = "Global";
  137   char           iniParmsStr[]   = "InitiatorParms";
  138   char           SwParmsStr[]   = "SWParms";
  139   char           OBQueueProps[] = "OBQueueProps";
  140   char           IBQueueProps[] = "IBQueueProps";
  141   char           IBQueueSize[40];
  142   char           OBQueueSize[40];
  143   char           IBQueueEleSize[40];
  144   char           OBQueueEleSize[40];
  145   char           OBQueueInterruptCount[40];
  146   char           OBQueueInterruptDelay[40];
  147   char           OBQueueInterruptEnable[40];
  148   char           IBQueuePriority[40];
  149   char           *cardNum = tdsaAllShared->CardIDString;
  150   bit32          i;
  151   bit32          enableDIF;
  152   bit32          enableEncryption;
  153 #ifdef SA_CONFIG_MDFD_REGISTRY
  154   bit32          disableMDF;
  155 #endif
  156 
  157 #ifdef FDS_DM
  158   dmSwConfig_t   *dmSwConfig;
  159 #endif
  160 #ifdef FDS_SM
  161   smSwConfig_t   *smSwConfig;
  162 #endif
  163 
  164   TI_DBG6(("tdsaGetSwConfigParams: start\n"));
  165   TI_DBG6(("tdsaGetSwConfigParams: tdsaRoot %p tdsaAllShared %p \n",tdsaRoot, tdsaAllShared));
  166 
  167   buffer = tmpBuffer;
  168   buffLen = sizeof(tmpBuffer);
  169 
  170   osti_memset(buffer, 0, buffLen);
  171 
  172   /* the followings are the default values */
  173   SwConfig = (agsaSwConfig_t *)&(tdsaAllShared->SwConfig);
  174   QueueConfig = (agsaQueueConfig_t *)&(tdsaAllShared->QueueConfig);
  175 
  176 #ifdef FDS_DM
  177   dmSwConfig = (dmSwConfig_t *)&(tdsaAllShared->dmSwConfig);
  178 #endif
  179 #ifdef FDS_SM
  180   smSwConfig = (smSwConfig_t *)&(tdsaAllShared->smSwConfig);
  181 #endif
  182 
  183   /*
  184     just default values
  185     and are overwritten later by the configuration file contents
  186   */
  187   SwConfig->numDevHandles = DEFAULT_MAX_DEV;
  188 
  189   SwConfig->maxActiveIOs = DEFAULT_MAX_ACTIVE_IOS;
  190   SwConfig->smpReqTimeout = DEFAULT_SMP_TIMEOUT; /* DEFAULT_VALUE; */
  191   SwConfig->numberOfEventRegClients = DEFAULT_NUM_REG_CLIENTS;
  192   SwConfig->sizefEventLog1 = HOST_EVENT_LOG_SIZE;
  193   SwConfig->sizefEventLog2 = HOST_EVENT_LOG_SIZE;
  194   SwConfig->eventLog1Option = DEFAULT_EVENT_LOG_OPTION;
  195   SwConfig->eventLog2Option = DEFAULT_EVENT_LOG_OPTION;
  196   SwConfig->fatalErrorInterruptEnable = 1;
  197   SwConfig->fatalErrorInterruptVector = 0; /* Was 1 */
  198   SwConfig->hostDirectAccessSupport = 0;
  199   SwConfig->hostDirectAccessMode = 0;
  200   SwConfig->FWConfig = 0;
  201   SwConfig->enableDIF = agFALSE;
  202   SwConfig->enableEncryption = agFALSE;
  203 
  204 #ifdef SA_CONFIG_MDFD_REGISTRY
  205   SwConfig->disableMDF = agFALSE;
  206 #endif
  207 
  208   SwConfig->param1 = tdsaAllShared->tdDeviceIdVendId;
  209   SwConfig->param2 = tdsaAllShared->tdSubVendorId;
  210 
  211 
  212 #if defined(SALLSDK_DEBUG)
  213   SwConfig->sallDebugLevel = 1; /* DEFAULT_VALUE; */
  214 #endif
  215 #if defined(DM_DEBUG)
  216   dmSwConfig->DMDebugLevel = 1; /* DEFAULT_VALUE; */
  217 #endif
  218 #if defined(SM_DEBUG)
  219   smSwConfig->SMDebugLevel = 1; /* DEFAULT_VALUE; */
  220 #endif
  221 
  222   tdsaAllShared->portTMO = PORT_RECOVERY_TIMEOUT;   /* default 5 sec */
  223   tdsaAllShared->stp_idle_time = STP_IDLE_TIME;     /* default 5 us */
  224   tdsaAllShared->itNexusTimeout = IT_NEXUS_TIMEOUT; /* default 2000 ms */
  225 
  226   osti_memset(buffer, 0, buffLen);
  227   lenRecv = 0;
  228 
  229   if ((ostiGetTransportParam(
  230                              tiRoot,
  231                              globalStr,
  232                              iniParmsStr,
  233                              agNULL,
  234                              agNULL,
  235                              agNULL,
  236                              agNULL,
  237                              "MaxTargets",
  238                              buffer,
  239                              buffLen,
  240                              &lenRecv
  241                              ) == tiSuccess) && (lenRecv != 0))
  242   {
  243     if (osti_strncmp(buffer, "0x", 2) == 0)
  244     {
  245       SwConfig->numDevHandles = osti_strtoul (buffer, &pLastUsedChar, 0);
  246     }
  247     else
  248     {
  249       SwConfig->numDevHandles = osti_strtoul (buffer, &pLastUsedChar, 10);
  250     }
  251     TI_DBG2(("tdsaGetSwConfigParams: MaxTargets  %d\n",SwConfig->numDevHandles  ));
  252   }
  253 
  254   /*
  255    * read the NumInboundQueue parameter
  256    */
  257   osti_memset(buffer, 0, buffLen);
  258   lenRecv = 0;
  259 
  260   QueueConfig->numInboundQueues = DEFAULT_NUM_INBOUND_QUEUE;  /* default 1 Inbound queue */
  261 
  262   if ((ostiGetTransportParam(
  263                              tiRoot,
  264                              globalStr,   /* key */
  265                              SwParmsStr,  /* subkey1 */
  266                              agNULL,      /* subkey2 */
  267                              agNULL,
  268                              agNULL,
  269                              agNULL,      /* subkey5 */
  270                              "NumInboundQueues", /* valueName */
  271                              buffer,
  272                              buffLen,
  273                              &lenRecv
  274                              ) == tiSuccess) && (lenRecv != 0))
  275   {
  276     if (osti_strncmp(buffer, "0x", 2) == 0)
  277     {
  278       QueueConfig->numInboundQueues = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  279     }
  280     else
  281     {
  282       QueueConfig->numInboundQueues = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  283     }
  284 
  285     if (QueueConfig->numInboundQueues > AGSA_MAX_INBOUND_Q)
  286     {
  287       QueueConfig->numInboundQueues = AGSA_MAX_INBOUND_Q;
  288     }
  289   }
  290 
  291   /*
  292    * read the NumOutboundQueue parameter
  293    */
  294   osti_memset(buffer, 0, buffLen);
  295   lenRecv = 0;
  296 
  297   QueueConfig->numOutboundQueues = DEFAULT_NUM_OUTBOUND_QUEUE;  /* default 1 Outbound queue */
  298 
  299   if ((ostiGetTransportParam(
  300                              tiRoot,
  301                              globalStr,   /* key */
  302                              SwParmsStr,  /* subkey1 */
  303                              agNULL,      /* subkey2 */
  304                              agNULL,
  305                              agNULL,
  306                              agNULL,      /* subkey5 */
  307                              "NumOutboundQueues", /* valueName */
  308                              buffer,
  309                              buffLen,
  310                              &lenRecv
  311                              ) == tiSuccess) && (lenRecv != 0))
  312   {
  313     if (osti_strncmp(buffer, "0x", 2) == 0)
  314     {
  315       QueueConfig->numOutboundQueues = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  316     }
  317     else
  318     {
  319       QueueConfig->numOutboundQueues = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  320     }
  321 
  322     if (QueueConfig->numOutboundQueues > AGSA_MAX_OUTBOUND_Q)
  323     {
  324       QueueConfig->numOutboundQueues = AGSA_MAX_OUTBOUND_Q;
  325     }
  326   }
  327 
  328   /*
  329    * read the outbound queue option
  330    */
  331 
  332   osti_memset(buffer, 0, buffLen);
  333   lenRecv = 0;
  334 
  335   tdsaAllShared->QueueOption = DEFAULT_QUEUE_OPTION;  /* default 0 Outbound queue element */
  336 
  337   if ((ostiGetTransportParam(
  338                              tiRoot,
  339                              globalStr,   /* key */
  340                              SwParmsStr,  /* subkey1 */
  341                              agNULL,      /* subkey2 */
  342                              agNULL,
  343                              agNULL,
  344                              agNULL,      /* subkey5 */
  345                              "QueueOption", /* valueName */
  346                              buffer,
  347                              buffLen,
  348                              &lenRecv
  349                              ) == tiSuccess) && (lenRecv != 0))
  350   {
  351     if (osti_strncmp(buffer, "0x", 2) == 0)
  352     {
  353       tdsaAllShared->QueueOption = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  354     }
  355     else
  356     {
  357       tdsaAllShared->QueueOption = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  358     }
  359   }
  360 
  361   /*
  362    * read the MaxActiveIO parameter
  363    */
  364 
  365   osti_memset(buffer, 0, buffLen);
  366   lenRecv = 0;
  367 
  368   if ((ostiGetTransportParam(
  369                              tiRoot,
  370                              globalStr,   /* key */
  371                              SwParmsStr,  /* subkey1 */
  372                              agNULL,      /* subkey2 */
  373                              agNULL,
  374                              agNULL,
  375                              agNULL,      /* subkey5 */
  376                              "MaxActiveIO", /* valueName */
  377                              buffer,
  378                              buffLen,
  379                              &lenRecv
  380                              ) == tiSuccess) && (lenRecv != 0))
  381   {
  382     if (osti_strncmp(buffer, "0x", 2) == 0)
  383     {
  384       SwConfig->maxActiveIOs = osti_strtoul (buffer, &pLastUsedChar, 0);
  385       TI_DBG6(("tdsaGetSwConfigParams: maxactiveio 1 !!!\n"));
  386     }
  387     else
  388     {
  389       SwConfig->maxActiveIOs = osti_strtoul (buffer, &pLastUsedChar, 10);
  390       TI_DBG6(("tdsaGetSwConfigParams: maxactiveio 2 !!!\n"));
  391     }
  392     TI_DBG6(("tdsaGetSwConfigParams: maxactiveio 3 !!!\n"));
  393   }
  394 
  395 
  396 
  397   /*
  398    * read the SMPTO parameter (SMP Timeout)
  399    */
  400   osti_memset(buffer, 0, buffLen);
  401   lenRecv = 0;
  402 
  403   if ((ostiGetTransportParam(
  404                              tiRoot,
  405                              globalStr,   /* key */
  406                              SwParmsStr,  /* subkey1 */
  407                              agNULL,      /* subkey2 */
  408                              agNULL,
  409                              agNULL,
  410                              agNULL,      /* subkey5 */
  411                              "SMPTO", /* valueName */
  412                              buffer,
  413                              buffLen,
  414                              &lenRecv
  415                              ) == tiSuccess) && (lenRecv != 0))
  416   {
  417     if (osti_strncmp(buffer, "0x", 2) == 0)
  418     {
  419       SwConfig->smpReqTimeout = osti_strtoul (buffer, &pLastUsedChar, 0);
  420     }
  421     else
  422     {
  423       SwConfig->smpReqTimeout = osti_strtoul (buffer, &pLastUsedChar, 10);
  424     }
  425   }
  426 
  427 
  428   /*
  429    * read the NumRegClients parameter (SMP Timeout)
  430    */
  431   osti_memset(buffer, 0, buffLen);
  432   lenRecv = 0;
  433 
  434   if ((ostiGetTransportParam(
  435                              tiRoot,
  436                              globalStr,   /* key */
  437                              SwParmsStr,  /* subkey1 */
  438                              agNULL,      /* subkey2 */
  439                              agNULL,
  440                              agNULL,
  441                              agNULL,      /* subkey5 */
  442                              "NumRegClients", /* valueName */
  443                              buffer,
  444                              buffLen,
  445                              &lenRecv
  446                              ) == tiSuccess) && (lenRecv != 0))
  447   {
  448     if (osti_strncmp(buffer, "0x", 2) == 0)
  449     {
  450       SwConfig->numberOfEventRegClients = osti_strtoul (buffer, &pLastUsedChar, 0);
  451     }
  452     else
  453     {
  454       SwConfig->numberOfEventRegClients = osti_strtoul (buffer, &pLastUsedChar, 10);
  455     }
  456   }
  457 
  458 #if defined(SALLSDK_DEBUG)
  459   osti_memset(buffer, 0, buffLen);
  460   lenRecv = 0;
  461 
  462   if ((ostiGetTransportParam(
  463                              tiRoot,
  464                              globalStr,   /* key */
  465                              SwParmsStr,  /* subkey1 */
  466                              agNULL,      /* subkey2 */
  467                              agNULL,
  468                              agNULL,
  469                              agNULL,      /* subkey5 */
  470                              "LLDebugLevel", /* valueName */
  471                              buffer,
  472                              buffLen,
  473                              &lenRecv
  474                              ) == tiSuccess) && (lenRecv != 0))
  475   {
  476     if (osti_strncmp(buffer, "0x", 2) == 0)
  477     {
  478       SwConfig->sallDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 0);
  479     }
  480     else
  481     {
  482       SwConfig->sallDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 10);
  483     }
  484   }
  485 #endif
  486 
  487 #if defined(DM_DEBUG)
  488   osti_memset(buffer, 0, buffLen);
  489   lenRecv = 0;
  490 
  491   if ((ostiGetTransportParam(
  492                              tiRoot,
  493                              globalStr,   /* key */
  494                              SwParmsStr,  /* subkey1 */
  495                              agNULL,      /* subkey2 */
  496                              agNULL,
  497                              agNULL,
  498                              agNULL,      /* subkey5 */
  499                              "DMDebugLevel", /* valueName */
  500                              buffer,
  501                              buffLen,
  502                              &lenRecv
  503                              ) == tiSuccess) && (lenRecv != 0))
  504   {
  505     if (osti_strncmp(buffer, "0x", 2) == 0)
  506     {
  507       dmSwConfig->DMDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 0);
  508     }
  509     else
  510     {
  511       dmSwConfig->DMDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 10);
  512     }
  513   }
  514 #endif
  515 
  516 #if defined(SM_DEBUG)
  517   osti_memset(buffer, 0, buffLen);
  518   lenRecv = 0;
  519 
  520   if ((ostiGetTransportParam(
  521                              tiRoot,
  522                              globalStr,   /* key */
  523                              SwParmsStr,  /* subkey1 */
  524                              agNULL,      /* subkey2 */
  525                              agNULL,
  526                              agNULL,
  527                              agNULL,      /* subkey5 */
  528                              "SMDebugLevel", /* valueName */
  529                              buffer,
  530                              buffLen,
  531                              &lenRecv
  532                              ) == tiSuccess) && (lenRecv != 0))
  533   {
  534     if (osti_strncmp(buffer, "0x", 2) == 0)
  535     {
  536       smSwConfig->SMDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 0);
  537     }
  538     else
  539     {
  540       smSwConfig->SMDebugLevel = osti_strtoul (buffer, &pLastUsedChar, 10);
  541     }
  542   }
  543 #endif
  544 
  545   osti_memset(buffer, 0, buffLen);
  546   lenRecv = 0;
  547 
  548   for (i=0;i<QueueConfig->numInboundQueues;i++)
  549   {
  550     osti_sprintf(IBQueueSize,"IBQueueNumElements%d", i);
  551     osti_sprintf(IBQueueEleSize,"IBQueueElementSize%d", i);
  552     osti_sprintf(IBQueuePriority,"IBQueuePriority%d", i);
  553 
  554     /*
  555      * read the IBQueueSize
  556      */
  557 
  558     osti_memset(buffer, 0, buffLen);
  559     lenRecv = 0;
  560 
  561     tdsaAllShared->InboundQueueSize[i] = DEFAULT_INBOUND_QUEUE_SIZE;  /* default 256 Inbound queue size */
  562 
  563     if ((ostiGetTransportParam(
  564                              tiRoot,
  565                              globalStr,   /* key */
  566                              SwParmsStr,  /* subkey1 */
  567                              IBQueueProps,/* subkey2 */
  568                              agNULL,
  569                              agNULL,
  570                              agNULL,      /* subkey5 */
  571                              IBQueueSize, /* valueName */
  572                              buffer,
  573                              buffLen,
  574                              &lenRecv
  575                              ) == tiSuccess) && (lenRecv != 0))
  576     {
  577       if (osti_strncmp(buffer, "0x", 2) == 0)
  578       {
  579         tdsaAllShared->InboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  580       }
  581       else
  582       {
  583         tdsaAllShared->InboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  584         TI_DBG6(("tdsaGetSwConfigParams: queue number %d IB queue size %d\n", i, tdsaAllShared->InboundQueueSize[i]));
  585       }
  586     }
  587 
  588 
  589     /*
  590      * read the IBQueueEleSize
  591      */
  592 
  593     osti_memset(buffer, 0, buffLen);
  594     lenRecv = 0;
  595 
  596     tdsaAllShared->InboundQueueEleSize[i] = DEFAULT_INBOUND_QUEUE_ELE_SIZE;  /* default 128 Inbound queue element */
  597 
  598     if ((ostiGetTransportParam(
  599                              tiRoot,
  600                              globalStr,   /* key */
  601                              SwParmsStr,  /* subkey1 */
  602                              IBQueueProps,/* subkey2 */
  603                              agNULL,
  604                              agNULL,
  605                              agNULL,      /* subkey5 */
  606                              IBQueueEleSize, /* valueName */
  607                              buffer,
  608                              buffLen,
  609                              &lenRecv
  610                              ) == tiSuccess) && (lenRecv != 0))
  611     {
  612       if (osti_strncmp(buffer, "0x", 2) == 0)
  613       {
  614         tdsaAllShared->InboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  615       }
  616       else
  617       {
  618         tdsaAllShared->InboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  619         TI_DBG6(("tdsaGetSwConfigParams: queue number %d IB queue ele size %d\n", i, tdsaAllShared->InboundQueueEleSize[i]));
  620       }
  621     }
  622 
  623     /*
  624      * read the IBQueuePriority
  625      */
  626 
  627     osti_memset(buffer, 0, buffLen);
  628     lenRecv = 0;
  629 
  630     tdsaAllShared->InboundQueuePriority[i] = DEFAULT_INBOUND_QUEUE_PRIORITY; /* default 0 Inbound queue priority */
  631 
  632     if ((ostiGetTransportParam(
  633                              tiRoot,
  634                              globalStr,   /* key */
  635                              SwParmsStr,  /* subkey1 */
  636                              IBQueueProps,/* subkey2 */
  637                              agNULL,
  638                              agNULL,
  639                              agNULL,      /* subkey5 */
  640                              IBQueuePriority, /* valueName */
  641                              buffer,
  642                              buffLen,
  643                              &lenRecv
  644                              ) == tiSuccess) && (lenRecv != 0))
  645     {
  646       if (osti_strncmp(buffer, "0x", 2) == 0)
  647       {
  648         tdsaAllShared->InboundQueuePriority[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  649       }
  650       else
  651       {
  652         tdsaAllShared->InboundQueuePriority[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  653         TI_DBG6(("tdsaGetSwConfigParams: queue number %d priority %d\n", i, tdsaAllShared->InboundQueuePriority[i]));
  654       }
  655     }
  656 
  657     /**********************************************/
  658     osti_memset(buffer, 0, buffLen);
  659     lenRecv = 0;
  660   }/* end of loop */
  661 
  662 
  663 
  664   osti_memset(buffer, 0, buffLen);
  665   lenRecv = 0;
  666 
  667   for (i=0;i<QueueConfig->numOutboundQueues;i++)
  668   {
  669     osti_sprintf(OBQueueSize,"OBQueueNumElements%d", i);
  670     osti_sprintf(OBQueueEleSize,"OBQueueElementSize%d", i);
  671     osti_sprintf(OBQueueInterruptDelay,"OBQueueInterruptDelay%d", i);
  672     osti_sprintf(OBQueueInterruptCount,"OBQueueInterruptCount%d", i);
  673     osti_sprintf(OBQueueInterruptEnable,"OBQueueInterruptEnable%d", i);
  674 
  675     /*
  676      * read the OBQueueSize
  677      */
  678     osti_memset(buffer, 0, buffLen);
  679     lenRecv = 0;
  680 
  681 
  682     tdsaAllShared->OutboundQueueSize[i] = DEFAULT_OUTBOUND_QUEUE_SIZE;  /* default 256 Outbound queue size */
  683 
  684     if ((ostiGetTransportParam(
  685                              tiRoot,
  686                              globalStr,   /* key */
  687                              SwParmsStr,  /* subkey1 */
  688                              OBQueueProps,      /* subkey2 */
  689                              agNULL,
  690                              agNULL,
  691                              agNULL,      /* subkey5 */
  692                              OBQueueSize, /* valueName */
  693                              buffer,
  694                              buffLen,
  695                              &lenRecv
  696                              ) == tiSuccess) && (lenRecv != 0))
  697     {
  698       if (osti_strncmp(buffer, "0x", 2) == 0)
  699       {
  700         tdsaAllShared->OutboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  701       }
  702       else
  703       {
  704         tdsaAllShared->OutboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  705         TI_DBG6(("tdsaGetSwConfigParams: queue number %d OB queue size %d\n", i, tdsaAllShared->OutboundQueueSize[i]));
  706 
  707       }
  708     }
  709 
  710 
  711     /*
  712      * read the OBQueueEleSize
  713      */
  714     osti_memset(buffer, 0, buffLen);
  715     lenRecv = 0;
  716 
  717 
  718     tdsaAllShared->OutboundQueueEleSize[i] = DEFAULT_OUTBOUND_QUEUE_ELE_SIZE;  /* default 128 Outbound queue element */
  719 
  720     if ((ostiGetTransportParam(
  721                              tiRoot,
  722                              globalStr,   /* key */
  723                              SwParmsStr,  /* subkey1 */
  724                              OBQueueProps,      /* subkey2 */
  725                              agNULL,
  726                              agNULL,
  727                              agNULL,      /* subkey5 */
  728                              OBQueueEleSize, /* valueName */
  729                              buffer,
  730                              buffLen,
  731                              &lenRecv
  732                              ) == tiSuccess) && (lenRecv != 0))
  733     {
  734       if (osti_strncmp(buffer, "0x", 2) == 0)
  735       {
  736         tdsaAllShared->OutboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  737       }
  738       else
  739       {
  740         tdsaAllShared->OutboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  741         TI_DBG6(("tdsaGetSwConfigParams: queue number %d OB queue ele size %d\n", i, tdsaAllShared->OutboundQueueEleSize[i]));
  742 
  743       }
  744     }
  745 
  746 
  747     /*
  748      * read the OBQueueInterruptDelay
  749      */
  750     osti_memset(buffer, 0, buffLen);
  751     lenRecv = 0;
  752 
  753 
  754     tdsaAllShared->OutboundQueueInterruptDelay[i] = DEFAULT_OUTBOUND_QUEUE_INTERRUPT_DELAY;  /* default 1 Outbound interrupt delay */
  755 
  756     if ((ostiGetTransportParam(
  757                              tiRoot,
  758                              globalStr,   /* key */
  759                              SwParmsStr,  /* subkey1 */
  760                              OBQueueProps,      /* subkey2 */
  761                              agNULL,
  762                              agNULL,
  763                              agNULL,      /* subkey5 */
  764                              OBQueueInterruptDelay, /* valueName */
  765                              buffer,
  766                              buffLen,
  767                              &lenRecv
  768                              ) == tiSuccess) && (lenRecv != 0))
  769     {
  770       if (osti_strncmp(buffer, "0x", 2) == 0)
  771       {
  772         tdsaAllShared->OutboundQueueInterruptDelay[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  773       }
  774       else
  775       {
  776         tdsaAllShared->OutboundQueueInterruptDelay[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  777         TI_DBG6(("tdsaGetSwConfigParams: queue number %d interrupt delay %d\n", i, tdsaAllShared->OutboundQueueInterruptDelay[i]));
  778 
  779       }
  780     }
  781 
  782     /*
  783      * read the OBQueueInterruptCount
  784      */
  785 
  786     osti_memset(buffer, 0, buffLen);
  787     lenRecv = 0;
  788 
  789     tdsaAllShared->OutboundQueueInterruptCount[i] = DEFAULT_OUTBOUND_QUEUE_INTERRUPT_COUNT;  /* default 1 Outbound interrupt count */
  790 
  791     if ((ostiGetTransportParam(
  792                              tiRoot,
  793                              globalStr,   /* key */
  794                              SwParmsStr,  /* subkey1 */
  795                              OBQueueProps,      /* subkey2 */
  796                              agNULL,
  797                              agNULL,
  798                              agNULL,      /* subkey5 */
  799                              OBQueueInterruptCount, /* valueName */
  800                              buffer,
  801                              buffLen,
  802                              &lenRecv
  803                              ) == tiSuccess) && (lenRecv != 0))
  804     {
  805       if (osti_strncmp(buffer, "0x", 2) == 0)
  806       {
  807         tdsaAllShared->OutboundQueueInterruptCount[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  808       }
  809       else
  810       {
  811         tdsaAllShared->OutboundQueueInterruptCount[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  812         TI_DBG6(("tdsaGetSwConfigParams: queue number %d interrupt count %d\n", i, tdsaAllShared->OutboundQueueInterruptCount[i]));
  813       }
  814     }
  815 
  816 
  817     /*
  818      * read the OBQueueInterruptEnable
  819      */
  820 
  821     osti_memset(buffer, 0, buffLen);
  822     lenRecv = 0;
  823 
  824     tdsaAllShared->OutboundQueueInterruptEnable[i] = DEFAULT_OUTBOUND_INTERRUPT_ENABLE;  /* default 1 Outbound interrupt is enabled */
  825 
  826     if ((ostiGetTransportParam(
  827                              tiRoot,
  828                              globalStr,   /* key */
  829                              SwParmsStr,  /* subkey1 */
  830                              OBQueueProps,      /* subkey2 */
  831                              agNULL,
  832                              agNULL,
  833                              agNULL,      /* subkey5 */
  834                              OBQueueInterruptEnable, /* valueName */
  835                              buffer,
  836                              buffLen,
  837                              &lenRecv
  838                              ) == tiSuccess) && (lenRecv != 0))
  839     {
  840       if (osti_strncmp(buffer, "0x", 2) == 0)
  841       {
  842         tdsaAllShared->OutboundQueueInterruptEnable[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  843       }
  844       else
  845       {
  846         tdsaAllShared->OutboundQueueInterruptEnable[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  847         TI_DBG6(("tdsaGetSwConfigParams: queue number %d interrupt enable %d\n", i, tdsaAllShared->OutboundQueueInterruptEnable[i]));
  848       }
  849     }
  850 
  851     /**********************************************/
  852     osti_memset(buffer, 0, buffLen);
  853     lenRecv = 0;
  854 
  855   }/* end of loop */
  856 
  857 
  858 
  859   /********************READ CARD SPECIFIC *******************************************************/
  860 
  861   osti_memset(buffer, 0, buffLen);
  862   lenRecv = 0;
  863 
  864   for (i=0;i<QueueConfig->numInboundQueues;i++)
  865   {
  866     osti_sprintf(IBQueueSize,"IBQueueNumElements%d", i);
  867     osti_sprintf(IBQueueEleSize,"IBQueueElementSize%d", i);
  868     osti_sprintf(IBQueuePriority,"IBQueuePriority%d", i);
  869 
  870     /*
  871      * read the IBQueueSize
  872      */
  873 
  874     osti_memset(buffer, 0, buffLen);
  875     lenRecv = 0;
  876 
  877     if ((ostiGetTransportParam(
  878                              tiRoot,
  879                              cardNum,   /* key */
  880                              SwParmsStr,  /* subkey1 */
  881                              IBQueueProps,/* subkey2 */
  882                              agNULL,
  883                              agNULL,
  884                              agNULL,      /* subkey5 */
  885                              IBQueueSize, /* valueName */
  886                              buffer,
  887                              buffLen,
  888                              &lenRecv
  889                              ) == tiSuccess) && (lenRecv != 0))
  890     {
  891       if (osti_strncmp(buffer, "0x", 2) == 0)
  892       {
  893         tdsaAllShared->InboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  894       }
  895       else
  896       {
  897         tdsaAllShared->InboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  898         TI_DBG6(("tdsaGetSwConfigParams: queue number %d IB queue size %d\n", i, tdsaAllShared->InboundQueueSize[i]));
  899       }
  900     }
  901 
  902     /*
  903      * read the IBQueueEleSize
  904      */
  905 
  906     osti_memset(buffer, 0, buffLen);
  907     lenRecv = 0;
  908 
  909     if ((ostiGetTransportParam(
  910                              tiRoot,
  911                              cardNum,   /* key */
  912                              SwParmsStr,  /* subkey1 */
  913                              IBQueueProps,/* subkey2 */
  914                              agNULL,
  915                              agNULL,
  916                              agNULL,      /* subkey5 */
  917                              IBQueueEleSize, /* valueName */
  918                              buffer,
  919                              buffLen,
  920                              &lenRecv
  921                              ) == tiSuccess) && (lenRecv != 0))
  922     {
  923       if (osti_strncmp(buffer, "0x", 2) == 0)
  924       {
  925         tdsaAllShared->InboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  926       }
  927       else
  928       {
  929         tdsaAllShared->InboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  930         TI_DBG6(("tdsaGetSwConfigParams: queue number %d IB queue ele size %d\n", i, tdsaAllShared->InboundQueueEleSize[i]));
  931       }
  932     }
  933 
  934     /*
  935      * read the IBQueuePriority
  936      */
  937 
  938     osti_memset(buffer, 0, buffLen);
  939     lenRecv = 0;
  940 
  941     if ((ostiGetTransportParam(
  942                              tiRoot,
  943                              cardNum,   /* key */
  944                              SwParmsStr,  /* subkey1 */
  945                              IBQueueProps,/* subkey2 */
  946                              agNULL,
  947                              agNULL,
  948                              agNULL,      /* subkey5 */
  949                              IBQueuePriority, /* valueName */
  950                              buffer,
  951                              buffLen,
  952                              &lenRecv
  953                              ) == tiSuccess) && (lenRecv != 0))
  954     {
  955       if (osti_strncmp(buffer, "0x", 2) == 0)
  956       {
  957         tdsaAllShared->InboundQueuePriority[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
  958       }
  959       else
  960       {
  961         tdsaAllShared->InboundQueuePriority[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
  962         TI_DBG6(("tdsaGetSwConfigParams: card number %s queue number %d priority %d\n", cardNum, i, tdsaAllShared->InboundQueuePriority[i]));
  963       }
  964     }
  965 
  966     /**********************************************/
  967     osti_memset(buffer, 0, buffLen);
  968     lenRecv = 0;
  969   }/* end of loop */
  970 
  971 
  972 
  973   osti_memset(buffer, 0, buffLen);
  974   lenRecv = 0;
  975 
  976   for (i=0;i<QueueConfig->numOutboundQueues;i++)
  977   {
  978     osti_sprintf(OBQueueSize,"OBQueueNumElements%d", i);
  979     osti_sprintf(OBQueueEleSize,"OBQueueElementSize%d", i);
  980     osti_sprintf(OBQueueInterruptDelay,"OBQueueInterruptDelay%d", i);
  981     osti_sprintf(OBQueueInterruptCount,"OBQueueInterruptCount%d", i);
  982     osti_sprintf(OBQueueInterruptEnable,"OBQueueInterruptEnable%d", i);
  983 
  984     /*
  985      * read the OBQueueSize
  986      */
  987     osti_memset(buffer, 0, buffLen);
  988     lenRecv = 0;
  989 
  990     if ((ostiGetTransportParam(
  991                              tiRoot,
  992                              cardNum,   /* key */
  993                              SwParmsStr,  /* subkey1 */
  994                              OBQueueProps,      /* subkey2 */
  995                              agNULL,
  996                              agNULL,
  997                              agNULL,      /* subkey5 */
  998                              OBQueueSize, /* valueName */
  999                              buffer,
 1000                              buffLen,
 1001                              &lenRecv
 1002                              ) == tiSuccess) && (lenRecv != 0))
 1003     {
 1004       if (osti_strncmp(buffer, "0x", 2) == 0)
 1005       {
 1006         tdsaAllShared->OutboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
 1007       }
 1008       else
 1009       {
 1010         tdsaAllShared->OutboundQueueSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
 1011         TI_DBG6(("tdsaGetSwConfigParams: queue number %d OB queue size %d\n", i, tdsaAllShared->OutboundQueueSize[i]));
 1012 
 1013       }
 1014     }
 1015 
 1016     /*
 1017      * read the OBQueueEleSize
 1018      */
 1019     osti_memset(buffer, 0, buffLen);
 1020     lenRecv = 0;
 1021 
 1022 
 1023     if ((ostiGetTransportParam(
 1024                              tiRoot,
 1025                              cardNum,   /* key */
 1026                              SwParmsStr,  /* subkey1 */
 1027                              OBQueueProps,      /* subkey2 */
 1028                              agNULL,
 1029                              agNULL,
 1030                              agNULL,      /* subkey5 */
 1031                              OBQueueEleSize, /* valueName */
 1032                              buffer,
 1033                              buffLen,
 1034                              &lenRecv
 1035                              ) == tiSuccess) && (lenRecv != 0))
 1036     {
 1037       if (osti_strncmp(buffer, "0x", 2) == 0)
 1038       {
 1039         tdsaAllShared->OutboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
 1040       }
 1041       else
 1042       {
 1043         tdsaAllShared->OutboundQueueEleSize[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
 1044         TI_DBG6(("tdsaGetSwConfigParams: queue number %d OB queue ele size %d\n", i, tdsaAllShared->OutboundQueueEleSize[i]));
 1045 
 1046       }
 1047     }
 1048 
 1049     /*
 1050      * read the OBQueueInterruptDelay
 1051      */
 1052     osti_memset(buffer, 0, buffLen);
 1053     lenRecv = 0;
 1054 
 1055 
 1056     if ((ostiGetTransportParam(
 1057                              tiRoot,
 1058                              cardNum,   /* key */
 1059                              SwParmsStr,  /* subkey1 */
 1060                              OBQueueProps,      /* subkey2 */
 1061                              agNULL,
 1062                              agNULL,
 1063                              agNULL,      /* subkey5 */
 1064                              OBQueueInterruptDelay, /* valueName */
 1065                              buffer,
 1066                              buffLen,
 1067                              &lenRecv
 1068                              ) == tiSuccess) && (lenRecv != 0))
 1069     {
 1070       if (osti_strncmp(buffer, "0x", 2) == 0)
 1071       {
 1072         tdsaAllShared->OutboundQueueInterruptDelay[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
 1073       }
 1074       else
 1075       {
 1076         tdsaAllShared->OutboundQueueInterruptDelay[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
 1077         TI_DBG6(("tdsaGetSwConfigParams: card number %s queue number %d interrupt delay %d\n", cardNum, i, tdsaAllShared->OutboundQueueInterruptDelay[i]));
 1078 
 1079       }
 1080     }
 1081 
 1082     /*
 1083      * read the OBQueueInterruptCount
 1084      */
 1085 
 1086     osti_memset(buffer, 0, buffLen);
 1087     lenRecv = 0;
 1088 
 1089     if ((ostiGetTransportParam(
 1090                              tiRoot,
 1091                              cardNum,   /* key */
 1092                              SwParmsStr,  /* subkey1 */
 1093                              OBQueueProps,      /* subkey2 */
 1094                              agNULL,
 1095                              agNULL,
 1096                              agNULL,      /* subkey5 */
 1097                              OBQueueInterruptCount, /* valueName */
 1098                              buffer,
 1099                              buffLen,
 1100                              &lenRecv
 1101                              ) == tiSuccess) && (lenRecv != 0))
 1102     {
 1103       if (osti_strncmp(buffer, "0x", 2) == 0)
 1104       {
 1105         tdsaAllShared->OutboundQueueInterruptCount[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
 1106       }
 1107       else
 1108       {
 1109         tdsaAllShared->OutboundQueueInterruptCount[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
 1110         TI_DBG6(("tdsaGetSwConfigParams: card number %s queue number %d interrupt count %d\n", cardNum, i, tdsaAllShared->OutboundQueueInterruptCount[i]));
 1111       }
 1112     }
 1113 
 1114 
 1115     /*
 1116      * read the OBQueueInterruptEnable
 1117      */
 1118 
 1119     osti_memset(buffer, 0, buffLen);
 1120     lenRecv = 0;
 1121 
 1122     if ((ostiGetTransportParam(
 1123                              tiRoot,
 1124                              cardNum,   /* key */
 1125                              SwParmsStr,  /* subkey1 */
 1126                              OBQueueProps,      /* subkey2 */
 1127                              agNULL,
 1128                              agNULL,
 1129                              agNULL,      /* subkey5 */
 1130                              OBQueueInterruptEnable, /* valueName */
 1131                              buffer,
 1132                              buffLen,
 1133                              &lenRecv
 1134                              ) == tiSuccess) && (lenRecv != 0))
 1135     {
 1136       if (osti_strncmp(buffer, "0x", 2) == 0)
 1137       {
 1138         tdsaAllShared->OutboundQueueInterruptEnable[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 0);
 1139       }
 1140       else
 1141       {
 1142         tdsaAllShared->OutboundQueueInterruptEnable[i] = (bit16) osti_strtoul (buffer, &pLastUsedChar, 10);
 1143         TI_DBG6(("tdsaGetSwConfigParams: card number %s queue number %d interrupt enable %d\n", cardNum, i, tdsaAllShared->OutboundQueueInterruptEnable[i]));
 1144       }
 1145     }
 1146 
 1147 
 1148     /**********************************************/
 1149     osti_memset(buffer, 0, buffLen);
 1150     lenRecv = 0;
 1151 
 1152   }/* end of loop */
 1153 
 1154   /* process event log related parameters */
 1155   osti_memset(buffer, 0, buffLen);
 1156   lenRecv = 0;
 1157 
 1158   if ((ostiGetTransportParam(
 1159                              tiRoot,
 1160                              globalStr,   /* key */
 1161                              SwParmsStr,  /* subkey1 */
 1162                              agNULL,      /* subkey2 */
 1163                              agNULL,
 1164                              agNULL,
 1165                              agNULL,      /* subkey5 */
 1166                              "EventLogSize1", /* valueName */
 1167                              buffer,
 1168                              buffLen,
 1169                              &lenRecv
 1170                              ) == tiSuccess) && (lenRecv != 0))
 1171   {
 1172     if (osti_strncmp(buffer, "0x", 2) == 0)
 1173     {
 1174       SwConfig->sizefEventLog1 = osti_strtoul (buffer, &pLastUsedChar, 0);
 1175     }
 1176     else
 1177     {
 1178       SwConfig->sizefEventLog1 = osti_strtoul (buffer, &pLastUsedChar, 10);
 1179     }
 1180   }
 1181 
 1182   osti_memset(buffer, 0, buffLen);
 1183   lenRecv = 0;
 1184 
 1185   if ((ostiGetTransportParam(
 1186                              tiRoot,
 1187                              globalStr,   /* key */
 1188                              SwParmsStr,  /* subkey1 */
 1189                              agNULL,      /* subkey2 */
 1190                              agNULL,
 1191                              agNULL,
 1192                              agNULL,      /* subkey5 */
 1193                              "EventLogOption1", /* valueName */
 1194                              buffer,
 1195                              buffLen,
 1196                              &lenRecv
 1197                              ) == tiSuccess) && (lenRecv != 0))
 1198   {
 1199     if (osti_strncmp(buffer, "0x", 2) == 0)
 1200     {
 1201       SwConfig->eventLog1Option = osti_strtoul (buffer, &pLastUsedChar, 0);
 1202     }
 1203     else
 1204     {
 1205       SwConfig->eventLog1Option = osti_strtoul (buffer, &pLastUsedChar, 10);
 1206     }
 1207   }
 1208 
 1209   osti_memset(buffer, 0, buffLen);
 1210   lenRecv = 0;
 1211 
 1212   if ((ostiGetTransportParam(
 1213                              tiRoot,
 1214                              globalStr,   /* key */
 1215                              SwParmsStr,  /* subkey1 */
 1216                              agNULL,      /* subkey2 */
 1217                              agNULL,
 1218                              agNULL,
 1219                              agNULL,      /* subkey5 */
 1220                              "EventLogSize2", /* valueName *//* IOP size in K dWords   */
 1221                              buffer,
 1222                              buffLen,
 1223                              &lenRecv
 1224                              ) == tiSuccess) && (lenRecv != 0))
 1225   {
 1226     if (osti_strncmp(buffer, "0x", 2) == 0)
 1227     {
 1228       SwConfig->sizefEventLog2 = osti_strtoul (buffer, &pLastUsedChar, 0);
 1229     }
 1230     else
 1231     {
 1232       SwConfig->sizefEventLog2 = osti_strtoul (buffer, &pLastUsedChar, 10);
 1233     }
 1234   }
 1235 
 1236   osti_memset(buffer, 0, buffLen);
 1237   lenRecv = 0;
 1238 
 1239   if ((ostiGetTransportParam(
 1240                              tiRoot,
 1241                              globalStr,   /* key */
 1242                              SwParmsStr,  /* subkey1 */
 1243                              agNULL,      /* subkey2 */
 1244                              agNULL,
 1245                              agNULL,
 1246                              agNULL,      /* subkey5 */
 1247                              "EventLogOption2", /* valueName */
 1248                              buffer,
 1249                              buffLen,
 1250                              &lenRecv
 1251                              ) == tiSuccess) && (lenRecv != 0))
 1252   {
 1253     if (osti_strncmp(buffer, "0x", 2) == 0)
 1254     {
 1255       SwConfig->eventLog2Option = osti_strtoul (buffer, &pLastUsedChar, 0);
 1256     }
 1257     else
 1258     {
 1259       SwConfig->eventLog2Option = osti_strtoul (buffer, &pLastUsedChar, 10);
 1260     }
 1261   }
 1262   /* end of event log related parameters */
 1263 
 1264   /*
 1265     HDA parameters
 1266   */
 1267   osti_memset(buffer, 0, buffLen);
 1268   lenRecv = 0;
 1269 
 1270   if ((ostiGetTransportParam(
 1271                              tiRoot,
 1272                              globalStr,   /* key */
 1273                              SwParmsStr,  /* subkey1 */
 1274                              agNULL,      /* subkey2 */
 1275                              agNULL,
 1276                              agNULL,
 1277                              agNULL,      /* subkey5 */
 1278                              "HDASupport", /* valueName */
 1279                              buffer,
 1280                              buffLen,
 1281                              &lenRecv
 1282                              ) == tiSuccess) && (lenRecv != 0))
 1283   {
 1284     if (osti_strncmp(buffer, "0x", 2) == 0)
 1285     {
 1286       SwConfig->hostDirectAccessSupport = osti_strtoul (buffer, &pLastUsedChar, 0);
 1287     }
 1288     else
 1289     {
 1290       SwConfig->hostDirectAccessSupport = osti_strtoul (buffer, &pLastUsedChar, 10);
 1291     }
 1292   }
 1293 
 1294   osti_memset(buffer, 0, buffLen);
 1295   lenRecv = 0;
 1296 
 1297   if ((ostiGetTransportParam(
 1298                              tiRoot,
 1299                              globalStr,   /* key */
 1300                              SwParmsStr,  /* subkey1 */
 1301                              agNULL,      /* subkey2 */
 1302                              agNULL,
 1303                              agNULL,
 1304                              agNULL,      /* subkey5 */
 1305                              "HDAMode", /* valueName */
 1306                              buffer,
 1307                              buffLen,
 1308                              &lenRecv
 1309                              ) == tiSuccess) && (lenRecv != 0))
 1310   {
 1311     if (osti_strncmp(buffer, "0x", 2) == 0)
 1312     {
 1313       SwConfig->hostDirectAccessMode = osti_strtoul (buffer, &pLastUsedChar, 0);
 1314     }
 1315     else
 1316     {
 1317       SwConfig->hostDirectAccessMode = osti_strtoul (buffer, &pLastUsedChar, 10);
 1318     }
 1319   }
 1320   /* the end of HDA parameters */
 1321 
 1322   /* FW configuration */
 1323   osti_memset(buffer, 0, buffLen);
 1324   lenRecv = 0;
 1325 
 1326   if ((ostiGetTransportParam(
 1327                              tiRoot,
 1328                              globalStr,   /* key */
 1329                              SwParmsStr,  /* subkey1 */
 1330                              agNULL,      /* subkey2 */
 1331                              agNULL,
 1332                              agNULL,
 1333                              agNULL,      /* subkey5 */
 1334                              "FWConfig", /* valueName */
 1335                              buffer,
 1336                              buffLen,
 1337                              &lenRecv
 1338                              ) == tiSuccess) && (lenRecv != 0))
 1339   {
 1340     if (osti_strncmp(buffer, "0x", 2) == 0)
 1341     {
 1342       SwConfig->FWConfig = osti_strtoul (buffer, &pLastUsedChar, 0);
 1343     }
 1344     else
 1345     {
 1346       SwConfig->FWConfig = osti_strtoul (buffer, &pLastUsedChar, 10);
 1347     }
 1348   }
 1349   /* The end of FW configuration */
 1350 
 1351   /* IQ Normal priority and High priority */
 1352   osti_memset(buffer, 0, buffLen);
 1353   lenRecv = 0;
 1354 
 1355   if ((ostiGetTransportParam(
 1356                              tiRoot,
 1357                              globalStr,   /* key */
 1358                              SwParmsStr,  /* subkey1 */
 1359                              IBQueueProps,/* subkey2 */
 1360                              agNULL,
 1361                              agNULL,
 1362                              agNULL,      /* subkey5 */
 1363                              "IQNQDepth", /* valueName */
 1364                              buffer,
 1365                              buffLen,
 1366                              &lenRecv
 1367                              ) == tiSuccess) && (lenRecv != 0))
 1368     {
 1369       if (osti_strncmp(buffer, "0x", 2) == 0)
 1370       {
 1371         QueueConfig->iqNormalPriorityProcessingDepth = (bit8) osti_strtoul (buffer, &pLastUsedChar, 0);
 1372       }
 1373       else
 1374       {
 1375         QueueConfig->iqNormalPriorityProcessingDepth = (bit8) osti_strtoul (buffer, &pLastUsedChar, 10);
 1376       }
 1377     }
 1378 
 1379   osti_memset(buffer, 0, buffLen);
 1380   lenRecv = 0;
 1381 
 1382   if ((ostiGetTransportParam(
 1383                              tiRoot,
 1384                              globalStr,   /* key */
 1385                              SwParmsStr,  /* subkey1 */
 1386                              IBQueueProps,/* subkey2 */
 1387                              agNULL,
 1388                              agNULL,
 1389                              agNULL,      /* subkey5 */
 1390                              "IQHQDepth", /* valueName */
 1391                              buffer,
 1392                              buffLen,
 1393                              &lenRecv
 1394                              ) == tiSuccess) && (lenRecv != 0))
 1395     {
 1396       if (osti_strncmp(buffer, "0x", 2) == 0)
 1397       {
 1398         QueueConfig->iqHighPriorityProcessingDepth = (bit8) osti_strtoul (buffer, &pLastUsedChar, 0);
 1399       }
 1400       else
 1401       {
 1402         QueueConfig->iqHighPriorityProcessingDepth = (bit8) osti_strtoul (buffer, &pLastUsedChar, 10);
 1403       }
 1404     }
 1405   /* End IQ Normal priority and High priority */
 1406 
 1407   /* Start port timeout value */
 1408   osti_memset(buffer, 0, buffLen);
 1409   lenRecv = 0;
 1410 
 1411   if ((ostiGetTransportParam(
 1412                              tiRoot,
 1413                              globalStr,   /* key */
 1414                              SwParmsStr,  /* subkey1 */
 1415                              agNULL,/* subkey2 */
 1416                              agNULL,
 1417                              agNULL,
 1418                              agNULL,      /* subkey5 */
 1419                              "PortTMO", /* valueName */
 1420                              buffer,
 1421                              buffLen,
 1422                              &lenRecv
 1423                              ) == tiSuccess) && (lenRecv != 0))
 1424     {
 1425       if (osti_strncmp(buffer, "0x", 2) == 0)
 1426       {
 1427         tdsaAllShared->portTMO = osti_strtoul (buffer, &pLastUsedChar, 0);
 1428       }
 1429       else
 1430       {
 1431         tdsaAllShared->portTMO = osti_strtoul (buffer, &pLastUsedChar, 10);
 1432       }
 1433     }
 1434   /* End port timeout value */
 1435 
 1436 #ifdef SA_ENABLE_TRACE_FUNCTIONS
 1437   osti_memset(buffer, 0, buffLen);
 1438   lenRecv = 0;
 1439   if ((ostiGetTransportParam(
 1440                              tiRoot,
 1441                              globalStr,   /* key */
 1442                              SwParmsStr,  /* subkey1 */
 1443                              agNULL,      /* subkey2 */
 1444                              agNULL,
 1445                              agNULL,
 1446                              agNULL,      /* subkey5 */
 1447                              "TraceDestination", /* valueName */
 1448                              buffer,
 1449                              buffLen,
 1450                              &lenRecv
 1451                              ) == tiSuccess) && (lenRecv != 0))
 1452   {
 1453     if (osti_strncmp(buffer, "0x", 2) == 0)
 1454     {
 1455       SwConfig->TraceDestination = osti_strtoul (buffer, &pLastUsedChar, 0);
 1456     }
 1457     else
 1458     {
 1459       SwConfig->TraceDestination = osti_strtoul (buffer, &pLastUsedChar, 10);
 1460     }
 1461     TI_DBG2(("tdsaGetSwConfigParams: SwConfig->TraceDestination %d\n",SwConfig->TraceDestination));
 1462   }
 1463 
 1464   osti_memset(buffer, 0, buffLen);
 1465   lenRecv = 0;
 1466   if ((ostiGetTransportParam(
 1467                              tiRoot,
 1468                              globalStr,   /* key */
 1469                              SwParmsStr,  /* subkey1 */
 1470                              agNULL,      /* subkey2 */
 1471                              agNULL,
 1472                              agNULL,
 1473                              agNULL,      /* subkey5 */
 1474                              "TraceMask", /* valueName */
 1475                              buffer,
 1476                              buffLen,
 1477                              &lenRecv
 1478                              ) == tiSuccess) && (lenRecv != 0))
 1479   {
 1480     if (osti_strncmp(buffer, "0x", 2) == 0)
 1481     {
 1482       SwConfig->TraceMask = osti_strtoul (buffer, &pLastUsedChar, 0);
 1483     }
 1484     else
 1485     {
 1486       SwConfig->TraceMask = osti_strtoul (buffer, &pLastUsedChar, 10);
 1487     }
 1488     TI_DBG2(("tdsaGetSwConfigParams: SwConfig->TraceMask %d %X\n",SwConfig->TraceMask,SwConfig->TraceMask));
 1489   }
 1490 #endif /*# SA_ENABLE_TRACE_FUNCTIONS */
 1491 
 1492 #ifdef AGTIAPI_CTL
 1493   /*
 1494    * read the SAS Connection Time Limit parameter
 1495    */
 1496   osti_memset(buffer, 0, buffLen);
 1497   lenRecv = 0;
 1498   tdsaAllShared->SASConnectTimeLimit = 0;
 1499 
 1500   if ((ostiGetTransportParam(
 1501                              tiRoot,
 1502                              globalStr,   /* key */
 1503                              SwParmsStr,  /* subkey1 */
 1504                              agNULL,      /* subkey2 */
 1505                              agNULL,
 1506                              agNULL,
 1507                              agNULL,      /* subkey5 */
 1508                              "SASCTL",    /* valueName */
 1509                              buffer,
 1510                              buffLen,
 1511                              &lenRecv
 1512                              ) == tiSuccess) && (lenRecv != 0))
 1513   {
 1514     if (osti_strncmp(buffer, "0x", 2) == 0)
 1515       tdsaAllShared->SASConnectTimeLimit = osti_strtoul (buffer, &pLastUsedChar, 0);
 1516     else
 1517       tdsaAllShared->SASConnectTimeLimit = osti_strtoul (buffer, &pLastUsedChar, 10);
 1518   }
 1519 #endif
 1520 
 1521   /* Start FCA value */
 1522   osti_memset(buffer, 0, buffLen);
 1523   lenRecv = 0;
 1524 
 1525   tdsaAllShared->FCA = 1; /* No FCA by default */
 1526 
 1527   if ((ostiGetTransportParam(
 1528                              tiRoot,
 1529                              globalStr,   /* key */
 1530                              "InitiatorParms",  /* subkey1 */
 1531                              agNULL,/* subkey2 */
 1532                              agNULL,
 1533                              agNULL,
 1534                              agNULL,      /* subkey5 */
 1535                              "FCA", /* valueName */
 1536                              buffer,
 1537                              buffLen,
 1538                              &lenRecv
 1539                              ) == tiSuccess) && (lenRecv != 0))
 1540     {
 1541       if (osti_strncmp(buffer, "0x", 2) == 0)
 1542       {
 1543         tdsaAllShared->FCA = osti_strtoul (buffer, &pLastUsedChar, 0);
 1544       }
 1545       else
 1546       {
 1547         tdsaAllShared->FCA = osti_strtoul (buffer, &pLastUsedChar, 10);
 1548       }
 1549     }
 1550   /* End FCA value */
 1551 
 1552   /* Start ResetInDiscovery value */
 1553   osti_memset(buffer, 0, buffLen);
 1554   lenRecv = 0;
 1555 
 1556   tdsaAllShared->ResetInDiscovery = 0; /* No ResetInDiscovery by default */
 1557 
 1558   if ((ostiGetTransportParam(
 1559                              tiRoot,
 1560                              globalStr,   /* key */
 1561                              "InitiatorParms",  /* subkey1 */
 1562                              agNULL,/* subkey2 */
 1563                              agNULL,
 1564                              agNULL,
 1565                              agNULL,      /* subkey5 */
 1566                              "ResetInDiscovery", /* valueName */
 1567                              buffer,
 1568                              buffLen,
 1569                              &lenRecv
 1570                              ) == tiSuccess) && (lenRecv != 0))
 1571     {
 1572       if (osti_strncmp(buffer, "0x", 2) == 0)
 1573       {
 1574         tdsaAllShared->ResetInDiscovery = osti_strtoul (buffer, &pLastUsedChar, 0);
 1575       }
 1576       else
 1577       {
 1578         tdsaAllShared->ResetInDiscovery = osti_strtoul (buffer, &pLastUsedChar, 10);
 1579       }
 1580     }
 1581   /* End ResetInDiscovery value */
 1582 
 1583   /* Start MCN value */
 1584   osti_memset(buffer, 0, buffLen);
 1585   lenRecv = 0;
 1586 
 1587   tdsaAllShared->MCN = 1; /* default MCN */
 1588 
 1589   if ((ostiGetTransportParam(
 1590                              tiRoot,
 1591                              globalStr,   /* key */
 1592                              SwParmsStr,  /* subkey1 */
 1593                              agNULL,/* subkey2 */
 1594                              agNULL,
 1595                              agNULL,
 1596                              agNULL,      /* subkey5 */
 1597                              "MCN", /* valueName */
 1598                              buffer,
 1599                              buffLen,
 1600                              &lenRecv
 1601                              ) == tiSuccess) && (lenRecv != 0))
 1602   {
 1603     if (osti_strncmp(buffer, "0x", 2) == 0)
 1604     {
 1605       tdsaAllShared->MCN = osti_strtoul (buffer, &pLastUsedChar, 0);
 1606     }
 1607     else
 1608     {
 1609       tdsaAllShared->MCN = osti_strtoul (buffer, &pLastUsedChar, 10);
 1610     }
 1611     TI_DBG6(("tdsaGetSwConfigParams: MCN %d\n", tdsaAllShared->MCN));
 1612   }
 1613   /* End MCN value */
 1614 
 1615   /* Start sflag value */
 1616   osti_memset(buffer, 0, buffLen);
 1617   lenRecv = 0;
 1618 
 1619   tdsaAllShared->sflag = 0; /* default sflag */
 1620 
 1621   if ((ostiGetTransportParam(
 1622                              tiRoot,
 1623                              globalStr,   /* key */
 1624                              SwParmsStr,  /* subkey1 */
 1625                              agNULL,      /* subkey2 */
 1626                              agNULL,
 1627                              agNULL,
 1628                              agNULL,      /* subkey5 */
 1629                              "Sflag",     /* valueName */
 1630                              buffer,
 1631                              buffLen,
 1632                              &lenRecv
 1633                              ) == tiSuccess) && (lenRecv != 0))
 1634   {
 1635     if (osti_strncmp(buffer, "0x", 2) == 0)
 1636     {
 1637       tdsaAllShared->sflag = osti_strtoul (buffer, &pLastUsedChar, 0);
 1638     }
 1639     else
 1640     {
 1641       tdsaAllShared->sflag = osti_strtoul (buffer, &pLastUsedChar, 10);
 1642     }
 1643     TI_DBG1(("tdsaGetSwConfigParams: sflag %d\n", tdsaAllShared->sflag));
 1644   }
 1645   /* End sflag value */
 1646 
 1647   /* Start enable DIF */
 1648   osti_memset(buffer, 0, buffLen);
 1649   lenRecv = 0;
 1650 
 1651   if ((ostiGetTransportParam(
 1652                              tiRoot,
 1653                              globalStr,   /* key */
 1654                              SwParmsStr,  /* subkey1 */
 1655                              agNULL,/* subkey2 */
 1656                              agNULL,
 1657                              agNULL,
 1658                              agNULL,      /* subkey5 */
 1659                              "enableDIF", /* valueName */
 1660                              buffer,
 1661                              buffLen,
 1662                              &lenRecv
 1663                              ) == tiSuccess) && (lenRecv != 0))
 1664   {
 1665     if (osti_strncmp(buffer, "0x", 2) == 0)
 1666     {
 1667       enableDIF = osti_strtoul (buffer, &pLastUsedChar, 0);
 1668     }
 1669     else
 1670     {
 1671       enableDIF = osti_strtoul (buffer, &pLastUsedChar, 10);
 1672     }
 1673     TI_DBG6(("tdsaGetSwConfigParams: enableDIF %d\n", enableDIF));
 1674     if (enableDIF)
 1675     {
 1676       SwConfig->enableDIF = agTRUE;
 1677     }
 1678     else
 1679     {
 1680       SwConfig->enableDIF = agFALSE;
 1681     }
 1682     TI_DBG6(("tdsaGetSwConfigParams: SwConfig->enableDIF %d\n", SwConfig->enableDIF));
 1683   }
 1684   /* End enable DIF */
 1685 
 1686 
 1687   /* Start enable Encryption */
 1688   osti_memset(buffer, 0, buffLen);
 1689   lenRecv = 0;
 1690 
 1691   if ((ostiGetTransportParam(
 1692                              tiRoot,
 1693                              globalStr,   /* key */
 1694                              SwParmsStr,  /* subkey1 */
 1695                              agNULL,/* subkey2 */
 1696                              agNULL,
 1697                              agNULL,
 1698                              agNULL,      /* subkey5 */
 1699                              "enableEncryption", /* valueName */
 1700                              buffer,
 1701                              buffLen,
 1702                              &lenRecv
 1703                              ) == tiSuccess) && (lenRecv != 0))
 1704   {
 1705     if (osti_strncmp(buffer, "0x", 2) == 0)
 1706     {
 1707       enableEncryption = osti_strtoul (buffer, &pLastUsedChar, 0);
 1708     }
 1709     else
 1710     {
 1711       enableEncryption = osti_strtoul (buffer, &pLastUsedChar, 10);
 1712     }
 1713     TI_DBG6(("tdsaGetSwConfigParams: enableEncryption %d\n", enableEncryption));
 1714     if (enableEncryption)
 1715     {
 1716       SwConfig->enableEncryption = agTRUE;
 1717     }
 1718     else
 1719     {
 1720       SwConfig->enableEncryption = agFALSE;
 1721     }
 1722     TI_DBG6(("tdsaGetSwConfigParams: SwConfig->enableEncryption %d\n", SwConfig->enableEncryption));
 1723   }
 1724   /* End enable Encryption */
 1725 
 1726   /* Start allow connection rate change */
 1727   osti_memset(buffer, 0, buffLen);
 1728   lenRecv = 0;
 1729   tdsaAllShared->RateAdjust = 0; /* No rate adjust by default */
 1730   if ((ostiGetTransportParam(
 1731                              tiRoot,
 1732                              globalStr,   /* key */
 1733                              SwParmsStr,  /* subkey1 */
 1734                              agNULL,/* subkey2 */
 1735                              agNULL,
 1736                              agNULL,
 1737                              agNULL,      /* subkey5 */
 1738                              "RateAdjust", /* valueName */
 1739                              buffer,
 1740                              buffLen,
 1741                              &lenRecv
 1742                              ) == tiSuccess) && (lenRecv != 0))
 1743   {
 1744     if (osti_strncmp(buffer, "0x", 2) == 0)
 1745     {
 1746       tdsaAllShared->RateAdjust = osti_strtoul (buffer, &pLastUsedChar, 0);
 1747     }
 1748     else
 1749     {
 1750       tdsaAllShared->RateAdjust = osti_strtoul (buffer, &pLastUsedChar, 10);
 1751     }
 1752     TI_DBG6(("tdsaGetSwConfigParams: tdsaAllShared->RateAdjust %d\n", tdsaAllShared->RateAdjust));
 1753   }
 1754   /* End allow connection rate change */
 1755 
 1756 
 1757 #ifdef SA_CONFIG_MDFD_REGISTRY
 1758   /* Start disable MDF */
 1759   osti_memset(buffer, 0, buffLen);
 1760   lenRecv = 0;
 1761 
 1762   if ((ostiGetTransportParam(
 1763                              tiRoot,
 1764                              globalStr,   /* key */
 1765                              SwParmsStr,  /* subkey1 */
 1766                              agNULL,/* subkey2 */
 1767                              agNULL,
 1768                              agNULL,
 1769                              agNULL,      /* subkey5 */
 1770                              "disableMDF", /* valueName */
 1771                              buffer,
 1772                              buffLen,
 1773                              &lenRecv
 1774                              ) == tiSuccess) && (lenRecv != 0))
 1775   {
 1776     if (osti_strncmp(buffer, "0x", 2) == 0)
 1777     {
 1778       disableMDF = osti_strtoul (buffer, &pLastUsedChar, 0);
 1779     }
 1780     else
 1781     {
 1782       disableMDF = osti_strtoul (buffer, &pLastUsedChar, 10);
 1783     }
 1784     TI_DBG6(("tdsaGetSwConfigParams: disableMDF %d\n", disableMDF));
 1785     if (disableMDF)
 1786     {
 1787       SwConfig->disableMDF = agTRUE;
 1788     }
 1789     else
 1790     {
 1791       SwConfig->disableMDF = agFALSE;
 1792     }
 1793     TI_DBG6(("tdsaGetSwConfigParams: SwConfig->disableMDF %d\n", SwConfig->disableMDF));
 1794   }
 1795   /* End disable MDF */
 1796 #endif /*SA_CONFIG_MDFD_REGISTRY*/
 1797 
 1798   /* Start IT_NEXUS_TIMEOUT */
 1799   osti_memset(buffer, 0, buffLen);
 1800   lenRecv = 0;
 1801 
 1802   if ((ostiGetTransportParam(
 1803                              tiRoot,
 1804                              globalStr,   /* key */
 1805                              SwParmsStr,  /* subkey1 */
 1806                              agNULL,/* subkey2 */
 1807                              agNULL,
 1808                              agNULL,
 1809                              agNULL,      /* subkey5 */
 1810                              "IT_NEXUS_TIMEOUT", /* valueName */
 1811                              buffer,
 1812                              buffLen,
 1813                              &lenRecv
 1814                              ) == tiSuccess) && (lenRecv != 0))
 1815   {
 1816     if (osti_strncmp(buffer, "0x", 2) == 0)
 1817     {
 1818       tdsaAllShared->itNexusTimeout = osti_strtoul (buffer, &pLastUsedChar, 0);
 1819     }
 1820     else
 1821     {
 1822       tdsaAllShared->itNexusTimeout = osti_strtoul (buffer, &pLastUsedChar, 10);
 1823     }
 1824     TI_DBG1(("tdsaGetSwConfigParams: tdsaAllShared->itNexusTimeout %d\n", tdsaAllShared->itNexusTimeout));
 1825   }
 1826   /* End IT_NEXUS_TIMEOUT */
 1827 
 1828   /* Start stp idle time */
 1829   osti_memset(buffer, 0, buffLen);
 1830   lenRecv = 0;
 1831 
 1832   if ((ostiGetTransportParam(
 1833                              tiRoot,
 1834                              globalStr,   /* key */
 1835                              SwParmsStr,  /* subkey1 */
 1836                              agNULL,/* subkey2 */
 1837                              agNULL,
 1838                              agNULL,
 1839                              agNULL,      /* subkey5 */
 1840                              "STPIdleTime", /* valueName */
 1841                              buffer,
 1842                              buffLen,
 1843                              &lenRecv
 1844                              ) == tiSuccess) && (lenRecv != 0))
 1845   {
 1846     if (osti_strncmp(buffer, "0x", 2) == 0)
 1847     {
 1848       tdsaAllShared->stp_idle_time = osti_strtoul (buffer, &pLastUsedChar, 0);
 1849     }
 1850     else
 1851     {
 1852       tdsaAllShared->stp_idle_time = osti_strtoul (buffer, &pLastUsedChar, 10);
 1853     }
 1854     TI_DBG2(("tdsaGetSwConfigParams: STPIdleTime %d\n", tdsaAllShared->stp_idle_time));
 1855   }
 1856   /* End stp idle time */
 1857 
 1858   /* Start STP_MCT_TMO */
 1859   osti_memset(buffer, 0, buffLen);
 1860   lenRecv = 0;
 1861 
 1862   tdsaAllShared->STP_MCT_TMO = 32;
 1863   if ((ostiGetTransportParam(
 1864                              tiRoot,
 1865                              globalStr,   /* key */
 1866                              SwParmsStr,  /* subkey1 */
 1867                              agNULL,/* subkey2 */
 1868                              agNULL,
 1869                              agNULL,
 1870                              agNULL,      /* subkey5 */
 1871                              "SAS_STP_MCT_TMO", /* valueName */
 1872                              buffer,
 1873                              buffLen,
 1874                              &lenRecv
 1875                              ) == tiSuccess) && (lenRecv != 0))
 1876   {
 1877     if (osti_strncmp(buffer, "0x", 2) == 0)
 1878     {
 1879       tdsaAllShared->STP_MCT_TMO = osti_strtoul (buffer, &pLastUsedChar, 0);
 1880     }
 1881     else
 1882     {
 1883       tdsaAllShared->STP_MCT_TMO = osti_strtoul (buffer, &pLastUsedChar, 10);
 1884     }
 1885     TI_DBG2(("tdsaGetSwConfigParams: STP_MCT_TMO %d\n", tdsaAllShared->STP_MCT_TMO));
 1886   }
 1887   /* End  STP_MCT_TMO */
 1888 
 1889   /* Start SSP_MCT_TMO */
 1890   osti_memset(buffer, 0, buffLen);
 1891   lenRecv = 0;
 1892   tdsaAllShared->SSP_MCT_TMO = 32;
 1893   if ((ostiGetTransportParam(
 1894                              tiRoot,
 1895                              globalStr,   /* key */
 1896                              SwParmsStr,  /* subkey1 */
 1897                              agNULL,/* subkey2 */
 1898                              agNULL,
 1899                              agNULL,
 1900                              agNULL,      /* subkey5 */
 1901                              "SAS_SSP_MCT_TMO", /* valueName */
 1902                              buffer,
 1903                              buffLen,
 1904                              &lenRecv
 1905                              ) == tiSuccess) && (lenRecv != 0))
 1906   {
 1907     if (osti_strncmp(buffer, "0x", 2) == 0)
 1908     {
 1909       tdsaAllShared->SSP_MCT_TMO = osti_strtoul (buffer, &pLastUsedChar, 0);
 1910     }
 1911     else
 1912     {
 1913       tdsaAllShared->SSP_MCT_TMO = osti_strtoul (buffer, &pLastUsedChar, 10);
 1914     }
 1915     TI_DBG2(("tdsaGetSwConfigParams: SSP_MCT_TMO %d\n", tdsaAllShared->SSP_MCT_TMO));
 1916   }
 1917   /* End  SSP_MCT_TMO */
 1918 
 1919 
 1920   /* Start MAX_OPEN_TIME */
 1921   osti_memset(buffer, 0, buffLen);
 1922   lenRecv = 0;
 1923   tdsaAllShared->MAX_OPEN_TIME = 5;
 1924   if ((ostiGetTransportParam(
 1925                              tiRoot,
 1926                              globalStr,   /* key */
 1927                              SwParmsStr,  /* subkey1 */
 1928                              agNULL,/* subkey2 */
 1929                              agNULL,
 1930                              agNULL,
 1931                              agNULL,      /* subkey5 */
 1932                              "SAS_MAX_OPEN_TIME", /* valueName */
 1933                              buffer,
 1934                              buffLen,
 1935                              &lenRecv
 1936                              ) == tiSuccess) && (lenRecv != 0))
 1937   {
 1938     if (osti_strncmp(buffer, "0x", 2) == 0)
 1939     {
 1940       tdsaAllShared->MAX_OPEN_TIME = osti_strtoul (buffer, &pLastUsedChar, 0);
 1941     }
 1942     else
 1943     {
 1944       tdsaAllShared->MAX_OPEN_TIME = osti_strtoul (buffer, &pLastUsedChar, 10);
 1945     }
 1946     TI_DBG2(("tdsaGetSwConfigParams: MAX_OPEN_TIME %d\n", tdsaAllShared->MAX_OPEN_TIME));
 1947   }
 1948   /* End  MAX_OPEN_TIME */
 1949 
 1950 
 1951   /* Start SMP_MAX_CONN_TIMER */
 1952   osti_memset(buffer, 0, buffLen);
 1953   lenRecv = 0;
 1954   tdsaAllShared->SMP_MAX_CONN_TIMER = 0xFF;
 1955   if ((ostiGetTransportParam(
 1956                              tiRoot,
 1957                              globalStr,   /* key */
 1958                              SwParmsStr,  /* subkey1 */
 1959                              agNULL,/* subkey2 */
 1960                              agNULL,
 1961                              agNULL,
 1962                              agNULL,      /* subkey5 */
 1963                              "SAS_SMP_MAX_CONN_TIMER", /* valueName */
 1964                              buffer,
 1965                              buffLen,
 1966                              &lenRecv
 1967                              ) == tiSuccess) && (lenRecv != 0))
 1968   {
 1969     if (osti_strncmp(buffer, "0x", 2) == 0)
 1970     {
 1971       tdsaAllShared->SMP_MAX_CONN_TIMER = osti_strtoul (buffer, &pLastUsedChar, 0);
 1972     }
 1973     else
 1974     {
 1975       tdsaAllShared->SMP_MAX_CONN_TIMER = osti_strtoul (buffer, &pLastUsedChar, 10);
 1976     }
 1977     TI_DBG2(("tdsaGetSwConfigParams: SMP_MAX_CONN_TIMER %d\n", tdsaAllShared->SMP_MAX_CONN_TIMER));
 1978   }
 1979   /* End  SMP_MAX_CONN_TIMER */
 1980 
 1981   /* Start STP_FRM_TMO */
 1982   osti_memset(buffer, 0, buffLen);
 1983   lenRecv = 0;
 1984   tdsaAllShared->STP_FRM_TMO = 0;
 1985   if ((ostiGetTransportParam(
 1986                              tiRoot,
 1987                              globalStr,   /* key */
 1988                              SwParmsStr,  /* subkey1 */
 1989                              agNULL,/* subkey2 */
 1990                              agNULL,
 1991                              agNULL,
 1992                              agNULL,      /* subkey5 */
 1993                              "SAS_STP_FRM_TMO", /* valueName */
 1994                              buffer,
 1995                              buffLen,
 1996                              &lenRecv
 1997                              ) == tiSuccess) && (lenRecv != 0))
 1998   {
 1999     if (osti_strncmp(buffer, "0x", 2) == 0)
 2000     {
 2001       tdsaAllShared->STP_FRM_TMO = osti_strtoul (buffer, &pLastUsedChar, 0);
 2002     }
 2003     else
 2004     {
 2005       tdsaAllShared->STP_FRM_TMO = osti_strtoul (buffer, &pLastUsedChar, 10);
 2006     }
 2007     TI_DBG2(("tdsaGetSwConfigParams: STP_FRM_TMO %d\n", tdsaAllShared->STP_FRM_TMO));
 2008   }
 2009   /* End  STP_FRM_TMO */
 2010 
 2011   /* Start MFD_OPNRJT_RTRY_INTVL */
 2012   osti_memset(buffer, 0, buffLen);
 2013   lenRecv = 0;
 2014   tdsaAllShared->MFD = 1; /* disabled  by default */
 2015   if ((ostiGetTransportParam(
 2016                              tiRoot,
 2017                              globalStr,   /* key */
 2018                              SwParmsStr,  /* subkey1 */
 2019                              agNULL,/* subkey2 */
 2020                              agNULL,
 2021                              agNULL,
 2022                              agNULL,      /* subkey5 */
 2023                              "SAS_MFD", /* valueName */
 2024                              buffer,
 2025                              buffLen,
 2026                              &lenRecv
 2027                              ) == tiSuccess) && (lenRecv != 0))
 2028   {
 2029     if (osti_strncmp(buffer, "0x", 2) == 0)
 2030     {
 2031       tdsaAllShared->MFD = osti_strtoul (buffer, &pLastUsedChar, 0);
 2032     }
 2033     else
 2034     {
 2035       tdsaAllShared->MFD = osti_strtoul (buffer, &pLastUsedChar, 10);
 2036     }
 2037     TI_DBG2(("tdsaGetSwConfigParams: MFD %d\n", tdsaAllShared->MFD));
 2038   }
 2039   /* End  MFD_OPNRJT_RTRY_INTVL */
 2040 
 2041   /* Start MFD_OPNRJT_RTRY_INTVL */
 2042   osti_memset(buffer, 0, buffLen);
 2043   lenRecv = 0;
 2044   tdsaAllShared->OPNRJT_RTRY_INTVL = 2;
 2045   if ((ostiGetTransportParam(
 2046                              tiRoot,
 2047                              globalStr,   /* key */
 2048                              SwParmsStr,  /* subkey1 */
 2049                              agNULL,/* subkey2 */
 2050                              agNULL,
 2051                              agNULL,
 2052                              agNULL,      /* subkey5 */
 2053                              "SAS_OPNRJT_RTRY_INTVL", /* valueName */
 2054                              buffer,
 2055                              buffLen,
 2056                              &lenRecv
 2057                              ) == tiSuccess) && (lenRecv != 0))
 2058   {
 2059     if (osti_strncmp(buffer, "0x", 2) == 0)
 2060     {
 2061       tdsaAllShared->OPNRJT_RTRY_INTVL = osti_strtoul (buffer, &pLastUsedChar, 0);
 2062     }
 2063     else
 2064     {
 2065       tdsaAllShared->OPNRJT_RTRY_INTVL = osti_strtoul (buffer, &pLastUsedChar, 10);
 2066     }
 2067     TI_DBG2(("tdsaGetSwConfigParams: OPNRJT_RTRY_INTVL %d\n", tdsaAllShared->OPNRJT_RTRY_INTVL));
 2068   }
 2069   /* End  MFD_OPNRJT_RTRY_INTVL */
 2070 
 2071   /* Start DOPNRJT_RTRY_TMO */
 2072   osti_memset(buffer, 0, buffLen);
 2073   lenRecv = 0;
 2074   tdsaAllShared->DOPNRJT_RTRY_TMO = 128;
 2075   if ((ostiGetTransportParam(
 2076                              tiRoot,
 2077                              globalStr,   /* key */
 2078                              SwParmsStr,  /* subkey1 */
 2079                              agNULL,/* subkey2 */
 2080                              agNULL,
 2081                              agNULL,
 2082                              agNULL,      /* subkey5 */
 2083                              "SAS_DOPNRJT_RTRY_TMO", /* valueName */
 2084                              buffer,
 2085                              buffLen,
 2086                              &lenRecv
 2087                              ) == tiSuccess) && (lenRecv != 0))
 2088   {
 2089     if (osti_strncmp(buffer, "0x", 2) == 0)
 2090     {
 2091       tdsaAllShared->DOPNRJT_RTRY_TMO = osti_strtoul (buffer, &pLastUsedChar, 0);
 2092     }
 2093     else
 2094     {
 2095       tdsaAllShared->DOPNRJT_RTRY_TMO = osti_strtoul (buffer, &pLastUsedChar, 10);
 2096     }
 2097     TI_DBG2(("tdsaGetSwConfigParams: DOPNRJT_RTRY_TMO %d\n", tdsaAllShared->DOPNRJT_RTRY_TMO));
 2098   }
 2099   /* End  DOPNRJT_RTRY_TMO */
 2100 
 2101   /* Start COPNRJT_RTRY_TMO */
 2102   osti_memset(buffer, 0, buffLen);
 2103   lenRecv = 0;
 2104 //  tdsaAllShared->COPNRJT_RTRY_TMO = 32;
 2105   tdsaAllShared->COPNRJT_RTRY_TMO = 128;
 2106   if ((ostiGetTransportParam(
 2107                              tiRoot,
 2108                              globalStr,   /* key */
 2109                              SwParmsStr,  /* subkey1 */
 2110                              agNULL,/* subkey2 */
 2111                              agNULL,
 2112                              agNULL,
 2113                              agNULL,      /* subkey5 */
 2114                              "SAS_COPNRJT_RTRY_TMO", /* valueName */
 2115                              buffer,
 2116                              buffLen,
 2117                              &lenRecv
 2118                              ) == tiSuccess) && (lenRecv != 0))
 2119   {
 2120     if (osti_strncmp(buffer, "0x", 2) == 0)
 2121     {
 2122       tdsaAllShared->COPNRJT_RTRY_TMO = osti_strtoul (buffer, &pLastUsedChar, 0);
 2123     }
 2124     else
 2125     {
 2126       tdsaAllShared->COPNRJT_RTRY_TMO = osti_strtoul (buffer, &pLastUsedChar, 10);
 2127     }
 2128     TI_DBG2(("tdsaGetSwConfigParams: COPNRJT_RTRY_TMO %d\n", tdsaAllShared->COPNRJT_RTRY_TMO));
 2129   }
 2130   /* End  COPNRJT_RTRY_TMO */
 2131 
 2132   /* Start DOPNRJT_RTRY_THR */
 2133   osti_memset(buffer, 0, buffLen);
 2134   lenRecv = 0;
 2135 //  tdsaAllShared->DOPNRJT_RTRY_THR = 16; /* FW default */
 2136   /*
 2137     Making ORR bigger than IT NEXUS LOSS which is 2000000us = 2 second.
 2138     Assuming a bigger value 3 second, 3000000/128 = 23437.5 where 128 is tdsaAllShared->DOPNRJT_RTRY_TMO
 2139   */
 2140   tdsaAllShared->DOPNRJT_RTRY_THR = 23438;
 2141   if ((ostiGetTransportParam(
 2142                              tiRoot,
 2143                              globalStr,   /* key */
 2144                              SwParmsStr,  /* subkey1 */
 2145                              agNULL,/* subkey2 */
 2146                              agNULL,
 2147                              agNULL,
 2148                              agNULL,      /* subkey5 */
 2149                              "SAS_DOPNRJT_RTRY_THR", /* valueName */
 2150                              buffer,
 2151                              buffLen,
 2152                              &lenRecv
 2153                              ) == tiSuccess) && (lenRecv != 0))
 2154   {
 2155     if (osti_strncmp(buffer, "0x", 2) == 0)
 2156     {
 2157       tdsaAllShared->DOPNRJT_RTRY_THR = osti_strtoul (buffer, &pLastUsedChar, 0);
 2158     }
 2159     else
 2160     {
 2161       tdsaAllShared->DOPNRJT_RTRY_THR = osti_strtoul (buffer, &pLastUsedChar, 10);
 2162     }
 2163     TI_DBG2(("tdsaGetSwConfigParams: DOPNRJT_RTRY_THR %d\n", tdsaAllShared->DOPNRJT_RTRY_THR));
 2164   }
 2165   /* End  DOPNRJT_RTRY_THR */
 2166 
 2167   /* Start COPNRJT_RTRY_THR */
 2168   osti_memset(buffer, 0, buffLen);
 2169   lenRecv = 0;
 2170 //  tdsaAllShared->COPNRJT_RTRY_THR = 1024; /* FW default */
 2171   /*
 2172     Making ORR bigger than IT NEXUS LOSS which is 2000000us = 2 second.
 2173     Assuming a bigger value 3 second, 3000000/128 =  23437.5 where 128 is tdsaAllShared->COPNRJT_RTRY_TMO
 2174   */
 2175   tdsaAllShared->COPNRJT_RTRY_THR = 23438;
 2176   if ((ostiGetTransportParam(
 2177                              tiRoot,
 2178                              globalStr,   /* key */
 2179                              SwParmsStr,  /* subkey1 */
 2180                              agNULL,/* subkey2 */
 2181                              agNULL,
 2182                              agNULL,
 2183                              agNULL,      /* subkey5 */
 2184                              "SAS_COPNRJT_RTRY_THR", /* valueName */
 2185                              buffer,
 2186                              buffLen,
 2187                              &lenRecv
 2188                              ) == tiSuccess) && (lenRecv != 0))
 2189   {
 2190     if (osti_strncmp(buffer, "0x", 2) == 0)
 2191     {
 2192       tdsaAllShared->COPNRJT_RTRY_THR = osti_strtoul (buffer, &pLastUsedChar, 0);
 2193     }
 2194     else
 2195     {
 2196       tdsaAllShared->COPNRJT_RTRY_THR = osti_strtoul (buffer, &pLastUsedChar, 10);
 2197     }
 2198     TI_DBG2(("tdsaGetSwConfigParams: COPNRJT_RTRY_THR %d\n", tdsaAllShared->COPNRJT_RTRY_THR));
 2199   }
 2200   /* End  COPNRJT_RTRY_THR */
 2201 
 2202   /* Start MAX_AIP */
 2203   osti_memset(buffer, 0, buffLen);
 2204   lenRecv = 0;
 2205   tdsaAllShared->MAX_AIP = 0x200000;
 2206   if ((ostiGetTransportParam(
 2207                              tiRoot,
 2208                              globalStr,   /* key */
 2209                              SwParmsStr,  /* subkey1 */
 2210                              agNULL,/* subkey2 */
 2211                              agNULL,
 2212                              agNULL,
 2213                              agNULL,      /* subkey5 */
 2214                              "SAS_MAX_AIP", /* valueName */
 2215                              buffer,
 2216                              buffLen,
 2217                              &lenRecv
 2218                              ) == tiSuccess) && (lenRecv != 0))
 2219   {
 2220     if (osti_strncmp(buffer, "0x", 2) == 0)
 2221     {
 2222       tdsaAllShared->MAX_AIP = osti_strtoul (buffer, &pLastUsedChar, 0);
 2223     }
 2224     else
 2225     {
 2226       tdsaAllShared->MAX_AIP = osti_strtoul (buffer, &pLastUsedChar, 10);
 2227     }
 2228     TI_DBG2(("tdsaGetSwConfigParams: MAX_AIP %d\n", tdsaAllShared->MAX_AIP));
 2229   }
 2230   /* End  MAX_AIP */
 2231 
 2232   /***********************************************************************/
 2233   osti_memset(buffer, 0, buffLen);
 2234   lenRecv = 0;
 2235 
 2236 
 2237     /*
 2238     typedef struct agsaMPIContext_s
 2239     {
 2240       bit32   MPITableType;
 2241       bit32   offset;
 2242       bit32   value;
 2243     } agsaMPIContext_t;
 2244     */
 2245 
 2246   {
 2247     bit32 MpiContextvalue  = 0;
 2248     SwConfig->mpiContextTable = agNULL;
 2249     SwConfig->mpiContextTablelen = 0;
 2250 
 2251     if ((ostiGetTransportParam(
 2252                                tiRoot,
 2253                                globalStr,   /* key */
 2254                                SwParmsStr,  /* subkey1 */
 2255                                agNULL,      /* subkey2 */
 2256                                agNULL,
 2257                                agNULL,
 2258                                agNULL,      /* subkey5 */
 2259                                "MpiContext", /* valueName */
 2260                                buffer,
 2261                                buffLen,
 2262                                &lenRecv
 2263                                ) == tiSuccess) && (lenRecv != 0))
 2264     {
 2265 
 2266       if (osti_strncmp(buffer, "0x", 2) == 0)
 2267       {
 2268         MpiContextvalue = osti_strtoul (buffer, &pLastUsedChar, 0);
 2269       }
 2270       else
 2271       {
 2272         MpiContextvalue =  osti_strtoul (buffer, &pLastUsedChar, 10);
 2273       }
 2274 
 2275 
 2276       if (MpiContextvalue  == 0)
 2277       {
 2278         SwConfig->mpiContextTable = agNULL;
 2279         SwConfig->mpiContextTablelen = 0;
 2280       }
 2281       else
 2282       {
 2283         tdsaRoot_t    *tdsaRoot = (tdsaRoot_t *)tiRoot->tdData;
 2284         if(agNULL != tdsaRoot)
 2285         {
 2286           tdsaRoot->tdsaAllShared.MpiOverride.MPITableType = 0xFF;
 2287           tdsaRoot->tdsaAllShared.MpiOverride.offset = 0;
 2288           tdsaRoot->tdsaAllShared.MpiOverride.value = 0;
 2289 
 2290           SwConfig->mpiContextTable = &(tdsaRoot->tdsaAllShared.MpiOverride);
 2291           SwConfig->mpiContextTablelen = sizeof(agsaMPIContext_t);
 2292         }
 2293 
 2294         TI_DBG1(("tdsaGetSwConfigParams: MpiContext %p Len %d\n", SwConfig->mpiContextTable, SwConfig->mpiContextTablelen));
 2295 
 2296       }
 2297     }
 2298 
 2299     if(SwConfig->mpiContextTable != agNULL )
 2300     {
 2301       tdsaRoot_t    *tdsaRoot = (tdsaRoot_t *)tiRoot->tdData;
 2302       if(agNULL != tdsaRoot)
 2303       {
 2304         if ((ostiGetTransportParam(
 2305                                    tiRoot,
 2306                                    globalStr,   /* key */
 2307                                    SwParmsStr,  /* subkey1 */
 2308                                    agNULL,      /* subkey2 */
 2309                                    agNULL,
 2310                                    agNULL,
 2311                                    agNULL,      /* subkey5 */
 2312                                    "MpiTableType", /* valueName */
 2313                                    buffer,
 2314                                    buffLen,
 2315                                    &lenRecv
 2316                                    ) == tiSuccess) && (lenRecv != 0))
 2317         {
 2318           if (osti_strncmp(buffer, "0x", 2) == 0)
 2319           {
 2320             tdsaRoot->tdsaAllShared.MpiOverride.MPITableType = osti_strtoul (buffer, &pLastUsedChar, 0);
 2321           }
 2322           else
 2323           {
 2324             tdsaRoot->tdsaAllShared.MpiOverride.MPITableType =  osti_strtoul (buffer, &pLastUsedChar, 10);
 2325           }
 2326         TI_DBG1(("tdsaGetSwConfigParams: MpiOverride.MPITableType  0x%X\n",tdsaRoot->tdsaAllShared.MpiOverride.MPITableType ));
 2327         }
 2328 
 2329         if ((ostiGetTransportParam(
 2330                                    tiRoot,
 2331                                    globalStr,   /* key */
 2332                                    SwParmsStr,  /* subkey1 */
 2333                                    agNULL,      /* subkey2 */
 2334                                    agNULL,
 2335                                    agNULL,
 2336                                    agNULL,      /* subkey5 */
 2337                                    "MpiTableOffset", /* valueName */
 2338                                    buffer,
 2339                                    buffLen,
 2340                                    &lenRecv
 2341                                    ) == tiSuccess) && (lenRecv != 0))
 2342         {
 2343           if (osti_strncmp(buffer, "0x", 2) == 0)
 2344           {
 2345             tdsaRoot->tdsaAllShared.MpiOverride.offset = osti_strtoul (buffer, &pLastUsedChar, 0);
 2346           }
 2347           else
 2348           {
 2349             tdsaRoot->tdsaAllShared.MpiOverride.offset =  osti_strtoul (buffer, &pLastUsedChar, 10);
 2350           }
 2351 
 2352         TI_DBG1(("tdsaGetSwConfigParams: MpiOverride.offset 0x%X\n",tdsaRoot->tdsaAllShared.MpiOverride.offset ));
 2353         }
 2354 
 2355         if ((ostiGetTransportParam(
 2356                                    tiRoot,
 2357                                    globalStr,   /* key */
 2358                                    SwParmsStr,  /* subkey1 */
 2359                                    agNULL,      /* subkey2 */
 2360                                    agNULL,
 2361                                    agNULL,
 2362                                    agNULL,      /* subkey5 */
 2363                                    "MpiTableValue", /* valueName */
 2364                                    buffer,
 2365                                    buffLen,
 2366                                    &lenRecv
 2367                                    ) == tiSuccess) && (lenRecv != 0))
 2368         {
 2369           if (osti_strncmp(buffer, "0x", 2) == 0)
 2370           {
 2371             tdsaRoot->tdsaAllShared.MpiOverride.value = osti_strtoul (buffer, &pLastUsedChar, 0);
 2372           }
 2373           else
 2374           {
 2375             tdsaRoot->tdsaAllShared.MpiOverride.value =  osti_strtoul (buffer, &pLastUsedChar, 10);
 2376           }
 2377           TI_DBG1(("tdsaGetSwConfigParams: MpiOverride.value 0x%X\n",tdsaRoot->tdsaAllShared.MpiOverride.value ));
 2378         }
 2379       }
 2380     }
 2381   }
 2382   /***********************************************************************/
 2383 
 2384 #ifdef SA_ENABLE_PCI_TRIGGER
 2385 
 2386   osti_memset(buffer, 0, buffLen);
 2387   lenRecv = 0;
 2388 
 2389   if ((ostiGetTransportParam(
 2390                              tiRoot, 
 2391                              globalStr,   /* key */
 2392                              SwParmsStr,  /* subkey1 */
 2393                              agNULL,      /* subkey2 */
 2394                              agNULL,
 2395                              agNULL, 
 2396                              agNULL,      /* subkey5 */
 2397                              "PciTrigger", /* valueName */
 2398                              buffer, 
 2399                              buffLen, 
 2400                              &lenRecv
 2401                              ) == tiSuccess) && (lenRecv != 0))
 2402   {
 2403 
 2404     if (osti_strncmp(buffer, "0x", 2) == 0)
 2405     { 
 2406       SwConfig->PCI_trigger = osti_strtoul (buffer, &pLastUsedChar, 0);
 2407     }
 2408     else
 2409     {
 2410       SwConfig->PCI_trigger = osti_strtoul (buffer, &pLastUsedChar, 10);
 2411     }
 2412     TI_DBG1(("tdsaGetSwConfigParams: PciTrigger %d\n",SwConfig->PCI_trigger));        
 2413   }
 2414 #endif /* SA_ENABLE_PCI_TRIGGER */
 2415 
 2416 
 2417   TI_DBG6(("tdsaGetSwConfigParams: $$$$$$$$$$$$$$$$$ merge $$$$$$$$$$$$$\n"));
 2418 #if defined(SALLSDK_DEBUG)
 2419   TI_DBG2(("tdsaGetSwConfigParams: SwConfig->sallDebugLevel %d\n", SwConfig->sallDebugLevel));
 2420 #endif
 2421 
 2422 #ifdef SA_ENABLE_PCI_TRIGGER
 2423   TI_DBG1(("tdsaGetSwConfigParams: SwConfig->PCI_trigger  0x%x   0x%x\n",SwConfig->PCI_trigger, tdsaRoot->itdsaIni->tdsaAllShared->SwConfig.PCI_trigger));
 2424 #endif /* SA_ENABLE_PCI_TRIGGER */
 2425 
 2426 
 2427 #ifdef AGTIAPI_CTL
 2428   TI_DBG6(("tdsaLoLevelGetResource: SASConnectTimeLimit 0x%x\n",
 2429            tdsaAllShared->SASConnectTimeLimit));
 2430 #endif
 2431 
 2432   return;
 2433 }
 2434 
 2435 /*****************************************************************************
 2436 *! \brief  tdsaParseLinkRateMode
 2437 *
 2438 *  Purpose:  This function parses link rate and mode.
 2439 *
 2440 *  \param   LinkRate: Link rate specified by user.
 2441 *  \param   Mode: Link rate specified by user.
 2442 *
 2443 *  \return:
 2444 *           Value combined with Linkrate and Mode
 2445 *
 2446 *   \note:
 2447 *
 2448 *****************************************************************************/
 2449 osGLOBAL void
 2450 tdsaParseLinkRateMode(
 2451                       tiRoot_t *tiRoot,
 2452                       bit32 index,
 2453                       bit32 LinkRateRead,
 2454                       bit32 ModeRead,
 2455                       bit32 OpticalModeRead,
 2456                       bit32 LinkRate,
 2457                       bit32 Mode,
 2458                       bit32 OpticalMode
 2459                       )
 2460 {
 2461   tdsaRoot_t     *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
 2462   tdsaContext_t  *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
 2463 
 2464   TI_DBG3(("tdsaParseLinkRateMode: index 0x%X\n",index));
 2465   TI_DBG3(("tdsaParseLinkRateMode: LinkRateRead 0x%X    LinkRate 0x%X\n",LinkRateRead,LinkRate));
 2466   TI_DBG3(("tdsaParseLinkRateMode: ModeRead 0x%X        Mode 0x%X\n",ModeRead,Mode));
 2467   TI_DBG3(("tdsaParseLinkRateMode: OpticalModeRead 0x%X OpticalMode 0x%X\n",OpticalModeRead,OpticalMode));
 2468 
 2469 
 2470   if (LinkRateRead == agTRUE)
 2471   {
 2472     /* link rate */
 2473     if (LinkRate & 0x1)
 2474     {
 2475       tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | 0x1;
 2476     }
 2477     if (LinkRate & 0x2)
 2478     {
 2479       tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | 0x2;
 2480     }
 2481     if (LinkRate & 0x4)
 2482     {
 2483       tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | 0x4;
 2484     }
 2485     if (LinkRate & 0x8)
 2486     {
 2487       tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | 0x8;
 2488     }
 2489     if (LinkRate == 0 || LinkRate > 0xF )
 2490     {
 2491       /* not allowed, set the rate to default 1.5 G */
 2492       tdsaAllShared->Ports[index].agPhyConfig.phyProperties = 0;
 2493       tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | 0x1;
 2494       TI_DBG1(("tdsaParseLinkRateMode:  LinkRate == 0 || LinkRate >= 0x%x\n",tdsaAllShared->Ports[index].agPhyConfig.phyProperties));
 2495     }
 2496     TI_DBG2(("tdsaParseLinkRateMode:A index 0x%x LinkRate 0x%x Mode 0x%x\n",index,LinkRate,Mode));
 2497 
 2498   }
 2499 
 2500   if ( ModeRead == agTRUE)
 2501   {
 2502     /* mode */
 2503     if (Mode & 0x1)
 2504     {
 2505       tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | 0x10;
 2506     }
 2507     if (Mode & 0x2)
 2508     {
 2509       tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | 0x20;
 2510     }
 2511     if (Mode == 0 || Mode >= 4 )
 2512     {
 2513       /* not allowed, set the mode to default SAS/SATA */
 2514       tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties & 0xf;
 2515       tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | 0x30;
 2516     }
 2517     TI_DBG2(("tdsaParseLinkRateMode:1 index 0x%x Mode 0x%x\n",index,tdsaAllShared->Ports[index].agPhyConfig.phyProperties));
 2518   }
 2519 
 2520   if ( OpticalModeRead == agTRUE)
 2521   {
 2522     /* setting bit20 */
 2523     agsaRoot_t     *agRoot = &tdsaAllShared->agRootInt;
 2524 
 2525     if (OpticalMode == 0)
 2526     {
 2527       TI_DBG1(("tdsaParseLinkRateMode: OpticalMode 0  phy %d phyProperties 0x%x\n",index,tdsaAllShared->Ports[index].agPhyConfig.phyProperties));
 2528     } 
 2529     else if(OpticalMode == 1)
 2530     {
 2531       if(tIsSPCV12or6G(agRoot))
 2532       {
 2533         TI_DBG1(("tdsaParseLinkRateMode: OpticalMode 1  phy %d phyProperties 0x%x\n",index,tdsaAllShared->Ports[index].agPhyConfig.phyProperties));
 2534         tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | (1 << 22);
 2535       }
 2536       else
 2537       {
 2538         tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | (1 << 22);
 2539         tdsaAllShared->Ports[index].agPhyConfig.phyProperties &= 0xFFFFFFF0;
 2540         tdsaAllShared->Ports[index].agPhyConfig.phyProperties |= 0x4;
 2541       }
 2542     }
 2543     else if(OpticalMode == 2 )
 2544     {
 2545       if(tIsSPCV12or6G(agRoot))
 2546       {
 2547         TI_DBG1(("tdsaParseLinkRateMode: OpticalMode 2  phy %d phyProperties 0x%x\n",index,tdsaAllShared->Ports[index].agPhyConfig.phyProperties));
 2548         tdsaAllShared->Ports[index].agPhyConfig.phyProperties = tdsaAllShared->Ports[index].agPhyConfig.phyProperties | (1 << 20);
 2549       }
 2550       else
 2551       {
 2552         TD_ASSERT(0, "SPC optical mode 2");
 2553       }
 2554 
 2555       TI_DBG1(("tdsaParseLinkRateMode: OpticalMode %d phy %d phyProperties 0x%x\n",OpticalMode,index,tdsaAllShared->Ports[index].agPhyConfig.phyProperties));
 2556     }
 2557     else
 2558     {
 2559        TI_DBG1(("tdsaParseLinkRateMode: OpticalMode unknown %d  phy %d phyProperties 0x%x\n",OpticalMode,index,tdsaAllShared->Ports[index].agPhyConfig.phyProperties));
 2560     }
 2561   }
 2562   else
 2563   {
 2564     TI_DBG1(("tdsaParseLinkRateMode: OpticalMode off phy %d phyProperties 0x%x\n",index,tdsaAllShared->Ports[index].agPhyConfig.phyProperties));
 2565   }
 2566 
 2567   TI_DBG1(("tdsaParseLinkRateMode: phy %d phyProperties 0x%x\n",index,tdsaAllShared->Ports[index].agPhyConfig.phyProperties));
 2568 
 2569 
 2570   return;
 2571 }
 2572 
 2573 
 2574 /*****************************************************************************
 2575 *! \brief tdsaGetHwConfigParams
 2576 *
 2577 *  Purpose:  This function reads hardware configuration parameters from the
 2578 *            configuration file
 2579 *
 2580 *  \param  tiRoot:            Pointer to driver/port instance.
 2581 *
 2582 *  \return: None
 2583 *
 2584 *  \note -
 2585 *
 2586 *****************************************************************************/
 2587 osGLOBAL void
 2588 tdsaGetHwConfigParams(
 2589                       tiRoot_t *tiRoot
 2590                       )
 2591 {
 2592   tdsaRoot_t     *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
 2593   tdsaContext_t  *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
 2594   agsaHwConfig_t *HwConfig;
 2595   char           *buffer;
 2596   bit32          buffLen;
 2597   bit32          lenRecv = 0;
 2598   char           *pLastUsedChar = agNULL;
 2599   char           tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
 2600   char           globalStr[]     = "Global";
 2601   char           HwParmsStr[]   = "HWParms";
 2602   char           phyReg[10];
 2603   int            i,j;
 2604   agsaPhyAnalogSetupTable_t *phyRegTable;
 2605 
 2606   TI_DBG6(("tdsaGetHwConfigParams: start\n"));
 2607   TI_DBG6(("tdsaGetHwConfigParams: tdsaRoot %p tdsaAllShared %p \n",tdsaRoot, tdsaAllShared));
 2608 
 2609   buffer = tmpBuffer;
 2610   buffLen = sizeof(tmpBuffer);
 2611 
 2612   osti_memset(buffer, 0, buffLen);
 2613 
 2614   HwConfig = (agsaHwConfig_t *)&(tdsaAllShared->HwConfig);
 2615   phyRegTable = (agsaPhyAnalogSetupTable_t *)&(HwConfig->phyAnalogConfig);
 2616 
 2617   osti_memset(HwConfig, 0, sizeof(agsaHwConfig_t));
 2618 
 2619   /*
 2620     just default values
 2621     and are overwritten later by the configuration file contents
 2622     turning off hw control interrupt coalescing
 2623   */
 2624   tdsaAllShared->FWMaxPorts = DEFAULT_FW_MAX_PORTS; /* 8, applicable only to SPC not to SPCv */
 2625   HwConfig->phyCount = TD_MAX_NUM_PHYS;
 2626   HwConfig->hwInterruptCoalescingTimer = 1;
 2627   HwConfig->hwInterruptCoalescingControl = 0;
 2628   tdsaAllShared->phyCalibration = 0;
 2629   HwConfig->hwOption = 0; /* default: PI/CI addresses are 32-bit */
 2630 
 2631   osti_memset(buffer, 0, buffLen);
 2632   lenRecv = 0;
 2633 
 2634   if ((ostiGetTransportParam(
 2635                              tiRoot,
 2636                              globalStr,   /* key */
 2637                              HwParmsStr,  /* subkey1 */
 2638                              agNULL,      /* subkey2 */
 2639                              agNULL,
 2640                              agNULL,
 2641                              agNULL,      /* subkey5 */
 2642                              "HwIntCoalTimer", /* valueName */
 2643                              buffer,
 2644                              buffLen,
 2645                              &lenRecv
 2646                              ) == tiSuccess) && (lenRecv != 0))
 2647   {
 2648     if (osti_strncmp(buffer, "0x", 2) == 0)
 2649     {
 2650       HwConfig->hwInterruptCoalescingTimer = osti_strtoul (buffer, &pLastUsedChar, 0);
 2651     }
 2652     else
 2653     {
 2654       HwConfig->hwInterruptCoalescingTimer = osti_strtoul (buffer, &pLastUsedChar, 10);
 2655     }
 2656   }
 2657 
 2658   osti_memset(buffer, 0, buffLen);
 2659   lenRecv = 0;
 2660 
 2661   if ((ostiGetTransportParam(
 2662                              tiRoot,
 2663                              globalStr,   /* key */
 2664                              HwParmsStr,  /* subkey1 */
 2665                              agNULL,      /* subkey2 */
 2666                              agNULL,
 2667                              agNULL,
 2668                              agNULL,      /* subkey5 */
 2669                              "HwIntCoalControl", /* valueName */
 2670                              buffer,
 2671                              buffLen,
 2672                              &lenRecv
 2673                              ) == tiSuccess) && (lenRecv != 0))
 2674   {
 2675     if (osti_strncmp(buffer, "0x", 2) == 0)
 2676     {
 2677       HwConfig->hwInterruptCoalescingControl = osti_strtoul (buffer, &pLastUsedChar, 0);
 2678     }
 2679     else
 2680     {
 2681       HwConfig->hwInterruptCoalescingControl = osti_strtoul (buffer, &pLastUsedChar, 10);
 2682     }
 2683   }
 2684 
 2685   /* For hwInterruptCoalescingTimer, 0 disables interrrupt, not allowed */
 2686   if (HwConfig->hwInterruptCoalescingControl == 1 && HwConfig->hwInterruptCoalescingTimer == 0)
 2687   {
 2688     HwConfig->hwInterruptCoalescingTimer = 1;
 2689   }
 2690 
 2691   osti_memset(buffer, 0, buffLen);
 2692   lenRecv = 0;
 2693 
 2694   /* interrupt reassetion field*/
 2695   if ((ostiGetTransportParam(
 2696                              tiRoot,
 2697                              globalStr,   /* key */
 2698                              HwParmsStr,  /* subkey1 */
 2699                              agNULL,      /* subkey2 */
 2700                              agNULL,
 2701                              agNULL,
 2702                              agNULL,      /* subkey5 */
 2703                              "IntReassertionOpt", /* valueName */
 2704                              buffer,
 2705                              buffLen,
 2706                              &lenRecv
 2707                              ) == tiSuccess) && (lenRecv != 0))
 2708   {
 2709     if (osti_strncmp(buffer, "0x", 2) == 0)
 2710     {
 2711       HwConfig->intReassertionOption = osti_strtoul (buffer, &pLastUsedChar, 0);
 2712     }
 2713     else
 2714     {
 2715       HwConfig->intReassertionOption = osti_strtoul (buffer, &pLastUsedChar, 10);
 2716     }
 2717   }
 2718 
 2719   osti_memset(buffer, 0, buffLen);
 2720   lenRecv = 0;
 2721 
 2722   /* interrupt reassetion field*/
 2723   if ((ostiGetTransportParam(
 2724                              tiRoot,
 2725                              globalStr,   /* key */
 2726                              HwParmsStr,  /* subkey1 */
 2727                              agNULL,      /* subkey2 */
 2728                              agNULL,
 2729                              agNULL,
 2730                              agNULL,      /* subkey5 */
 2731                              "HwOption", /* valueName */
 2732                              buffer,
 2733                              buffLen,
 2734                              &lenRecv
 2735                              ) == tiSuccess) && (lenRecv != 0))
 2736   {
 2737     if (osti_strncmp(buffer, "0x", 2) == 0)
 2738     {
 2739       HwConfig->hwOption = osti_strtoul (buffer, &pLastUsedChar, 0);
 2740     }
 2741     else
 2742     {
 2743       HwConfig->hwOption = osti_strtoul (buffer, &pLastUsedChar, 10);
 2744     }
 2745   }
 2746 
 2747   osti_memset(buffer, 0, buffLen);
 2748   lenRecv = 0;
 2749 
 2750   /* interrupt reassetion field*/
 2751   if ((ostiGetTransportParam(
 2752                              tiRoot,
 2753                              globalStr,   /* key */
 2754                              HwParmsStr,  /* subkey1 */
 2755                              agNULL,      /* subkey2 */
 2756                              agNULL,
 2757                              agNULL,
 2758                              agNULL,      /* subkey5 */
 2759                              "MaxFWPorts", /* valueName */
 2760                              buffer,
 2761                              buffLen,
 2762                              &lenRecv
 2763                              ) == tiSuccess) && (lenRecv != 0))
 2764   {
 2765     if (osti_strncmp(buffer, "0x", 2) == 0)
 2766     {
 2767       tdsaAllShared->FWMaxPorts = osti_strtoul (buffer, &pLastUsedChar, 0);
 2768     }
 2769     else
 2770     {
 2771       tdsaAllShared->FWMaxPorts = osti_strtoul (buffer, &pLastUsedChar, 10);
 2772     }
 2773   }
 2774 
 2775   osti_memset(buffer, 0, buffLen);
 2776   lenRecv = 0;
 2777 
 2778   if ((ostiGetTransportParam(
 2779                              tiRoot,
 2780                              globalStr,   /* key */
 2781                              HwParmsStr,  /* subkey1 */
 2782                              agNULL,      /* subkey2 */
 2783                              agNULL,
 2784                              agNULL,
 2785                              agNULL,      /* subkey5 */
 2786                              "phyCalibration", /* valueName */
 2787                              buffer,
 2788                              buffLen,
 2789                              &lenRecv
 2790                              ) == tiSuccess) && (lenRecv != 0))
 2791   {
 2792     if (osti_strncmp(buffer, "0x", 2) == 0)
 2793     {
 2794       tdsaAllShared->phyCalibration = osti_strtoul (buffer, &pLastUsedChar, 0);
 2795     }
 2796     else
 2797     {
 2798       tdsaAllShared->phyCalibration = osti_strtoul (buffer, &pLastUsedChar, 10);
 2799     }
 2800   }
 2801 
 2802   osti_memset(buffer, 0, buffLen);
 2803   lenRecv = 0;
 2804 
 2805 
 2806   /* phy calibration */
 2807   for (i=0;i<MAX_INDEX;i++)
 2808   {
 2809     for(j=0;j<10;j++)
 2810     {
 2811       osti_sprintf(phyReg,"spaReg%d%d",i,j);
 2812       TI_DBG6(("tdsaGetHwConfigParams: phyReg %s\n", phyReg));
 2813 
 2814       if (j == 0)
 2815       {
 2816         if ((ostiGetTransportParam(
 2817                                tiRoot,
 2818                                globalStr,   /* key */
 2819                                HwParmsStr,  /* subkey1 */
 2820                                agNULL,      /* subkey2 */
 2821                                agNULL,
 2822                                agNULL,
 2823                                agNULL,      /* subkey5 */
 2824                                phyReg, /* valueName */
 2825                                buffer,
 2826                                buffLen,
 2827                                &lenRecv
 2828                                ) == tiSuccess) && (lenRecv != 0))
 2829       {
 2830         if (osti_strncmp(buffer, "0x", 2) == 0)
 2831         {
 2832           phyRegTable->phyAnalogSetupRegisters[i].spaRegister0 = osti_strtoul (buffer, &pLastUsedChar, 0);
 2833         }
 2834         else
 2835         {
 2836           phyRegTable->phyAnalogSetupRegisters[i].spaRegister0 = osti_strtoul (buffer, &pLastUsedChar, 10);
 2837         }
 2838       }
 2839 
 2840       osti_memset(buffer, 0, buffLen);
 2841       lenRecv = 0;
 2842       }
 2843       else if (j == 1)
 2844       {
 2845         if ((ostiGetTransportParam(
 2846                                tiRoot,
 2847                                globalStr,   /* key */
 2848                                HwParmsStr,  /* subkey1 */
 2849                                agNULL,      /* subkey2 */
 2850                                agNULL,
 2851                                agNULL,
 2852                                agNULL,      /* subkey5 */
 2853                                phyReg, /* valueName */
 2854                                buffer,
 2855                                buffLen,
 2856                                &lenRecv
 2857                                ) == tiSuccess) && (lenRecv != 0))
 2858       {
 2859         if (osti_strncmp(buffer, "0x", 2) == 0)
 2860         {
 2861           phyRegTable->phyAnalogSetupRegisters[i].spaRegister1 = osti_strtoul (buffer, &pLastUsedChar, 0);
 2862         }
 2863         else
 2864         {
 2865           phyRegTable->phyAnalogSetupRegisters[i].spaRegister1 = osti_strtoul (buffer, &pLastUsedChar, 10);
 2866         }
 2867       }
 2868 
 2869       osti_memset(buffer, 0, buffLen);
 2870       lenRecv = 0;
 2871       }
 2872       else if (j == 2)
 2873       {
 2874         if ((ostiGetTransportParam(
 2875                                tiRoot,
 2876                                globalStr,   /* key */
 2877                                HwParmsStr,  /* subkey1 */
 2878                                agNULL,      /* subkey2 */
 2879                                agNULL,
 2880                                agNULL,
 2881                                agNULL,      /* subkey5 */
 2882                                phyReg, /* valueName */
 2883                                buffer,
 2884                                buffLen,
 2885                                &lenRecv
 2886                                ) == tiSuccess) && (lenRecv != 0))
 2887       {
 2888         if (osti_strncmp(buffer, "0x", 2) == 0)
 2889         {
 2890           phyRegTable->phyAnalogSetupRegisters[i].spaRegister2 = osti_strtoul (buffer, &pLastUsedChar, 0);
 2891         }
 2892         else
 2893         {
 2894           phyRegTable->phyAnalogSetupRegisters[i].spaRegister2 = osti_strtoul (buffer, &pLastUsedChar, 10);
 2895         }
 2896       }
 2897 
 2898       osti_memset(buffer, 0, buffLen);
 2899       lenRecv = 0;
 2900       }
 2901       else if (j == 3)
 2902       {
 2903         if ((ostiGetTransportParam(
 2904                                tiRoot,
 2905                                globalStr,   /* key */
 2906                                HwParmsStr,  /* subkey1 */
 2907                                agNULL,      /* subkey2 */
 2908                                agNULL,
 2909                                agNULL,
 2910                                agNULL,      /* subkey5 */
 2911                                phyReg, /* valueName */
 2912                                buffer,
 2913                                buffLen,
 2914                                &lenRecv
 2915                                ) == tiSuccess) && (lenRecv != 0))
 2916       {
 2917         if (osti_strncmp(buffer, "0x", 2) == 0)
 2918         {
 2919           phyRegTable->phyAnalogSetupRegisters[i].spaRegister3 = osti_strtoul (buffer, &pLastUsedChar, 0);
 2920         }
 2921         else
 2922         {
 2923           phyRegTable->phyAnalogSetupRegisters[i].spaRegister3 = osti_strtoul (buffer, &pLastUsedChar, 10);
 2924         }
 2925       }
 2926 
 2927       osti_memset(buffer, 0, buffLen);
 2928       lenRecv = 0;
 2929       }
 2930       else if (j == 4)
 2931       {
 2932         if ((ostiGetTransportParam(
 2933                                tiRoot,
 2934                                globalStr,   /* key */
 2935                                HwParmsStr,  /* subkey1 */
 2936                                agNULL,      /* subkey2 */
 2937                                agNULL,
 2938                                agNULL,
 2939                                agNULL,      /* subkey5 */
 2940                                phyReg, /* valueName */
 2941                                buffer,
 2942                                buffLen,
 2943                                &lenRecv
 2944                                ) == tiSuccess) && (lenRecv != 0))
 2945       {
 2946         if (osti_strncmp(buffer, "0x", 2) == 0)
 2947         {
 2948           phyRegTable->phyAnalogSetupRegisters[i].spaRegister4 = osti_strtoul (buffer, &pLastUsedChar, 0);
 2949         }
 2950         else
 2951         {
 2952           phyRegTable->phyAnalogSetupRegisters[i].spaRegister4 = osti_strtoul (buffer, &pLastUsedChar, 10);
 2953         }
 2954       }
 2955 
 2956       osti_memset(buffer, 0, buffLen);
 2957       lenRecv = 0;
 2958       }
 2959       else if (j == 5)
 2960       {
 2961         if ((ostiGetTransportParam(
 2962                                tiRoot,
 2963                                globalStr,   /* key */
 2964                                HwParmsStr,  /* subkey1 */
 2965                                agNULL,      /* subkey2 */
 2966                                agNULL,
 2967                                agNULL,
 2968                                agNULL,      /* subkey5 */
 2969                                phyReg, /* valueName */
 2970                                buffer,
 2971                                buffLen,
 2972                                &lenRecv
 2973                                ) == tiSuccess) && (lenRecv != 0))
 2974       {
 2975         if (osti_strncmp(buffer, "0x", 2) == 0)
 2976         {
 2977           phyRegTable->phyAnalogSetupRegisters[i].spaRegister5 = osti_strtoul (buffer, &pLastUsedChar, 0);
 2978         }
 2979         else
 2980         {
 2981           phyRegTable->phyAnalogSetupRegisters[i].spaRegister5 = osti_strtoul (buffer, &pLastUsedChar, 10);
 2982         }
 2983       }
 2984 
 2985       osti_memset(buffer, 0, buffLen);
 2986       lenRecv = 0;
 2987       }
 2988       else if (j == 6)
 2989       {
 2990         if ((ostiGetTransportParam(
 2991                                tiRoot,
 2992                                globalStr,   /* key */
 2993                                HwParmsStr,  /* subkey1 */
 2994                                agNULL,      /* subkey2 */
 2995                                agNULL,
 2996                                agNULL,
 2997                                agNULL,      /* subkey5 */
 2998                                phyReg, /* valueName */
 2999                                buffer,
 3000                                buffLen,
 3001                                &lenRecv
 3002                                ) == tiSuccess) && (lenRecv != 0))
 3003       {
 3004         if (osti_strncmp(buffer, "0x", 2) == 0)
 3005         {
 3006           phyRegTable->phyAnalogSetupRegisters[i].spaRegister6 = osti_strtoul (buffer, &pLastUsedChar, 0);
 3007         }
 3008         else
 3009         {
 3010           phyRegTable->phyAnalogSetupRegisters[i].spaRegister6 = osti_strtoul (buffer, &pLastUsedChar, 10);
 3011         }
 3012       }
 3013 
 3014       osti_memset(buffer, 0, buffLen);
 3015       lenRecv = 0;
 3016       }
 3017       else if (j == 7)
 3018       {
 3019         if ((ostiGetTransportParam(
 3020                                tiRoot,
 3021                                globalStr,   /* key */
 3022                                HwParmsStr,  /* subkey1 */
 3023                                agNULL,      /* subkey2 */
 3024                                agNULL,
 3025                                agNULL,
 3026                                agNULL,      /* subkey5 */
 3027                                phyReg, /* valueName */
 3028                                buffer,
 3029                                buffLen,
 3030                                &lenRecv
 3031                                ) == tiSuccess) && (lenRecv != 0))
 3032       {
 3033         if (osti_strncmp(buffer, "0x", 2) == 0)
 3034         {
 3035           phyRegTable->phyAnalogSetupRegisters[i].spaRegister7 = osti_strtoul (buffer, &pLastUsedChar, 0);
 3036         }
 3037         else
 3038         {
 3039           phyRegTable->phyAnalogSetupRegisters[i].spaRegister7 = osti_strtoul (buffer, &pLastUsedChar, 10);
 3040         }
 3041       }
 3042 
 3043       osti_memset(buffer, 0, buffLen);
 3044       lenRecv = 0;
 3045       }
 3046       else if (j == 8)
 3047       {
 3048         if ((ostiGetTransportParam(
 3049                                tiRoot,
 3050                                globalStr,   /* key */
 3051                                HwParmsStr,  /* subkey1 */
 3052                                agNULL,      /* subkey2 */
 3053                                agNULL,
 3054                                agNULL,
 3055                                agNULL,      /* subkey5 */
 3056                                phyReg, /* valueName */
 3057                                buffer,
 3058                                buffLen,
 3059                                &lenRecv
 3060                                ) == tiSuccess) && (lenRecv != 0))
 3061       {
 3062         if (osti_strncmp(buffer, "0x", 2) == 0)
 3063         {
 3064           phyRegTable->phyAnalogSetupRegisters[i].spaRegister8 = osti_strtoul (buffer, &pLastUsedChar, 0);
 3065         }
 3066         else
 3067         {
 3068           phyRegTable->phyAnalogSetupRegisters[i].spaRegister8 = osti_strtoul (buffer, &pLastUsedChar, 10);
 3069         }
 3070       }
 3071 
 3072       osti_memset(buffer, 0, buffLen);
 3073       lenRecv = 0;
 3074       }
 3075       else if (j == 9)
 3076       {
 3077         if ((ostiGetTransportParam(
 3078                                tiRoot,
 3079                                globalStr,   /* key */
 3080                                HwParmsStr,  /* subkey1 */
 3081                                agNULL,      /* subkey2 */
 3082                                agNULL,
 3083                                agNULL,
 3084                                agNULL,      /* subkey5 */
 3085                                phyReg, /* valueName */
 3086                                buffer,
 3087                                buffLen,
 3088                                &lenRecv
 3089                                ) == tiSuccess) && (lenRecv != 0))
 3090       {
 3091         if (osti_strncmp(buffer, "0x", 2) == 0)
 3092         {
 3093           phyRegTable->phyAnalogSetupRegisters[i].spaRegister9 = osti_strtoul (buffer, &pLastUsedChar, 0);
 3094         }
 3095         else
 3096         {
 3097           phyRegTable->phyAnalogSetupRegisters[i].spaRegister9 = osti_strtoul (buffer, &pLastUsedChar, 10);
 3098         }
 3099       }
 3100 
 3101       osti_memset(buffer, 0, buffLen);
 3102       lenRecv = 0;
 3103       }
 3104 
 3105     } /* inner loop */
 3106   } /* outer loop */
 3107   return;
 3108 }
 3109 /*****************************************************************************
 3110 *! \brief tdsaGetCardPhyParams
 3111 *
 3112 *  Purpose:  This function reads phy-related configuration parameters from the
 3113 *            configuration file
 3114 *
 3115 *  \param  tiRoot:            Pointer to driver/port instance.
 3116 *
 3117 *  \return: None
 3118 *
 3119 *  \note - just a place holder for now
 3120 *
 3121 *****************************************************************************/
 3122 osGLOBAL void
 3123 tdsaGetCardPhyParams(
 3124                  tiRoot_t *tiRoot
 3125                  )
 3126 {
 3127   tdsaRoot_t     *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
 3128   tdsaContext_t  *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
 3129   agsaRoot_t     *agRoot = &tdsaAllShared->agRootInt;
 3130   char           *buffer;
 3131   bit32          buffLen;
 3132   bit32          lenRecv = 0;
 3133   char           *pLastUsedChar = agNULL;
 3134   char           tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
 3135   char           *globalStr = tdsaAllShared->CardIDString;
 3136   char           phyParmsStr[12];
 3137   int            i;
 3138   bit32          LinkRate = 15, Mode = 3, OpticalMode = 0; //VG
 3139   bit32          LinkRateRead = agTRUE, ModeRead = agFALSE, OpticalModeRead = agFALSE;
 3140   bit32          flag = agFALSE; /* true only for PM8008 or PM8009 (SPCv and SPCve) controller */
 3141 
 3142   TI_DBG6(("tdsaGetCardPhyParams: start \n"));
 3143   TI_DBG6(("tdsaGetCardPhyParams: tdsaRoot %p tdsaAllShared %p \n", tdsaRoot,tdsaAllShared));
 3144 
 3145   if (tiIS_8PHY(agRoot))
 3146   {
 3147     TI_DBG6(("tdsaGetCardPhyParams: SPCv or SPCve \n"));
 3148     flag = agTRUE;
 3149   }
 3150   TI_DBG6(("tdsaGetCardPhyParams: flag %d\n", flag));
 3151 
 3152 #ifdef REMOVED
 3153 #ifdef FPGA_CARD
 3154   for (i=0;i<TD_MAX_NUM_PHYS;i++)
 3155   {
 3156     /* setting default phy properties */
 3157     OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3158     OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x05060708);
 3159     /* 1.5G only, SAS/SATA, no spin-up control */
 3160     tdsaAllShared->Ports[i].agPhyConfig.phyProperties = 0x31; /* 49 */
 3161   }
 3162 #else
 3163 #ifdef INITIATOR_DRIVER
 3164   /* ASIC */
 3165   for (i=0;i<TD_MAX_NUM_PHYS;i++)
 3166   {
 3167     /* setting default phy properties */
 3168     OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3169     OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x05060708);
 3170     /* 1.5G/3G , SAS/SATA, no spin-up control */
 3171     tdsaAllShared->Ports[i].agPhyConfig.phyProperties = 0x37; /* 55 */
 3172     TI_DBG6(("tdsaGetCardPhyParams: phy %d hi 0x%x lo 0x%x\n", i, SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[i].SASID)), SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[i].SASID))));
 3173   }
 3174 #endif
 3175 
 3176 #ifdef TARGET_DRIVER
 3177   /* ASIC */
 3178   for (i=0;i<TD_MAX_NUM_PHYS;i++)
 3179   {
 3180     /* setting default phy properties */
 3181     OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3182     OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x05050500+i);
 3183     /* 1.5G/3G , SAS/SATA, no spin-up control */
 3184     tdsaAllShared->Ports[i].agPhyConfig.phyProperties = 0x37; /* 55 */
 3185     TI_DBG6(("tdsaGetCardPhyParams: phy %d hi 0x%x lo 0x%x\n", i, SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[i].SASID)), SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[i].SASID))));
 3186   }
 3187 #endif
 3188 
 3189 #endif
 3190 #endif /* REMOVED */
 3191 
 3192 
 3193   buffer = tmpBuffer;
 3194   buffLen = sizeof(tmpBuffer);
 3195 
 3196   osti_memset(buffer, 0, buffLen);
 3197   lenRecv = 0;
 3198 
 3199   for (i=0;i<TD_MAX_NUM_PHYS;i++)
 3200   {
 3201     if (flag == agFALSE)
 3202     {
 3203       osti_sprintf(phyParmsStr,"PhyParms%d", i);
 3204     }
 3205     else
 3206     {
 3207       if (i >= 4)
 3208       {
 3209         osti_sprintf(phyParmsStr,"PhyParms%d", i+4);
 3210       }
 3211       else
 3212       {
 3213         osti_sprintf(phyParmsStr,"PhyParms%d", i);
 3214       }
 3215     }
 3216 
 3217     TI_DBG6(("tdsaGetCardPhyParams: i %d PhyParms %s\n", i, phyParmsStr));
 3218 
 3219     TI_DBG2(("tdsaGetCardPhyParams: phy %d phyProperties %d\n", i, tdsaAllShared->Ports[i].agPhyConfig.phyProperties));
 3220 
 3221 
 3222     if ((ostiGetTransportParam (
 3223                                 tiRoot,
 3224                                 globalStr,
 3225                                 phyParmsStr,
 3226                                 agNULL,
 3227                                 agNULL,
 3228                                 agNULL,
 3229                                 agNULL,
 3230                                 "AddrHi",
 3231                                 buffer,
 3232                                 buffLen,
 3233                                 &lenRecv
 3234                                 ) == tiSuccess) && (lenRecv != 0))
 3235     {
 3236       if (osti_strncmp(buffer, "0x", 2) == 0)
 3237       {
 3238         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, osti_strtoul(buffer, &pLastUsedChar, 0));
 3239         TI_DBG6(("tdsaGetCardPhyParams: phy %d hi 0x%x \n", i, SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[i].SASID))));
 3240       }
 3241       else
 3242       {
 3243         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, osti_strtoul(buffer, &pLastUsedChar, 10));
 3244         TI_DBG6(("tdsaGetCardPhyParams: phy %d hi %d \n", i, SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[i].SASID))));
 3245       }
 3246     }
 3247 
 3248 
 3249     osti_memset(buffer, 0, buffLen);
 3250     lenRecv = 0;
 3251 
 3252     if ((ostiGetTransportParam (
 3253                                 tiRoot,
 3254                                 globalStr,
 3255                                 phyParmsStr,
 3256                                 agNULL,
 3257                                 agNULL,
 3258                                 agNULL,
 3259                                 agNULL,
 3260                                 "AddrLow",
 3261                                 buffer,
 3262                                 buffLen,
 3263                                 &lenRecv
 3264                                 ) == tiSuccess) && (lenRecv != 0))
 3265     {
 3266       if (osti_strncmp(buffer, "0x", 2) == 0)
 3267       {
 3268         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, osti_strtoul(buffer, &pLastUsedChar, 0));
 3269         TI_DBG6(("tdsaGetCardPhyParams: phy %d lo 0x%x\n", i, SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[i].SASID))));
 3270       }
 3271       else
 3272       {
 3273         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, osti_strtoul(buffer, &pLastUsedChar, 10));
 3274         TI_DBG6(("tdsaGetCardPhyParams: phy %d lo %d\n", i, SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[i].SASID))));
 3275       }
 3276     }
 3277     TI_DBG6(("tdsaGetCardPhyParams: loop phy %d hi 0x%x lo 0x%x\n", i, SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[i].SASID)), SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[i].SASID))));
 3278 
 3279     /* phy properties */
 3280     osti_memset(buffer, 0, buffLen);
 3281     lenRecv = 0;
 3282 /*
 3283     if ((ostiGetTransportParam (
 3284                                 tiRoot,
 3285                                 globalStr,
 3286                                 phyParmsStr,
 3287                                 agNULL,
 3288                                 agNULL,
 3289                                 agNULL,
 3290                                 agNULL,
 3291                                 "LinkRate",
 3292                                 buffer,
 3293                                 buffLen,
 3294                                 &lenRecv
 3295                                 ) == tiSuccess) && (lenRecv != 0))
 3296     {
 3297       LinkRateRead = agTRUE;
 3298       if (osti_strncmp(buffer, "0x", 2) == 0)
 3299       {
 3300         LinkRate = osti_strtoul(buffer, &pLastUsedChar, 0);
 3301         TI_DBG6(("tdsaGetCardPhyParams: phy %d linkrate 0x%x \n", i, LinkRate));
 3302       }
 3303       else
 3304       {
 3305         LinkRate = osti_strtoul(buffer, &pLastUsedChar, 10);
 3306         TI_DBG6(("tdsaGetCardPhyParams: phy %d linkrate %d \n", i, LinkRate));
 3307       }
 3308     }
 3309 
 3310     TI_DBG2(("tdsaGetCardPhyParams: phy %d linkrate %d \n", i, LinkRate));
 3311 */
 3312 
 3313     osti_memset(buffer, 0, buffLen);
 3314     lenRecv = 0;
 3315 
 3316     if ((ostiGetTransportParam (
 3317                                 tiRoot,
 3318                                 globalStr,
 3319                                 phyParmsStr,
 3320                                 agNULL,
 3321                                 agNULL,
 3322                                 agNULL,
 3323                                 agNULL,
 3324                                 "Mode",
 3325                                 buffer,
 3326                                 buffLen,
 3327                                 &lenRecv
 3328                                 ) == tiSuccess) && (lenRecv != 0))
 3329     {
 3330       ModeRead = agTRUE;
 3331       if (osti_strncmp(buffer, "0x", 2) == 0)
 3332       {
 3333         Mode = osti_strtoul(buffer, &pLastUsedChar, 0);
 3334         TI_DBG6(("tdsaGetCardPhyParams: phy %d Mode 0x%x \n", i, Mode));
 3335       }
 3336       else
 3337       {
 3338         Mode = osti_strtoul(buffer, &pLastUsedChar, 10);
 3339         TI_DBG6(("tdsaGetCardPhyParams: phy %d Mode %d \n", i, Mode));
 3340       }
 3341     }
 3342 
 3343     osti_memset(buffer, 0, buffLen);
 3344     lenRecv = 0;
 3345 
 3346     if ((ostiGetTransportParam (
 3347                                 tiRoot,
 3348                                 globalStr,
 3349                                 phyParmsStr,
 3350                                 agNULL,
 3351                                 agNULL,
 3352                                 agNULL,
 3353                                 agNULL,
 3354                                 "OpticalMode",
 3355                                 buffer,
 3356                                 buffLen,
 3357                                 &lenRecv
 3358                                 ) == tiSuccess) && (lenRecv != 0))
 3359     {
 3360       OpticalModeRead = agTRUE;
 3361       if (osti_strncmp(buffer, "0x", 2) == 0)
 3362       {
 3363         OpticalMode = osti_strtoul(buffer, &pLastUsedChar, 0);
 3364         TI_DBG6(("tdsaGetCardPhyParams: phy %d OpticalMode 0x%x \n", i, OpticalMode));
 3365       }
 3366       else
 3367       {
 3368         OpticalMode = osti_strtoul(buffer, &pLastUsedChar, 10);
 3369         TI_DBG6(("tdsaGetCardPhyParams: phy %d OpticalMode %d \n", i, OpticalMode));
 3370       }
 3371     }
 3372 
 3373     tdsaParseLinkRateMode(tiRoot, i, LinkRateRead, ModeRead, OpticalModeRead, LinkRate, Mode, OpticalMode);
 3374 
 3375     TI_DBG2(("tdsaGetCardPhyParams: phy %d phyProperties %d\n", i, tdsaAllShared->Ports[i].agPhyConfig.phyProperties));
 3376 
 3377 
 3378     /**********************************************/
 3379     osti_memset(buffer, 0, buffLen);
 3380     lenRecv = 0;
 3381     LinkRateRead = agTRUE;//VG
 3382     ModeRead = agFALSE;
 3383     OpticalModeRead = agFALSE;
 3384 
 3385   } /* end for */
 3386   return;
 3387 }
 3388 
 3389 
 3390 
 3391 
 3392 
 3393 /*****************************************************************************
 3394 *! \brief tdsaGetGlobalPhyParams
 3395 *
 3396 *  Purpose:  This function reads phy-related configuration parameters from the
 3397 *            configuration file
 3398 *
 3399 *  \param  tiRoot:            Pointer to driver/port instance.
 3400 *
 3401 *  \return: None
 3402 *
 3403 *  \note - just a place holder for now
 3404 *
 3405 *****************************************************************************/
 3406 osGLOBAL void
 3407 tdsaGetGlobalPhyParams(
 3408                  tiRoot_t *tiRoot
 3409                  )
 3410 {
 3411   tdsaRoot_t     *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
 3412   tdsaContext_t  *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
 3413   agsaRoot_t     *agRoot = &tdsaAllShared->agRootInt;
 3414   char           *buffer;
 3415   bit32          buffLen;
 3416   bit32          lenRecv = 0;
 3417   char           *pLastUsedChar = agNULL;
 3418   char           tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
 3419   char           globalStr[]     = "Global";
 3420   char           phyParmsStr[12];
 3421   int            i;
 3422   bit32          LinkRate = 15/*7*/, Mode = 3, OpticalMode = 0;
 3423   bit32          LinkRateRead = agFALSE, ModeRead = agFALSE, OpticalModeRead = agFALSE;
 3424   bit32          flag = agFALSE; /* true only for PM8008 or PM8009 (SPCv and SPCve) controller */
 3425 
 3426   TI_DBG6(("tdsaGetGlobalPhyParams: start \n"));
 3427   TI_DBG6(("tdsaGetGlobalPhyParams: tdsaRoot %p tdsaAllShared %p \n", tdsaRoot,tdsaAllShared));
 3428 
 3429   if (tiIS_8PHY(agRoot) )
 3430   {
 3431     TI_DBG6(("tdsaGetGlobalPhyParams: SPCv or SPCve \n"));
 3432     flag = agTRUE;
 3433   }
 3434 
 3435   TI_DBG6(("tdsaGetGlobalPhyParams: flag %d\n", flag));
 3436 
 3437 #ifdef FPGA_CARD
 3438   for (i=0;i<TD_MAX_NUM_PHYS;i++)
 3439   {
 3440     /* setting default phy properties */
 3441     OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3442     OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x05060708);
 3443     /* 1.5G only, SAS/SATA, no spin-up control */
 3444     tdsaAllShared->Ports[i].agPhyConfig.phyProperties = 0x31; /* 49 */
 3445   }
 3446 #else
 3447   /* ASIC */
 3448 #ifdef INITIATOR_DRIVER
 3449   for (i=0;i<TD_MAX_NUM_PHYS;i++)
 3450   {
 3451     /* setting default phy properties */
 3452     if (flag == agFALSE) /* SPC or SPCv+ */
 3453     {
 3454       if (0 <= i && i <= 7)
 3455       {
 3456         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3457         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x05060708);
 3458       }
 3459       else
 3460       {
 3461         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01010101);
 3462         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x02020202);
 3463       }
 3464     }
 3465     else /* SPCv or SPCve */
 3466     {
 3467       if (0 <= i && i <= 3)
 3468       {
 3469         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3470         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x05060708);
 3471       }
 3472       else if (4 <= i && i <= 7)
 3473       {
 3474         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3475         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x02020202);
 3476       }
 3477       else /* don't care */
 3478       {
 3479         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01010101);
 3480         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x0f0f0f0f);
 3481       }
 3482 
 3483     }
 3484     /* 1.5G/3G , SAS/SATA, no spin-up control */
 3485     tdsaAllShared->Ports[i].agPhyConfig.phyProperties = 0x31; /* 55 */
 3486     TI_DBG6(("tdsaGetGlobalPhyParams: phy %d hi 0x%x lo 0x%x\n", i, SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[i].SASID)), SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[i].SASID))));
 3487 
 3488   }
 3489 #endif
 3490 #ifdef TARGET_DRIVER
 3491    for (i=0;i<TD_MAX_NUM_PHYS;i++)
 3492   {
 3493     /* setting default phy properties */
 3494     /* SPC; narrow ports; 8 ports
 3495        SPCv, SPCve wide port; 8 ports
 3496        SPCv+ wide port; 16 ports
 3497     */
 3498     if (tiIS_SPC(agRoot))
 3499     {
 3500        if (0 <= i && i <= 7)
 3501       {
 3502         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3503         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x05050500+i);
 3504       }
 3505       else
 3506       {
 3507         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3508         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x06060600+i);
 3509       }
 3510     }
 3511     else if (tiIS_16PHY(agRoot))
 3512     {
 3513        if (0 <= i && i <= 7)
 3514       {
 3515         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3516         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x05050500+i);
 3517       }
 3518       else
 3519       {
 3520         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3521         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x06060600+i);
 3522       }
 3523     }
 3524     else
 3525     {
 3526       if (0 <= i && i <= 3)
 3527       {
 3528         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3529         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x05050500+i);
 3530       }
 3531       else if (4 <= i && i <= 7)
 3532       {
 3533         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3534         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x06060600+i);
 3535       }
 3536       else /* don't care */
 3537       {
 3538         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, 0x01020304);
 3539         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, 0x0f0f0f0f+i);
 3540       }
 3541     }
 3542     /* 1.5G/3G , SAS/SATA, no spin-up control */
 3543     tdsaAllShared->Ports[i].agPhyConfig.phyProperties = 0x31; /* 49 The default is 1.5G and will be changed based on the registry value */
 3544     TI_DBG6(("tdsaGetGlobalPhyParams: phy %d hi 0x%x lo 0x%x\n", i, SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[i].SASID)), SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[i].SASID))));
 3545 
 3546   }
 3547 #endif
 3548 #endif
 3549 
 3550 
 3551   buffer = tmpBuffer;
 3552   buffLen = sizeof(tmpBuffer);
 3553 
 3554   osti_memset(buffer, 0, buffLen);
 3555   lenRecv = 0;
 3556 
 3557   /* needs to read Phy's id frame */
 3558   for (i=0;i<TD_MAX_NUM_PHYS;i++)
 3559   {
 3560     if (flag == agFALSE)
 3561     {
 3562       osti_sprintf(phyParmsStr,"PhyParms%d", i);
 3563     }
 3564     else
 3565     {
 3566       if (i >= 4)
 3567       {
 3568         osti_sprintf(phyParmsStr,"PhyParms%d", i+4);
 3569       }
 3570       else
 3571       {
 3572         osti_sprintf(phyParmsStr,"PhyParms%d", i);
 3573       }
 3574     }
 3575 
 3576     TI_DBG6(("tdsaGetGlobalPhyParams: i %d PhyParms %s\n", i, phyParmsStr));
 3577 
 3578 
 3579     if ((ostiGetTransportParam (
 3580                                 tiRoot,
 3581                                 globalStr,
 3582                                 phyParmsStr,
 3583                                 agNULL,
 3584                                 agNULL,
 3585                                 agNULL,
 3586                                 agNULL,
 3587                                 "AddrHi",
 3588                                 buffer,
 3589                                 buffLen,
 3590                                 &lenRecv
 3591                                 ) == tiSuccess) && (lenRecv != 0))
 3592     {
 3593       if (osti_strncmp(buffer, "0x", 2) == 0)
 3594       {
 3595         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, osti_strtoul(buffer, &pLastUsedChar, 0));
 3596         TI_DBG6(("tdsaGetGlobalPhyParams: phy %d hi 0x%x \n", i, SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[i].SASID))));
 3597       }
 3598       else
 3599       {
 3600         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressHi, 0, osti_strtoul(buffer, &pLastUsedChar, 10));
 3601         TI_DBG6(("tdsaGetGlobalPhyParams: phy %d hi %d \n", i, SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[i].SASID))));
 3602 
 3603       }
 3604     }
 3605 
 3606 
 3607     osti_memset(buffer, 0, buffLen);
 3608     lenRecv = 0;
 3609 
 3610     if ((ostiGetTransportParam (
 3611                                 tiRoot,
 3612                                 globalStr,
 3613                                 phyParmsStr,
 3614                                 agNULL,
 3615                                 agNULL,
 3616                                 agNULL,
 3617                                 agNULL,
 3618                                 "AddrLow",
 3619                                 buffer,
 3620                                 buffLen,
 3621                                 &lenRecv
 3622                                 ) == tiSuccess) && (lenRecv != 0))
 3623     {
 3624       if (osti_strncmp(buffer, "0x", 2) == 0)
 3625       {
 3626         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, osti_strtoul(buffer, &pLastUsedChar, 0));
 3627         TI_DBG6(("tdsaGetGlobalPhyParams: phy %d lo 0x%x\n", i, SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[i].SASID))));
 3628       }
 3629       else
 3630       {
 3631         OSSA_WRITE_BE_32(agRoot, tdsaAllShared->Ports[i].SASID.sasAddressLo, 0, osti_strtoul(buffer, &pLastUsedChar, 10));
 3632         TI_DBG6(("tdsaGetGlobalPhyParams: phy %d lo %d\n", i, SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[i].SASID))));
 3633 
 3634       }
 3635     }
 3636     TI_DBG6(("tdsaGetGlobalPhyParams: loop phy %d hi 0x%x lo 0x%x\n", i, SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[i].SASID)), SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[i].SASID))));
 3637 
 3638     /* phy properties */
 3639     osti_memset(buffer, 0, buffLen);
 3640     lenRecv = 0;
 3641 /*
 3642     if ((ostiGetTransportParam (
 3643                                 tiRoot,
 3644                                 globalStr,
 3645                                 phyParmsStr,
 3646                                 agNULL,
 3647                                 agNULL,
 3648                                 agNULL,
 3649                                 agNULL,
 3650                                 "LinkRate",
 3651                                 buffer,
 3652                                 buffLen,
 3653                                 &lenRecv
 3654                                 ) == tiSuccess) && (lenRecv != 0))
 3655     {
 3656       LinkRateRead = agTRUE;
 3657       if (osti_strncmp(buffer, "0x", 2) == 0)
 3658       {
 3659         LinkRate = osti_strtoul(buffer, &pLastUsedChar, 0);
 3660         TI_DBG2(("tdsaGetGlobalPhyParams: phy %d linkrate 0x%x \n", i, LinkRate));
 3661       }
 3662       else
 3663       {
 3664         LinkRate = osti_strtoul(buffer, &pLastUsedChar, 10);
 3665         TI_DBG2(("tdsaGetGlobalPhyParams: phy %d linkrate %d \n", i, LinkRate));
 3666       }
 3667     }
 3668 */
 3669 
 3670     osti_memset(buffer, 0, buffLen);
 3671     lenRecv = 0;
 3672 
 3673     if ((ostiGetTransportParam (
 3674                                 tiRoot,
 3675                                 globalStr,
 3676                                 phyParmsStr,
 3677                                 agNULL,
 3678                                 agNULL,
 3679                                 agNULL,
 3680                                 agNULL,
 3681                                 "Mode",
 3682                                 buffer,
 3683                                 buffLen,
 3684                                 &lenRecv
 3685                                 ) == tiSuccess) && (lenRecv != 0))
 3686     {
 3687       ModeRead = agTRUE;
 3688       if (osti_strncmp(buffer, "0x", 2) == 0)
 3689       {
 3690         Mode = osti_strtoul(buffer, &pLastUsedChar, 0);
 3691         TI_DBG2(("tdsaGetGlobalPhyParams: phy %d Mode 0x%x \n", i, Mode));
 3692       }
 3693       else
 3694       {
 3695         Mode = osti_strtoul(buffer, &pLastUsedChar, 10);
 3696         TI_DBG2(("tdsaGetGlobalPhyParams: phy %d Mode %d \n", i, Mode));
 3697       }
 3698     }
 3699 
 3700     osti_memset(buffer, 0, buffLen);
 3701     lenRecv = 0;
 3702 
 3703     if ((ostiGetTransportParam (
 3704                                 tiRoot,
 3705                                 globalStr,
 3706                                 phyParmsStr,
 3707                                 agNULL,
 3708                                 agNULL,
 3709                                 agNULL,
 3710                                 agNULL,
 3711                                 "OpticalMode",
 3712                                 buffer,
 3713                                 buffLen,
 3714                                 &lenRecv
 3715                                 ) == tiSuccess) && (lenRecv != 0))
 3716     {
 3717       OpticalModeRead = agTRUE;
 3718       if (osti_strncmp(buffer, "0x", 2) == 0)
 3719       {
 3720         OpticalMode = osti_strtoul(buffer, &pLastUsedChar, 0);
 3721         TI_DBG2(("tdsaGetGlobalPhyParams: phy %d OpticalMode 0x%x \n", i, OpticalMode));
 3722       }
 3723       else
 3724       {
 3725         OpticalMode = osti_strtoul(buffer, &pLastUsedChar, 10);
 3726         TI_DBG2(("tdsaGetGlobalPhyParams: phy %d OpticalMode %d \n", i, OpticalMode));
 3727       }
 3728     }
 3729 
 3730     TI_DBG2(("tdsaGetGlobalPhyParams:A phy %d phyProperties %d\n", i, tdsaAllShared->Ports[i].agPhyConfig.phyProperties));
 3731     tdsaParseLinkRateMode(tiRoot, i, LinkRateRead, ModeRead, OpticalModeRead, LinkRate, Mode, OpticalMode);
 3732 
 3733     TI_DBG2(("tdsaGetGlobalPhyParams:B phy %d phyProperties %d\n", i, tdsaAllShared->Ports[i].agPhyConfig.phyProperties));
 3734 
 3735 
 3736 
 3737     /**********************************************/
 3738     osti_memset(buffer, 0, buffLen);
 3739     lenRecv = 0;
 3740     /* restore default */
 3741     LinkRate = 15;
 3742     Mode = 3;
 3743     OpticalMode = 0;
 3744     LinkRateRead = agTRUE;//VG
 3745     ModeRead = agFALSE;
 3746     OpticalModeRead = agFALSE;
 3747 
 3748 
 3749   } /* end for */
 3750 
 3751   return;
 3752 }
 3753 
 3754 /*****************************************************************************
 3755 *! \brief  tdsaGetPortParams
 3756 *
 3757 *  Purpose:  This function reads port-related configuration parameters from the
 3758 *            configuration file
 3759 *
 3760 *  \param  tiRoot:            Pointer to driver/port instance.
 3761 *
 3762 *  \return:     None
 3763 *
 3764 *  \note - just a place holder for now
 3765 *
 3766 *****************************************************************************/
 3767 osGLOBAL void
 3768 tdsaGetPortParams(
 3769                   tiRoot_t *tiRoot
 3770                   )
 3771 {
 3772   tdsaRoot_t     *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
 3773   tdsaContext_t  *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
 3774 
 3775 
 3776   char    *buffer;
 3777   bit32   buffLen;
 3778   bit32   lenRecv = 0;
 3779   char    *pLastUsedChar = agNULL;
 3780   char    tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
 3781   char    globalStr[]     = "Global";
 3782   char    portParmsStr[] = "PortParms";
 3783 
 3784   TI_DBG6(("tdsaGetPortParams: start \n"));
 3785   TI_DBG6(("tdsaGetPortParams: tdsaRoot %p tdsaAllShared %p \n", tdsaRoot,tdsaAllShared));
 3786 
 3787   buffer = tmpBuffer;
 3788   buffLen = sizeof(tmpBuffer);
 3789   osti_memset(buffer, 0, buffLen);
 3790 
 3791   if ((ostiGetTransportParam (
 3792                               tiRoot,
 3793                               globalStr,
 3794                               portParmsStr,
 3795                               agNULL,
 3796                               agNULL,
 3797                               agNULL,
 3798                               agNULL,
 3799                               "InterruptDelay",
 3800                               buffer,
 3801                               buffLen,
 3802                               &lenRecv
 3803                               ) == tiSuccess) && (lenRecv != 0))
 3804   {
 3805     if (osti_strncmp(buffer, "0x", 2) == 0)
 3806     {
 3807       tdsaAllShared->currentInterruptDelay = osti_strtoul (buffer, &pLastUsedChar, 0);
 3808     }
 3809     else
 3810     {
 3811       tdsaAllShared->currentInterruptDelay = osti_strtoul (buffer, &pLastUsedChar, 10);
 3812     }
 3813     TI_DBG6(("tdsaGetPortParams: in \n"));
 3814   }
 3815   osti_memset(buffer, 0, buffLen);
 3816   lenRecv = 0;
 3817 
 3818   TI_DBG6(("tdsaGetPortParams: out \n"));
 3819 
 3820   /* and more .... */
 3821 
 3822 
 3823   return;
 3824 }
 3825 
 3826 #ifdef FW_EVT_LOG_TST
 3827 void saLogDump(agsaRoot_t *agRoot,
 3828                U32    *eventLogSize,
 3829                U32   **eventLogAddress);
 3830 
 3831 void tiLogDump(tiRoot_t *tiRoot, U32 *size, U32 **addr)
 3832 {
 3833   tdsaRoot_t    *tdsaRoot;
 3834   tdsaContext_t *tdsaAllShared;
 3835 
 3836   tdsaRoot = (tdsaRoot_t*)tiRoot->tdData;
 3837   tdsaAllShared = (tdsaContext_t*)&(tdsaRoot->tdsaAllShared);
 3838   saLogDump(&tdsaAllShared->agRootNonInt, size, addr);
 3839 }
 3840 #endif
 3841 
 3842 
 3843 
 3844 /*****************************************************************************
 3845 *! \brief  tiCOMPortInit
 3846 *
 3847 *  Purpose: This function is called to initialize the port hardware.
 3848 *           This call could only be called until after the successful
 3849 *           completion tiCOMInit().
 3850 *
 3851 *  \param   tiRoot:         Pointer to root data structure.
 3852 *  \param   sysIntsActive:  system interrupt flag
 3853 *
 3854 *  \return:
 3855 *           tiSuccess:      Successful.
 3856 *           Others:             Fail.
 3857 *
 3858 *  \note -
 3859 *
 3860 *****************************************************************************/
 3861 osGLOBAL bit32
 3862 tiCOMPortInit(
 3863               tiRoot_t      *tiRoot,
 3864               bit32         sysIntsActive
 3865               )
 3866 {
 3867   tdsaRoot_t          *tdsaRoot;
 3868   tdsaContext_t       *tdsaAllShared;
 3869   agsaRoot_t          *agRoot;
 3870   tiLoLevelResource_t *loResource;
 3871   bit32                status = tiError;
 3872   bit32                i;
 3873 
 3874   agsaQueueConfig_t   *QueueConfig;
 3875 
 3876 #ifdef CONTROLLER_STATUS_TESTING
 3877   static agsaControllerStatus_t  agcontrollerStatus;
 3878 #endif /* CONTROLLER_STATUS_TESTING */
 3879 
 3880 #ifdef CONTROLLER_INFO_TESTING
 3881   static agsaControllerInfo_t  agcontrollerInfo;
 3882 #endif /* CONTROLLER_INFO_TESTING */
 3883 
 3884 #ifdef CONTROLLER_ENCRYPT_TESTING
 3885   static  agsaEncryptInfo_t       agsaEncryptInfo;
 3886 #endif /* CONTROLLER_INFO_TESTING */
 3887 
 3888   static agsaMemoryRequirement_t agMemoryRequirement;
 3889 #ifdef ECHO_TESTING
 3890   /* temp */
 3891   static   bit8                     payload[56];
 3892 #endif
 3893 
 3894 #if defined(FDS_DM) || defined(FDS_SM)
 3895   static agsaMemoryRequirement_t memRequirement;
 3896   bit32                          maxQueueSets = 0;
 3897   bit32                          LLMemCount = 0;
 3898   bit32                          usecsPerTick = 0;
 3899   static agsaSwConfig_t          tmpLLSwConfig;
 3900 #endif
 3901 
 3902 #ifdef FDS_DM
 3903    static  dmRoot_t                       *dmRoot = agNULL;
 3904 #ifdef FDS_SM
 3905    static dmSwConfig_t                   dmSwConfig;
 3906 #endif
 3907   static dmMemoryRequirement_t   dmMemRequirement;
 3908   bit32                          DMMemCount = 0;
 3909 #endif
 3910 
 3911 #if defined(FDS_DM) && defined(FDS_SM)
 3912   bit32                          dmUsecsPerTick = 0;
 3913   bit32                          dmMaxNumLocks = 0;
 3914 #endif
 3915 
 3916 #ifdef FDS_SM
 3917   smRoot_t                       *smRoot = agNULL;
 3918 //  smSwConfig_t                   smSwConfig;
 3919   static smMemoryRequirement_t   smMemRequirement;
 3920   bit32                          SMMemCount = 0;
 3921 #endif
 3922 
 3923 #ifndef TURN_OFF_HDA
 3924   static agsaFwImg_t                    HDAImg;
 3925 #endif /*  TURN_OFF_HDA */
 3926 
 3927   TI_DBG3(("tiCOMPortInit: start\n"));
 3928   TI_DBG6(("tiCOMPortInit: sizeof agsaMemoryRequirement_t %d\n", (int)sizeof(agsaMemoryRequirement_t)));
 3929 
 3930   tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
 3931   tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
 3932 
 3933   osti_memset(&agMemoryRequirement, 0, sizeof(agsaMemoryRequirement_t));
 3934   /*
 3935    * don't do anything if reset is in progress
 3936    */
 3937   if (tdsaAllShared->flags.resetInProgress == agTRUE)
 3938   {
 3939     TI_DBG1(("tiCOMPortInit: resetinProgress error\n"));
 3940     return tiError;
 3941   }
 3942 
 3943   loResource = &(tdsaAllShared->loResource);
 3944 
 3945   agRoot = &(tdsaAllShared->agRootNonInt);
 3946   tdsaAllShared->flags.sysIntsActive    = sysIntsActive;
 3947 
 3948   /*
 3949      gets port-related parameters; not in use for now
 3950      tdsaGetPortParams(tiRoot);
 3951    */
 3952 
 3953   /* call these before agroot is created  for testing */
 3954 
 3955 
 3956 #ifdef CONTROLLER_STATUS_TESTING
 3957   TI_DBG1(("tiCOMPortInit: saGetControllerStatus returns 0x%X\n",saGetControllerStatus(agRoot,&agcontrollerStatus ) ));
 3958 #endif /* CONTROLLER_INFO_TESTING */
 3959 
 3960 #ifdef CONTROLLER_INFO_TESTING
 3961   TI_DBG1(("tiCOMPortInit: saGetControllerInfo returns 0x%X\n",saGetControllerInfo(agRoot,&agcontrollerInfo ) ));
 3962 #endif /* CONTROLLER_INFO_TESTING */
 3963 
 3964 #ifdef CONTROLLER_ENCRYPT_TESTING
 3965   TI_DBG1(("tiCOMPortInit: saEncryptGetMode returns 0x%X\n",saEncryptGetMode(agRoot,agNULL, &agsaEncryptInfo ) ));
 3966 #endif /* CONTROLLER_INFO_TESTING */
 3967 
 3968 
 3969   tdsaGetSwConfigParams(tiRoot);
 3970   tdsaPrintSwConfig(&(tdsaAllShared->SwConfig));
 3971 
 3972   /* setting interrupt requirements */
 3973   tdsaAllShared->SwConfig.max_MSIX_InterruptVectors = loResource->loLevelOption.maxInterruptVectors;
 3974   tdsaAllShared->SwConfig.max_MSI_InterruptVectors = loResource->loLevelOption.max_MSI_InterruptVectors;
 3975   tdsaAllShared->SwConfig.legacyInt_X = loResource->loLevelOption.flag;
 3976   TI_DBG2(("tiCOMPortInit: got max_MSIX_InterruptVectors %d \n", tdsaAllShared->SwConfig.max_MSIX_InterruptVectors));
 3977   TI_DBG2(("tiCOMPortInit: got max_MSI_InterruptVectors %d \n", tdsaAllShared->SwConfig.max_MSI_InterruptVectors));
 3978   TI_DBG2(("tiCOMPortInit: got flag - legacyInt_X %d \n", tdsaAllShared->SwConfig.legacyInt_X));
 3979 
 3980   /* error checking for interrupt types */
 3981   if (
 3982       ((tdsaAllShared->SwConfig.max_MSIX_InterruptVectors == 0) &&
 3983        (tdsaAllShared->SwConfig.max_MSI_InterruptVectors == 0)  &&
 3984        (tdsaAllShared->SwConfig.legacyInt_X == 0))
 3985       ||
 3986       ((tdsaAllShared->SwConfig.max_MSIX_InterruptVectors != 0) &&
 3987        (tdsaAllShared->SwConfig.max_MSI_InterruptVectors == 0)  &&
 3988        (tdsaAllShared->SwConfig.legacyInt_X == 0))
 3989       ||
 3990       ((tdsaAllShared->SwConfig.max_MSIX_InterruptVectors == 0) &&
 3991        (tdsaAllShared->SwConfig.max_MSI_InterruptVectors != 0)  &&
 3992        (tdsaAllShared->SwConfig.legacyInt_X == 0))
 3993       ||
 3994       ((tdsaAllShared->SwConfig.max_MSIX_InterruptVectors == 0) &&
 3995        (tdsaAllShared->SwConfig.max_MSI_InterruptVectors == 0)  &&
 3996        (tdsaAllShared->SwConfig.legacyInt_X != 0))
 3997      )
 3998   {
 3999     /* do nothing */
 4000   }
 4001   else
 4002   {
 4003     TI_DBG1(("tiCOMPortInit: incorrect interrupt\n"));
 4004     return tiError;
 4005   }
 4006 
 4007   QueueConfig = &tdsaAllShared->QueueConfig;
 4008 
 4009   for(i=0;i<QueueConfig->numInboundQueues;i++)
 4010   {
 4011     QueueConfig->inboundQueues[i].elementCount = tdsaAllShared->InboundQueueSize[i];
 4012     QueueConfig->inboundQueues[i].elementSize = tdsaAllShared->InboundQueueEleSize[i];
 4013     QueueConfig->inboundQueues[i].priority = tdsaAllShared->InboundQueuePriority[i];
 4014     QueueConfig->inboundQueues[i].reserved = 0;
 4015     TI_DBG6(("tiCOMPortInit: InboundQueuePriroity %d \n", tdsaAllShared->InboundQueuePriority[i]));
 4016   }
 4017   for(i=0;i<QueueConfig->numOutboundQueues;i++)
 4018   {
 4019     QueueConfig->outboundQueues[i].elementCount = tdsaAllShared->OutboundQueueSize[i];
 4020     QueueConfig->outboundQueues[i].elementSize = tdsaAllShared->OutboundQueueEleSize[i];
 4021     QueueConfig->outboundQueues[i].interruptDelay = tdsaAllShared->OutboundQueueInterruptDelay[i]; /* default 0; no interrupt delay */
 4022     QueueConfig->outboundQueues[i].interruptCount = tdsaAllShared->OutboundQueueInterruptCount[i]; /* default 1 */
 4023     QueueConfig->outboundQueues[i].interruptEnable = tdsaAllShared->OutboundQueueInterruptEnable[i]; /* default 1 */
 4024     QueueConfig->outboundQueues[i].interruptVectorIndex = 0;
 4025     if (tdsaAllShared->SwConfig.max_MSIX_InterruptVectors != 0)
 4026     {
 4027       QueueConfig->outboundQueues[i].interruptVectorIndex = i % tdsaAllShared->SwConfig.max_MSIX_InterruptVectors;
 4028     }
 4029     else if (tdsaAllShared->SwConfig.max_MSI_InterruptVectors != 0)
 4030     {
 4031       QueueConfig->outboundQueues[i].interruptVectorIndex = i % tdsaAllShared->SwConfig.max_MSI_InterruptVectors;
 4032     }
 4033     else
 4034     {
 4035       QueueConfig->outboundQueues[i].interruptVectorIndex = 0;
 4036     }
 4037     TI_DBG6(("tiCOMPortInit: OutboundQueueInterruptDelay %d OutboundQueueInterruptCount %d OutboundQueueInterruptEnable %d\n", tdsaAllShared->OutboundQueueInterruptDelay[i], tdsaAllShared->OutboundQueueInterruptCount[i], tdsaAllShared->OutboundQueueInterruptEnable[i]));
 4038 
 4039   }
 4040   /* queue option */
 4041   QueueConfig->queueOption = tdsaAllShared->QueueOption;
 4042 
 4043   tdsaAllShared->SwConfig.param3 = (void *)QueueConfig;
 4044   tdsaAllShared->SwConfig.stallUsec = 10;
 4045 
 4046   /* finds a first high priority queue for SMP */
 4047   tdsaAllShared->SMPQNum = 0; /* default */
 4048   for(i=0;i<QueueConfig->numInboundQueues;i++)
 4049   {
 4050     if (QueueConfig->inboundQueues[i].priority != DEFAULT_INBOUND_QUEUE_PRIORITY) /* 0 */
 4051     {
 4052       tdsaAllShared->SMPQNum = i;
 4053       break;
 4054     }
 4055   }
 4056 
 4057   tdsaGetHwConfigParams(tiRoot);
 4058 
 4059   tdsaPrintHwConfig(&(tdsaAllShared->HwConfig));
 4060 
 4061 #ifdef TARGET_DRIVER
 4062   /* target, not yet */
 4063   if (tdsaAllShared->currentOperation & TD_OPERATION_TARGET)
 4064   {
 4065     ttdssGetTargetParams(tiRoot);
 4066   }
 4067 #endif
 4068 
 4069 #if defined(FDS_DM) && defined(FDS_SM)
 4070   /*
 4071     needs to call saGetRequirements() to find out agMemoryRequirement.count requested by LL
 4072   */
 4073   osti_memcpy(&tmpLLSwConfig, &(tdsaAllShared->SwConfig), sizeof(agsaSwConfig_t));
 4074 
 4075   saGetRequirements(agRoot,
 4076                     &tmpLLSwConfig,
 4077                     &memRequirement,
 4078                     &usecsPerTick,
 4079                     &maxQueueSets
 4080                     );
 4081   TI_DBG1(("tiCOMPortInit: usecsPerTick %d\n", usecsPerTick));
 4082 
 4083   TI_DBG1(("tiCOMPortInit: LL memRequirement.count %d\n", memRequirement.count));
 4084   TI_DBG1(("tiCOMPortInit: loResource->loLevelMem.count %d\n", loResource->loLevelMem.count));
 4085   LLMemCount = memRequirement.count;
 4086 
 4087   /*
 4088     needs to call dmGetRequirements() to find out dmMemoryRequirement.count requested by DM
 4089   */
 4090 
 4091   dmGetRequirements(dmRoot,
 4092                     &dmSwConfig,
 4093                     &dmMemRequirement,
 4094                     &dmUsecsPerTick,
 4095                     &dmMaxNumLocks
 4096                     );
 4097 
 4098   TI_DBG1(("tiCOMPortInit: DM dmmemRequirement.count %d\n", dmMemRequirement.count));
 4099   TI_DBG1(("tiCOMPortInit: loResource->loLevelMem.count %d\n", loResource->loLevelMem.count));
 4100 
 4101   DMMemCount = dmMemRequirement.count;
 4102   SMMemCount = loResource->loLevelMem.count - LLMemCount - DMMemCount;
 4103   agMemoryRequirement.count =  LLMemCount;
 4104 
 4105   TI_DBG1(("tiCOMPortInit: SMMemCount %d\n", SMMemCount));
 4106 
 4107 
 4108 #elif defined(FDS_DM)
 4109   /*
 4110     needs to call saGetRequirements() to find out agMemoryRequirement.count requested by LL
 4111   */
 4112   osti_memcpy(&tmpLLSwConfig, &(tdsaAllShared->SwConfig), sizeof(agsaSwConfig_t));
 4113 
 4114   saGetRequirements(agRoot,
 4115                     &tmpLLSwConfig,
 4116                     &memRequirement,
 4117                     &usecsPerTick,
 4118                     &maxQueueSets
 4119                     );
 4120 
 4121   TI_DBG1(("tiCOMPortInit: memRequirement.count %d\n", memRequirement.count));
 4122   TI_DBG1(("tiCOMPortInit: loResource->loLevelMem.count %d\n", loResource->loLevelMem.count));
 4123 
 4124   LLMemCount = memRequirement.count;
 4125   DMMemCount = loResource->loLevelMem.count - LLMemCount;
 4126 
 4127   agMemoryRequirement.count =  LLMemCount;
 4128 
 4129 #elif defined(FDS_SM)
 4130   osti_memcpy(&tmpLLSwConfig, &(tdsaAllShared->SwConfig), sizeof(agsaSwConfig_t));
 4131 
 4132   saGetRequirements(agRoot,
 4133                     &tmpLLSwConfig,
 4134                     &memRequirement,
 4135                     &usecsPerTick,
 4136                     &maxQueueSets
 4137                     );
 4138 
 4139   TI_DBG1(("tiCOMPortInit: memRequirement.count %d\n", memRequirement.count));
 4140   TI_DBG1(("tiCOMPortInit: loResource->loLevelMem.count %d\n", loResource->loLevelMem.count));
 4141 
 4142   LLMemCount = memRequirement.count;
 4143   SMMemCount = loResource->loLevelMem.count - LLMemCount;
 4144 
 4145   agMemoryRequirement.count =  LLMemCount;
 4146 
 4147 #else
 4148 
 4149   agMemoryRequirement.count = loResource->loLevelMem.count;
 4150 
 4151 #endif
 4152 
 4153 #if defined(FDS_DM) && defined(FDS_SM)
 4154   /* for debugging */
 4155   for(i=0;i<(int)(LLMemCount + DMMemCount + SMMemCount);i++)
 4156   {
 4157     TI_DBG2(("tiCOMPortInit: index %d phyAddrUpper 0x%x phyAddrLower 0x%x totalLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].physAddrUpper, loResource->loLevelMem.mem[i].physAddrLower, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].alignment));
 4158     TI_DBG2(("tiCOMPortInit: index %d virtPtr %p\n",i, loResource->loLevelMem.mem[i].virtPtr));
 4159   }
 4160 #endif
 4161 
 4162   /* initialize */
 4163   TI_DBG6(("tiCOMPortInit: AGSA_NUM_MEM_CHUNKS %d\n", AGSA_NUM_MEM_CHUNKS));
 4164   for(i=0;i<AGSA_NUM_MEM_CHUNKS;i++)
 4165   {
 4166     agMemoryRequirement.agMemory[i].virtPtr = agNULL;
 4167     agMemoryRequirement.agMemory[i].osHandle = agNULL;
 4168     agMemoryRequirement.agMemory[i].phyAddrUpper = 0;
 4169     agMemoryRequirement.agMemory[i].phyAddrLower = 0;
 4170     agMemoryRequirement.agMemory[i].totalLength = 0;
 4171     agMemoryRequirement.agMemory[i].numElements = 0;
 4172     agMemoryRequirement.agMemory[i].singleElementLength = 0;
 4173     agMemoryRequirement.agMemory[i].alignment = 0;
 4174     agMemoryRequirement.agMemory[i].type = 0;
 4175     agMemoryRequirement.agMemory[i].reserved = 0;
 4176   }
 4177 
 4178   for(i=0;i<(int)agMemoryRequirement.count;i++)
 4179   {
 4180     TI_DBG2(("tiCOMPortInit: LL copying loResource.loLevelMem to agsaMemoryRequirement_t index %d\n", i));
 4181     agMemoryRequirement.agMemory[i].virtPtr = loResource->loLevelMem.mem[i].virtPtr;
 4182     agMemoryRequirement.agMemory[i].osHandle = loResource->loLevelMem.mem[i].osHandle;
 4183     agMemoryRequirement.agMemory[i].phyAddrUpper = loResource->loLevelMem.mem[i].physAddrUpper;
 4184     agMemoryRequirement.agMemory[i].phyAddrLower = loResource->loLevelMem.mem[i].physAddrLower;
 4185     agMemoryRequirement.agMemory[i].totalLength = loResource->loLevelMem.mem[i].totalLength;
 4186     agMemoryRequirement.agMemory[i].numElements = loResource->loLevelMem.mem[i].numElements;
 4187     agMemoryRequirement.agMemory[i].singleElementLength = loResource->loLevelMem.mem[i].singleElementLength;
 4188     agMemoryRequirement.agMemory[i].alignment = loResource->loLevelMem.mem[i].alignment;
 4189     if (loResource->loLevelMem.mem[i].type == TI_DMA_MEM)
 4190     {
 4191       agMemoryRequirement.agMemory[i].type = AGSA_DMA_MEM;
 4192     }
 4193     else if (loResource->loLevelMem.mem[i].type == TI_CACHED_MEM)
 4194     {
 4195       agMemoryRequirement.agMemory[i].type = AGSA_CACHED_MEM;
 4196 
 4197     }
 4198     else if (loResource->loLevelMem.mem[i].type == TI_CACHED_DMA_MEM)
 4199     {
 4200       agMemoryRequirement.agMemory[i].type = AGSA_CACHED_DMA_MEM;
 4201     }
 4202 
 4203     agMemoryRequirement.agMemory[i].reserved = loResource->loLevelMem.mem[i].reserved;
 4204     TI_DBG2(("tiCOMPortInit: index %d virtPtr %p osHandle %p\n",i, loResource->loLevelMem.mem[i].virtPtr, loResource->loLevelMem.mem[i].osHandle));
 4205     TI_DBG2(("tiCOMPortInit: index %d phyAddrUpper 0x%x phyAddrLower 0x%x totalLength %d numElements %d\n", i,
 4206     loResource->loLevelMem.mem[i].physAddrUpper,
 4207     loResource->loLevelMem.mem[i].physAddrLower,
 4208     loResource->loLevelMem.mem[i].totalLength,
 4209     loResource->loLevelMem.mem[i].numElements));
 4210     TI_DBG2(("tiCOMPortInit: index %d singleElementLength 0x%x alignment 0x%x type %d reserved %d\n", i,
 4211     loResource->loLevelMem.mem[i].singleElementLength,
 4212     loResource->loLevelMem.mem[i].alignment,
 4213     loResource->loLevelMem.mem[i].type,
 4214     loResource->loLevelMem.mem[i].reserved));
 4215 
 4216   }
 4217   osti_memset(&(tdsaAllShared->tdFWControlEx), 0, sizeof(tdFWControlEx_t));
 4218 
 4219   /*
 4220    * Note: Be sure to call this only once since sallsdk does initialization only once
 4221    * saInitialize(IN, IN, IN, IN, IN);
 4222    */
 4223 
 4224   TI_DBG1(("tiCOMPortInit: tdsaAllShared->tdDeviceIdVendId %x\n",tdsaAllShared->tdDeviceIdVendId));
 4225   TI_DBG1(("tiCOMPortInit: tdsaAllShared->tdSubVendorId= SUB_VEN_ID %x\n",tdsaAllShared->tdSubVendorId));
 4226 
 4227   TI_DBG1(("tiCOMPortInit: swConfig->param1 hwDEVICE_ID_VENDID %x\n", tdsaAllShared->SwConfig.param1 ));
 4228   TI_DBG1(("tiCOMPortInit: swConfig->param2 hwSVID             %x\n", tdsaAllShared->SwConfig.param2));
 4229 
 4230   /*
 4231     1. Read hostDirectAccessSupport
 4232     2. If set, read HDA images based on chip ID
 4233  */
 4234 
 4235   t_MacroCheck(agRoot);
 4236 
 4237 #ifndef TURN_OFF_HDA
 4238   if (tdsaAllShared->SwConfig.hostDirectAccessSupport != 0)
 4239   {
 4240     osti_memset(&HDAImg, 0, sizeof(HDAImg));
 4241     if (tiIS_SPC(agRoot))
 4242     {
 4243       TI_DBG1(("tiCOMPortInit: SPC HDA\n"));
 4244       HDAImg.aap1Img = (bit8*)(&aap1array);
 4245       HDAImg.aap1Len = sizeof( aap1array);
 4246       HDAImg.iopImg  = (bit8*)(&ioparray);
 4247       HDAImg.iopLen  = sizeof(  ioparray);
 4248       HDAImg.istrImg = (bit8*)(&istrarray);
 4249       HDAImg.istrLen = sizeof( istrarray);
 4250 
 4251       HDAImg.ilaImg  = (bit8*)(&ilaarray);
 4252       HDAImg.ilaLen  = sizeof(ilaarray);
 4253     }
 4254     else if (tiIS_SPC6V(agRoot))
 4255     {
 4256       TI_DBG1(("tiCOMPortInit: SPCv HDA\n"));
 4257       HDAImg.aap1Img = (bit8*)(&spcv_aap1array);
 4258       HDAImg.aap1Len =  sizeof( spcv_aap1array);
 4259       HDAImg.iopImg  = (bit8*)(&spcv_ioparray);
 4260       HDAImg.iopLen  = sizeof(  spcv_ioparray);
 4261 
 4262       HDAImg.ilaImg  = (bit8*)(&spcv_ilaarray);
 4263       HDAImg.ilaLen  = sizeof(spcv_ilaarray);
 4264     }
 4265     else if (tIsSPCV12G(agRoot))
 4266     {
 4267       TI_DBG1(("tiCOMPortInit: SPCv12G HDA\n"));
 4268       HDAImg.aap1Img = (bit8*)(&spcv12g_raaearray);
 4269       HDAImg.aap1Len =  sizeof( spcv12g_raaearray);
 4270       HDAImg.iopImg  = (bit8*)(&spcv12g_ioparray);
 4271       HDAImg.iopLen  = sizeof(  spcv12g_ioparray);
 4272 
 4273       HDAImg.ilaImg  = (bit8*)(&spcv12g_ilaarray);
 4274       HDAImg.ilaLen  = sizeof(spcv12g_ilaarray);
 4275     }
 4276     else
 4277     {
 4278       TI_DBG1(("tiCOMPortInit: HDA Mode Unknown chip type 0x%08x\n",ossaHwRegReadConfig32(agRoot,0 )));
 4279       return tiError;
 4280     }
 4281     TI_DBG1(("tiCOMPortInit: HDA aap1Len 0x%08x iopLen 0x%08x ilaLen 0x%08x\n",HDAImg.aap1Len,HDAImg.iopLen,HDAImg.ilaLen ));
 4282     tdsaAllShared->SwConfig.param4 = &(HDAImg);
 4283   }
 4284   else
 4285   {
 4286     TI_DBG1(("tiCOMPortInit: HDA off\n"));
 4287     tdsaAllShared->SwConfig.param4 = agNULL;
 4288   }
 4289 #endif /*  TURN_OFF_HDA */
 4290 
 4291   if (tiIS_SPC(agRoot))
 4292   {
 4293     /* FW config is only for SPC */
 4294     tdsaAllShared->SwConfig.FWConfig = 0;
 4295     /* default port recovery timer 0x32 = 50 = 5000ms and port reset timer 3 (300 ms)*/
 4296     tdsaAllShared->SwConfig.PortRecoveryResetTimer = 0x30032;
 4297     TI_DBG1(("tiCOMPortInit:only for SPC FWConfig set\n"));
 4298   }
 4299 
 4300   tdsaAllShared->SwConfig.fatalErrorInterruptVector = loResource->loLevelOption.maxInterruptVectors > 31 ? 31 : loResource->loLevelOption.maxInterruptVectors -1;
 4301 
 4302   TI_DBG1(("tiCOMPortInit: SwConfig->FWConfig 0x%x\n", tdsaAllShared->SwConfig.FWConfig));
 4303   TI_DBG1(("tiCOMPortInit: SwConfig->fatalErrorInterruptVector 0x%x\n", tdsaAllShared->SwConfig.fatalErrorInterruptVector));
 4304   TI_DBG1(("tiCOMPortInit: loResource->loLevelOption.usecsPerTick %d\n", loResource->loLevelOption.usecsPerTick));
 4305 
 4306   status = saInitialize(agRoot,
 4307                         &agMemoryRequirement,
 4308                         &(tdsaAllShared->HwConfig),
 4309                         /* &temp_HwConfig, */
 4310                         &(tdsaAllShared->SwConfig),
 4311                         loResource->loLevelOption.usecsPerTick);
 4312 
 4313   TI_DBG6(("tiCOMPortInit: loResource->loLevelOption.usecsPerTick %d 0x%x\n", loResource->loLevelOption.usecsPerTick, loResource->loLevelOption.usecsPerTick));
 4314 
 4315   /*TI_DBG6(("tiCOMPortInit: tdsaAllShared->SwConfig.enableDIF %d\n", tdsaAllShared->SwConfig.enableDIF)); */
 4316   /*TI_DBG6(("tiCOMPortInit: tdsaAllShared->SwConfig.enableEncryption %d\n", tdsaAllShared->SwConfig.enableEncryption)); */
 4317 
 4318   if(status == AGSA_RC_FAILURE )
 4319   {
 4320     TI_DBG1(("tiCOMPortInit: saInitialize AGSA_RC_FAILURE, status 0x%x\n", status));
 4321     return tiError;
 4322   }
 4323 
 4324   if( status == AGSA_RC_VERSION_INCOMPATIBLE)
 4325   {
 4326     TI_DBG1(("tiCOMPortInit: saInitialize AGSA_RC_VERSION_INCOMPATIBLE, status 0x%x\n", status));
 4327     return tiError;
 4328   }
 4329 
 4330   /* let's make sdkData same for Int and Non-int agRoots */
 4331   tdsaAllShared->agRootInt.sdkData = tdsaAllShared->agRootNonInt.sdkData;
 4332 
 4333 
 4334   /* mark the port as initialized */
 4335   for(i=0;i<TD_MAX_NUM_PHYS;i++)
 4336   {
 4337     tdsaAllShared->Ports[i].flags.portInitialized = agTRUE;
 4338   }
 4339 
 4340 #ifdef INITIATOR_DRIVER                 //ini. only in stsdkll spec (TP)
 4341   /* register device registration callback function */
 4342   TI_DBG6(("tiCOMPortInit: calling saRegisterEventCallback for device registration\n"));
 4343   status = saRegisterEventCallback(agRoot, OSSA_EVENT_SOURCE_DEVICE_HANDLE_ADDED, (void *)ossaDeviceRegistrationCB);
 4344   if (status == AGSA_RC_FAILURE)
 4345   {
 4346     TI_DBG6(("tiCOMPortInit: saRegisterEventCallback Device Register failed\n"));
 4347   }
 4348   else
 4349   {
 4350     TI_DBG6(("tiCOMPortInit: saRegisterEventCallback Device Register succeeded\n"));
 4351   }
 4352 #endif
 4353 
 4354   /* register device deregistration callback function */
 4355   TI_DBG6(("tiCOMPortInit: calling saRegisterEventCallback for device de-registration\n"));
 4356   status = saRegisterEventCallback(agRoot, OSSA_EVENT_SOURCE_DEVICE_HANDLE_REMOVED, (void *)ossaDeregisterDeviceHandleCB);
 4357   if (status == AGSA_RC_FAILURE)
 4358   {
 4359     TI_DBG6(("tiCOMPortInit: saRegisterEventCallback Device Deregister failed\n"));
 4360   }
 4361   else
 4362   {
 4363     TI_DBG6(("tiCOMPortInit: saRegisterEventCallback Device Deregister succeeded\n"));
 4364   }
 4365 
 4366 #ifdef ECHO_TESTING
 4367   /* temporary to test saEchoCommand() */
 4368   /*
 4369     send echo
 4370   */
 4371   payload[0] = gEcho;
 4372   payload[55] = gEcho;
 4373   TI_DBG2(("tiCOMPortInit: calling saEchoCommand gEcho %d\n", gEcho));
 4374   saEchoCommand(agRoot, agNULL, tdsaRotateQnumber(tiRoot, agNULL), (void *)&payload);
 4375   gEcho++;
 4376 #endif
 4377 
 4378 #ifdef CONTROLLER_STATUS_TESTING
 4379   TI_DBG1(("tiCOMPortInit: saGetControllerStatus returns 0x%X\n",saGetControllerStatus(agRoot,&agcontrollerStatus ) ));
 4380 #endif /* CONTROLLER_INFO_TESTING */
 4381 
 4382 #ifdef CONTROLLER_INFO_TESTING
 4383   TI_DBG1(("tiCOMPortInit: saGetControllerInfo returns 0x%X\n",saGetControllerInfo(agRoot,&agcontrollerInfo ) ));
 4384 #endif /* CONTROLLER_INFO_TESTING */
 4385 
 4386 #ifdef CONTROLLER_ENCRYPT_TESTING
 4387   TI_DBG1(("tiCOMPortInit: saEncryptGetMode returns 0x%X\n",saEncryptGetMode(agRoot,agNULL,&agsaEncryptInfo ) ));
 4388 #endif /* CONTROLLER_INFO_TESTING */
 4389 
 4390 
 4391 #ifdef VPD_TESTING
 4392   /* temporary to test saSetVPDCommand() and saGetVPDCommand */
 4393   tdsaVPDSet(tiRoot);
 4394 #endif /* VPD_TESTING */
 4395 
 4396 #if defined(FDS_DM) && defined(FDS_SM)
 4397   /* initialize DM then SM */
 4398   /* DM */
 4399   dmRoot = &(tdsaAllShared->dmRoot);
 4400   osti_memset(&dmMemRequirement, 0, sizeof(dmMemoryRequirement_t));
 4401 
 4402   dmMemRequirement.count = DMMemCount;
 4403 
 4404   for(i=LLMemCount;i<(int)(LLMemCount + DMMemCount);i++)
 4405   {
 4406     TI_DBG2(("tiCOMPortInit: DM copying loResource.loLevelMem to agsaMemoryRequirement_t index %d\n", i));
 4407     dmMemRequirement.dmMemory[i-LLMemCount].virtPtr = loResource->loLevelMem.mem[i].virtPtr;
 4408     dmMemRequirement.dmMemory[i-LLMemCount].osHandle = loResource->loLevelMem.mem[i].osHandle;
 4409     dmMemRequirement.dmMemory[i-LLMemCount].physAddrUpper = loResource->loLevelMem.mem[i].physAddrUpper;
 4410     dmMemRequirement.dmMemory[i-LLMemCount].physAddrLower = loResource->loLevelMem.mem[i].physAddrLower;
 4411     dmMemRequirement.dmMemory[i-LLMemCount].totalLength = loResource->loLevelMem.mem[i].totalLength;
 4412     dmMemRequirement.dmMemory[i-LLMemCount].numElements = loResource->loLevelMem.mem[i].numElements;
 4413     dmMemRequirement.dmMemory[i-LLMemCount].singleElementLength = loResource->loLevelMem.mem[i].singleElementLength;
 4414     dmMemRequirement.dmMemory[i-LLMemCount].alignment = loResource->loLevelMem.mem[i].alignment;
 4415     dmMemRequirement.dmMemory[i-LLMemCount].type = loResource->loLevelMem.mem[i].type;
 4416     dmMemRequirement.dmMemory[i-LLMemCount].reserved = loResource->loLevelMem.mem[i].reserved;
 4417     TI_DBG2(("tiCOMPortInit: index %d virtPtr %p osHandle %p\n",i, loResource->loLevelMem.mem[i].virtPtr, loResource->loLevelMem.mem[i].osHandle));
 4418     TI_DBG2(("tiCOMPortInit: index %d phyAddrUpper 0x%x phyAddrLower 0x%x totalLength %d numElements %d\n", i,
 4419     loResource->loLevelMem.mem[i].physAddrUpper,
 4420     loResource->loLevelMem.mem[i].physAddrLower,
 4421     loResource->loLevelMem.mem[i].totalLength,
 4422     loResource->loLevelMem.mem[i].numElements));
 4423     TI_DBG2(("tiCOMPortInit: index %d singleElementLength 0x%x alignment 0x%x type %d reserved %d\n", i,
 4424     loResource->loLevelMem.mem[i].singleElementLength,
 4425     loResource->loLevelMem.mem[i].alignment,
 4426     loResource->loLevelMem.mem[i].type,
 4427     loResource->loLevelMem.mem[i].reserved));
 4428 
 4429   }
 4430 
 4431   status = dmInitialize(dmRoot,
 4432                         agRoot,
 4433                         &dmMemRequirement,
 4434                         &(tdsaAllShared->dmSwConfig), //&dmSwConfig, /* start here */
 4435                         loResource->loLevelOption.usecsPerTick);
 4436 
 4437   if(status == DM_RC_FAILURE || status == DM_RC_VERSION_INCOMPATIBLE)
 4438   {
 4439     TI_DBG1(("tiCOMPortInit: dmInitialize FAILED, status 0x%x\n", status));
 4440     return tiError;
 4441   }
 4442 
 4443   /* SM */
 4444   smRoot = &(tdsaAllShared->smRoot);
 4445   osti_memset(&smMemRequirement, 0, sizeof(smMemoryRequirement_t));
 4446 
 4447   smMemRequirement.count = SMMemCount;
 4448 
 4449   for(i=(LLMemCount + DMMemCount);i<(int)(LLMemCount + DMMemCount + SMMemCount);i++)
 4450   {
 4451     TI_DBG1(("tiCOMPortInit: SM copying loResource.loLevelMem to agsaMemoryRequirement_t index %d\n", i));
 4452     smMemRequirement.smMemory[i-LLMemCount-DMMemCount].virtPtr = loResource->loLevelMem.mem[i].virtPtr;
 4453     smMemRequirement.smMemory[i-LLMemCount-DMMemCount].osHandle = loResource->loLevelMem.mem[i].osHandle;
 4454     smMemRequirement.smMemory[i-LLMemCount-DMMemCount].physAddrUpper = loResource->loLevelMem.mem[i].physAddrUpper;
 4455     smMemRequirement.smMemory[i-LLMemCount-DMMemCount].physAddrLower = loResource->loLevelMem.mem[i].physAddrLower;
 4456     smMemRequirement.smMemory[i-LLMemCount-DMMemCount].totalLength = loResource->loLevelMem.mem[i].totalLength;
 4457     smMemRequirement.smMemory[i-LLMemCount-DMMemCount].numElements = loResource->loLevelMem.mem[i].numElements;
 4458     smMemRequirement.smMemory[i-LLMemCount-DMMemCount].singleElementLength = loResource->loLevelMem.mem[i].singleElementLength;
 4459     smMemRequirement.smMemory[i-LLMemCount-DMMemCount].alignment = loResource->loLevelMem.mem[i].alignment;
 4460     smMemRequirement.smMemory[i-LLMemCount-DMMemCount].type = loResource->loLevelMem.mem[i].type;
 4461     smMemRequirement.smMemory[i-LLMemCount-DMMemCount].reserved = loResource->loLevelMem.mem[i].reserved;
 4462     TI_DBG2(("tiCOMPortInit: index %d virtPtr %p osHandle %p\n",i, loResource->loLevelMem.mem[i].virtPtr, loResource->loLevelMem.mem[i].osHandle));
 4463     TI_DBG2(("tiCOMPortInit: index %d phyAddrUpper 0x%x phyAddrLower 0x%x totalLength %d numElements %d\n", i,
 4464     loResource->loLevelMem.mem[i].physAddrUpper,
 4465     loResource->loLevelMem.mem[i].physAddrLower,
 4466     loResource->loLevelMem.mem[i].totalLength,
 4467     loResource->loLevelMem.mem[i].numElements));
 4468     TI_DBG2(("tiCOMPortInit: index %d singleElementLength 0x%x alignment 0x%x type %d reserved %d\n", i,
 4469     loResource->loLevelMem.mem[i].singleElementLength,
 4470     loResource->loLevelMem.mem[i].alignment,
 4471     loResource->loLevelMem.mem[i].type,
 4472     loResource->loLevelMem.mem[i].reserved));
 4473 
 4474   }
 4475 
 4476   status = smInitialize(smRoot,
 4477                         agRoot,
 4478                         &smMemRequirement,
 4479                         &(tdsaAllShared->smSwConfig), //&smSwConfig, /* start here */
 4480                         loResource->loLevelOption.usecsPerTick);
 4481 
 4482   if(status == SM_RC_FAILURE || status == SM_RC_VERSION_INCOMPATIBLE)
 4483   {
 4484     TI_DBG1(("tiCOMPortInit: smInitialize FAILED, status 0x%x\n", status));
 4485     return tiError;
 4486   }
 4487 
 4488 #elif defined(FDS_DM)
 4489   dmRoot = &(tdsaAllShared->dmRoot);
 4490   osti_memset(&dmMemRequirement, 0, sizeof(dmMemoryRequirement_t));
 4491 
 4492   dmMemRequirement.count = DMMemCount;
 4493 
 4494   for(i=LLMemCount;i<(int)(LLMemCount + DMMemCount);i++)
 4495   {
 4496     TI_DBG6(("tiCOMPortInit: copying loResource.loLevelMem to agsaMemoryRequirement_t index %d\n", i));
 4497     dmMemRequirement.dmMemory[i-LLMemCount].virtPtr = loResource->loLevelMem.mem[i].virtPtr;
 4498     dmMemRequirement.dmMemory[i-LLMemCount].osHandle = loResource->loLevelMem.mem[i].osHandle;
 4499     dmMemRequirement.dmMemory[i-LLMemCount].physAddrUpper = loResource->loLevelMem.mem[i].physAddrUpper;
 4500     dmMemRequirement.dmMemory[i-LLMemCount].physAddrLower = loResource->loLevelMem.mem[i].physAddrLower;
 4501     dmMemRequirement.dmMemory[i-LLMemCount].totalLength = loResource->loLevelMem.mem[i].totalLength;
 4502     dmMemRequirement.dmMemory[i-LLMemCount].numElements = loResource->loLevelMem.mem[i].numElements;
 4503     dmMemRequirement.dmMemory[i-LLMemCount].singleElementLength = loResource->loLevelMem.mem[i].singleElementLength;
 4504     dmMemRequirement.dmMemory[i-LLMemCount].alignment = loResource->loLevelMem.mem[i].alignment;
 4505     dmMemRequirement.dmMemory[i-LLMemCount].type = loResource->loLevelMem.mem[i].type;
 4506     dmMemRequirement.dmMemory[i-LLMemCount].reserved = loResource->loLevelMem.mem[i].reserved;
 4507     TI_DBG6(("tiCOMPortInit: index %d phyAddrUpper 0x%x phyAddrLower 0x%x totalLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].physAddrUpper, loResource->loLevelMem.mem[i].physAddrLower, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].alignment));
 4508     TI_DBG6(("tiCOMPortInit: index %d virtPtr %p\n",i, loResource->loLevelMem.mem[i].virtPtr));
 4509 
 4510   }
 4511 
 4512   status = dmInitialize(dmRoot,
 4513                         agRoot,
 4514                         &dmMemRequirement,
 4515                         &(tdsaAllShared->dmSwConfig), //&dmSwConfig, /* start here */
 4516                         loResource->loLevelOption.usecsPerTick);
 4517 
 4518   if(status == DM_RC_FAILURE || status == DM_RC_VERSION_INCOMPATIBLE)
 4519   {
 4520     TI_DBG1(("tiCOMPortInit: dmInitialize FAILED, status 0x%x\n", status));
 4521     return tiError;
 4522   }
 4523 
 4524 #elif defined(FDS_SM)
 4525   smRoot = &(tdsaAllShared->smRoot);
 4526   osti_memset(&smMemRequirement, 0, sizeof(smMemoryRequirement_t));
 4527 
 4528   smMemRequirement.count = SMMemCount;
 4529 
 4530   for(i=LLMemCount;i<(int)(LLMemCount + SMMemCount);i++)
 4531   {
 4532     TI_DBG6(("tiCOMPortInit: copying loResource.loLevelMem to agsaMemoryRequirement_t index %d\n", i));
 4533     smMemRequirement.smMemory[i-LLMemCount].virtPtr = loResource->loLevelMem.mem[i].virtPtr;
 4534     smMemRequirement.smMemory[i-LLMemCount].osHandle = loResource->loLevelMem.mem[i].osHandle;
 4535     smMemRequirement.smMemory[i-LLMemCount].physAddrUpper = loResource->loLevelMem.mem[i].physAddrUpper;
 4536     smMemRequirement.smMemory[i-LLMemCount].physAddrLower = loResource->loLevelMem.mem[i].physAddrLower;
 4537     smMemRequirement.smMemory[i-LLMemCount].totalLength = loResource->loLevelMem.mem[i].totalLength;
 4538     smMemRequirement.smMemory[i-LLMemCount].numElements = loResource->loLevelMem.mem[i].numElements;
 4539     smMemRequirement.smMemory[i-LLMemCount].singleElementLength = loResource->loLevelMem.mem[i].singleElementLength;
 4540     smMemRequirement.smMemory[i-LLMemCount].alignment = loResource->loLevelMem.mem[i].alignment;
 4541     smMemRequirement.smMemory[i-LLMemCount].type = loResource->loLevelMem.mem[i].type;
 4542     smMemRequirement.smMemory[i-LLMemCount].reserved = loResource->loLevelMem.mem[i].reserved;
 4543     TI_DBG6(("tiCOMPortInit: index %d phyAddrUpper 0x%x phyAddrLower 0x%x totalLength %d alignment %d\n", i, loResource->loLevelMem.mem[i].physAddrUpper, loResource->loLevelMem.mem[i].physAddrLower, loResource->loLevelMem.mem[i].totalLength, loResource->loLevelMem.mem[i].alignment));
 4544     TI_DBG6(("tiCOMPortInit: index %d virtPtr %p\n",i, loResource->loLevelMem.mem[i].virtPtr));
 4545 
 4546   }
 4547 
 4548   status = smInitialize(smRoot,
 4549                         agRoot,
 4550                         &smMemRequirement,
 4551                         &(tdsaAllShared->smSwConfig), //&smSwConfig, /* start here */
 4552                         loResource->loLevelOption.usecsPerTick);
 4553 
 4554   if(status == SM_RC_FAILURE || status == SM_RC_VERSION_INCOMPATIBLE)
 4555   {
 4556     TI_DBG1(("tiCOMPortInit: smInitialize FAILED, status 0x%x\n", status));
 4557     return tiError;
 4558   }
 4559 #else
 4560   /* nothing */
 4561 #endif /* FDS_DM && FDS_SM */
 4562 
 4563   /* call these again after agroot is created  for testing */
 4564 #ifdef CONTROLLER_STATUS_TESTING
 4565   TI_DBG1(("tiCOMPortInit:again saGetControllerStatus returns 0x%X\n",saGetControllerStatus(agRoot,&agcontrollerStatus ) ));
 4566 #endif /* CONTROLLER_INFO_TESTING */
 4567 
 4568 #ifdef CONTROLLER_INFO_TESTING
 4569   TI_DBG1(("tiCOMPortInit:again saGetControllerInfo returns 0x%X\n",saGetControllerInfo(agRoot,&agcontrollerInfo ) ));
 4570 #endif /* CONTROLLER_INFO_TESTING */
 4571 
 4572 #ifdef CONTROLLER_ENCRYPT_TESTING
 4573   TI_DBG1(("tiCOMPortInit:again saEncryptGetMode returns 0x%X\n",saEncryptGetMode(agRoot,agNULL,&agsaEncryptInfo ) ));
 4574 #endif /* CONTROLLER_INFO_TESTING */
 4575 
 4576 /* Enable SGPIO */
 4577   if (tiSuccess == tiCOMConfigureSgpio(tiRoot, agTRUE))
 4578   {
 4579     TI_DBG2(("tiCOMPortInit: Successfully sent request to enable SGPIO\n"));
 4580   }
 4581   else
 4582   {
 4583     TI_DBG1(("tiCOMPortInit: Failed to enable SGPIO\n"));
 4584   }
 4585 
 4586   return tiSuccess;
 4587 }
 4588 
 4589 /*****************************************************************************
 4590 *! \brief SendSgpioRequest
 4591 *
 4592 *  Purpose: This function is used to send SGPIO request during initialization
 4593 *
 4594 *  \param   tiRoot: Pointer to the OS Specific module allocated tiRoot_t
 4595 *                   instance.
 4596 *  \param   regType: Register Type
 4597 *  \param   regIndex: Register Index
 4598 *  \param   regCount: Register Count
 4599 *  \param   writeData: Part of the request
 4600 *                  
 4601 *  \return:
 4602 *           tiSuccess on success
 4603 *           Other status on failure
 4604 *
 4605 *****************************************************************************/   
 4606 static bit32 SendSgpioRequest(
 4607                             tiRoot_t    *tiRoot,
 4608                             bit8        regType,
 4609                             bit8        regIndex,
 4610                             bit8        regCount,
 4611                             bit32       *writeData
 4612                             )
 4613 {
 4614     static bit32            buffer[128] = {0};
 4615     bit32                   status = tiError;
 4616     bit32                   retVal = IOCTL_CALL_FAIL;
 4617     tiIOCTLPayload_t        *agIOCTLPayload = (tiIOCTLPayload_t *) buffer;
 4618     agsaSGpioReqResponse_t  *pSGpioReq = (agsaSGpioReqResponse_t *) &agIOCTLPayload->FunctionSpecificArea[0];
 4619     agsaSGpioReqResponse_t  *pSgpioResponse = (agsaSGpioReqResponse_t *) &agIOCTLPayload->FunctionSpecificArea[0];
 4620 
 4621     do{
 4622   
 4623     /* Frame the Ioctl payload */
 4624     agIOCTLPayload->MajorFunction = IOCTL_MJ_SGPIO;
 4625     agIOCTLPayload->Length = sizeof(agsaSGpioReqResponse_t);
 4626     
 4627     /* Frame the SGPIO request */
 4628     pSGpioReq->smpFrameType = SMP_REQUEST;
 4629     pSGpioReq->function = AGSA_WRITE_SGPIO_REGISTER;
 4630     pSGpioReq->registerType = regType;
 4631     pSGpioReq->registerIndex = regIndex;
 4632     pSGpioReq->registerCount = regCount;
 4633     memcpy(pSGpioReq->readWriteData, writeData, regCount * 4);
 4634 
 4635     /* Send the SGPIO request */
 4636     sgpioResponseSet = 0;
 4637     retVal = tdsaSGpioIoctlSetup(tiRoot, agNULL, agIOCTLPayload, agNULL, agNULL);
 4638     if (retVal != IOCTL_CALL_PENDING)
 4639     {
 4640         break;
 4641     }
 4642     /* Waiting for SGPIO Response */
 4643     while(!sgpioResponseSet)
 4644     {
 4645         tiCOMDelayedInterruptHandler(tiRoot, 0, 1, tiNonInterruptContext);
 4646     }
 4647     sgpioResponseSet = 0;
 4648     /* Check the ioctl result */
 4649     if(agIOCTLPayload->Status != IOCTL_ERR_STATUS_OK)
 4650     {
 4651         break;
 4652     }
 4653     /* Check the sgpio function result */
 4654     if(pSgpioResponse->functionResult != 0x00)
 4655     {
 4656         break;
 4657     }
 4658 
 4659     status = tiSuccess;
 4660     
 4661   }while(0);
 4662     
 4663     return status;
 4664 }
 4665 
 4666 /*****************************************************************************
 4667 *! \brief tiCOMConfigureSgpio
 4668 *
 4669 *  Purpose: This function is used to configure SGPIO during initialization
 4670 *
 4671 *  \param   tiRoot: Pointer to the OS Specific module allocated tiRoot_t
 4672 *                   instance.
 4673 *  \param   enableSgpio: Enable / Disable SGPIO
 4674 *                  
 4675 *  \return:
 4676 *           tiSuccess on success
 4677 *           Other status on failure
 4678 *
 4679 *****************************************************************************/
 4680 bit32 tiCOMConfigureSgpio(
 4681                         tiRoot_t    *tiRoot,
 4682                         bit8        enableSgpio
 4683                         )
 4684 {
 4685     bit32           status = tiError;
 4686     bit32           i;
 4687     bit8            regCount;
 4688     bit32           writeData[OSSA_SGPIO_MAX_READ_DATA_COUNT] = {0};
 4689     agsaSGpioCfg0_t *pCfg0 = (agsaSGpioCfg0_t *) &writeData[0];
 4690     agsaSGpioCfg1_t *pCfg1 = (agsaSGpioCfg1_t *) &writeData[1];
 4691     tdsaRoot_t      *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
 4692     tdsaContext_t   *tdsaAllShared = (tdsaContext_t *) &tdsaRoot->tdsaAllShared;
 4693     bit32           phyCount = tdsaAllShared->phyCount;
 4694 
 4695     if (enableSgpio)
 4696     {
 4697         /* Configure both CFG[0] and CFG[1] */
 4698         regCount = 2;
 4699 
 4700         /* Enable SGPIO */
 4701         pCfg0->gpioEnable = 1;
 4702 
 4703         /* The following are the default values for CFG[1] suggested by SFF-8485 spec */
 4704         /* Maximum Activity ON: 2 */
 4705         /* Forced Activity OFF: 1 */
 4706         pCfg1->maxActOn = 2;
 4707         pCfg1->forceActOff = 1;
 4708     }
 4709     else
 4710     {
 4711         /* Configure CFG[0] only */
 4712         regCount = 1;
 4713 
 4714         /* Disable SGPIO */
 4715         pCfg0->gpioEnable = 0;
 4716     }
 4717 
 4718     status = SendSgpioRequest(tiRoot, AGSA_SGPIO_CONFIG_REG, 0, regCount, writeData);
 4719     if((tiSuccess == status) && (enableSgpio))
 4720     {
 4721          /* Write default values to transmit registers */ 
 4722          /* RegisterCount = Number of phys present in HBA / 4 */
 4723          regCount = phyCount / 4;
 4724          for(i = 0; i < regCount; i++)
 4725          {
 4726            /* Following are the default values specified in SFF-8485 spec */
 4727            /* Activity: 5 */
 4728            /* Locate: 0 */
 4729            /* Error: 0 */
 4730            writeData[i] = 0xA0A0A0A0;
 4731         }
 4732         status = SendSgpioRequest(tiRoot, AGSA_SGPIO_DRIVE_BY_DRIVE_TRANSMIT_REG, 0, regCount, writeData);
 4733    }
 4734     
 4735    return status;
 4736 }
 4737 
 4738 
 4739 /*****************************************************************************
 4740 *! \brief  tiCOMPortStart
 4741 *
 4742 *  Purpose: This function is called to bring the port hardware online. This
 4743 *           call could only be called until after the successful completion
 4744 *           tiCOMPortInit().
 4745 *
 4746 *  \param  tiRoot:          Pointer to root data structure.
 4747 *  \param  portID:          A ID for this portal to be used by the TD Layer
 4748 *                           to get the portal configuration information.
 4749 *  \param  portalContext:   Pointer to the context for this portal.
 4750 *  \param  option:          An option for starting a port
 4751 *
 4752 *  \return:
 4753 *          tiSuccess:      Successful.
 4754 *          Others:             Fail.
 4755 *
 4756 *  \note -
 4757 *   If sas or sata initiator, this will be called 8 (the number of phys) times.
 4758 *   If both sas and sata initiator, this will be called 16 times
 4759 *
 4760 *****************************************************************************/
 4761 /* portID is used as PhyID
 4762    Should return always tiSuccess. PortStarted is returned in ossaHwCB()
 4763 */
 4764 osGLOBAL bit32
 4765 tiCOMPortStart(
 4766                tiRoot_t          * tiRoot,
 4767                bit32               portID,
 4768                tiPortalContext_t * portalContext,
 4769                bit32               option
 4770                )
 4771 {
 4772   tdsaRoot_t    *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
 4773   tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 4774   agsaRoot_t *agRoot = &tdsaAllShared->agRootInt;
 4775   agsaSASProtocolTimerConfigurationPage_t SASConfigPage;
 4776   bit32 status = AGSA_RC_FAILURE;
 4777   static bit32 IsSendSASConfigPage = agFALSE;
 4778 
 4779 
 4780   TI_DBG3(("tiCOMPortStart: start portID %d\n", portID));
 4781 
 4782   /*
 4783    * return error if reset is in progress
 4784    */
 4785   if (tdsaAllShared->flags.resetInProgress == agTRUE)
 4786   {
 4787     TI_DBG1(("tiCOMPortStart: reset error\n"));
 4788     return tiError;
 4789   }
 4790 
 4791   /*
 4792    *
 4793    * port is not initialized, return error
 4794    */
 4795   if (tdsaAllShared->Ports[portID].flags.portInitialized == agFALSE)
 4796   {
 4797     TI_DBG1(("tiCOMPortStart: not intialized error\n"));
 4798     return tiError;
 4799   }
 4800 
 4801   /* portal has been started. */
 4802   if (portalContext->tdData != NULL)
 4803   {
 4804     if (tdsaAllShared->Ports[portID].flags.portStarted == agTRUE)
 4805     {
 4806       TI_DBG3 (("tiCOMPortStart : Cannot start port again: Port has already been started\n"));
 4807       ostiPortEvent (
 4808                      tiRoot,
 4809                      tiPortStarted,
 4810                      tiSuccess,
 4811                      (void *) tdsaAllShared->Ports[portID].tiPortalContext
 4812                      );
 4813       return tiSuccess;
 4814     }
 4815   }
 4816 
 4817   portalContext->tdData =  &(tdsaAllShared->Ports[portID]);
 4818   TI_DBG4 (("tiCOMPortStart : saving portalconext portID %d tdsaAllShared %p\n", portID, tdsaAllShared));
 4819   /* saving tiportalContext_t */
 4820   tdsaAllShared->Ports[portID].tiPortalContext = portalContext;
 4821   TI_DBG4(("tiCOMPortStart : portID/phyID %d tiPortalContext %p\n", portID, tdsaAllShared->Ports[portID].tiPortalContext));
 4822 
 4823   /*
 4824     where is "tdsaAllShared->Ports[0].portContext" set?
 4825     in ossaHWCB
 4826   */
 4827   if (tdsaAllShared->Ports[portID].flags.portStarted == agTRUE)
 4828   {
 4829     TI_DBG1(("tiCOMPortStart: port already has been started \n"));
 4830     return tiSuccess;
 4831   }
 4832 
 4833   
 4834   /*
 4835     hardcode sasID frame. It should be read by ostigettransportparams later from configuration file
 4836   */
 4837 #ifdef INITIATOR_DRIVER
 4838 
 4839   tdsaAllShared->Ports[portID].SASID.target_ssp_stp_smp = 0;
 4840   tdsaAllShared->Ports[portID].SASID.initiator_ssp_stp_smp
 4841       = SA_IDFRM_SSP_BIT | SA_IDFRM_STP_BIT | SA_IDFRM_SMP_BIT;
 4842   tdsaAllShared->Ports[portID].SASID.deviceType_addressFrameType = AGSA_DEV_TYPE_END_DEVICE;
 4843 
 4844   tdsaAllShared->Ports[portID].SASID.phyIdentifier = (bit8)portID;
 4845 
 4846 #endif
 4847 
 4848 #ifdef TARGET_DRIVER
 4849 
 4850   tdsaAllShared->Ports[portID].SASID.target_ssp_stp_smp = SA_IDFRM_SSP_BIT;
 4851   tdsaAllShared->Ports[portID].SASID.initiator_ssp_stp_smp = 0;
 4852   tdsaAllShared->Ports[portID].SASID.deviceType_addressFrameType = AGSA_DEV_TYPE_END_DEVICE;
 4853   tdsaAllShared->Ports[portID].SASID.phyIdentifier = (bit8)portID;
 4854 
 4855 #endif
 4856 
 4857 #if defined (INITIATOR_DRIVER) && defined (TARGET_DRIVER)
 4858 
 4859   /* for combo testing */
 4860   tdsaAllShared->Ports[portID].SASID.target_ssp_stp_smp = SA_IDFRM_SSP_BIT;
 4861   tdsaAllShared->Ports[portID].SASID.initiator_ssp_stp_smp
 4862       = SA_IDFRM_SSP_BIT | SA_IDFRM_STP_BIT | SA_IDFRM_SMP_BIT;
 4863   tdsaAllShared->Ports[portID].SASID.deviceType_addressFrameType = AGSA_DEV_TYPE_END_DEVICE;
 4864 
 4865   tdsaAllShared->Ports[portID].SASID.phyIdentifier = (bit8)portID;
 4866 
 4867 #endif
 4868 
 4869 
 4870   TI_DBG6(("tiCOMPortStart: before pid %d\n", portID));
 4871   tdssPrintSASIdentify(&(tdsaAllShared->Ports[portID].SASID));
 4872 
 4873   TI_DBG6(("tiCOMPortStart: sysIntsActive %s\n",
 4874            (tdsaAllShared->flags.sysIntsActive == agTRUE) ? "agTRUE" : "agFALSE"));
 4875 
 4876   /* Read global configuration first then card-specific configuration */
 4877 
 4878   /* the following must be processed only once */
 4879   if ( tdsaAllShared->first_process == agFALSE)
 4880   {
 4881     tdsaGetGlobalPhyParams(tiRoot);
 4882     tdsaGetCardPhyParams(tiRoot);
 4883     tdsaAllShared->first_process = agTRUE;
 4884   }
 4885 
 4886   TI_DBG6(("tiCOMPortStart: after pid %d\n", portID));
 4887   tdssPrintSASIdentify(&(tdsaAllShared->Ports[portID].SASID));
 4888 
 4889   /*
 4890      Phy Calibration
 4891   */
 4892   if (tdsaAllShared->phyCalibration)
 4893   {
 4894     /* Change default phy calibration */
 4895     tdsaAllShared->Ports[portID].agPhyConfig.phyProperties =
 4896       (tdsaAllShared->Ports[portID].agPhyConfig.phyProperties) | 0x80;
 4897     /* Setting index of phy calibration table index
 4898        portID is used as phy calibration table index
 4899     */
 4900     tdsaAllShared->Ports[portID].agPhyConfig.phyProperties =
 4901       (tdsaAllShared->Ports[portID].agPhyConfig.phyProperties) | (portID << 8);
 4902   }
 4903   TI_DBG2(("tiCOMPortStart: tdsaAllShared->Ports[0x%x].agPhyConfig.phyProperties 0x%x\n",
 4904     portID, tdsaAllShared->Ports[portID].agPhyConfig.phyProperties));
 4905 
 4906 
 4907   if(gSSC_Disable)
 4908   {
 4909     tdsaAllShared->Ports[portID].agPhyConfig.phyProperties = tdsaAllShared->Ports[portID].agPhyConfig.phyProperties | 0x40000;
 4910     TI_DBG1(("tiCOMPortStart:gSSC_Disable tdsaAllShared->Ports[portID].agPhyConfig.phyProperties 0x%x\n", tdsaAllShared->Ports[portID].agPhyConfig.phyProperties));
 4911 
 4912   }
 4913 
 4914   if(tIsSPCV12or6G(agRoot) && !IsSendSASConfigPage) /* Not SPC */
 4915   {
 4916     /* call saSetControllerConfig() to set STP_IDLE_TIME; All others are the defaults */
 4917     osti_memset(&SASConfigPage, 0, sizeof(agsaSASProtocolTimerConfigurationPage_t));
 4918     SASConfigPage.pageCode        =  AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE;
 4919     SASConfigPage.MST_MSI         =  3 << 15; /* enables both MCT for SSP target and initiator */
 4920     SASConfigPage.STP_SSP_MCT_TMO =  (tdsaAllShared->STP_MCT_TMO << 16) | tdsaAllShared->SSP_MCT_TMO; /* default of 3200 us for STP and SSP maximum connection time */
 4921     SASConfigPage.STP_FRM_TMO     = (tdsaAllShared->MAX_OPEN_TIME << 24) | (tdsaAllShared->SMP_MAX_CONN_TIMER << 16) | tdsaAllShared->STP_FRM_TMO; /* MAX_OPEN_TIME, SMP_MAX_CONN_TIMER, STP frame timeout */
 4922     SASConfigPage.STP_IDLE_TMO    =  tdsaAllShared->stp_idle_time;
 4923     if (SASConfigPage.STP_IDLE_TMO > 0x3FFFFFF)
 4924     {
 4925       SASConfigPage.STP_IDLE_TMO = 0x3FFFFFF;
 4926     }
 4927     SASConfigPage.OPNRJT_RTRY_INTVL =         (tdsaAllShared->MFD << 16)              | tdsaAllShared->OPNRJT_RTRY_INTVL; /* Multi Data Fetach enabled and 2 us for Open Reject Retry interval */
 4928     SASConfigPage.Data_Cmd_OPNRJT_RTRY_TMO =  (tdsaAllShared->DOPNRJT_RTRY_TMO << 16) | tdsaAllShared->COPNRJT_RTRY_TMO; /* 128 us for ORR Timeout for DATA phase and 32 us for ORR Timeout for command phase */
 4929     SASConfigPage.Data_Cmd_OPNRJT_RTRY_THR =  (tdsaAllShared->DOPNRJT_RTRY_THR << 16) | tdsaAllShared->COPNRJT_RTRY_THR; /* 16 for ORR backoff threshold for DATA phase and 1024 for ORR backoff threshold for command phase */
 4930     SASConfigPage.MAX_AIP =  tdsaAllShared->MAX_AIP; /* MAX AIP. Default is  0x200000 */
 4931 
 4932     TI_DBG1(("tiCOMPortStart: saSetControllerConfig SASConfigPage.pageCode                 0x%08x\n",SASConfigPage.pageCode));
 4933     TI_DBG1(("tiCOMPortStart: saSetControllerConfig SASConfigPage.MST_MSI                  0x%08x\n",SASConfigPage.MST_MSI));
 4934     TI_DBG1(("tiCOMPortStart: saSetControllerConfig SASConfigPage.STP_SSP_MCT_TMO          0x%08x\n",SASConfigPage.STP_SSP_MCT_TMO));
 4935     TI_DBG1(("tiCOMPortStart: saSetControllerConfig SASConfigPage.STP_FRM_TMO              0x%08x\n",SASConfigPage.STP_FRM_TMO));
 4936     TI_DBG1(("tiCOMPortStart: saSetControllerConfig SASConfigPage.STP_IDLE_TMO             0x%08x\n",SASConfigPage.STP_IDLE_TMO));
 4937     TI_DBG1(("tiCOMPortStart: saSetControllerConfig SASConfigPage.OPNRJT_RTRY_INTVL        0x%08x\n",SASConfigPage.OPNRJT_RTRY_INTVL));
 4938     TI_DBG1(("tiCOMPortStart: saSetControllerConfig SASConfigPage.Data_Cmd_OPNRJT_RTRY_TMO 0x%08x\n",SASConfigPage.Data_Cmd_OPNRJT_RTRY_TMO));
 4939     TI_DBG1(("tiCOMPortStart: saSetControllerConfig SASConfigPage.Data_Cmd_OPNRJT_RTRY_THR 0x%08x\n",SASConfigPage.Data_Cmd_OPNRJT_RTRY_THR));
 4940     TI_DBG1(("tiCOMPortStart: saSetControllerConfig SASConfigPage.MAX_AIP                  0x%08x\n",SASConfigPage.MAX_AIP));
 4941 
 4942     status = saSetControllerConfig(agRoot,
 4943                                     0,
 4944                                     AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE,
 4945                                     sizeof(agsaSASProtocolTimerConfigurationPage_t),
 4946                                     &SASConfigPage,
 4947                                     agNULL);
 4948     if (status != AGSA_RC_SUCCESS)
 4949     {
 4950       TI_DBG1(("tiCOMPortStart: calling saSetControllerConfig() failed\n"));
 4951     }
 4952     else
 4953     {
 4954       TI_DBG2(("tiCOMPortStart: calling saSetControllerConfig() is OK\n"));
 4955     }
 4956     IsSendSASConfigPage = agTRUE;
 4957   }
 4958   else
 4959   {
 4960     TI_DBG1(("tiCOMPortStart: saSetControllerConfig not called tIsSPCV12or6G %d IsSendSASConfigPage %d\n",tIsSPCV12or6G(agRoot),IsSendSASConfigPage));
 4961   }
 4962 
 4963   /* maps portID to phyID */
 4964   status = saPhyStart(agRoot,
 4965                       agNULL,
 4966                       0,
 4967                       portID,
 4968                       &(tdsaAllShared->Ports[portID].agPhyConfig),
 4969                       &(tdsaAllShared->Ports[portID].SASID)
 4970                       );
 4971 
 4972   TI_DBG6(("tiCOMPortStart: saPhyStart status %d\n", status));
 4973 
 4974   if (status == AGSA_RC_SUCCESS)
 4975   {
 4976     TI_DBG3(("tiCOMPortStart : calling portstarted\n"));
 4977     ostiPortEvent(
 4978                   tiRoot,
 4979                   tiPortStarted,
 4980                   tiSuccess,
 4981                   (void *) tdsaAllShared->Ports[portID].tiPortalContext
 4982                   );
 4983     return tiSuccess;
 4984   }
 4985   else
 4986   {
 4987     TI_DBG3(("tiCOMPortStart : cant' start port\n"));
 4988     return tiError;
 4989   }
 4990 
 4991 }
 4992 
 4993 /*****************************************************************************
 4994 *! \brief  tiCOMPortStop
 4995 *
 4996 *  Purpose: This function is called to bring the port hardware down.
 4997 *
 4998 *  \param  tiRoot:          Pointer to root data structure.
 4999 *  \param  portalContext:   Pointer to the context for this portal.
 5000 *
 5001 *  \return:
 5002 *          tiSuccess:      Successful.
 5003 *          Others:             Fail.
 5004 *
 5005 *  \note -
 5006 *
 5007 *****************************************************************************/
 5008 osGLOBAL bit32
 5009 tiCOMPortStop (
 5010   tiRoot_t          *tiRoot,
 5011   tiPortalContext_t *portalContext
 5012   )
 5013 {
 5014   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 5015   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5016   tdList_t          *PortContextList;
 5017   tdsaPortContext_t *onePortContext = agNULL;
 5018   agsaRoot_t        *agRoot = agNULL;
 5019   bit32             i;
 5020   bit32             found = agFALSE;
 5021 
 5022 #ifdef CONTROLLER_STATUS_TESTING
 5023   agsaControllerStatus_t  agcontrollerStatus;
 5024 #endif /* CONTROLLER_STATUS_TESTING */
 5025 
 5026 
 5027   TI_DBG3(("tiCOMPortStop: start\n"));
 5028   /*
 5029     find the portcontext
 5030     find phys belonging to that portcotext
 5031     call saPhyStop for all those phys
 5032     call saPhyStop()
 5033     remove the portcontext from the portcontext list
 5034   */
 5035 
 5036   agRoot = &(tdsaAllShared->agRootNonInt);
 5037 
 5038 #ifdef CONTROLLER_STATUS_TESTING
 5039   TI_DBG1(("tiCOMPortStop: saGetControllerStatus returns 0x%X\n",saGetControllerStatus(agRoot,&agcontrollerStatus ) ));
 5040 #endif /* CONTROLLER_INFO_TESTING */
 5041 
 5042   if (TDLIST_EMPTY(&(tdsaAllShared->MainPortContextList)))
 5043   {
 5044     TI_DBG1(("tiCOMPortStop: empty tdsaPortContext\n"));
 5045     return tiError;
 5046   }
 5047 
 5048   /* find a right portcontext */
 5049   PortContextList = tdsaAllShared->MainPortContextList.flink;
 5050   while (PortContextList != &(tdsaAllShared->MainPortContextList))
 5051   {
 5052     onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
 5053     if (onePortContext == agNULL)
 5054     {
 5055       TI_DBG1(("tiCOMPortStop: onePortContext is NULL!!!\n"));
 5056       return tiError;
 5057     }
 5058     if (onePortContext->tiPortalContext == portalContext)
 5059     {
 5060       TI_DBG6(("tiCOMPortStop: found; oneportContext ID %d\n", onePortContext->id));
 5061       found = agTRUE;
 5062       break;
 5063     }
 5064     PortContextList = PortContextList->flink;
 5065   }
 5066 
 5067   if (found == agFALSE)
 5068   {
 5069     TI_DBG1(("tiCOMPortStop: No corressponding tdsaPortContext\n"));
 5070     return tiError;
 5071   }
 5072 
 5073 #ifdef INITIATOR_DRIVER
 5074   /* reset the fields of portcontext */
 5075   onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
 5076   onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
 5077 #endif /* INITIATOR_DRIVER */
 5078 
 5079   onePortContext->Count = 0;
 5080   onePortContext->agContext.osData = onePortContext;
 5081   for(i=0;i<TD_MAX_NUM_PHYS;i++)
 5082   {
 5083     if (onePortContext->PhyIDList[i] == agTRUE)
 5084     {
 5085       tdsaAllShared->Ports[i].portContext = agNULL;
 5086 #ifdef CCFLAGS_PHYCONTROL_COUNTS
 5087       if( tiIS_SPC(agRoot) )
 5088       {
 5089 
 5090         saLocalPhyControl(agRoot,&onePortContext->agContext,0 , i, AGSA_PHY_GET_ERROR_COUNTS, agNULL);
 5091         saLocalPhyControl(agRoot,&onePortContext->agContext,0 , i, AGSA_PHY_CLEAR_ERROR_COUNTS, agNULL);
 5092         saLocalPhyControl(agRoot,&onePortContext->agContext,0 , i, AGSA_PHY_GET_BW_COUNTS, agNULL);
 5093       }
 5094       else
 5095       {
 5096         TI_DBG1(("\ntiCOMPortStop: CCFLAGS_PHYCONTROL_COUNTS PHY %d\n",i));
 5097         saGetPhyProfile( agRoot,&onePortContext->agContext,0, AGSA_SAS_PHY_ERR_COUNTERS_PAGE, i);
 5098         saGetPhyProfile( agRoot,&onePortContext->agContext,0, AGSA_SAS_PHY_BW_COUNTERS_PAGE,i);
 5099         saGetPhyProfile( agRoot,&onePortContext->agContext,0, AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE,i);
 5100         saGetPhyProfile( agRoot,&onePortContext->agContext,0, AGSA_SAS_PHY_GENERAL_STATUS_PAGE,i);
 5101         saGetPhyProfile( agRoot,&onePortContext->agContext,0, AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE,i);
 5102 
 5103         TI_DBG1(("tiCOMPortStop: CCFLAGS_PHYCONTROL_COUNTS PHY %d\n",i));
 5104 
 5105       }
 5106 
 5107 #endif /* CCFLAGS_PHYCONTROL_COUNTS */
 5108       saPhyStop(agRoot, &onePortContext->agContext, 0, i);
 5109     }
 5110   }
 5111 
 5112   return tiSuccess;
 5113 }
 5114 
 5115 
 5116 /*****************************************************************************
 5117 *! \brief tiCOMGetPortInfo
 5118 *
 5119 *  Purpose:  This function is called to return information about the specific
 5120 *            port instant
 5121 *
 5122 *
 5123 *  \param   tiRoot:        Pointer to driver/port instance.
 5124 *  \param   portalContext  Pointer to the context for this portal.
 5125 *  \param   tiPortInfo:    Pointer to port information structure.
 5126 *
 5127 *  \Return: tiSuccess
 5128 *
 5129 *****************************************************************************/
 5130 /*
 5131   can't find tdsaportcontext in this function
 5132   since discovery has not been called by OS layer yet
 5133   Therefore, hardcoded value are being returned for now
 5134 */
 5135 osGLOBAL bit32 tiCOMGetPortInfo(
 5136                                 tiRoot_t            *tiRoot,
 5137                                 tiPortalContext_t   *portalContext,
 5138                                 tiPortInfo_t        *tiPortInfo
 5139                                 )
 5140 
 5141 {
 5142   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 5143   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5144   tdList_t          *PortContextList;
 5145   tdsaPortContext_t *onePortContext = agNULL;
 5146   bit32             found = agFALSE;
 5147   static bit8       localname[68], remotename[68];
 5148   
 5149   TI_DBG6(("tiCOMGetPortInfo: start\n"));
 5150 
 5151  
 5152   tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 5153   if (TDLIST_EMPTY(&(tdsaAllShared->MainPortContextList)))
 5154   {
 5155     tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 5156     TI_DBG1(("tiCOMGetPortInfo: No tdsaPortContext\n"));
 5157     return tiError;
 5158   }
 5159   else
 5160   {
 5161     tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 5162   }
 5163 
 5164   /* find a corresponding portcontext */
 5165   PortContextList = tdsaAllShared->MainPortContextList.flink;
 5166   while (PortContextList != &(tdsaAllShared->MainPortContextList))
 5167   {
 5168     onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
 5169     TI_DBG3(("tiCOMGetPortInfo: oneportContext pid %d\n", onePortContext->id));
 5170     if (onePortContext->tiPortalContext == portalContext && onePortContext->valid == agTRUE)
 5171     {
 5172       TI_DBG3(("tiCOMGetPortInfo: found; oneportContext pid %d\n", onePortContext->id));
 5173       found = agTRUE;
 5174       break;
 5175     }
 5176     PortContextList = PortContextList->flink;
 5177   }
 5178 
 5179   if (found == agFALSE)
 5180   {
 5181     TI_DBG1(("tiCOMGetPortInfo: First, No corresponding tdsaPortContext\n"));
 5182     return tiError;
 5183   }
 5184   
 5185   if (onePortContext == agNULL)
 5186   {
 5187     TI_DBG1(("tiCOMGetPortInfo: Second, No corressponding tdsaPortContext\n"));
 5188     return tiError;
 5189   }
 5190   
 5191   osti_memset(localname, 0, sizeof(localname));
 5192   osti_memset(remotename, 0, sizeof(remotename));
 5193   
 5194   /*
 5195     Parse the type of port then fill in the information
 5196   */
 5197   if ( onePortContext->sasRemoteAddressHi == 0xFFFFFFFF && onePortContext->sasRemoteAddressLo == 0xFFFFFFFF)
 5198   {
 5199     /* directly attached SATA port */
 5200     osti_memcpy(localname, &(onePortContext->sasLocalAddressHi), 4);
 5201     osti_memcpy(&(localname[4]), &(onePortContext->sasLocalAddressLo), 4);
 5202     tiPortInfo->localNameLen = 8;
 5203     /* information is from SATA ID device data. remoteName is serial number, firmware version, model number */
 5204     osti_memcpy(remotename, onePortContext->remoteName, 68);
 5205     tiPortInfo->remoteNameLen = 68;    
 5206   }
 5207   else
 5208   {
 5209     /* copy hi address and low address */
 5210     osti_memcpy(localname, &(onePortContext->sasLocalAddressHi), 4);
 5211     osti_memcpy(&(localname[4]), &(onePortContext->sasLocalAddressLo), 4);
 5212     tiPortInfo->localNameLen = 8;
 5213     osti_memcpy(remotename, &(onePortContext->sasRemoteAddressHi), 4);
 5214     osti_memcpy(&(remotename[4]), &(onePortContext->sasRemoteAddressLo), 4);
 5215     tiPortInfo->remoteNameLen = 8;
 5216   }  
 5217   
 5218   tiPortInfo->localName = (char *)&localname;
 5219   tiPortInfo->remoteName = (char *)&remotename;  
 5220 
 5221   
 5222   return tiSuccess;
 5223 
 5224 }
 5225 
 5226 /*****************************************************************************
 5227 *
 5228 * tiCOMSetControllerConfig
 5229 *
 5230 *  Purpose:  This function is called to set the controller's advanced configuration.
 5231 *            The status is reported via ostiPortEvent().
 5232 *
 5233 *  Parameters:
 5234 *
 5235 *    tiRoot:        Pointer to driver/port instance.
 5236 *
 5237 *  Return:
 5238 *     tiSuccess:  The setting controller configuration was started.
 5239 *     tiError:    The setting controller configuration was not started.
 5240 *
 5241 *****************************************************************************/
 5242 osGLOBAL bit32  tiCOMSetControllerConfig (
 5243          tiRoot_t    *tiRoot,
 5244          bit32       modePage,
 5245          bit32       length,
 5246          void        *buffer,
 5247          void        *context)
 5248 {
 5249    agsaRoot_t      *agRoot;
 5250    bit32           returnCode = AGSA_RC_BUSY;
 5251    bit32           tiStatus = tiSuccess;
 5252    tdsaRoot_t      *tdsaRoot ;
 5253    tdsaContext_t   *tdsaAllShared ;
 5254 
 5255    TD_ASSERT(tiRoot, "tiRoot");
 5256    tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 5257    TD_ASSERT(tdsaRoot, "tdsaRoot");
 5258 
 5259    tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5260    TD_ASSERT(tdsaAllShared, "tdsaAllShared");
 5261    agRoot = &(tdsaAllShared->agRootNonInt);
 5262    TD_ASSERT(agRoot, "agRoot");
 5263 
 5264    agRoot = &(tdsaAllShared->agRootNonInt);
 5265 
 5266    TI_DBG1(("tiCOMSetControllerConfig:\n" ));
 5267 
 5268    /*do some sanity checking */
 5269    if ( ((modePage == TI_INTERRUPT_CONFIGURATION_PAGE)   && (length != sizeof(tiInterruptConfigPage_t )))   ||
 5270         ((modePage == TI_ENCRYPTION_GENERAL_CONFIG_PAGE) && (length != sizeof(tiEncryptGeneralPage_t  )))    ||
 5271         ((modePage == TI_ENCRYPTION_DEK_CONFIG_PAGE)     && (length != sizeof(tiEncryptDekConfigPage_t)))    ||
 5272         ((modePage == TI_ENCRYPTION_CONTROL_PARM_PAGE)  && (length != sizeof(tiEncryptControlParamPage_t ))) ||
 5273         ((modePage == TI_ENCRYPTION_HMAC_CONFIG_PAGE)  && (length != sizeof(tiEncryptHMACConfigPage_t )))    ||
 5274         ((modePage == TI_SAS_PROTOCOL_TIMER_CONFIG_PAGE) && (length != sizeof(tiSASProtocolTimerConfigurationPage_t )))  )
 5275    {
 5276        tiStatus = tiError;
 5277    }
 5278    else
 5279    {
 5280        returnCode = saSetControllerConfig(agRoot, 0, modePage, length, buffer, context);
 5281 
 5282        if (returnCode == AGSA_RC_SUCCESS)
 5283        {
 5284            tiStatus = tiSuccess;
 5285        }
 5286        else if (returnCode == AGSA_RC_BUSY)
 5287        {
 5288            tiStatus = tiBusy;
 5289        }
 5290        else
 5291        {
 5292            tiStatus = tiError;
 5293        }
 5294    }
 5295    return(tiStatus);
 5296 }
 5297 
 5298 /*****************************************************************************
 5299 *
 5300 * tiCOMGetControllerConfig
 5301 *
 5302 *  Purpose:  This function is called to get the controller's advanced configuration.
 5303 *            The status is reported via ostiPortEvent().
 5304 *
 5305 *  Parameters:
 5306 *
 5307 *    tiRoot:        Pointer to driver/port instance.
 5308 *    flag:          Interrupt  Vector Mask
 5309 *                   This parameter is valid only when modePage is set to TI_INTERRUPT_CONFIGURATION_PAGE.
 5310 *                   When the modePage field is set to TI_INTERRUPT_CONFIGURATION_PAGE,
 5311 *                   this field contains a bitmap of interrupt vectors for which interrupt coalescing parameters are retrieved.
 5312 *  Return:
 5313 *     tiSuccess:  The controller configuration retrival was started.
 5314 *     tiError:    The controller configuration retrival was not started.
 5315 *
 5316 *****************************************************************************/
 5317 osGLOBAL bit32  tiCOMGetControllerConfig (
 5318          tiRoot_t    *tiRoot,
 5319          bit32       modePage,
 5320          bit32       flag,
 5321          void        *context)
 5322 
 5323 {
 5324   agsaRoot_t      *agRoot;
 5325   bit32           returnCode = AGSA_RC_BUSY;
 5326   bit32           tiStatus = tiSuccess;
 5327   tdsaRoot_t      *tdsaRoot ;
 5328   tdsaContext_t   *tdsaAllShared ;
 5329 
 5330   TD_ASSERT(tiRoot, "tiRoot");
 5331   tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 5332   TD_ASSERT(tdsaRoot, "tdsaRoot");
 5333 
 5334   tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5335   TD_ASSERT(tdsaAllShared, "tdsaAllShared");
 5336   agRoot = &(tdsaAllShared->agRootNonInt);
 5337   TD_ASSERT(agRoot, "agRoot");
 5338 
 5339   agRoot = &(tdsaAllShared->agRootNonInt);
 5340 
 5341   TI_DBG1(("tiCOMGetControllerConfig: modePage 0x%x context %p\n",modePage,context ));
 5342 
 5343   returnCode = saGetControllerConfig(agRoot, 0, modePage, flag, 0, context);
 5344 
 5345   if (returnCode == AGSA_RC_SUCCESS)
 5346   {
 5347     tiStatus = tiSuccess;
 5348     TI_DBG1(("tiCOMGetControllerConfig:modePage 0x%x tiSuccess\n",modePage ));
 5349   }
 5350   else if (returnCode == AGSA_RC_BUSY)
 5351   {
 5352     tiStatus = tiBusy;
 5353     TI_DBG1(("tiCOMGetControllerConfig:modePage 0x%x tiBusy\n",modePage ));
 5354   }
 5355   else
 5356   {
 5357     tiStatus = tiError;
 5358     TI_DBG1(("tiCOMGetControllerConfig:modePage 0x%x tiError\n",modePage ));
 5359   }
 5360 
 5361    return(tiStatus);
 5362 }
 5363 
 5364 /*****************************************************************************
 5365 *
 5366 * tiCOMEncryptGetInfo
 5367 *
 5368 *  Purpose:  This function is called to return information about the encryption
 5369 *            engine for the specified port.
 5370 *
 5371 *  Parameters:
 5372 *
 5373 *    tiRoot:        Pointer to driver/port instance.
 5374 *
 5375 *  Return:
 5376 *   tiSuccess       The request is being processed
 5377 *   tiNotSupported  Encryption is not supported
 5378 *
 5379 *****************************************************************************/
 5380 osGLOBAL bit32 tiCOMEncryptGetInfo(tiRoot_t *tiRoot)
 5381 {
 5382   tiEncryptInfo_t tiEncryptInfo;
 5383   agsaEncryptInfo_t agsaEncryptInfo;
 5384   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 5385   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5386   agsaRoot_t      *agRoot;
 5387   tiEncryptPort_t tiEncryptPort;
 5388   bit32           returnCode;
 5389   bit32           tiStatus;
 5390 
 5391   agRoot = &(tdsaAllShared->agRootNonInt);
 5392 
 5393   returnCode = saEncryptGetMode(agRoot,agNULL, &agsaEncryptInfo);
 5394   TI_DBG1(("tiCOMEncryptGetInfo: returnCode 0x%x\n", returnCode));
 5395 
 5396   if (returnCode == AGSA_RC_SUCCESS)
 5397   {
 5398       tiStatus = tiSuccess;
 5399 
 5400       /*
 5401        * The data encoded in the agsaEncryptInfo must be converted
 5402        * to match the fields of the tiEncryptInfo structure.
 5403        *
 5404        * No sector information is currently available.
 5405        */
 5406       osti_memset(&tiEncryptInfo, 0x0, sizeof(tiEncryptInfo_t));
 5407 
 5408       /* cipher mode */
 5409       if (agsaEncryptInfo.encryptionCipherMode == agsaEncryptCipherModeXTS)
 5410       {
 5411          tiEncryptInfo.securityCipherMode = TI_ENCRYPT_ATTRIB_CIPHER_XTS;
 5412       }
 5413       /* security mode */
 5414       if (agsaEncryptInfo.encryptionSecurityMode == agsaEncryptSMF)
 5415       {
 5416          tiEncryptInfo.securityCipherMode |= TI_ENCRYPT_SEC_MODE_FACT_INIT;
 5417       }
 5418       else if (agsaEncryptInfo.encryptionSecurityMode == agsaEncryptSMA)
 5419       {
 5420          tiEncryptInfo.securityCipherMode |= TI_ENCRYPT_SEC_MODE_A;
 5421       }
 5422       else if (agsaEncryptInfo.encryptionSecurityMode == agsaEncryptSMB)
 5423       {
 5424          tiEncryptInfo.securityCipherMode |= TI_ENCRYPT_SEC_MODE_B;
 5425       }
 5426 
 5427       tiEncryptInfo.status = agsaEncryptInfo.status;
 5428 
 5429       tiEncryptPort.pData = &tiEncryptInfo;
 5430 
 5431       /* The low level returns synchronously, so fake a port event now.*/
 5432       tiEncryptPort.encryptEvent = tiEncryptGetInfo;
 5433       tiEncryptPort.subEvent = 0;
 5434 
 5435       ostiPortEvent(tiRoot,tiEncryptOperation,tiStatus,&tiEncryptPort);
 5436   }
 5437   else
 5438   {
 5439     if (returnCode == AGSA_RC_NOT_SUPPORTED)
 5440     {
 5441       tiStatus = tiNotSupported;
 5442       TI_DBG1(("tiCOMEncryptGetInfo: tiNotSupported\n"));
 5443     }
 5444     else
 5445     {
 5446       TI_DBG1(("tiCOMEncryptGetInfo: tiError returnCode 0x%x\n",returnCode));
 5447       tiStatus = tiError;
 5448     }
 5449 
 5450     tiEncryptPort.pData = NULL;
 5451   }
 5452 
 5453   return(tiStatus);
 5454 }
 5455 
 5456 /*****************************************************************************
 5457 *
 5458 * tiCOMEncryptSetMode
 5459 *
 5460 *  Purpose:  This function is called to set the encryption security and cipher modes
 5461 *            for the encryption engine.
 5462 *
 5463 *  Parameters:
 5464 *
 5465 *    tiRoot:        Pointer to driver/port instance.
 5466 *
 5467 *  Return:
 5468 *   tiSuccess       The request is being processed
 5469 *   tiError         The encryption engine is not in factory init mode or multiple
 5470 *                   security modes were specified.
 5471 *
 5472 *****************************************************************************/
 5473 
 5474 osGLOBAL bit32 tiCOMEncryptSetMode(tiRoot_t            *tiRoot,
 5475                                    bit32               securityCipherMode)
 5476 {
 5477   bit32                         returnCode;
 5478   bit32                         tiStatus;
 5479   agsaEncryptInfo_t mode;
 5480   agsaEncryptInfo_t *pmode = &mode;
 5481 
 5482   tdsaRoot_t        *tdsaRoot ;
 5483   tdsaContext_t     *tdsaAllShared;
 5484   agsaRoot_t        *agRoot;
 5485 
 5486   TD_ASSERT(tiRoot, "tiRoot");
 5487   tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 5488   TD_ASSERT(tdsaRoot, "tdsaRoot");
 5489 
 5490   tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5491   TD_ASSERT(tdsaAllShared, "tdsaAllShared");
 5492   agRoot = &(tdsaAllShared->agRootNonInt);
 5493   TD_ASSERT(agRoot, "agRoot");
 5494 
 5495   pmode->encryptionSecurityMode = 0;
 5496   pmode->encryptionCipherMode = 0;
 5497   pmode->status = 0;
 5498 
 5499   TI_DBG1(("tiCOMEncryptSetMode:\n"));
 5500 
 5501 
 5502   if(( securityCipherMode & TI_ENCRYPT_SEC_MODE_A ) == TI_ENCRYPT_SEC_MODE_A)
 5503   {
 5504     pmode->encryptionSecurityMode = agsaEncryptSMA;
 5505   }
 5506 
 5507   if(( securityCipherMode & TI_ENCRYPT_SEC_MODE_B ) == TI_ENCRYPT_SEC_MODE_B)
 5508   {
 5509     pmode->encryptionSecurityMode = agsaEncryptSMB;
 5510   }
 5511 
 5512   if( (securityCipherMode & TI_ENCRYPT_ATTRIB_CIPHER_XTS)  == TI_ENCRYPT_ATTRIB_CIPHER_XTS)
 5513   {
 5514     pmode->encryptionCipherMode |= agsaEncryptCipherModeXTS;
 5515   }
 5516 
 5517   /* ECB is not supported in SPCv */
 5518   if(( securityCipherMode & TI_ENCRYPT_ATTRIB_CIPHER_ECB)  == TI_ENCRYPT_ATTRIB_CIPHER_ECB)
 5519   {
 5520     return tiError;
 5521   }
 5522 
 5523   returnCode = saEncryptSetMode(agRoot,agNULL, 0, pmode );
 5524 
 5525   if (returnCode == AGSA_RC_SUCCESS)
 5526   {
 5527     tiStatus = tiSuccess;
 5528   }
 5529   else if (returnCode == AGSA_RC_BUSY)
 5530   {
 5531     TI_DBG1(("tiCOMEncryptSetMode:tiBusy\n"));
 5532     tiStatus = tiBusy;
 5533   }
 5534   else
 5535   {
 5536     TI_DBG1(("tiCOMEncryptSetMode:tiError\n"));
 5537     tiStatus = tiError;
 5538   }
 5539 
 5540   return(tiStatus);
 5541 }
 5542 
 5543 /*****************************************************************************
 5544 *
 5545 * tiCOMEncryptDekAdd
 5546 *
 5547 *  Purpose:  This function is called to add a DEK to the controller cache.
 5548 *
 5549 *  Parameters:
 5550 *
 5551 *    tiRoot:          Pointer to driver/port instance.
 5552 *    kekIndext:         Index of the KEK table
 5553 *    dekTableSelect:  Number of the DEK table receiving a new entry
 5554 *    dekAddrHi:       Upper 32-bits of the DEK table physical address
 5555 *    dekAddrLo:       Lower 32-bits of the DEK table physical address
 5556 *    dekIndex:        Number of the first entry in the DEK table that will inserted in the cache
 5557 *    dekNumberOfEntries: Number of entries to be inserted in the cache
 5558 *    dekBlobFormat:     Specifies the DEK blob format
 5559 *    dekTableKeyEntrySize: Encoded value for DEK Entry Size in the DEK Table
 5560 *
 5561 *  Return:
 5562 *   tiSuccess       The request is being processed
 5563 *   tiError         An invalid parameter was specified
 5564 *
 5565 *****************************************************************************/
 5566 osGLOBAL bit32 tiCOMEncryptDekAdd(tiRoot_t            *tiRoot,
 5567                                   bit32               kekIndex,
 5568                                   bit32               dekTableSelect,
 5569                                   bit32               dekAddrHi,
 5570                                   bit32               dekAddrLo,
 5571                                   bit32               dekIndex,
 5572                                   bit32               dekNumberOfEntries,
 5573                                   bit32               dekBlobFormat,
 5574                                   bit32               dekTableKeyEntrySize
 5575 
 5576                                   )
 5577 {
 5578     agsaRoot_t        *agRoot;
 5579     bit32           returnCode;
 5580     bit32           tiStatus;
 5581     tdsaRoot_t        *tdsaRoot ;
 5582     tdsaContext_t     *tdsaAllShared ;
 5583 
 5584     TD_ASSERT(tiRoot, "tiRoot");
 5585     tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 5586     TD_ASSERT(tdsaRoot, "tdsaRoot");
 5587 
 5588     tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5589     TD_ASSERT(tdsaAllShared, "tdsaAllShared");
 5590     agRoot = &(tdsaAllShared->agRootNonInt);
 5591     TD_ASSERT(agRoot, "agRoot");
 5592 
 5593 
 5594     agRoot = &(tdsaAllShared->agRootNonInt);
 5595 
 5596 
 5597     TI_DBG1(("tiCOMEncryptDekAdd:\n" ));
 5598 
 5599     returnCode = saEncryptDekCacheUpdate(agRoot,
 5600                                     agNULL,
 5601                                     0,
 5602                                     kekIndex,
 5603                                     dekTableSelect,
 5604                                     dekAddrHi,
 5605                                     dekAddrLo,
 5606                                     dekIndex,
 5607                                     dekNumberOfEntries,
 5608                                     dekBlobFormat,
 5609                                     dekTableKeyEntrySize
 5610                                     );
 5611 
 5612     if (returnCode == AGSA_RC_SUCCESS)
 5613     {
 5614         tiStatus = tiSuccess;
 5615     }
 5616     else if (returnCode == AGSA_RC_BUSY)
 5617     {
 5618         tiStatus = tiBusy;
 5619     }
 5620     else
 5621     {
 5622         tiStatus = tiError;
 5623     }
 5624 
 5625     return(tiStatus);
 5626 }
 5627 
 5628 /*****************************************************************************
 5629 *
 5630 * tiCOMEncryptDekInvalidate
 5631 *
 5632 *  Purpose:  This function is called to remove a DEK entry from the hardware cache.
 5633 *
 5634 *  Parameters:
 5635 *
 5636 *    tiRoot:        Pointer to driver/port instance.
 5637 *    dekTable       DEK table that will be affected
 5638 *    dekIndex:      DEK table entry that will be affected. The value 0xfffffff clears the cache.
 5639 *
 5640 *  Return:
 5641 *   tiSuccess       The request is being processed
 5642 *   tiError         An invalid parameter was specified
 5643 *   tiBusy          An operation is already in progress
 5644 *
 5645 *****************************************************************************/
 5646 
 5647 osGLOBAL bit32 tiCOMEncryptDekInvalidate(tiRoot_t            *tiRoot,
 5648                                          bit32               dekTable,
 5649                                          bit32               dekIndex)
 5650 {
 5651 
 5652     tdsaRoot_t        *tdsaRoot;
 5653     tdsaContext_t     *tdsaAllShared;
 5654 
 5655     agsaRoot_t        *agRoot;
 5656     tiEncryptPort_t tiEncryptPort;
 5657     tiEncryptDek_t  tiEncryptDek;
 5658     bit32           returnCode;
 5659     bit32           tiStatus;
 5660 
 5661     TD_ASSERT(tiRoot, "tiRoot");
 5662     tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 5663     TD_ASSERT(tdsaRoot, "tdsaRoot");
 5664 
 5665     tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5666     TD_ASSERT(tdsaAllShared, "tdsaAllShared");
 5667     agRoot = &(tdsaAllShared->agRootNonInt);
 5668     TD_ASSERT(agRoot, "agRoot");
 5669 
 5670     TI_DBG1(("tiCOMEncryptDekInvalidate:dekTable 0x%x dekIndex 0x%x\n", dekTable, dekIndex));
 5671 
 5672     returnCode = saEncryptDekCacheInvalidate(agRoot, agNULL, 0, dekTable, dekIndex);
 5673 
 5674     if (returnCode == AGSA_RC_SUCCESS)
 5675     {
 5676         tiStatus = tiSuccess;
 5677     }
 5678     else
 5679     {
 5680         if (returnCode == AGSA_RC_NOT_SUPPORTED)
 5681         {
 5682             tiStatus = tiNotSupported;
 5683         }
 5684         else if (returnCode == AGSA_RC_BUSY)
 5685         {
 5686             tiStatus = tiBusy;
 5687         }
 5688         else
 5689         {
 5690             tiStatus = tiError;
 5691         }
 5692 
 5693         tiEncryptDek.dekTable = dekTable;
 5694         tiEncryptDek.dekIndex = dekIndex;
 5695 
 5696         tiEncryptPort.encryptEvent = tiEncryptDekInvalidate;
 5697         tiEncryptPort.subEvent = 0;
 5698         tiEncryptPort.pData = (void *) &tiEncryptDek;
 5699 
 5700         ostiPortEvent(tiRoot,tiEncryptOperation,tiStatus,&tiEncryptPort);
 5701     }
 5702 
 5703     return(tiStatus);
 5704 }
 5705 
 5706 /*****************************************************************************
 5707 *
 5708 * tiCOMEncryptKekAdd
 5709 *
 5710 *  Purpose:  This function is called to add a KEK in the register specified by
 5711 *            the index parameter.
 5712 *
 5713 *  Parameters:
 5714 *
 5715 *    tiRoot:           Pointer to driver/port instance.
 5716 *    kekIndex:         KEK table entry that will be affected
 5717 *    wrapperKekIndex   KEK table entry that encrypt the KEK blob
 5718 *    encryptKekBlob    KEK blob that will be added
 5719 *
 5720 *  Return:
 5721 *   tiSuccess       The request is being processed
 5722 *   tiError         An invalid parameter was specified
 5723 *   tiBusy          A KEK operation is already in progress
 5724 *
 5725 *****************************************************************************/
 5726 
 5727 osGLOBAL bit32 tiCOMEncryptKekAdd(tiRoot_t            *tiRoot,
 5728                                   bit32               kekIndex,
 5729                                   bit32               wrapperKekIndex,
 5730                                   bit32               blobFormat,
 5731                                   tiEncryptKekBlob_t *encryptKekBlob)
 5732 {
 5733   tdsaRoot_t        *tdsaRoot;
 5734   tdsaContext_t     *tdsaAllShared;
 5735   agsaRoot_t        *agRoot;
 5736 
 5737   bit32           returnCode= AGSA_RC_BUSY;
 5738   bit32           tiStatus= tiError;
 5739 
 5740   tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 5741   tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5742 
 5743   agRoot = &(tdsaAllShared->agRootNonInt);
 5744 
 5745   TI_DBG1(("tiCOMEncryptDekInvalidate: kekIndex 0x%x wrapperKekIndex 0x%x\n", kekIndex , wrapperKekIndex));
 5746 
 5747   returnCode = saEncryptKekUpdate(agRoot,
 5748                                   agNULL,
 5749                                   0,
 5750                                   AGSA_ENCRYPT_STORE_NVRAM,
 5751                                   kekIndex,
 5752                                   wrapperKekIndex,
 5753                                   blobFormat,
 5754                                   (agsaEncryptKekBlob_t *) encryptKekBlob);
 5755 
 5756   if (returnCode == AGSA_RC_SUCCESS)
 5757   {
 5758     tiStatus = tiSuccess;
 5759   }
 5760   else if (returnCode == AGSA_RC_BUSY)
 5761   {
 5762     tiStatus = tiBusy;
 5763   }
 5764   else
 5765   {
 5766     tiStatus = tiError;
 5767   }
 5768 
 5769   return(tiStatus);
 5770 }
 5771 #ifdef HIALEAH_ENCRYPTION
 5772 
 5773 osGLOBAL bit32 tiCOMEncryptHilSet(tiRoot_t            *tiRoot )
 5774 {
 5775   tdsaRoot_t        *tdsaRoot;
 5776   tdsaContext_t     *tdsaAllShared;
 5777   agsaRoot_t        *agRoot;
 5778   agsaEncryptInfo_t agsaEncryptInfo;
 5779 
 5780   bit32           returnCode= tiBusy;
 5781   bit32           tiStatus= tiError;
 5782 
 5783   tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 5784   tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5785 
 5786   agRoot = &(tdsaAllShared->agRootNonInt);
 5787 
 5788 
 5789   returnCode = saEncryptGetMode(agRoot,agNULL, &agsaEncryptInfo);
 5790   TI_DBG1(("tiCOMEncryptHilSet: saEncryptGetMode returnCode 0x%x agsaEncryptInfo status 0x%x Smode 0x%x CMode 0x%x\n",
 5791           returnCode,
 5792           agsaEncryptInfo.status,
 5793           agsaEncryptInfo.encryptionSecurityMode,
 5794           agsaEncryptInfo.encryptionCipherMode ));
 5795 
 5796   if (returnCode == AGSA_RC_FAILURE)
 5797   {
 5798    TI_DBG1(("tiCOMEncryptHilSet:agsaEncryptInfo.status 0x%x\n",agsaEncryptInfo.status ));
 5799     if(agsaEncryptInfo.status == 0x81)
 5800     {
 5801           TI_DBG1(("tiCOMEncryptHilSet: status 0x80 KEY CARD MISMATCH agsaEncryptInfo.status 0x%x\n",agsaEncryptInfo.status ));
 5802       returnCode = saEncryptHilUpdate(agRoot,
 5803                                       agNULL,
 5804                                       0 );
 5805       if (returnCode == AGSA_RC_SUCCESS)
 5806       {
 5807         TI_DBG1(("tiCOMEncryptHilSet:AGSA_RC_SUCCESS\n"));
 5808       }
 5809     }
 5810         else if(agsaEncryptInfo.status == 0x80)
 5811     {
 5812                 ostidisableEncryption(tiRoot);
 5813                 TI_DBG1(("tiCOMEncryptHilSet: status 0x80 KEY CARD MISSING agsaEncryptInfo.status 0x%x\n",agsaEncryptInfo.status ));
 5814         returnCode = AGSA_RC_SUCCESS;
 5815         }
 5816     else
 5817     {
 5818       TI_DBG1(("tiCOMEncryptHilSet: not status 0x81 agsaEncryptInfo.status 0x%x\n",agsaEncryptInfo.status ));
 5819       returnCode = AGSA_RC_FAILURE;
 5820     }
 5821   }
 5822 
 5823   if (returnCode == AGSA_RC_SUCCESS)
 5824   {
 5825     tiStatus = tiSuccess;
 5826   }
 5827   else if (returnCode == AGSA_RC_BUSY)
 5828   {
 5829     TI_DBG1(("tiCOMEncryptHilSet:AGSA_RC_BUSY\n"));
 5830     tiStatus = tiBusy;
 5831   }
 5832   else
 5833   {
 5834     TI_DBG1(("tiCOMEncryptHilSet:tiError\n"));
 5835     tiStatus = tiError;
 5836   }
 5837 
 5838   return(tiStatus);
 5839 }
 5840 #endif /* HIALEAH_ENCRYPTION */
 5841 
 5842 /*****************************************************************************
 5843 *
 5844 * tiCOMEncryptKekStore
 5845 *
 5846 *  Purpose:  This function is called to store a KEK in NVRAM. If -1 is specified
 5847 *            as the KEK index, then all KEKs will be stored.
 5848 *
 5849 *  Parameters:
 5850 *
 5851 *    tiRoot:        Pointer to driver/port instance.
 5852 *    kekIndex:      The KEK to be stored in NVRAM
 5853 *
 5854 *  Return:
 5855 *   tiSuccess       The request is being processed
 5856 *   tiError         An invalid parameter was specified
 5857 *   tiBusy          A KEK operation is already in progress
 5858 *
 5859 *****************************************************************************/
 5860 
 5861 osGLOBAL bit32 tiCOMEncryptKekStore(tiRoot_t  *tiRoot,
 5862                                     bit32      kekIndex)
 5863 {
 5864 #ifdef NOT_YET
 5865     tdsaRoot_t        *tdsaRoot;
 5866     tdsaContext_t     *tdsaAllShared;
 5867     agsaRoot_t        *agRoot;
 5868 #endif
 5869 /*
 5870     bit32           returnCode= AGSA_RC_BUSY;
 5871 */
 5872     bit32           tiStatus = tiError;
 5873 
 5874 #ifdef NOT_YET
 5875     tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 5876     tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5877 
 5878     agRoot = &(tdsaAllShared->agRootNonInt);
 5879 #endif
 5880 
 5881     TI_DBG1(("tiCOMEncryptKekStore: Needs code !!!! kekIndex 0x%x\n", kekIndex ));
 5882 /*
 5883     returnCode = fcEncryptKekStore(agRoot, kekIndex);
 5884 
 5885     if (returnCode == AGSA_RC_SUCCESS)
 5886     {
 5887         tiStatus = tiSuccess;
 5888     }
 5889     else if (returnCode == AGSA_RC_BUSY)
 5890     {
 5891         tiStatus = tiBusy;
 5892     }
 5893     else
 5894     {
 5895         tiStatus;
 5896     }
 5897 */
 5898     return(tiStatus);
 5899 }
 5900 
 5901 /*****************************************************************************
 5902 *
 5903 * tiCOMEncryptKekLoad
 5904 *
 5905 *  Purpose:  This function is called to load a KEK from NVRAM. If -1 is specified
 5906 *            as the KEK index, then all KEKs will be loaded.
 5907 *
 5908 *  Parameters:
 5909 *
 5910 *    tiRoot:        Pointer to driver/port instance.
 5911 *    kekIndex:      The KEK to be loaded in NVRAM
 5912 *
 5913 *  Return:
 5914 *   tiSuccess       The request is being processed
 5915 *   tiError         An invalid parameter was specified
 5916 *   tiBusy          A KEK operation is already in progress
 5917 *
 5918 *****************************************************************************/
 5919 
 5920 osGLOBAL bit32 tiCOMEncryptKekLoad(tiRoot_t            *tiRoot,
 5921                                    bit32               kekIndex)
 5922 {
 5923 #ifdef NOT_YET
 5924     tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 5925     tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5926     agsaRoot_t      *agRoot;
 5927     //bit32           returnCode;
 5928 #endif
 5929     bit32           tiStatus = tiError;
 5930 
 5931 #ifdef NOT_YET
 5932     agRoot = &(tdsaAllShared->agRootNonInt);
 5933 #endif
 5934 /*
 5935     returnCode = fcEncryptKekLoad(agRoot, kekIndex);
 5936 
 5937     if (returnCode == AGSA_RC_SUCCESS)
 5938     {
 5939         tiStatus = tiSuccess;
 5940     }
 5941     else if (returnCode == AGSA_RC_BUSY)
 5942     {
 5943         tiStatus = tiBusy;
 5944     }
 5945     else
 5946     {
 5947         tiStatus = tiError;
 5948     }
 5949 */
 5950     return(tiStatus);
 5951 }
 5952 
 5953 /*****************************************************************************
 5954 *
 5955 * tiCOMEncryptSelfTest
 5956 *
 5957 *  Purpose:  This function starts the encryption self test. For the encryption self test, IOs must be quiesced.
 5958 *                The completion of this function is via ostiPortEvent().
 5959 *
 5960 *  Parameters:
 5961 *
 5962 *    tiRoot:      Pointer to driver/port instance.
 5963 *    type:        Types of test
 5964                       0x1: tiBISTTest
 5965                       0x2: tiHMACTest
 5966                       Others are reserved.
 5967 *    length:
 5968                    Size of the test descriptor in bytes, e.g.,
 5969                    Sizeof(tiEncryptSelfTestDescriptor_t)
 5970                    Sizeof(tiEncryptHMACTestDescriptor_t)
 5971 *    TestDescriptor       address of the test descriptor structure.
 5972 *
 5973 *  Return:
 5974 *   tiSuccess     The request is being processed
 5975 *   tiError          An invalid parameter was specified
 5976 *   tiBusy          A encrytion operation is already in progress
 5977 *
 5978 *****************************************************************************/
 5979 osGLOBAL bit32 tiCOMEncryptSelfTest(
 5980                         tiRoot_t  *tiRoot,
 5981                         bit32      type,
 5982                         bit32      length,
 5983                         void      *TestDescriptor
 5984                         )
 5985 {
 5986   tdsaRoot_t     *tdsaRoot       = agNULL;
 5987   tdsaContext_t  *tdsaAllShared  = agNULL;
 5988   agsaRoot_t     *agRoot         = agNULL;
 5989 
 5990   bit32           returnCode     = AGSA_RC_BUSY;
 5991   bit32           tiStatus       = tiError;
 5992 
 5993   tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 5994   TD_ASSERT(tdsaRoot != agNULL, "tdsaRoot is NULL !!!");
 5995 
 5996   tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5997   TD_ASSERT(tdsaAllShared != agNULL, "tdsaAllShared is NULL !!!");
 5998 
 5999   agRoot = &(tdsaAllShared->agRootNonInt);
 6000   TD_ASSERT(agRoot != agNULL, "agRoot is NULL !!!");
 6001 
 6002   TI_DBG1(("tiCOMEncryptSelfTest: type =  0x%x length = 0x%x\n", type, length));
 6003 
 6004   /*do some sanity checking */
 6005   if ( ((type == TI_ENCRYPTION_TEST_TYPE_BIST) && (length != sizeof(tiEncryptSelfTestDescriptor_t )))  ||
 6006        ((type == TI_ENCRYPTION_TEST_TYPE_HMAC) && (length != sizeof(tiEncryptHMACTestDescriptor_t))) )
 6007   {
 6008     TI_DBG1(("tiCOMEncryptSelfTest: type or length error, type 0x%x length 0x%x\n", type, length));
 6009     tiStatus = tiError;
 6010   }
 6011   else
 6012   {
 6013     returnCode = saEncryptSelftestExecute(agRoot,
 6014                                       agNULL,
 6015                                       0,
 6016                                       type,
 6017                                       length,
 6018                                       TestDescriptor
 6019                                       );
 6020 
 6021     if (returnCode == AGSA_RC_SUCCESS)
 6022     {
 6023       tiStatus = tiSuccess;
 6024     }
 6025     else if (returnCode == AGSA_RC_BUSY)
 6026     {
 6027       tiStatus = tiBusy;
 6028     }
 6029     else
 6030     {
 6031       tiStatus = tiError;
 6032     }
 6033   }
 6034 
 6035   return(tiStatus);
 6036 }
 6037 
 6038 /*****************************************************************************
 6039 *
 6040 * tiCOMSetOperator
 6041 *
 6042 *  Purpose:  This function is called to login to or logout out from the controller by an operator.
 6043                   The status is reported via ostiPortEvent().
 6044 *
 6045 *  Parameters:
 6046 *
 6047 *    tiRoot:      Pointer to driver/port instance.
 6048 *    flag:         operator flag.
 6049                      Bits 0-3: Access type (ACS)
 6050                        0x1: Login
 6051                        0x2: Logout
 6052                        All others are reserved.
 6053                      Bit 4: KEYopr pinned in the KEK table (PIN)
 6054                        0: Not pinned. Operator ID table will be searched during authentication.
 6055                        1: Pinned. OPRIDX is referenced to unwrap the certificate.
 6056                      Bits 5-7: Reserved
 6057                      Bits 8-15: KEKopr Index in the KEK Table (OPRIDX). If KEKopr is pinned in the KEK table, OPRIDX is to reference the KEK for authentication
 6058                      Bits 16-31: Reserved.
 6059 
 6060      cert:         The pointer to the operator's certificate. The size of the certificate is 40 bytes.
 6061 *
 6062 *  Return:
 6063 *   tiSuccess     Log in or log out was started.
 6064 *   tiError          Log in or log out was not started.
 6065 *   tiBusy          A operator management operation is already in progress
 6066 *
 6067 *****************************************************************************/
 6068 osGLOBAL bit32 tiCOMSetOperator(
 6069                         tiRoot_t      *tiRoot,
 6070                         bit32          flag,
 6071                         void          *cert
 6072                         )
 6073 {
 6074   tdsaRoot_t     *tdsaRoot       = agNULL;
 6075   tdsaContext_t  *tdsaAllShared  = agNULL;
 6076   agsaRoot_t     *agRoot         = agNULL;
 6077 
 6078   bit32           returnCode     = AGSA_RC_FAILURE;
 6079   bit32           tiStatus       = tiError;
 6080 
 6081   tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 6082   TD_ASSERT(tdsaRoot != agNULL, "tdsaRoot is NULL !!!");
 6083 
 6084   tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6085   TD_ASSERT(tdsaAllShared != agNULL, "tdsaAllShared is NULL !!!");
 6086 
 6087   agRoot = &(tdsaAllShared->agRootNonInt);
 6088   TD_ASSERT(agRoot != agNULL, "agRoot is NULL !!!");
 6089 
 6090   TI_DBG1(("tiCOMSetOperator: flag =  0x%x \n", flag));
 6091 
 6092   returnCode = saSetOperator(agRoot,
 6093                              agNULL,
 6094                              0,
 6095                              flag,
 6096                              cert);
 6097 
 6098   if (returnCode == AGSA_RC_SUCCESS)
 6099   {
 6100     tiStatus = tiSuccess;
 6101   }
 6102   else if (returnCode == AGSA_RC_BUSY)
 6103   {
 6104     tiStatus = tiBusy;
 6105   }
 6106   else
 6107   {
 6108     tiStatus = tiError;
 6109   }
 6110 
 6111   return(tiStatus);
 6112 }
 6113 
 6114 /*****************************************************************************
 6115 *
 6116 * tiCOMGetOperator
 6117 *
 6118 *  Purpose:  This function is used to retrieve the role and ID of the current operator or all operators.
 6119                   The status is reported via ostiPortEvent().
 6120 *
 6121 *  Parameters:
 6122 *
 6123 *    tiRoot:      Pointer to driver/port instance.
 6124 *    option:     Types of get operations
 6125                        0x1: Current operator only
 6126                        0x2: All operators
 6127                        All others are reserved.
 6128       AddrHi      Upper 32-bit host physical address to store operator certificates.
 6129                     This field is used only when option is 0x2
 6130       AddrLo     Lower 32-bit host physical address to store operator certificates.
 6131                     This field is used only when option is 0x2
 6132 *
 6133 *  Return:
 6134 *   tiSuccess     The operation was started..
 6135 *   tiError          The operation was not started.
 6136 *   tiBusy          A operator management operation is already in progress
 6137 *
 6138 *****************************************************************************/
 6139 osGLOBAL bit32 tiCOMGetOperator(
 6140                            tiRoot_t   *tiRoot,
 6141                            bit32       option,
 6142                            bit32       AddrHi,
 6143                            bit32       AddrLo
 6144                            )
 6145 {
 6146   tdsaRoot_t     *tdsaRoot       = agNULL;
 6147   tdsaContext_t  *tdsaAllShared  = agNULL;
 6148   agsaRoot_t     *agRoot         = agNULL;
 6149 
 6150   bit32           returnCode     = AGSA_RC_FAILURE;
 6151   bit32           tiStatus       = tiError;
 6152 
 6153   tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 6154   TD_ASSERT(tdsaRoot != agNULL, "tdsaRoot is NULL !!!");
 6155 
 6156   tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6157   TD_ASSERT(tdsaAllShared != agNULL, "tdsaAllShared is NULL !!!");
 6158 
 6159   agRoot = &(tdsaAllShared->agRootNonInt);
 6160   TD_ASSERT(agRoot != agNULL, "agRoot is NULL !!!");
 6161 
 6162   TI_DBG1(("tiCOMGetOperator: option = 0x%x \n", option));
 6163 
 6164   returnCode = saGetOperator(agRoot,
 6165                              agNULL,
 6166                              0,
 6167                              option,
 6168                              AddrHi,
 6169                              AddrLo);
 6170 
 6171   if (returnCode == AGSA_RC_SUCCESS)
 6172   {
 6173     tiStatus = tiSuccess;
 6174   }
 6175   else if (returnCode == AGSA_RC_BUSY)
 6176   {
 6177     tiStatus = tiBusy;
 6178   }
 6179   else
 6180   {
 6181     tiStatus = tiError;
 6182   }
 6183 
 6184   return(tiStatus);
 6185 }
 6186 
 6187 /*****************************************************************************
 6188 *
 6189 * tiCOMOperationManagement
 6190 *
 6191 *  Purpose:  this function is used to manage operators,  e.g. adding or deleting an operator..
 6192 *
 6193 *  Parameters:
 6194 *
 6195 *   tiRoot:      Pointer to driver/port instance.
 6196 *   flag:         operation flag.
 6197                     Bits 0-7: Operator Management Operation(OMO)
 6198                        0: Add an operator.
 6199                        1: Delete an operator.
 6200                        2: Delete all operators.
 6201                        Others are reserved.
 6202                     Bit 8: Pinned to KEK RAM (PKR)
 6203                       0: Operator's KEK is stored in the operator ID table(OID_TLB) only.
 6204                       1: Operator's KEK is pinned to the internal KEK RAM (1 of the 16 entries) and is also stored in OID_TLB.
 6205                     Bits 9-10: KEKopr blob format (KBF)
 6206                       00b: Reserved.
 6207                       01b: AGSA_ENCRYPTED_KEK_PMCA.
 6208                       10b: AGSA_ENCRYPTED_KEK_PMCB.
 6209                       11b: Reserved.
 6210                     Bits 11-15: Reserved
 6211                     Bits 16-23: KEKauth Index in the KEK Table (AUTIDX)
 6212                     Bits 24-31: KEKopr Index in the KEK Table (OPRIDX). This field is valid only when PKR is 1.
 6213 
 6214        role        Role
 6215                        01b: Crypto officer role.
 6216                        10b: User role.
 6217                        All others are reserved.
 6218 
 6219 *    idString:         Pointer to the tiID_t structure describing the ID string
 6220 *    kekBlob          Pointer to the tiEncryptKekBlob_t structure describing KBLOB.
 6221 *
 6222 *  Return:
 6223 *   tiSuccess     The request is being processed
 6224 *   tiError          An invalid parameter was specified
 6225 *   tiBusy          A operator management operation is already in progress
 6226 *
 6227 *****************************************************************************/
 6228 osGLOBAL bit32 tiCOMOperatorManagement(
 6229                         tiRoot_t            *tiRoot,
 6230                         bit32                flag,
 6231                         bit8                 role,
 6232                         tiID_t              *idString,
 6233                         tiEncryptKekBlob_t  *kekBlob
 6234                         )
 6235 {
 6236   tdsaRoot_t     *tdsaRoot       = agNULL;
 6237   tdsaContext_t  *tdsaAllShared  = agNULL;
 6238   agsaRoot_t     *agRoot         = agNULL;
 6239 
 6240   bit32           returnCode     = AGSA_RC_BUSY;
 6241   bit32           tiStatus       = tiError;
 6242 
 6243   tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 6244   TD_ASSERT(tdsaRoot != agNULL, "tdsaRoot is NULL !!!");
 6245 
 6246   tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6247   TD_ASSERT(tdsaAllShared != agNULL, "tdsaAllShared is NULL !!!");
 6248 
 6249   agRoot = &(tdsaAllShared->agRootNonInt);
 6250   TD_ASSERT(agRoot != agNULL, "agRoot is NULL !!!");
 6251 
 6252   TI_DBG1(("tiCOMOperatorManagement: flag =  0x%x role = 0x%x\n", flag, role));
 6253 
 6254   returnCode = saOperatorManagement(agRoot,
 6255                                     agNULL,
 6256                                     0,
 6257                                     flag,
 6258                                     role,
 6259                                     (agsaID_t*)idString,
 6260                                     (agsaEncryptKekBlob_t *)kekBlob
 6261                                     );
 6262 
 6263   if (returnCode == AGSA_RC_SUCCESS)
 6264   {
 6265     tiStatus = tiSuccess;
 6266   }
 6267   else if (returnCode == AGSA_RC_BUSY)
 6268   {
 6269     tiStatus = tiBusy;
 6270   }
 6271   else
 6272   {
 6273     tiStatus = tiError;
 6274   }
 6275 
 6276   return(tiStatus);
 6277 }
 6278 
 6279 /*****************************************************************************
 6280 *! \brief tdssRemoveSASSATAFromSharedcontext
 6281 *
 6282 *  Purpose:  This function removes all discovered devices belonging to
 6283 *            a given portcontext from device list
 6284 *
 6285 *
 6286 *  \param   agRoot                   Pointer to the root data structure of
 6287 *                                    TD and Lower layer
 6288 *  \param   tsddPortContext_Instance Pointer to the target port context
 6289 *
 6290 *  \Return: none
 6291 *
 6292 *****************************************************************************/
 6293 #ifdef INITIATOR_DRIVER                     /*TBD: added to compile tgt_drv. (TP)*/
 6294 osGLOBAL void
 6295 tdssRemoveSASSATAFromSharedcontext(
 6296                           agsaRoot_t           *agRoot,
 6297                           tdsaPortContext_t    *PortContext_Instance
 6298                           )
 6299 {
 6300   tdsaDeviceData_t  *oneDeviceData = agNULL;
 6301   tdList_t          *DeviceListList;
 6302   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 6303   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 6304   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 6305   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6306 
 6307   TI_DBG1(("tdssRemoveSASSATAFromSharedcontext: start\n"));
 6308   TI_DBG1(("tdssRemoveSASSATAFromSharedcontext: pid %d\n", PortContext_Instance->id));
 6309 
 6310   /* find oneDeviceData belonging to the portcontext */
 6311   DeviceListList = tdsaAllShared->MainDeviceList.flink;
 6312   while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 6313   {
 6314     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 6315     if (oneDeviceData == agNULL)
 6316     {
 6317       TI_DBG1(("tdssRemoveSASSATAFromSharedcontext: oneDeviceData is NULL!!!\n"));
 6318       return;
 6319     }
 6320     if (oneDeviceData->tdPortContext == PortContext_Instance)
 6321     {
 6322       TI_DBG1(("tdssRemoveSASSATAFromSharedcontext: pid %d did %d\n", PortContext_Instance->id, oneDeviceData->id));
 6323       TI_DBG1(("tdssRemoveSASSATAFromSharedcontext: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
 6324       TI_DBG1(("tdssRemoveSASSATAFromSharedcontext: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
 6325 
 6326       /* reset valid bit */
 6327       oneDeviceData->valid = agFALSE;
 6328       oneDeviceData->valid2 = agFALSE;
 6329       oneDeviceData->registered = agFALSE;
 6330       /* notify only reported devices to OS layer*/
 6331       if ( DEVICE_IS_SSP_TARGET(oneDeviceData) ||
 6332            DEVICE_IS_STP_TARGET(oneDeviceData) ||
 6333            DEVICE_IS_SATA_DEVICE(oneDeviceData)
 6334         )
 6335       {
 6336         ostiInitiatorEvent(
 6337                          tiRoot,
 6338                          PortContext_Instance->tiPortalContext,
 6339                          &(oneDeviceData->tiDeviceHandle),
 6340                          tiIntrEventTypeDeviceChange,
 6341                          tiDeviceRemoval,
 6342                          agNULL
 6343                          );
 6344       }
 6345       DeviceListList = DeviceListList->flink;
 6346     /* to-do: deregister */
 6347 #ifdef REMOVED  /* don't remove device from the device list. May screw up ordering */
 6348       TDLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
 6349       TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
 6350 #endif
 6351     }
 6352     else
 6353     {
 6354       TI_DBG6(("tdssRemoveSASSATAFromSharedcontext: move to the next\n"));
 6355       DeviceListList = DeviceListList->flink;
 6356     }
 6357   } /* while */
 6358 
 6359   return;
 6360 }
 6361 
 6362 /*****************************************************************************
 6363 *! \brief tdssRemoveSASSATAFromSharedcontextByReset
 6364 *
 6365 *  Purpose:  This function removes all ports and discovered devices
 6366 *
 6367 *
 6368 *  \param   agRoot                   Pointer to the root data structure of
 6369 *                                    TD and Lower layer
 6370 *
 6371 *  \Return: none
 6372 *
 6373 *****************************************************************************/
 6374 osGLOBAL void
 6375 tdssRemoveSASSATAFromSharedcontextByReset(
 6376                                           agsaRoot_t           *agRoot
 6377                                           )
 6378 {
 6379   tdsaPortContext_t *onePortContext = agNULL;
 6380   tdsaDeviceData_t  *oneDeviceData = agNULL;
 6381   tdList_t          *PortContextList;
 6382   tdList_t          *DeviceListList;
 6383   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 6384   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 6385   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 6386   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6387 #ifdef FDS_DM
 6388   dmRoot_t          *dmRoot = agNULL;
 6389   dmPortContext_t   *dmPortContext = agNULL;
 6390   dmPortInfo_t      dmPortInfo;
 6391 #endif
 6392 #ifdef FDS_SM
 6393   smRoot_t          *smRoot = &(tdsaAllShared->smRoot);
 6394   smDeviceHandle_t  *smDeviceHandle = agNULL;
 6395   agsaDevHandle_t   *agDevHandle = agNULL;
 6396 #endif
 6397 
 6398   TI_DBG1(("tdssRemoveSASSATAFromSharedcontextByReset: start\n"));
 6399 
 6400 #ifdef FDS_DM
 6401   dmRoot = &(tdsaAllShared->dmRoot);
 6402 #endif
 6403   /* looping throuhg all portcontext */
 6404   PortContextList = tdsaAllShared->MainPortContextList.flink;
 6405   while (PortContextList != &(tdsaAllShared->MainPortContextList))
 6406   {
 6407     onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
 6408     if (onePortContext == agNULL)
 6409     {
 6410       TI_DBG1(("tdssRemoveSASSATAFromSharedcontextByReset: onePortContext is NULL!!!\n"));
 6411       return;
 6412     }
 6413     TI_DBG1(("tdssRemoveSASSATAFromSharedcontextByReset: oneportContext pid %d\n", onePortContext->id));
 6414     TI_DBG3(("tdssRemoveSASSATAFromSharedcontextByReset: sasAddressHi 0x%08x\n", onePortContext->sasLocalAddressHi));
 6415     TI_DBG3(("tdssRemoveSASSATAFromSharedcontextByReset: sasAddressLo 0x%08x\n", onePortContext->sasLocalAddressLo));
 6416 #ifdef FDS_DM
 6417     if (onePortContext->UseDM == agTRUE)
 6418     {
 6419       dmPortContext = &(onePortContext->dmPortContext);
 6420       dmDestroyPort(dmRoot, dmPortContext, &dmPortInfo);
 6421     }
 6422 #endif
 6423 
 6424     tdsaPortContextReInit(tiRoot, onePortContext);
 6425 
 6426     PortContextList = PortContextList->flink;
 6427     tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 6428     TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
 6429     TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaAllShared->FreePortContextList));
 6430     tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 6431   }
 6432 
 6433   /* reinitialize the device data belonging to this portcontext */
 6434   DeviceListList = tdsaAllShared->MainDeviceList.flink;
 6435   while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 6436   {
 6437     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 6438     if (oneDeviceData == agNULL)
 6439     {
 6440       TI_DBG1(("tdssRemoveSASSATAFromSharedcontextByReset: oneDeviceData is NULL!!!\n"));
 6441       return;
 6442     }
 6443 
 6444     TI_DBG1(("tdssRemoveSASSATAFromSharedcontextByReset: did %d\n", oneDeviceData->id));
 6445     TI_DBG1(("tdssRemoveSASSATAFromSharedcontextByReset: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
 6446     TI_DBG1(("tdssRemoveSASSATAFromSharedcontextByReset: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
 6447 
 6448 #ifdef FDS_SM
 6449     agDevHandle = oneDeviceData->agDevHandle;
 6450     smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
 6451     smDeregisterDevice(smRoot, agDevHandle, smDeviceHandle);
 6452 #endif
 6453 
 6454     tdsaDeviceDataReInit(tiRoot, oneDeviceData);
 6455 
 6456     DeviceListList = DeviceListList->flink;
 6457     tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 6458     osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
 6459     TDLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
 6460     TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
 6461     tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 6462     /* no dequeue from Mainlink for consistant ordering of devices */
 6463   }
 6464 
 6465 
 6466   return;
 6467 }
 6468 
 6469 #endif
 6470 
 6471 
 6472 /*****************************************************************************
 6473 *! \brief tdssAddSASToSharedcontext
 6474 *
 6475 *  Purpose:  This function adds a discovered device to a device list of
 6476 *            a shared context
 6477 *
 6478 *  \param   tsddPortContext_Instance Pointer to the target port context
 6479 *  \param   agRoot                   Pointer to the root data structure of
 6480 *                                    TD and Lower layer
 6481 *  \param   agDevHandle              Pointer to a device handle
 6482 *
 6483 *  \Return: none
 6484 *
 6485 *****************************************************************************/
 6486 osGLOBAL void
 6487 tdssAddSASToSharedcontext(
 6488                           tdsaPortContext_t    *tdsaPortContext_Instance,
 6489                           agsaRoot_t           *agRoot,
 6490                           agsaDevHandle_t      *agDevHandle, /* this is NULL */
 6491                           tdsaSASSubID_t       *agSASSubID,
 6492                           bit32                 registered, /* no longer in use */
 6493                           bit8                  phyID,
 6494                           bit32                 flag
 6495                           )
 6496 {
 6497 
 6498   tdsaPortContext_t *onePortContext = agNULL;
 6499   tdList_t          *PortContextList;
 6500   tdsaDeviceData_t  *oneDeviceData = agNULL;
 6501   tdList_t          *DeviceListList;
 6502   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 6503   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 6504   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 6505   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6506   bit32             new_device = agTRUE;
 6507   bit32             Indenom = tdsaAllShared->QueueConfig.numInboundQueues;
 6508   bit32             Outdenom = tdsaAllShared->QueueConfig.numOutboundQueues;
 6509   bit8              dev_s_rate = 0;
 6510   bit8              sasorsata = 1;
 6511   bit8              connectionRate;
 6512   bit32             found = agFALSE;
 6513 
 6514   TI_DBG3(("tdssAddSASToSharedcontext: start\n"));
 6515   /*
 6516     find a right portcontext
 6517     then, get devicedata from FreeLink in DeviceList
 6518     then, do pointer operations
 6519     then, add the devicedata to the portcontext
 6520   */
 6521 
 6522   /* find a right portcontext */
 6523   PortContextList = tdsaAllShared->MainPortContextList.flink;
 6524   while (PortContextList != &(tdsaAllShared->MainPortContextList))
 6525   {
 6526     onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
 6527     if (onePortContext == tdsaPortContext_Instance)
 6528     {
 6529       TI_DBG3(("tdssAddSASToSharedContext: found; oneportContext ID %d\n", onePortContext->id));
 6530       found = agTRUE;
 6531       break;
 6532     }
 6533     PortContextList = PortContextList->flink;
 6534   }
 6535 
 6536   if (found == agTRUE)
 6537   {
 6538     TI_DBG3(("tdssAddSASToSharedcontext: found pid %d\n", onePortContext->id));
 6539   }
 6540   else
 6541   {
 6542     TI_DBG1(("tdssAddSASToSharedcontext: Error!!! no portcontext found!!!\n"));
 6543     return;
 6544   }
 6545 
 6546   /* find a device's existence */
 6547   DeviceListList = tdsaAllShared->MainDeviceList.flink;
 6548   while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 6549   {
 6550     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 6551     if (oneDeviceData == agNULL)
 6552     {
 6553       TI_DBG1(("tdssAddSASToSharedcontext: oneDeviceData is NULL!!!\n"));
 6554       return;
 6555     }
 6556     if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) &&
 6557         (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) &&
 6558         (oneDeviceData->tdPortContext == onePortContext)
 6559          )
 6560     {
 6561       TI_DBG1(("tdssAddSASToSharedcontext: pid %d did %d\n", onePortContext->id, oneDeviceData->id));
 6562       new_device = agFALSE;
 6563       break;
 6564     }
 6565     DeviceListList = DeviceListList->flink;
 6566   }
 6567 
 6568   /* new device */
 6569   if (new_device == agTRUE)
 6570   {
 6571     TI_DBG3(("tdssAddSASToSharedcontext: new device\n"));
 6572 
 6573     tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 6574     if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList)))
 6575     {
 6576       tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 6577       TI_DBG1(("tdssAddSASToSharedContext: empty DeviceData FreeLink\n"));
 6578       return;
 6579     }
 6580 
 6581     TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList));
 6582     tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 6583     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList);
 6584 
 6585     TI_DBG3(("tdssAddSASToSharedcontext: oneDeviceData %p\n", oneDeviceData));
 6586 
 6587     onePortContext->Count++;
 6588     oneDeviceData->DeviceType = TD_SAS_DEVICE;
 6589     oneDeviceData->agRoot = agRoot;
 6590 
 6591     if (flag == TD_OPERATION_TARGET)
 6592     {
 6593       oneDeviceData->agDevHandle = agDevHandle;
 6594       agDevHandle->osData = oneDeviceData; /* TD layer */
 6595     }
 6596 
 6597     /* saving sas address */
 6598     oneDeviceData->SASAddressID.sasAddressLo = agSASSubID->sasAddressLo;
 6599     oneDeviceData->SASAddressID.sasAddressHi = agSASSubID->sasAddressHi;
 6600     oneDeviceData->initiator_ssp_stp_smp = agSASSubID->initiator_ssp_stp_smp;
 6601     oneDeviceData->target_ssp_stp_smp = agSASSubID->target_ssp_stp_smp;
 6602 
 6603     oneDeviceData->tdPortContext = onePortContext;
 6604     oneDeviceData->valid = agTRUE;
 6605 
 6606     /* new */
 6607     oneDeviceData->directlyAttached = agTRUE;
 6608     /* parse sasIDframe to fill in agDeviceInfo */
 6609     DEVINFO_PUT_SMPTO(&oneDeviceData->agDeviceInfo, DEFAULT_SMP_TIMEOUT);
 6610     DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->agDeviceInfo, (bit16)tdsaAllShared->itNexusTimeout);
 6611     DEVINFO_PUT_FBS(&oneDeviceData->agDeviceInfo, 0);
 6612     /* enable TLR */
 6613     DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, 1);
 6614 
 6615     sasorsata = SAS_DEVICE_TYPE; /* SAS target (SAS disk or expander) */
 6616     connectionRate = onePortContext->LinkRate; 
 6617     dev_s_rate = (bit8)(dev_s_rate | (sasorsata << 4));
 6618     dev_s_rate = (bit8)(dev_s_rate | connectionRate);
 6619     DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->agDeviceInfo, dev_s_rate);
 6620 
 6621 
 6622     DEVINFO_PUT_SAS_ADDRESSLO(
 6623                               &oneDeviceData->agDeviceInfo,
 6624                               agSASSubID->sasAddressLo
 6625                               );
 6626     DEVINFO_PUT_SAS_ADDRESSHI(
 6627                               &oneDeviceData->agDeviceInfo,
 6628                               agSASSubID->sasAddressHi
 6629                               );
 6630 
 6631     oneDeviceData->agContext.osData = oneDeviceData;
 6632     oneDeviceData->agContext.sdkData = agNULL;
 6633 
 6634     if (flag == TD_OPERATION_INITIATOR)
 6635     {
 6636       if (oneDeviceData->registered == agFALSE )
 6637       {
 6638         if( tdsaAllShared->sflag )
 6639         {
 6640           if( ! DEVICE_IS_SMP_TARGET(oneDeviceData))
 6641           {
 6642             TI_DBG1(("tdssAddSASToSharedcontext: First, saRegisterNewDevice sflag %d\n", tdsaAllShared->sflag));
 6643             oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | TD_XFER_RDY_PRIORTY_DEVICE_FLAG;
 6644           }
 6645         }
 6646 
 6647         saRegisterNewDevice( /* tdssAddSASToSharedcontext */
 6648                             agRoot,
 6649                             &oneDeviceData->agContext,
 6650                             0,
 6651                             &oneDeviceData->agDeviceInfo,
 6652                             onePortContext->agPortContext,
 6653                             0
 6654                            );
 6655       }
 6656     }
 6657     oneDeviceData->phyID = phyID;
 6658     oneDeviceData->InQID = oneDeviceData->id % Indenom;
 6659 
 6660 #ifdef TARGET_DRIVER
 6661     {
 6662       bit32 localId = oneDeviceData->id;
 6663       localId += 1;
 6664       oneDeviceData->OutQID = localId % Outdenom;
 6665       TI_DBG1(("tdssAddSASToSharedcontext: OutQID %d\n", oneDeviceData->OutQID)); /* tdsaRotateQnumber for tgt*/
 6666 
 6667     }
 6668 #endif /* TARGET_DRIVER */
 6669 
 6670     TI_DBG4(("tdssAddSASToSharedcontext: SSP target %d STP target %d SATA device %d\n", DEVICE_IS_SSP_TARGET(oneDeviceData), DEVICE_IS_STP_TARGET(oneDeviceData), DEVICE_IS_SATA_DEVICE(oneDeviceData)));
 6671     /* add the devicedata to the portcontext */
 6672     tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 6673     TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
 6674     tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 6675     TI_DBG4(("tdssAddSASToSharedContext: one case pid %d did %d \n", onePortContext->id, oneDeviceData->id));
 6676     TI_DBG4(("tdssAddSASToSharedContext: new case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID));
 6677 
 6678   }
 6679   else /* old device */
 6680   {
 6681     TI_DBG3(("tdssAddSASToSharedcontext: old device\n"));
 6682     TI_DBG3(("tdssAddSASToSharedcontext: oneDeviceData %p\n", oneDeviceData));
 6683 
 6684     oneDeviceData->DeviceType = TD_SAS_DEVICE;
 6685     oneDeviceData->agRoot = agRoot;
 6686 
 6687     if (flag == TD_OPERATION_TARGET)
 6688     {
 6689       oneDeviceData->agDevHandle = agDevHandle;
 6690       agDevHandle->osData = oneDeviceData; /* TD layer */
 6691     }
 6692 
 6693     /* saving sas address */
 6694     oneDeviceData->SASAddressID.sasAddressLo = agSASSubID->sasAddressLo;
 6695     oneDeviceData->SASAddressID.sasAddressHi = agSASSubID->sasAddressHi;
 6696     oneDeviceData->initiator_ssp_stp_smp = agSASSubID->initiator_ssp_stp_smp;
 6697     oneDeviceData->target_ssp_stp_smp = agSASSubID->target_ssp_stp_smp;
 6698 
 6699 
 6700     oneDeviceData->tdPortContext = onePortContext;
 6701     oneDeviceData->valid = agTRUE;
 6702 
 6703     oneDeviceData->directlyAttached = agTRUE;
 6704     /* new */
 6705     if (oneDeviceData->registered == agFALSE)
 6706     {
 6707       TI_DBG1(("tdssAddSASToSharedcontext: registering\n"));
 6708       /* parse sasIDframe to fill in agDeviceInfo */
 6709       DEVINFO_PUT_SMPTO(&oneDeviceData->agDeviceInfo, DEFAULT_SMP_TIMEOUT);
 6710       DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->agDeviceInfo, (bit16)tdsaAllShared->itNexusTimeout);
 6711       DEVINFO_PUT_FBS(&oneDeviceData->agDeviceInfo, 0);
 6712       DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, 1);
 6713 
 6714       sasorsata = SAS_DEVICE_TYPE; /* SAS target (SAS disk or expander) */
 6715       connectionRate = onePortContext->LinkRate; 
 6716       dev_s_rate = (bit8)(dev_s_rate | (sasorsata << 4));
 6717       dev_s_rate = (bit8)(dev_s_rate | connectionRate);
 6718       DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->agDeviceInfo, dev_s_rate);
 6719 
 6720 
 6721       DEVINFO_PUT_SAS_ADDRESSLO(
 6722                                 &oneDeviceData->agDeviceInfo,
 6723                                 agSASSubID->sasAddressLo
 6724                                 );
 6725       DEVINFO_PUT_SAS_ADDRESSHI(
 6726                                 &oneDeviceData->agDeviceInfo,
 6727                                 agSASSubID->sasAddressHi
 6728                                 );
 6729 
 6730       oneDeviceData->agContext.osData = oneDeviceData;
 6731       oneDeviceData->agContext.sdkData = agNULL;
 6732 
 6733       if (flag == TD_OPERATION_INITIATOR)
 6734       {
 6735         if( tdsaAllShared->sflag )
 6736         {
 6737           if( ! DEVICE_IS_SMP_TARGET(oneDeviceData))
 6738           {
 6739             TI_DBG1(("tdssAddSASToSharedcontext: Second, saRegisterNewDevice sflag %d\n", tdsaAllShared->sflag));
 6740             oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | TD_XFER_RDY_PRIORTY_DEVICE_FLAG;
 6741           }
 6742         }
 6743         saRegisterNewDevice( /* tdssAddSASToSharedcontext */
 6744                             agRoot,
 6745                             &oneDeviceData->agContext,
 6746                             0,
 6747                             &oneDeviceData->agDeviceInfo,
 6748                             onePortContext->agPortContext,
 6749                             0
 6750                             );
 6751       }
 6752     }
 6753 
 6754 
 6755 
 6756 
 6757 
 6758 
 6759     oneDeviceData->phyID = phyID;
 6760     oneDeviceData->InQID = oneDeviceData->id % Indenom;
 6761     oneDeviceData->OutQID = oneDeviceData->id % Outdenom;
 6762 
 6763     TI_DBG1(("tdssAddSASToSharedcontext: A OutQID %d\n", oneDeviceData->OutQID));
 6764     TI_DBG4(("tdssAddSASToSharedcontext: SSP target %d STP target %d SATA device %d\n", DEVICE_IS_SSP_TARGET(oneDeviceData), DEVICE_IS_STP_TARGET(oneDeviceData), DEVICE_IS_SATA_DEVICE(oneDeviceData)));
 6765     TI_DBG4(("tdssAddSASToSharedContext: old case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID));
 6766   }
 6767 
 6768   return;
 6769 }
 6770 
 6771 
 6772 
 6773 
 6774 /*****************************************************************************
 6775 *! \brief tdssRemoveDevicedataFromSharedcontext
 6776 *
 6777 *  Purpose:  This function removes a discovered device from a device list of
 6778 *            a port context
 6779 *
 6780 *  \param   tsddPortContext_Ins      Pointer to the target port context
 6781 *  \param   tdsaDeviceData_Ins       Pointer to the target device
 6782 *  \param   agRoot                   Pointer to the root data structure of
 6783 *                                    TD and Lower layer
 6784 
 6785 *
 6786 *  \Return: none
 6787 *
 6788 *****************************************************************************/
 6789 osGLOBAL void
 6790 tdssRemoveSASFromSharedcontext(
 6791                                tdsaPortContext_t *tdsaPortContext_Ins,
 6792                                tdsaDeviceData_t  *tdsaDeviceData_Ins,
 6793                                agsaRoot_t        *agRoot
 6794                                )
 6795 {
 6796   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 6797   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 6798   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 6799   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6800   tdsaPortContext_t *onePortContext = agNULL;
 6801   tdList_t          *PortContextList;
 6802   tdsaDeviceData_t  *oneDeviceData = agNULL;
 6803   tdList_t          *DeviceListList;
 6804   bit32             found = agTRUE;
 6805 
 6806   TI_DBG3(("tdssRemoveSASFromSharedcontext: start\n"));
 6807   /* find a right portcontext */
 6808   PortContextList = tdsaAllShared->MainPortContextList.flink;
 6809   while (PortContextList != &(tdsaAllShared->MainPortContextList))
 6810   {
 6811     onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
 6812     if (onePortContext == agNULL)
 6813     {
 6814       TI_DBG1(("tdssRemoveDevicedataFromSharedcontext: onePortContext is NULL!!!\n"));
 6815       return;
 6816     }
 6817     if (onePortContext == tdsaPortContext_Ins)
 6818     {
 6819       TI_DBG4(("tdssRemoveDevicedataFromSharedcontext: found; oneportContext ID %d\n", onePortContext->id));
 6820       break;
 6821     }
 6822     PortContextList = PortContextList->flink;
 6823   }
 6824 
 6825   /* find a device's existence */
 6826   DeviceListList = tdsaAllShared->MainDeviceList.flink;
 6827   while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 6828   {
 6829     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 6830     if (oneDeviceData == agNULL)
 6831     {
 6832       TI_DBG1(("tdssRemoveDevicedataFromSharedcontext: oneDeviceData is NULL!!!\n"));
 6833       return;
 6834     }
 6835     if ((oneDeviceData->SASAddressID.sasAddressHi
 6836          == SA_DEVINFO_GET_SAS_ADDRESSHI(&tdsaDeviceData_Ins->agDeviceInfo))
 6837         &&
 6838         (oneDeviceData->SASAddressID.sasAddressLo ==
 6839          SA_DEVINFO_GET_SAS_ADDRESSLO(&tdsaDeviceData_Ins->agDeviceInfo)))
 6840     {
 6841       TI_DBG4(("tdssRemoveDevicedataFromSharedcontext: pid %d did %d\n", onePortContext->id, oneDeviceData->id));
 6842       found = agFALSE;
 6843       break;
 6844     }
 6845     DeviceListList = DeviceListList->flink;
 6846   }
 6847 
 6848   if (found == agFALSE)
 6849   {
 6850     TI_DBG6(("tdssRemoveDevicedataFromSharedcontext: can't find the right devicedata in MainLink\n"));
 6851     return;
 6852   }
 6853 
 6854   /* remove it and put it back to FreeLink of Devicedata */
 6855   TI_DBG6(("tdssRemoveDevicedataFromSharedcontext: removing ... pid %d did %d\n", onePortContext->id, oneDeviceData->id));
 6856 
 6857   /* invalidate the device but keep it on the list for persistency */
 6858   oneDeviceData->valid = agFALSE;
 6859 
 6860   return;
 6861 }
 6862 
 6863 /*****************************************************************************
 6864 *! \brief tdssRemoveAllDevicedataFromPortcontext
 6865 *
 6866 *  Purpose:  This function removes all discovered devices from a device list of
 6867 *            a port context
 6868 *
 6869 *  \param   tdsaDeviceData           Pointer to a device header
 6870 *
 6871 *  \Return: none
 6872 *
 6873 *****************************************************************************/
 6874 osGLOBAL void
 6875 tdssRemoveAllDevicelistFromPortcontext(
 6876                                        tdsaPortContext_t *PortContext_Ins,
 6877                                        agsaRoot_t        *agRoot
 6878                                        )
 6879 {
 6880 
 6881   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 6882   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 6883   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 6884   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6885   tdsaDeviceData_t  *oneDeviceData = agNULL;
 6886   tdList_t          *DeviceListList;
 6887 
 6888   TI_DBG6(("tdssRemoveAllDevicedataFromPortcontext: start\n"));
 6889 
 6890   /*
 6891     loop through device list and find the matching portcontext. Then invalidate the
 6892     matching devices
 6893   */
 6894   DeviceListList = tdsaAllShared->MainDeviceList.flink;
 6895   while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 6896   {
 6897     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 6898     if (oneDeviceData == agNULL)
 6899     {
 6900       TI_DBG1(("tdssRemoveAllDevicelistFromPortcontext: oneDeviceData is NULL!!!\n"));
 6901       return;
 6902     }
 6903     if (oneDeviceData->tdPortContext == PortContext_Ins)
 6904     {
 6905       TI_DBG4(("tdssRemoveAllDevicelistFromPortcontext: pid %d did %d\n", PortContext_Ins->id, oneDeviceData->id));
 6906       PortContext_Ins->Count--;
 6907       oneDeviceData->valid = agFALSE;
 6908     }
 6909     DeviceListList = DeviceListList->flink;
 6910   }
 6911 
 6912   return;
 6913 }
 6914 
 6915 
 6916 #ifdef INITIATOR_DRIVER
 6917 #ifdef TD_DISCOVER
 6918 /*****************************************************************************
 6919 *! \brief tdssNewAddSASToSharedcontext
 6920 *
 6921 *  Purpose:  This function adds a discovered SAS device to a device list of
 6922 *            a shared context. Used only in discovery.
 6923 *
 6924 *  \param   agRoot          Pointer to chip/driver Instance.
 6925 *  \param   onePortContext  Pointer to the target port context
 6926 *  \param   agSASSubID      Pointer to the SAS identification.
 6927 *
 6928 *  \Return:
 6929 *           Pointer to the device data
 6930 *
 6931 *****************************************************************************/
 6932 osGLOBAL tdsaDeviceData_t *
 6933 tdssNewAddSASToSharedcontext(
 6934                              agsaRoot_t           *agRoot,
 6935                              tdsaPortContext_t    *onePortContext,
 6936                              tdsaSASSubID_t       *agSASSubID,
 6937                              tdsaDeviceData_t     *oneExpDeviceData,
 6938                              bit8                 phyID
 6939                              )
 6940 {
 6941   tdsaDeviceData_t  *oneDeviceData = agNULL;
 6942   tdList_t          *DeviceListList;
 6943   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 6944   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 6945   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 6946   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6947   bit32             new_device = agTRUE;
 6948 
 6949   TI_DBG3(("tdssNewAddSASToSharedcontext: start\n"));
 6950   /*
 6951     find a right portcontext
 6952     then, get devicedata from FreeLink in DeviceList
 6953     then, do pointer operations
 6954     then, add the devicedata to the portcontext
 6955   */
 6956 
 6957 
 6958   TI_DBG3(("tdssNewAddSASToSharedcontext: oneportContext ID %d\n", onePortContext->id));
 6959   /* find a device's existence */
 6960   DeviceListList = tdsaAllShared->MainDeviceList.flink;
 6961   while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 6962   {
 6963     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 6964     if (oneDeviceData == agNULL)
 6965     {
 6966       TI_DBG1(("tdssNewAddSASToSharedcontext: oneDeviceData is NULL!!!\n"));
 6967       return agNULL;
 6968     }
 6969     if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) &&
 6970         (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) &&
 6971         (oneDeviceData->tdPortContext == onePortContext)
 6972         )
 6973     {
 6974       TI_DBG3(("tdssNewAddSASToSharedcontext: pid %d did %d\n", onePortContext->id, oneDeviceData->id));
 6975       new_device = agFALSE;
 6976       break;
 6977     }
 6978     DeviceListList = DeviceListList->flink;
 6979   }
 6980 
 6981   /* new device */
 6982   if (new_device == agTRUE)
 6983   {
 6984     TI_DBG3(("tdssNewAddSASToSharedcontext: new device\n"));
 6985     tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 6986     if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList)))
 6987     {
 6988       tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 6989       TI_DBG1(("tdssNewAddSASToSharedcontext: empty DeviceData FreeLink\n"));
 6990       return agNULL;
 6991     }
 6992 
 6993     TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList));
 6994     tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 6995     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList);
 6996 
 6997     TI_DBG3(("tdssNewAddSASToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
 6998 
 6999     onePortContext->Count++;
 7000     oneDeviceData->agRoot = agRoot;
 7001     /* saving sas address */
 7002     oneDeviceData->SASAddressID.sasAddressLo = agSASSubID->sasAddressLo;
 7003     oneDeviceData->SASAddressID.sasAddressHi = agSASSubID->sasAddressHi;
 7004     oneDeviceData->initiator_ssp_stp_smp = agSASSubID->initiator_ssp_stp_smp;
 7005     oneDeviceData->target_ssp_stp_smp = agSASSubID->target_ssp_stp_smp;
 7006     oneDeviceData->tdPortContext = onePortContext;
 7007     /* handles both SAS target and STP-target, SATA-device */
 7008     if (!DEVICE_IS_SATA_DEVICE(oneDeviceData) && !DEVICE_IS_STP_TARGET(oneDeviceData))
 7009     {
 7010       oneDeviceData->DeviceType = TD_SAS_DEVICE;
 7011     }
 7012     else
 7013     {
 7014       oneDeviceData->DeviceType = TD_SATA_DEVICE;
 7015     }
 7016 
 7017     oneDeviceData->ExpDevice = oneExpDeviceData;
 7018     /* set phyID only when it has initial value of 0xFF */
 7019     if (oneDeviceData->phyID == 0xFF)
 7020     {
 7021       oneDeviceData->phyID = phyID;
 7022     }
 7023 #ifdef FDS_DM
 7024     oneDeviceData->valid = agTRUE;
 7025 #else
 7026 
 7027     /* incremental discovery */
 7028     /* add device to incremental-related link. Report using this link
 7029        when incremental discovery is done */
 7030     if (onePortContext->discovery.type == TDSA_DISCOVERY_OPTION_INCREMENTAL_START)
 7031     {
 7032       TI_DBG3(("tdssNewAddSASToSharedcontext: incremental discovery\n"));
 7033       TI_DBG3(("tdssNewAddSASToSharedcontext: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
 7034       TI_DBG3(("tdssNewAddSASToSharedcontext: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
 7035       oneDeviceData->valid2 = agTRUE;
 7036     }
 7037     else
 7038     {
 7039       TI_DBG3(("tdssNewAddSASToSharedcontext: full discovery\n"));
 7040       TI_DBG3(("tdssNewAddSASToSharedcontext: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
 7041       TI_DBG3(("tdssNewAddSASToSharedcontext: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
 7042       oneDeviceData->valid = agTRUE;
 7043     }
 7044 #endif
 7045     /* add the devicedata to the portcontext */
 7046     tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 7047     TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
 7048     tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 7049     TI_DBG4(("tdssNewAddSASToSharedcontext: one case pid %d did %d \n", onePortContext->id, oneDeviceData->id));
 7050     TI_DBG4(("tdssNewAddSASToSharedcontext: new case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID));
 7051   }
 7052   else /* old device */
 7053   {
 7054     TI_DBG3(("tdssNewAddSASToSharedcontext: old device\n"));
 7055     TI_DBG3(("tdssNewAddSASToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
 7056 
 7057     oneDeviceData->agRoot = agRoot;
 7058     /* saving sas address */
 7059     oneDeviceData->SASAddressID.sasAddressLo = agSASSubID->sasAddressLo;
 7060     oneDeviceData->SASAddressID.sasAddressHi = agSASSubID->sasAddressHi;
 7061     oneDeviceData->initiator_ssp_stp_smp = agSASSubID->initiator_ssp_stp_smp;
 7062     oneDeviceData->target_ssp_stp_smp = agSASSubID->target_ssp_stp_smp;
 7063     oneDeviceData->tdPortContext = onePortContext;
 7064     /* handles both SAS target and STP-target, SATA-device */
 7065     if (!DEVICE_IS_SATA_DEVICE(oneDeviceData) && !DEVICE_IS_STP_TARGET(oneDeviceData))
 7066     {
 7067       oneDeviceData->DeviceType = TD_SAS_DEVICE;
 7068     }
 7069     else
 7070     {
 7071       oneDeviceData->DeviceType = TD_SATA_DEVICE;
 7072     }
 7073 
 7074     oneDeviceData->ExpDevice = oneExpDeviceData;
 7075     /* set phyID only when it has initial value of 0xFF */
 7076     if (oneDeviceData->phyID == 0xFF)
 7077     {
 7078       oneDeviceData->phyID = phyID;
 7079     }
 7080 
 7081 #ifdef FDS_DM
 7082     oneDeviceData->valid = agTRUE;
 7083 #else
 7084     if (onePortContext->discovery.type == TDSA_DISCOVERY_OPTION_INCREMENTAL_START)
 7085     {
 7086       TI_DBG3(("tdssNewAddSASToSharedcontext: incremental discovery\n"));
 7087       TI_DBG3(("tdssNewAddSASToSharedcontext: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
 7088       TI_DBG3(("tdssNewAddSASToSharedcontext: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
 7089       oneDeviceData->valid2 = agTRUE;
 7090     }
 7091     else
 7092     {
 7093       TI_DBG3(("tdssNewAddSASToSharedcontext: full discovery\n"));
 7094       TI_DBG3(("tdssNewAddSASToSharedcontext: sasAddrHi 0x%08x \n", oneDeviceData->SASAddressID.sasAddressHi));
 7095       TI_DBG3(("tdssNewAddSASToSharedcontext: sasAddrLo 0x%08x \n", oneDeviceData->SASAddressID.sasAddressLo));
 7096       oneDeviceData->valid = agTRUE;
 7097     }
 7098 #endif
 7099     TI_DBG4(("tdssNewAddSASToSharedcontext: old case pid %d did %d phyID %d\n", onePortContext->id, oneDeviceData->id, oneDeviceData->phyID));
 7100 
 7101   }
 7102   return oneDeviceData;
 7103 }
 7104 
 7105 /*****************************************************************************
 7106 *! \brief tdsaFindRegNValid
 7107 *
 7108 *  Purpose:  This function finds a device which is registered and valid in
 7109 *            the device list. Used only in incremental discovery.
 7110 *
 7111 *  \param   agRoot          Pointer to chip/driver Instance.
 7112 *  \param   onePortContext  Pointer to the target port context
 7113 *  \param   tdsaDeviceData  Pointer to a device list header
 7114 *  \param   agSASSubID      Pointer to the SAS identification.
 7115 *
 7116 *  \Return:
 7117 *           Pointer to the device data
 7118 *
 7119 *****************************************************************************/
 7120 osGLOBAL tdsaDeviceData_t *
 7121 tdsaFindRegNValid(
 7122                   agsaRoot_t           *agRoot,
 7123                   tdsaPortContext_t    *onePortContext,
 7124                   tdsaSASSubID_t       *agSASSubID
 7125                   )
 7126 {
 7127   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 7128   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 7129   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 7130   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 7131   tdsaDeviceData_t  *oneDeviceData = agNULL;
 7132   tdList_t          *DeviceListList;
 7133   bit32             found = agFALSE;
 7134 
 7135   TI_DBG3(("tdsaFindRegNValid: start\n"));
 7136 
 7137   /* find a device's existence */
 7138   DeviceListList = tdsaAllShared->MainDeviceList.flink;
 7139   if (onePortContext->discovery.type == TDSA_DISCOVERY_OPTION_FULL_START)
 7140   {
 7141     TI_DBG3(("tdsaFindRegNValid: Full discovery\n"));
 7142     while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 7143     {
 7144       oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 7145       if (oneDeviceData == agNULL)
 7146       {
 7147         TI_DBG1(("tdsaFindRegNValid: oneDeviceData is NULL!!!\n"));
 7148         return agNULL;
 7149       }
 7150       if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) &&
 7151           (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) &&
 7152           (oneDeviceData->registered == agTRUE) &&
 7153           (oneDeviceData->valid == agTRUE) &&
 7154           (oneDeviceData->tdPortContext == onePortContext)
 7155           )
 7156       {
 7157         TI_DBG3(("tdsaFindRegNValid: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
 7158         TI_DBG3(("tdsaFindRegNValid: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
 7159         TI_DBG3(("tdsaFindRegNValid: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
 7160         found = agTRUE;
 7161         break;
 7162       }
 7163       DeviceListList = DeviceListList->flink;
 7164     }
 7165   }
 7166   else
 7167   {
 7168     /* incremental discovery */
 7169     TI_DBG3(("tdsaFindRegNValid: Incremental discovery\n"));
 7170     while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 7171     {
 7172       oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 7173       if (oneDeviceData == agNULL)
 7174       {
 7175         TI_DBG1(("tdsaFindRegNValid: oneDeviceData is NULL!!!\n"));
 7176         return agNULL;
 7177       }
 7178       if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) &&
 7179           (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) &&
 7180           (oneDeviceData->registered == agTRUE) &&
 7181           (oneDeviceData->valid2 == agTRUE) &&
 7182           (oneDeviceData->tdPortContext == onePortContext)
 7183           )
 7184       {
 7185         TI_DBG3(("tdsaFindRegNValid: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
 7186         TI_DBG3(("tdsaFindRegNValid: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
 7187         TI_DBG3(("tdsaFindRegNValid: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
 7188         found = agTRUE;
 7189         break;
 7190       }
 7191       DeviceListList = DeviceListList->flink;
 7192     }
 7193   }
 7194 
 7195 
 7196 
 7197   if (found == agFALSE)
 7198   {
 7199     TI_DBG3(("tdsaFindRegNValid: end returning NULL\n"));
 7200     return agNULL;
 7201   }
 7202   else
 7203   {
 7204     TI_DBG3(("tdsaFindRegNValid: end returning NOT NULL\n"));
 7205     return oneDeviceData;
 7206   }
 7207 
 7208 }
 7209 
 7210 //registered to LL or not
 7211 /*****************************************************************************
 7212 *! \brief tdssNewSASorNot
 7213 *
 7214 *  Purpose:  This function finds whether a device is registered or not
 7215 *
 7216 *  \param   agRoot          Pointer to chip/driver Instance.
 7217 *  \param   onePortContext  Pointer to the target port context
 7218 *  \param   agSASSubID      Pointer to the SAS identification.
 7219 *
 7220 *  \Return:
 7221 *           agTRUE   Device is not registered (New device).
 7222 *           agFALSE  Device is registered (Old device).
 7223 *
 7224 *****************************************************************************/
 7225 bit32
 7226 tdssNewSASorNot(
 7227                                  agsaRoot_t           *agRoot,
 7228                                  tdsaPortContext_t    *onePortContext,
 7229                                  tdsaSASSubID_t       *agSASSubID
 7230                                  )
 7231 {
 7232   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 7233   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 7234   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 7235   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 7236   tdsaDeviceData_t  *oneDeviceData = agNULL;
 7237   tdList_t          *DeviceListList;
 7238   bit32             ret = agTRUE;
 7239 
 7240   TI_DBG3(("tdssNewSASorNot: start\n"));
 7241 
 7242   /* find a device's existence */
 7243   DeviceListList = tdsaAllShared->MainDeviceList.flink;
 7244   while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 7245   {
 7246     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 7247     if ((oneDeviceData->SASAddressID.sasAddressHi == agSASSubID->sasAddressHi) &&
 7248         (oneDeviceData->SASAddressID.sasAddressLo == agSASSubID->sasAddressLo) &&
 7249         (oneDeviceData->registered == agTRUE) &&
 7250         (oneDeviceData->tdPortContext == onePortContext)
 7251         )
 7252     {
 7253       TI_DBG3(("tdssNewSASorNot: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
 7254       ret = agFALSE;
 7255       break;
 7256     }
 7257     DeviceListList = DeviceListList->flink;
 7258   }
 7259 
 7260 
 7261 
 7262   TI_DBG3(("tdssNewSASorNot: end\n"));
 7263 
 7264   return ret;
 7265 }
 7266 
 7267 
 7268 
 7269 /*****************************************************************************
 7270 *! \brief  tdssSASDiscoveringExpanderAlloc
 7271 *
 7272 *  Purpose:  This function allocates an expander from the pre-allocated memory
 7273 *            pool.
 7274 *
 7275 *  \param   tiRoot: Pointer to the OS Specific module allocated tiRoot_t
 7276 *                   instance.
 7277 *  \param   onePortContext: Pointer to the portal context instance.
 7278 *  \param   oneDeviceData:  Pointer to the device data.
 7279 *
 7280 *  \return:
 7281 *           Pointer to expander on success
 7282 *           agNULL              on failure
 7283 *
 7284 *   \note:
 7285 *
 7286 *****************************************************************************/
 7287 osGLOBAL tdsaExpander_t *
 7288 tdssSASDiscoveringExpanderAlloc(
 7289                                 tiRoot_t                 *tiRoot,
 7290                                 tdsaPortContext_t        *onePortContext,
 7291                                 tdsaDeviceData_t         *oneDeviceData
 7292                                 )
 7293 {
 7294   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 7295   tdsaContext_t     *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 7296   tdsaExpander_t    *oneExpander = agNULL;
 7297   tdList_t          *ExpanderList;
 7298 
 7299   /*
 7300     move the expander from freeExpanderList
 7301     and ground the expander by TDLIST_DEQUEUE_THIS
 7302   */
 7303 
 7304 
 7305   TI_DBG3(("tdssSASDiscoveringExpanderAlloc: start\n"));
 7306   TI_DBG3(("tdssSASDiscoveringExpanderAlloc: did %d\n", oneDeviceData->id));
 7307   TI_DBG3(("tdssSASDiscoveringExpanderAlloc: sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
 7308   TI_DBG3(("tdssSASDiscoveringExpanderAlloc: sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
 7309 
 7310   if (onePortContext->valid == agFALSE)
 7311   {
 7312     TI_DBG1(("tdssSASDiscoveringExpanderAlloc: aborting discovery\n"));
 7313     tdsaSASDiscoverAbort(tiRoot, onePortContext);
 7314     return agNULL;
 7315   }
 7316 
 7317   tdsaDumpAllFreeExp(tiRoot);
 7318 
 7319   if (TDLIST_EMPTY(&(tdsaAllShared->freeExpanderList)))
 7320   {
 7321     TI_DBG1(("tdssSASDiscoveringExpanderAlloc: no free expanders\n"));
 7322     return agNULL;
 7323   }
 7324 
 7325   tdsaSingleThreadedEnter(tiRoot, TD_DISC_LOCK);
 7326   TDLIST_DEQUEUE_FROM_HEAD(&ExpanderList, &(tdsaAllShared->freeExpanderList));
 7327   tdsaSingleThreadedLeave(tiRoot, TD_DISC_LOCK);
 7328   //  oneExpander = TDLIST_OBJECT_BASE(tdsaContext_t, freeExpanderList, ExpanderList);
 7329   oneExpander = TDLIST_OBJECT_BASE(tdsaExpander_t, linkNode, ExpanderList);
 7330 
 7331   if (oneExpander != agNULL)
 7332   {
 7333     TI_DBG3(("tdssSASDiscoveringExpanderAlloc: expander id %d\n", oneExpander->id));
 7334 
 7335     tdsaSingleThreadedEnter(tiRoot, TD_DISC_LOCK);
 7336     TDLIST_DEQUEUE_THIS(&(oneExpander->linkNode));
 7337     tdsaSingleThreadedLeave(tiRoot, TD_DISC_LOCK);
 7338 
 7339     oneExpander->tdDevice = oneDeviceData;
 7340     oneExpander->tdUpStreamExpander = agNULL;
 7341     oneExpander->tdCurrentDownStreamExpander = agNULL;
 7342     oneExpander->tdReturnginExpander = agNULL;
 7343     oneExpander->hasUpStreamDevice = agFALSE;
 7344     oneExpander->numOfUpStreamPhys = 0;
 7345     oneExpander->currentUpStreamPhyIndex = 0;
 7346     oneExpander->discoveringPhyId = 0;
 7347     oneExpander->underDiscovering = agFALSE;
 7348     osti_memset( &(oneExpander->currentIndex), 0, sizeof(oneExpander->currentIndex));
 7349 
 7350     oneDeviceData->tdExpander = oneExpander;
 7351   }
 7352 
 7353   return oneExpander;
 7354 }
 7355 
 7356 /*****************************************************************************
 7357 *! \brief  tdssSASDiscoveringExpanderAdd
 7358 *
 7359 *  Purpose:  This function adds an expander to the expander list.
 7360 *
 7361 *  \param   tiRoot: Pointer to the OS Specific module allocated tiRoot_t
 7362 *                   instance.
 7363 *  \param   onePortContext: Pointer to the portal context instance.
 7364 *  \param   oneExpander: Pointer to the expander data.
 7365 *
 7366 *  \return:
 7367 *           None
 7368 *
 7369 *   \note:
 7370 *
 7371 *****************************************************************************/
 7372 osGLOBAL void
 7373 tdssSASDiscoveringExpanderAdd(
 7374                               tiRoot_t                 *tiRoot,
 7375                               tdsaPortContext_t        *onePortContext,
 7376                               tdsaExpander_t           *oneExpander
 7377                               )
 7378 {
 7379 #ifdef TD_INTERNAL_DEBUG
 7380   tdList_t          *ExpanderList;
 7381   tdsaExpander_t    *tempExpander;
 7382 #endif
 7383 
 7384   /* move the expander to discoveringExpanderList */
 7385 
 7386   TI_DBG3(("tdssSASDiscoveringExpanderAdd: start\n"));
 7387   TI_DBG3(("tdssSASDiscoveringExpanderAdd: expander id %d\n", oneExpander->id));
 7388   TI_DBG3(("tdssSASDiscoveringExpanderAdd: exp addrHi 0x%08x\n", oneExpander->tdDevice->SASAddressID.sasAddressHi));
 7389   TI_DBG3(("tdssSASDiscoveringExpanderAdd: exp addrLo 0x%08x\n", oneExpander->tdDevice->SASAddressID.sasAddressLo));
 7390 
 7391   if (onePortContext->valid == agFALSE)
 7392   {
 7393     TI_DBG1(("tdssSASDiscoveringExpanderAdd: aborting discovery\n"));
 7394     tdsaSASDiscoverAbort(tiRoot, onePortContext);
 7395     return;
 7396   }
 7397 
 7398 
 7399   if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
 7400   {
 7401     TI_DBG3(("tdssSASDiscoveringExpanderAdd: UPSTREAM\n"));
 7402   }
 7403   else if (onePortContext->discovery.status == DISCOVERY_DOWN_STREAM)
 7404   {
 7405     TI_DBG3(("tdssSASDiscoveringExpanderAdd: DOWNSTREAM\n"));
 7406   }
 7407   else
 7408   {
 7409     TI_DBG3(("tdssSASDiscoveringExpanderAdd: status %d\n", onePortContext->discovery.status));
 7410   }
 7411 
 7412   TI_DBG3(("tdssSASDiscoveringExpanderAdd: BEFORE\n"));
 7413   tdsaDumpAllExp(tiRoot, onePortContext, oneExpander);
 7414 
 7415 
 7416   if ( oneExpander->underDiscovering == agFALSE)
 7417   {
 7418     TI_DBG3(("tdssSASDiscoveringExpanderAdd: ADDED \n"));
 7419 
 7420     oneExpander->underDiscovering = agTRUE;
 7421     tdsaSingleThreadedEnter(tiRoot, TD_DISC_LOCK);
 7422     TDLIST_ENQUEUE_AT_TAIL(&(oneExpander->linkNode), &(onePortContext->discovery.discoveringExpanderList));
 7423     tdsaSingleThreadedLeave(tiRoot, TD_DISC_LOCK);
 7424   }
 7425 
 7426   TI_DBG3(("tdssSASDiscoveringExpanderAdd: AFTER\n"));
 7427   tdsaDumpAllExp(tiRoot, onePortContext, oneExpander);
 7428 
 7429 #ifdef TD_INTERNAL_DEBUG
 7430   /* debugging */
 7431   if (TDLIST_EMPTY(&(onePortContext->discovery.discoveringExpanderList)))
 7432   {
 7433     TI_DBG3(("tdssSASDiscoveringExpanderAdd: empty discoveringExpanderList\n"));
 7434     return;
 7435   }
 7436   ExpanderList = onePortContext->discovery.discoveringExpanderList.flink;
 7437   while (ExpanderList != &(onePortContext->discovery.discoveringExpanderList))
 7438   {
 7439     tempExpander = TDLIST_OBJECT_BASE(tdsaExpander_t, linkNode, ExpanderList);
 7440     TI_DBG3(("tdssSASDiscoveringExpanderAdd: expander id %d\n", tempExpander->id));
 7441     ExpanderList = ExpanderList->flink;
 7442   }
 7443 #endif
 7444 
 7445   return;
 7446 }
 7447 
 7448 /* temp */
 7449 osGLOBAL bit32
 7450 tdssSASFindDiscoveringExpander(
 7451                tiRoot_t                 *tiRoot,
 7452                tdsaPortContext_t        *onePortContext,
 7453                tdsaExpander_t           *oneExpander
 7454               )
 7455 {
 7456   tdList_t          *ExpanderList;
 7457   tdsaExpander_t    *tempExpander;
 7458   tdsaPortContext_t *tmpOnePortContext = onePortContext;
 7459   bit32             ret = agFALSE;
 7460 
 7461   TI_DBG3(("tdssSASFindDiscoveringExpander: exp addrHi 0x%08x\n", oneExpander->tdDevice->SASAddressID.sasAddressHi));
 7462   TI_DBG3(("tdssSASFindDiscoveringExpander: exp addrLo 0x%08x\n", oneExpander->tdDevice->SASAddressID.sasAddressLo));
 7463 
 7464   if (TDLIST_EMPTY(&(tmpOnePortContext->discovery.discoveringExpanderList)))
 7465   {
 7466     TI_DBG1(("tdssSASFindDiscoveringExpander: empty discoveringExpanderList\n"));
 7467     return ret;
 7468   }
 7469   ExpanderList = tmpOnePortContext->discovery.discoveringExpanderList.flink;
 7470   while (ExpanderList != &(tmpOnePortContext->discovery.discoveringExpanderList))
 7471   {
 7472     tempExpander = TDLIST_OBJECT_BASE(tdsaExpander_t, linkNode, ExpanderList);
 7473     if (tempExpander == oneExpander)
 7474     {
 7475       TI_DBG3(("tdssSASFindDiscoveringExpander: match!!! expander id %d\n", tempExpander->id));
 7476       TI_DBG3(("tdssSASFindDiscoveringExpander: exp addrHi 0x%08x\n", tempExpander->tdDevice->SASAddressID.sasAddressHi));
 7477       TI_DBG3(("tdssSASFindDiscoveringExpander: exp addrLo 0x%08x\n", tempExpander->tdDevice->SASAddressID.sasAddressLo));
 7478       ret = agTRUE;
 7479       break;
 7480     }
 7481 
 7482     ExpanderList = ExpanderList->flink;
 7483   }
 7484 
 7485 
 7486   return ret;
 7487 
 7488 }
 7489 /* to be tested */
 7490 /* move the expander to freeExpanderList */
 7491 /*****************************************************************************
 7492 *! \brief  tdssSASDiscoveringExpanderRemove
 7493 *
 7494 *  Purpose:  This function removes an expander from the expander list.
 7495 *
 7496 *  \param   tiRoot: Pointer to the OS Specific module allocated tiRoot_t
 7497 *                   instance.
 7498 *  \param   onePortContext: Pointer to the portal context instance.
 7499 *  \param   oneExpander: Pointer to the expander data.
 7500 *
 7501 *  \return:
 7502 *           None
 7503 *
 7504 *   \note:
 7505 *
 7506 *****************************************************************************/
 7507 osGLOBAL void
 7508 tdssSASDiscoveringExpanderRemove(
 7509                                  tiRoot_t                 *tiRoot,
 7510                                  tdsaPortContext_t        *onePortContext,
 7511                                  tdsaExpander_t           *oneExpander
 7512                                  )
 7513 {
 7514   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 7515   tdsaContext_t     *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 7516 #ifdef TD_INTERNAL_DEBUG
 7517   tdList_t          *ExpanderList;
 7518   tdsaExpander_t    *tempExpander;
 7519 #endif
 7520 
 7521   TI_DBG3(("tdssSASDiscoveringExpanderRemove: start\n"));
 7522   TI_DBG3(("tdssSASDiscoveringExpanderRemove: expander id %d\n", oneExpander->id));
 7523   TI_DBG3(("tdssSASDiscoveringExpanderRemove: exp addrHi 0x%08x\n", oneExpander->tdDevice->SASAddressID.sasAddressHi));
 7524   TI_DBG3(("tdssSASDiscoveringExpanderRemove: exp addrLo 0x%08x\n", oneExpander->tdDevice->SASAddressID.sasAddressLo));
 7525 
 7526 
 7527   TI_DBG3(("tdssSASDiscoveringExpanderRemove: BEFORE\n"));
 7528   tdsaDumpAllExp(tiRoot, onePortContext, oneExpander);
 7529   tdsaDumpAllUpExp(tiRoot, onePortContext, oneExpander);
 7530   tdsaDumpAllFreeExp(tiRoot);
 7531 
 7532 #ifdef TD_INTERNAL_DEBUG
 7533   /* debugging */
 7534   TI_DBG3(("tdssSASDiscoveringExpanderRemove: BEFORE\n"));
 7535   if (TDLIST_EMPTY(&(onePortContext->discovery.discoveringExpanderList)))
 7536   {
 7537     TI_DBG3(("tdssSASDiscoveringExpanderRemove: empty discoveringExpanderList\n"));
 7538   }
 7539   ExpanderList = onePortContext->discovery.discoveringExpanderList.flink;
 7540   while (ExpanderList != &(onePortContext->discovery.discoveringExpanderList))
 7541   {
 7542     tempExpander = TDLIST_OBJECT_BASE(tdsaExpander_t, linkNode, ExpanderList);
 7543     TI_DBG3(("tdssSASDiscoveringExpanderRemove: expander id %d\n", tempExpander->id));
 7544     ExpanderList = ExpanderList->flink;
 7545   }
 7546 #endif
 7547 
 7548   // if is temporary till smp problem is fixed
 7549   if (tdssSASFindDiscoveringExpander(tiRoot, onePortContext, oneExpander) == agTRUE)
 7550   {
 7551     oneExpander->underDiscovering = agFALSE;
 7552     oneExpander->discoveringPhyId = 0;
 7553     tdsaSingleThreadedEnter(tiRoot, TD_DISC_LOCK);
 7554     TDLIST_DEQUEUE_THIS(&(oneExpander->linkNode));
 7555 
 7556     if (onePortContext->discovery.status == DISCOVERY_UP_STREAM)
 7557     {
 7558       TI_DBG3(("tdssSASDiscoveringExpanderRemove: DISCOVERY_UP_STREAM\n"));
 7559       TDLIST_ENQUEUE_AT_TAIL(&(oneExpander->upNode), &(onePortContext->discovery.UpdiscoveringExpanderList));
 7560       onePortContext->discovery.NumOfUpExp++;
 7561     }
 7562     else
 7563     {
 7564       TI_DBG3(("tdssSASDiscoveringExpanderRemove: Status %d\n", onePortContext->discovery.status));
 7565       TDLIST_ENQUEUE_AT_TAIL(&(oneExpander->linkNode), &(tdsaAllShared->freeExpanderList));
 7566     }
 7567 
 7568     tdsaSingleThreadedLeave(tiRoot, TD_DISC_LOCK);
 7569   } //end temp if
 7570   else
 7571   {
 7572     TI_DBG1(("tdssSASDiscoveringExpanderRemove: !!! problem !!!\n"));
 7573   }
 7574 
 7575   TI_DBG3(("tdssSASDiscoveringExpanderRemove: AFTER\n"));
 7576   tdsaDumpAllExp(tiRoot, onePortContext, oneExpander);
 7577   tdsaDumpAllUpExp(tiRoot, onePortContext, oneExpander);
 7578 
 7579   tdsaDumpAllFreeExp(tiRoot);
 7580 
 7581 #ifdef TD_INTERNAL_DEBUG
 7582   /* debugging */
 7583   TI_DBG3(("tdssSASDiscoveringExpanderRemove: AFTER\n"));
 7584   if (TDLIST_EMPTY(&(onePortContext->discovery.discoveringExpanderList)))
 7585   {
 7586     TI_DBG3(("tdssSASDiscoveringExpanderRemove: empty discoveringExpanderList\n"));
 7587   }
 7588   ExpanderList = onePortContext->discovery.discoveringExpanderList.flink;
 7589   while (ExpanderList != &(onePortContext->discovery.discoveringExpanderList))
 7590   {
 7591     tempExpander = TDLIST_OBJECT_BASE(tdsaExpander_t, linkNode, ExpanderList);
 7592     TI_DBG3(("tdssSASDiscoveringExpanderRemove: expander id %d\n", tempExpander->id));
 7593     ExpanderList = ExpanderList->flink;
 7594   }
 7595 #endif
 7596 
 7597   return;
 7598 }
 7599 
 7600 #ifdef SATA_ENABLE
 7601 
 7602 /*****************************************************************************
 7603 *! \brief tdssNewAddSATAToSharedcontext
 7604 *
 7605 *  Purpose:  This function adds a discovered SATA device to a device list of
 7606 *            a shared context. Used only in discovery.
 7607 *
 7608 *  \param   tiRoot  Pointer to the OS Specific module allocated tiRoot_t
 7609 *                   instance.
 7610 *  \param   agRoot          Pointer to chip/driver Instance.
 7611 *  \param   onePortContext  Pointer to the target port context
 7612 *  \param   tdsaDeviceData  Pointer to a device list header
 7613 *  \param   agSATADeviceInfo      Pointer to the SATA device information.
 7614 *  \param   Signature       Pointer to SATA signature
 7615 *  \param   pm              Port multiplier
 7616 *  \param   pmField         Port multiplier field
 7617 *  \param   connectionRate  Connection rate
 7618 *
 7619 *  \Return:
 7620 *           Pointer to the device data
 7621 *
 7622 *****************************************************************************/
 7623 osGLOBAL tdsaDeviceData_t *
 7624 tdssNewAddSATAToSharedcontext(tiRoot_t             *tiRoot,
 7625                               agsaRoot_t           *agRoot,
 7626                               tdsaPortContext_t    *onePortContext,
 7627                               agsaSATADeviceInfo_t *agSATADeviceInfo,
 7628                               bit8                    *Signature,
 7629                               bit8                    pm,
 7630                               bit8                    pmField,
 7631                               bit32                   connectionRate,
 7632                               tdsaDeviceData_t        *oneExpDeviceData,
 7633                               bit8                    phyID
 7634                               )
 7635 {
 7636   tdsaDeviceData_t  *oneDeviceData = agNULL;
 7637   tdList_t          *DeviceListList;
 7638   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 7639   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 7640   int               new_device = agTRUE;
 7641 
 7642   TI_DBG5(("tdssNewAddSATAToSharedcontext: start\n"));
 7643 
 7644 
 7645 
 7646   TI_DBG5(("tdssNewAddSATAToSharedcontext: oneportContext ID %d\n", onePortContext->id));
 7647 
 7648 
 7649 #ifdef RPM_SOC
 7650   /* Find a device's existence */
 7651   DeviceListList = tdsaAllShared->MainDeviceList.flink;
 7652   while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 7653   {
 7654     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 7655 
 7656     if ((osti_memcmp (((char *)&oneDeviceData->satDevData.satIdentifyData),
 7657                       ((char *)&agSATADeviceInfo->sataIdentifyData),
 7658                       sizeof(agsaSATAIdentifyData_t)) == 0))
 7659     {
 7660       TI_DBG5(("tdssNewAddSATAToSharedcontext: pid %d did %d\n",
 7661         onePortContext->id, oneDeviceData->id));
 7662       new_device = agFALSE;
 7663       break;
 7664     }
 7665     DeviceListList = DeviceListList->flink;
 7666   }
 7667 #else
 7668  
 7669 
 7670 #endif
 7671 
 7672   /* New device */
 7673   if (new_device == agTRUE)
 7674   {
 7675     TI_DBG5(("tdssNewAddSATAToSharedcontext: new device\n"));
 7676 
 7677     tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 7678     if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList)))
 7679     {
 7680       tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 7681       TI_DBG1(("tdssNewAddSATAToSharedcontext: ERROR empty DeviceData FreeLink\n"));
 7682       return oneDeviceData;
 7683     }
 7684 
 7685     TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList));
 7686     tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 7687     oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList);
 7688 
 7689     onePortContext->Count++;
 7690     oneDeviceData->DeviceType = TD_SATA_DEVICE;
 7691     oneDeviceData->agRoot = agRoot;
 7692     TI_DBG5(("tdssNewAddSATAToSharedcontext: oneDeviceData %p\n", oneDeviceData));
 7693     TI_DBG5(("tdssNewAddSATAToSharedcontext: pSatDevData=%p\n", &oneDeviceData->satDevData));
 7694 
 7695 
 7696     /* saving PortMultiplier(PM) field */
 7697     oneDeviceData->satDevData.satPMField = pmField;
 7698 
 7699     /* saving signature */
 7700     osti_memcpy(&(oneDeviceData->satDevData.satSignature), Signature, 8);
 7701 
 7702     /*
 7703       saving device type
 7704       ATA device type; here should be either ATA_ATA_DEVICE or ATA_ATAPI_DEVICE
 7705     */
 7706      oneDeviceData->satDevData.satDeviceType = tdssSATADeviceTypeDecode(agSATADeviceInfo->signature);
 7707      TI_DBG3(("tdssNewAddSATAToSharedcontext: device type %d\n",  oneDeviceData->satDevData.satDeviceType));
 7708 
 7709 #ifdef RPM_SOC_REMOVED
 7710     /* print device signature - Word8 */
 7711     TI_DBG3(("tdssNewAddSATAToSharedcontext: Word8 %x signature: %x %x %x %x %x %x %x %x\n",
 7712              agSATADeviceInfo->sataIdentifyData.word1_9[7],
 7713              agSATADeviceInfo->signature[0], agSATADeviceInfo->signature[1],
 7714              agSATADeviceInfo->signature[2], agSATADeviceInfo->signature[3],
 7715              agSATADeviceInfo->signature[4], agSATADeviceInfo->signature[5],
 7716              agSATADeviceInfo->signature[6], agSATADeviceInfo->signature[7] ));
 7717 #endif
 7718 
 7719 
 7720 
 7721     oneDeviceData->tdPortContext = onePortContext;
 7722     oneDeviceData->valid = agTRUE;
 7723 
 7724     oneDeviceData->ExpDevice = oneExpDeviceData;
 7725     oneDeviceData->phyID = phyID;
 7726 
 7727     /* Add the devicedata to the portcontext */
 7728     tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 7729     TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
 7730     tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 7731     TI_DBG5(("tdssNewAddSATAToSharedcontext: one case pid %d did %d \n",
 7732       onePortContext->id, oneDeviceData->id));
 7733   }
 7734   else /* old device */
 7735   {
 7736     TI_DBG5(("tdssNewAddSATAToSharedcontext: old device\n"));
 7737 
 7738     onePortContext->Count++;
 7739 
 7740     oneDeviceData->DeviceType = TD_SATA_DEVICE;
 7741     oneDeviceData->agRoot = agRoot;
 7742 
 7743     oneDeviceData->tdPortContext = onePortContext;
 7744     oneDeviceData->valid = agTRUE;
 7745 
 7746     oneDeviceData->ExpDevice = oneExpDeviceData;
 7747     oneDeviceData->phyID = phyID;
 7748 
 7749   }
 7750 
 7751   return oneDeviceData;
 7752 
 7753 }
 7754 #endif /* SATA_ENABLE */
 7755 #endif /* TD_DISCOVER */
 7756 #endif /* INITIATOR_DRIVER */
 7757 
 7758 #ifdef TARGET_DRIVER
 7759 /*****************************************************************************
 7760 *! \brief  tdssReportRemovals
 7761 *
 7762 *  Purpose:  This function goes through device list and removes all devices
 7763 *            belong to the portcontext. This function also deregiters those
 7764 *            devices. This function is called in case of incremental discovery
 7765 *            failure.
 7766 *
 7767 *  \param   agRoot        :  Pointer to chip/driver Instance.
 7768 *  \param   onePortContext: Pointer to the portal context instance.
 7769 *  \param   oneDeviceData: Pointer to the device data.
 7770 *
 7771 *  \return:
 7772 *           None
 7773 *
 7774 *   \note:
 7775 *
 7776 *****************************************************************************/
 7777 osGLOBAL void
 7778 ttdssReportRemovals(
 7779                   agsaRoot_t           *agRoot,
 7780                   tdsaPortContext_t    *onePortContext,
 7781                   bit32                flag
 7782                   )
 7783 {
 7784   tdsaDeviceData_t  *oneDeviceData = agNULL;
 7785   tdList_t          *DeviceListList;
 7786   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 7787   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 7788   tdsaRoot_t        *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 7789   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 7790   bit32             removed = agFALSE;
 7791   agsaEventSource_t *eventSource;
 7792   bit32             PhyID;
 7793   bit32             HwAckSatus;
 7794   tdsaDeviceData_t  *tmpDeviceData = agNULL;
 7795 
 7796   TI_DBG1(("ttdssReportRemovals: start\n"));
 7797   /* in case nothing was registered */
 7798   PhyID = onePortContext->eventPhyID;
 7799   if (tdsaAllShared->eventSource[PhyID].EventValid == agTRUE &&
 7800       onePortContext->RegisteredDevNums == 0 &&
 7801       PhyID != 0xFF
 7802       )
 7803   {
 7804     TI_DBG1(("ttdssReportRemovals: calling saHwEventAck\n"));
 7805     eventSource = &(tdsaAllShared->eventSource[PhyID].Source);
 7806     HwAckSatus = saHwEventAck(
 7807                               agRoot,
 7808                               agNULL, /* agContext */
 7809                               0,
 7810                               eventSource, /* agsaEventSource_t */
 7811                               0,
 7812                               0
 7813                               );
 7814     if ( HwAckSatus != AGSA_RC_SUCCESS)
 7815     {
 7816       TI_DBG1(("ttdssReportRemovals: failing in saHwEventAck; status %d\n", HwAckSatus));
 7817     }
 7818 
 7819     /* toggle */
 7820     tdsaAllShared->eventSource[PhyID].EventValid = agFALSE;
 7821     if (onePortContext->valid == agFALSE)
 7822     {
 7823       tdsaPortContextReInit(tiRoot, onePortContext);
 7824       /*
 7825         put all devices belonging to the onePortContext
 7826         back to the free link
 7827        */
 7828       tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 7829       TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
 7830       TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaAllShared->FreePortContextList));
 7831       tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 7832     }
 7833   }
 7834   else
 7835   {
 7836     if (TDLIST_EMPTY(&(tdsaAllShared->MainDeviceList)))
 7837     {
 7838       TI_DBG1(("ttdssReportRemovals: empty device list\n"));
 7839       return;
 7840     }
 7841 
 7842     DeviceListList = tdsaAllShared->MainDeviceList.flink;
 7843     while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 7844     {
 7845       oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 7846       if( oneDeviceData == agNULL )
 7847       {
 7848         break;
 7849       }
 7850       TI_DBG1(("ttdssReportRemovals: loop did %d\n", oneDeviceData->id));
 7851       TI_DBG1(("ttdssReportRemovals: sasAddrHi 0x%08x sasAddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
 7852       TI_DBG1(("ttdssReportRemovals: valid %d valid2 %d\n", oneDeviceData->valid, oneDeviceData->valid2));
 7853       TI_DBG1(("ttdssReportRemovals: directlyAttached %d registered %d\n", oneDeviceData->directlyAttached, oneDeviceData->registered));
 7854       if ( oneDeviceData->tdPortContext == onePortContext)
 7855       {
 7856         TI_DBG1(("ttdssReportRemovals: right portcontext pid %d\n", onePortContext->id));
 7857         if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE)
 7858         {
 7859           TI_DBG1(("ttdssReportRemovals: removing\n"));
 7860 
 7861           /* notify only reported devices to OS layer*/
 7862           removed = agTRUE;
 7863 
 7864           /* all targets except expanders */
 7865           TI_DBG1(("ttdssReportRemovals: calling tdsaAbortAll\n"));
 7866           TI_DBG1(("ttdssReportRemovals: did %d\n", oneDeviceData->id));
 7867           TI_DBG1(("ttdssReportRemovals: sasAddrHi 0x%08x sasAddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
 7868           tmpDeviceData = oneDeviceData;
 7869           ttdsaAbortAll(tiRoot, agRoot, oneDeviceData);
 7870 
 7871 
 7872           /* reset valid bit */
 7873           oneDeviceData->valid = agFALSE;
 7874           oneDeviceData->valid2 = agFALSE;
 7875           oneDeviceData->registered = agFALSE;
 7876         }
 7877         /* called by port invalid case */
 7878         if (flag == agTRUE)
 7879         {
 7880           oneDeviceData->tdPortContext = agNULL;
 7881         }
 7882 #ifdef REMOVED /* removed */
 7883         /* directly attached SATA -> always remove it */
 7884         if (oneDeviceData->DeviceType == TD_SATA_DEVICE &&
 7885             oneDeviceData->directlyAttached == agTRUE)
 7886         {
 7887           TI_DBG1(("ttdssReportRemovals: device did %d\n", oneDeviceData->id));
 7888           tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 7889           TDLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
 7890           TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceLis));
 7891           DeviceListList = tdsaAllShared->MainDeviceList.flink;
 7892           if (TDLIST_EMPTY(&(tdsaAllShared->MainDeviceList)))
 7893           {
 7894             tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 7895             break;
 7896           }
 7897           else
 7898           {
 7899             tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 7900           }
 7901         }
 7902         else
 7903         {
 7904           DeviceListList = DeviceListList->flink;
 7905         }
 7906 #endif /* REMOVED */
 7907         DeviceListList = DeviceListList->flink;
 7908       }
 7909       else
 7910       {
 7911         if (oneDeviceData->tdPortContext != agNULL)
 7912         {
 7913           TI_DBG1(("ttdssReportRemovals: different portcontext; oneDeviceData->tdPortContext pid %d oneportcontext pid %d\n", oneDeviceData->tdPortContext->id, onePortContext->id));
 7914         }
 7915         else
 7916         {
 7917           TI_DBG1(("ttdssReportRemovals: different portcontext; oneDeviceData->tdPortContext pid NULL oneportcontext pid %d\n", onePortContext->id));
 7918         }
 7919         DeviceListList = DeviceListList->flink;
 7920       }
 7921     }
 7922 
 7923     if (removed == agTRUE)
 7924     {
 7925       TI_DBG1(("ttdssReportRemovals: removed at the end\n"));
 7926       ostiTargetEvent(
 7927                       tiRoot,
 7928                       onePortContext->tiPortalContext,
 7929                       &(tmpDeviceData->tiDeviceHandle),
 7930                       tiTgtEventTypeDeviceChange,
 7931                       tiDeviceRemoval,
 7932                       agNULL
 7933                       );
 7934     }
 7935   } /* big else */
 7936   return;
 7937 }
 7938 #endif /* TARGET_DRIVER */
 7939 
 7940 
 7941 /*****************************************************************************
 7942 *! \brief  tdsaRotateQnumber
 7943 *
 7944 *  Purpose:  This function generates inbound queue number.
 7945 *
 7946 *  \param   tiRoot: Pointer to the OS Specific module allocated tiRoot_t
 7947 *                   instance.
 7948 *
 7949 *  \return:
 7950 *           Queue number
 7951 *
 7952 *   \note:
 7953 *
 7954 *****************************************************************************/
 7955 FORCEINLINE bit32
 7956 tdsaRotateQnumber(tiRoot_t                *tiRoot,
 7957                   tdsaDeviceData_t        *oneDeviceData )
 7958 {
 7959   bit32             ret = 0;
 7960 
 7961   TI_DBG6(("tdsaRotateQnumber: start\n"));
 7962   if (oneDeviceData == agNULL)
 7963   {
 7964     return 0;
 7965   }
 7966   ret = (oneDeviceData->OutQID << 16) | oneDeviceData->InQID;
 7967   return ret;
 7968 }
 7969 
 7970 osGLOBAL bit32
 7971 tdsaRotateQnumber1(tiRoot_t                *tiRoot,
 7972                   tdsaDeviceData_t        *oneDeviceData )
 7973 {
 7974   tdsaRoot_t        *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 7975   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 7976 //  static int Last_Q;
 7977 //  bit32             denom = tdsaAllShared->QueueConfig.numOutboundQueues;
 7978   bit32             ret = 0;
 7979   if (oneDeviceData == agNULL)
 7980   {
 7981 //    Last_Q= 0;
 7982     return 0;
 7983   }
 7984 
 7985 /* alway use highest Q number */
 7986   ret = ((tdsaAllShared->QueueConfig.numOutboundQueues-1) << 16) | (tdsaAllShared->QueueConfig.numInboundQueues-1);
 7987 
 7988   return(ret);
 7989 }
 7990 
 7991 #ifdef REMOVED
 7992 osGLOBAL bit32
 7993 tdsaRotateQnumber(tiRoot_t                *tiRoot,
 7994                   tdsaDeviceData_t        *oneDeviceData )
 7995 {
 7996   tdsaRoot_t        *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 7997   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 7998   bit32             denom = tdsaAllShared->QueueConfig.numInboundQueues;
 7999   bit32             ret = 0;
 8000 
 8001   /* inbound queue number */
 8002   tdsaAllShared->IBQnumber++;
 8003   if (tdsaAllShared->IBQnumber % denom == 0) /* % Qnumber*/
 8004   {
 8005     tdsaAllShared->IBQnumber = 0;
 8006   }
 8007   TI_DBG6(("tdsaRotateQnumber: IBQnumber %d\n", tdsaAllShared->IBQnumber));
 8008 
 8009 
 8010   /* outbound queue number */
 8011   tdsaAllShared->OBQnumber++;
 8012   denom = tdsaAllShared->QueueConfig.numOutboundQueues;
 8013   if (tdsaAllShared->OBQnumber % denom == 0) /* % Qnumber*/
 8014   {
 8015     tdsaAllShared->OBQnumber = 0;
 8016   }
 8017   TI_DBG6(("tdsaRotateQnumber: OBQnumber %d\n", tdsaAllShared->OBQnumber));
 8018 
 8019   ret = (tdsaAllShared->OBQnumber << 16) | tdsaAllShared->IBQnumber;
 8020   return ret;
 8021 }
 8022 #endif
 8023 
 8024 
 8025 void t_MacroCheck(  agsaRoot_t       *agRoot)
 8026 {
 8027   TI_DBG1(("t_MacroCheck:tIsSPC           %d\n",tIsSPC(agRoot)));
 8028   TI_DBG1(("t_MacroCheck:tIsSPCHIL        %d\n",tIsSPCHIL(agRoot)));
 8029   TI_DBG1(("t_MacroCheck:tIsSPCv          %d\n",tIsSPCv(agRoot)));
 8030   TI_DBG1(("t_MacroCheck:tIsSPCve         %d\n",tIsSPCve(agRoot)));
 8031   TI_DBG1(("t_MacroCheck:tIsSPCvplus      %d\n",tIsSPCvplus(agRoot)));
 8032   TI_DBG1(("t_MacroCheck:tIsSPCveplus     %d\n",tIsSPCveplus(agRoot)));
 8033   TI_DBG1(("t_MacroCheck:tIsSPCADAPvplus  %d\n",tIsSPCADAPvplus(agRoot)));
 8034   TI_DBG1(("t_MacroCheck:tIsSPCADAPveplus %d\n",tIsSPCADAPveplus(agRoot)));
 8035   TI_DBG1(("t_MacroCheck:tIsSPC12Gv       %d\n",tIsSPC12Gv(agRoot)));
 8036   TI_DBG1(("t_MacroCheck:tIsSPC12Gve      %d\n",tIsSPC12Gve(agRoot)));
 8037   TI_DBG1(("t_MacroCheck:tIsSPC12Gvplus   %d\n",tIsSPC12Gvplus(agRoot)));
 8038   TI_DBG1(("t_MacroCheck:tIsSPC12Gveplus  %d\n",tIsSPC12Gveplus(agRoot)));
 8039   TI_DBG1(("t_MacroCheck:tiIS_SPC         %d\n",tiIS_SPC(agRoot)   ));
 8040   TI_DBG1(("t_MacroCheck:tiIS_HIL         %d\n",tiIS_HIL(agRoot)   ));
 8041   TI_DBG1(("t_MacroCheck:tiIS_SPC6V       %d\n",tiIS_SPC6V(agRoot) ));
 8042   TI_DBG1(("t_MacroCheck:tiIS_SPC_ENC     %d\n",tiIS_SPC_ENC(agRoot) ));
 8043   TI_DBG1(("t_MacroCheck:tIsSPCV12G       %d\n",tIsSPCV12G(agRoot) ));
 8044 }

Cache object: 55b7778c23385ec1ebd8f38d24ec5095


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