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/ossacmnapi.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  *
   26  *
   27  * This file contains CB functions used by lower layer in SAS/SATA TD layer
   28  *
   29  */
   30 #include <sys/cdefs.h>
   31 __FBSDID("$FreeBSD$");
   32 #include <dev/pms/config.h>
   33 
   34 #include <dev/pms/freebsd/driver/common/osenv.h>
   35 #include <dev/pms/freebsd/driver/common/ostypes.h>
   36 #include <dev/pms/freebsd/driver/common/osdebug.h>
   37 
   38 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
   39 #include <dev/pms/RefTisa/sallsdk/api/saapi.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 #ifdef ECHO_TESTING
   79 /* temporary to test saEchoCommand() */
   80 extern bit8 gEcho;
   81 #endif
   82 
   83 #if defined(SALLSDK_DEBUG)
   84 extern bit32 gLLDebugLevel;
   85 #endif
   86 
   87 
   88 #include <dev/pms/RefTisa/sallsdk/spc/mpidebug.h>
   89 
   90 #ifdef SA_ENABLE_TRACE_FUNCTIONS
   91 
   92 #ifdef siTraceFileID
   93 #undef siTraceFileID
   94 #endif
   95 #define siTraceFileID 'R'
   96 #endif
   97 /*
   98   functions that are common to SAS and SATA
   99 */
  100 
  101 FORCEINLINE
  102 void ossaCacheInvalidate(
  103                          agsaRoot_t  *agRoot,
  104                          void        *osMemHandle,
  105                          void        *virtPtr,
  106                          bit32       length
  107                          )
  108 {
  109   tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
  110   tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
  111 
  112   TI_DBG6(("ossaCacheInvalidate: start\n"));
  113   ostiCacheInvalidate(tiRoot, osMemHandle, virtPtr, length);
  114   return;
  115 }
  116 
  117 FORCEINLINE
  118 void ossaCacheFlush(
  119                agsaRoot_t  *agRoot,
  120                void        *osMemHandle,
  121                void        *virtPtr,
  122                bit32       length
  123                )
  124 {
  125   tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
  126   tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
  127 
  128   TI_DBG6(("ossaCacheFlush: start\n"));
  129   ostiCacheFlush(tiRoot, osMemHandle, virtPtr, length);
  130   return;
  131 }
  132 
  133 FORCEINLINE
  134 void ossaCachePreFlush(
  135                   agsaRoot_t  *agRoot,
  136                   void        *osMemHandle,
  137                   void        *virtPtr,
  138                   bit32       length
  139                    )
  140 
  141 {
  142   tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
  143   tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
  144 
  145   TI_DBG6(("ossaCachePreFlush: start\n"));
  146   ostiCachePreFlush(tiRoot, osMemHandle, virtPtr, length);
  147   return;
  148 }
  149 
  150 /*****************************************************************************
  151 *! \brief ossaDeviceHandleAccept
  152 *
  153 *  Purpose:  This function is called by lower layer to inform TD layer of
  154 *            a new SAS device arrival. Used only at the target
  155 *
  156 *
  157 *  \param   agRoot         Pointer to chip/driver Instance.
  158 *  \param   agDevHandle    Pointer to the device handle of the device
  159 *  \param   agDevInfo      Pointer to the device info structure
  160 *  \param   agPortContext  Pointer to a port context
  161 *
  162 *  \return:
  163 *          OSSA_RC_REJECT  A device is accpeted
  164 *          OSSA_RC_ACCEPT  A device is rejected
  165 *
  166 *  \note -  For details, refer to SAS/SATA Low-Level API Specification
  167 *
  168 *****************************************************************************/
  169 osGLOBAL bit32 ossaDeviceHandleAccept(
  170                        agsaRoot_t          *agRoot,
  171                        agsaDevHandle_t     *agDevHandle,
  172                        agsaSASDeviceInfo_t *agDevInfo,
  173                        agsaPortContext_t   *agPortContext,
  174                        bit32               *hostAssignedDeviceId
  175                        )
  176 {
  177 #ifdef TARGET_DRIVER
  178   tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
  179   tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
  180   tdsaRoot_t           *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
  181   tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
  182 
  183   tdsaPortContext_t    *onePortContext = agNULL;
  184   tiPortalContext_t    *tiPortalContext = agNULL;
  185   tdsaDeviceData_t     *oneDeviceData = agNULL;
  186   tiDeviceHandle_t     *tiDeviceHandle = agNULL;
  187   tdsaSASSubID_t       agSASSubID;
  188   bit32                option;
  189   bit32                param;
  190   /*
  191     at target only
  192     by default TD layer accpets all devices
  193   */
  194   /*
  195     at this point,
  196     by LINK_UP event tdsaPortContext should have been created
  197   */
  198   smTraceFuncEnter(hpDBG_VERY_LOUD, "Y0");
  199   TI_DBG1(("ossaDeviceHandleAccept: start hostAssignedDeviceId 0x%X\n",*hostAssignedDeviceId));
  200 
  201 
  202   if (agPortContext == agNULL)
  203   {
  204     TI_DBG1(("ossaDeviceHandleAccept: NULL agsaPortContext; wrong\n"));
  205     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y0");
  206     return OSSA_RC_REJECT;
  207   }
  208 
  209 
  210   onePortContext = (tdsaPortContext_t *)agPortContext->osData;
  211 
  212   if (onePortContext == agNULL)
  213   {
  214     TI_DBG1(("ossaDeviceHandleAccept: NULL oneportcontext; wrong\n"));
  215     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y0");
  216     return OSSA_RC_REJECT;
  217   }
  218 
  219   tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
  220 
  221   if (tiPortalContext == agNULL)
  222   {
  223     TI_DBG1(("ossaDeviceHandleAccept: NULL tiPortalContext; wrong\n"));
  224     smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y0");
  225     return OSSA_RC_REJECT;
  226   }
  227 
  228   /*
  229     add the device to device list
  230     cf) OSSA_DISCOVER_FOUND_DEVICE
  231   */
  232   TI_DBG4(("ossaDeviceHandleAccept: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agDevInfo->commonDevInfo)));
  233   TI_DBG4(("ossaDeviceHandleAccept: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agDevInfo->commonDevInfo)));
  234   TI_DBG4(("ossaDeviceHandleAccept: device type  0x%x\n", DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo)));
  235   TI_DBG4(("ossaDeviceHandleAccept: phys %d\n", agDevInfo->numOfPhys));
  236   TI_DBG4(("ossaDeviceHandleAccept: pid %d\n", onePortContext->id));
  237 
  238   if (DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo) == SAS_END_DEVICE)
  239   {
  240     TI_DBG4(("ossaDeviceHandleAccept: SAS_END_DEVICE\n"));
  241   }
  242   else if (DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo) == SAS_EDGE_EXPANDER_DEVICE)
  243   {
  244     TI_DBG4(("ossaDeviceHandleAccept: SAS_EDGE_EXPANDER_DEVICE\n"));
  245   }
  246   else /* SAS_FANOUT_EXPANDER_DEVICE */
  247   {
  248     TI_DBG4(("ossaDeviceHandleAccept: SAS_FANOUT_EXPANDER_DEVICE\n"));
  249   }
  250   agSASSubID.sasAddressHi = SA_DEVINFO_GET_SAS_ADDRESSHI(&agDevInfo->commonDevInfo);
  251   agSASSubID.sasAddressLo = SA_DEVINFO_GET_SAS_ADDRESSLO(&agDevInfo->commonDevInfo);
  252   agSASSubID.initiator_ssp_stp_smp = agDevInfo->initiator_ssp_stp_smp;
  253   agSASSubID.target_ssp_stp_smp = agDevInfo->target_ssp_stp_smp;
  254 
  255 
  256   tdssAddSASToSharedcontext(
  257                             onePortContext,
  258                             agRoot,
  259                             agDevHandle,
  260                             &agSASSubID,
  261                             agTRUE,
  262                             0xFF,
  263                             TD_OPERATION_TARGET
  264                             );
  265 
  266   /* at this point devicedata for new device exists */
  267   oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
  268 
  269   if (oneDeviceData == agNULL)
  270   {
  271     TI_DBG1(("ossaDeviceHandleAccept: NULL oneDeviceData; wrong\n"));
  272     return OSSA_RC_REJECT;
  273   }
  274 
  275   oneDeviceData->registered = agTRUE;
  276 
  277   tiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
  278 
  279   if (tiDeviceHandle == agNULL)
  280   {
  281     TI_DBG1(("ossaDeviceHandleAccept: NULL tiDeviceHandle; wrong\n"));
  282     smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y0");
  283     return OSSA_RC_REJECT;
  284   }
  285 
  286   /* setting MCN in agsaDeviceInfo_t*/
  287   agDevInfo->commonDevInfo.flag = agDevInfo->commonDevInfo.flag | (tdsaAllShared->MCN << 16);
  288   /* increment RegisteredDevNums */
  289   onePortContext->RegisteredDevNums++;
  290 
  291   *hostAssignedDeviceId |= 0xBEEF0000;
  292 
  293   TI_DBG1(("ossaDeviceHandleAccept: Now hostAssignedDeviceId 0x%X\n", *hostAssignedDeviceId));
  294 
  295 
  296   /* no login in SAS */
  297   /*
  298     osGLOBAL bit32 ostiTargetEvent (
  299                         tiRoot_t          *tiRoot,
  300                         tiPortalContext_t *portalContext,
  301                         tiDeviceHandle_t  *tiDeviceHandle,
  302                         tiTgtEventType_t  eventType,
  303                         bit32             eventStatus,
  304                         void              *parm
  305                         );
  306   */
  307 
  308   ostiTargetEvent(
  309                   tiRoot,
  310                   tiPortalContext,
  311                   tiDeviceHandle,
  312                   tiTgtEventTypeDeviceChange,
  313                   tiDeviceArrival,
  314                   agNULL
  315                   );
  316   /* set MCN and initiator role bit using saSetDeviceInfo */
  317   option = 24; /* setting MCN and initiator role 1 1000b*/
  318   param = (1 << 18) | (tdsaAllShared->MCN << 24);
  319   TI_DBG1(("ossaDeviceHandleAccept: option 0x%x param 0x%x MCN 0x%x\n", option, param, tdsaAllShared->MCN));
  320   saSetDeviceInfo(agRoot, agNULL, 0, agDevHandle, option, param, ossaSetDeviceInfoCB);
  321   smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y0");
  322   return OSSA_RC_ACCEPT;
  323 #endif
  324 
  325 #ifdef INITIATOR_DRIVER
  326   /* this function is not used in case of Initiator */
  327   return OSSA_RC_ACCEPT;
  328 #endif
  329 }
  330 
  331 #ifdef INITIATOR_DRIVER
  332 /*****************************************************************************
  333 *! \brief ossaDiscoverSasCB
  334 *
  335 *  Purpose:  This function is called by lower layer to inform TD layer of
  336 *            SAS discovery results
  337 *
  338 *
  339 *  \param   agRoot         Pointer to chip/driver Instance.
  340 *  \param   agPortContext  Pointer to the port context of TD and Lower layer
  341 *  \param   event          event type
  342 *  \param   pParm1         Pointer to data associated with event
  343 *  \param   pParm2         Pointer to data associated with event
  344 *
  345 *  \return: none
  346 *
  347 *  \note -  For details, refer to SAS/SATA Low-Level API Specification
  348 *
  349 *****************************************************************************/
  350 osGLOBAL void ossaDiscoverSasCB(agsaRoot_t        *agRoot,
  351                   agsaPortContext_t *agPortContext,
  352                   bit32             event,
  353                   void              *pParm1,
  354                   void              *pParm2
  355                   )
  356 {
  357   tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
  358   tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
  359   tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)osData->tdsaAllShared;
  360 
  361   tdsaPortContext_t    *onePortContext = agNULL;
  362   tdsaDeviceData_t     *oneDeviceData = agNULL;
  363 
  364   agsaDevHandle_t      *agDevHandle = agNULL;
  365   agsaSASDeviceInfo_t  *agDeviceInfo = agNULL;
  366   tiPortalContext_t    *tiPortalContext = agNULL;
  367   tdList_t             *DeviceListList;
  368   tdsaSASSubID_t       agSASSubID;
  369 
  370   smTraceFuncEnter(hpDBG_VERY_LOUD,"Y1");
  371   TI_DBG2(("ossaDiscoverSasCB: start\n"));
  372 
  373   if (agPortContext == agNULL)
  374   {
  375     TI_DBG1(("ossaDiscoverSasCB: NULL agsaPortContext; wrong\n"));
  376     return;
  377   }
  378 
  379   onePortContext = (tdsaPortContext_t *)agPortContext->osData;
  380   tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
  381 
  382   switch ( event )
  383   {
  384   case OSSA_DISCOVER_STARTED:
  385   {
  386     TI_DBG3(("ossaDiscoverSasCB: STARTED pid %d\n", onePortContext->id));
  387     /*
  388       invalidate all devices in current device list
  389     */
  390     DeviceListList = tdsaAllShared->MainDeviceList.flink;
  391     while (DeviceListList != &(tdsaAllShared->MainDeviceList))
  392     {
  393       oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
  394       TI_DBG3(("ossaDiscoverSasCB: loop did %d\n", oneDeviceData->id));
  395       TI_DBG3(("ossaDiscoverSasCB: loop sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
  396       TI_DBG6(("ossaDiscoverSasCB: loop sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
  397       if (oneDeviceData->tdPortContext == onePortContext)
  398       {
  399         TI_DBG3(("ossaDiscoverSasCB: did %d is invalidated \n", oneDeviceData->id));
  400         /* temporary solution: only for sata direct attached */
  401       }
  402       DeviceListList = DeviceListList->flink;
  403     }
  404     onePortContext->DiscoveryState = ITD_DSTATE_STARTED;
  405     break;
  406   }
  407 
  408   case OSSA_DISCOVER_FOUND_DEVICE:
  409   {
  410     TI_DBG4(("ossaDiscoverSasCB: $$$$$ FOUND_DEVICE pid %d\n", onePortContext->id));
  411     agDevHandle = (agsaDevHandle_t *)pParm1;
  412     agDeviceInfo = (agsaSASDeviceInfo_t *)pParm2;
  413     TI_DBG5(("ossaDiscoverSasCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agDeviceInfo->commonDevInfo)));
  414     TI_DBG5(("ossaDiscoverSasCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agDeviceInfo->commonDevInfo)));
  415     TI_DBG5(("ossaDiscoverSasCB: device type  0x%x\n", DEVINFO_GET_DEVICETTYPE(&agDeviceInfo->commonDevInfo)));
  416 
  417     TI_DBG6(("ossaDiscoverSasCB: phys %d\n", agDeviceInfo->numOfPhys));
  418     TI_DBG4(("ossaDiscoverSasCB: pid %d\n", onePortContext->id));
  419 
  420 
  421     /* Add only target devices; do not add expander device */
  422     if (DEVINFO_GET_DEVICETTYPE(&agDeviceInfo->commonDevInfo) == SAS_END_DEVICE)
  423     {
  424       agSASSubID.sasAddressHi = SA_DEVINFO_GET_SAS_ADDRESSHI(&agDeviceInfo->commonDevInfo);
  425       agSASSubID.sasAddressLo = SA_DEVINFO_GET_SAS_ADDRESSLO(&agDeviceInfo->commonDevInfo);
  426       agSASSubID.initiator_ssp_stp_smp = agDeviceInfo->initiator_ssp_stp_smp;
  427       agSASSubID.target_ssp_stp_smp = agDeviceInfo->target_ssp_stp_smp;
  428 
  429       TI_DBG2(("ossaDiscoverSasCB: adding ....\n"));
  430 
  431       tdssAddSASToSharedcontext(
  432                                 onePortContext,
  433                                 agRoot,
  434                                 agDevHandle,
  435                                 &agSASSubID,
  436                                 agTRUE,
  437                                 agDeviceInfo->phyIdentifier, 
  438                                 TD_OPERATION_INITIATOR
  439                                 );
  440       ostiInitiatorEvent(
  441                          tiRoot,
  442                          tiPortalContext,
  443                          agNULL,
  444                          tiIntrEventTypeDeviceChange,
  445                          tiDeviceArrival,
  446                          agNULL
  447                          );
  448     }
  449     else
  450     {
  451       TI_DBG5(("ossaDiscoverSasCB: $$$$$ not end device. not adding....\n"));
  452     }
  453 
  454 
  455     break;
  456   }
  457 
  458   case OSSA_DISCOVER_REMOVED_DEVICE:
  459   {
  460     TI_DBG3(("ossaDiscoverSasCB: REMOVED_DEVICE\n"));
  461     agDevHandle = (agsaDevHandle_t *)pParm1;
  462     agDeviceInfo = (agsaSASDeviceInfo_t *)pParm2;
  463     oneDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
  464 
  465     TI_DBG6(("ossaDiscoverSasCB: sasAddressHi 0x%08x\n",
  466              SA_DEVINFO_GET_SAS_ADDRESSHI(&agDeviceInfo->commonDevInfo)));
  467     TI_DBG6(("ossaDiscoverSasCB: sasAddressLo 0x%08x\n",
  468              SA_DEVINFO_GET_SAS_ADDRESSLO(&agDeviceInfo->commonDevInfo)));
  469     TI_DBG6(("ossaDiscoverSasCB: phys %d\n", agDeviceInfo->numOfPhys));
  470     TI_DBG6(("ossaDiscoverSasCB: onePortContext->id %d\n", onePortContext->id));
  471 
  472     if (oneDeviceData == agNULL)
  473     {
  474       TI_DBG1(("ossaDiscoverSasCB: Wrong. DevHandle->osData is NULL but is being removed\n"));
  475     }
  476     else
  477     {
  478       tdssRemoveSASFromSharedcontext(onePortContext,
  479                                      oneDeviceData,
  480                                      agRoot);
  481       agDevHandle->osData = agNULL;
  482       ostiInitiatorEvent(
  483                          tiRoot,
  484                          tiPortalContext,
  485                          agNULL,
  486                          tiIntrEventTypeDeviceChange,
  487                          tiDeviceRemoval,
  488                          agNULL
  489                          );
  490     }
  491 
  492     break;
  493   }
  494   case OSSA_DISCOVER_COMPLETE:
  495   {
  496     TI_DBG2(("ossaDiscoverSasCB: SAS COMPLETE pid %d\n", onePortContext->id));
  497     /*
  498       note:
  499       SAS discovery must be called before SATA discovery
  500       "onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED" is
  501       in ossaDiscoverSataCB not in ossaDiscoverSasCB when SATA_ENABLE
  502     */
  503 #ifndef SATA_ENABLE
  504     onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
  505     TI_DBG6(("ossaDiscoverSasCB: COMPLETE pid %d\n", onePortContext->id));
  506 #endif
  507 
  508 #ifdef SATA_ENABLE
  509     TI_DBG2(("ossaDiscoverSasCB: calling SATA discovery\n"));
  510 
  511     /* Continue with SATA discovery */
  512     saDiscover(agRoot, agPortContext, AG_SA_DISCOVERY_TYPE_SATA,
  513                onePortContext->discoveryOptions);
  514 
  515 #else /* SATA not enable */
  516 
  517 #ifdef TD_INTERNAL_DEBUG /* for debugging */
  518     /* dump device list */
  519     DeviceListList = tdsaAllShared->MainPortContextList.flink;
  520 
  521     while (DeviceListList != &(tdsaAllShared->MainPortContextList))
  522     {
  523       oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
  524       TI_DBG2(("ossaDiscoverSasCB: did %d valid %d\n", oneDeviceData->id, oneDeviceData->valid));
  525       TI_DBG2(("ossaDiscoverSasCB: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
  526       TI_DBG2(("ossaDiscoverSasCB: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
  527       DeviceListList = DeviceListList->flink;
  528     }
  529 #endif
  530 
  531     /* letting OS layer know discovery has been successfully complete */
  532     ostiInitiatorEvent(
  533                        tiRoot,
  534                        tiPortalContext,
  535                        agNULL,
  536                        tiIntrEventTypeDiscovery,
  537                        tiDiscOK,
  538                        agNULL
  539                        );
  540 #endif  /* SATA_ENABLE */
  541 
  542     break;
  543   }
  544   case OSSA_DISCOVER_ABORT:
  545   {
  546     TI_DBG3(("ossaDiscoverSasCB: ABORT\n"));
  547     /* letting OS layer know discovery has not been successfully complete */
  548     ostiInitiatorEvent(
  549                        tiRoot,
  550                        tiPortalContext,
  551                        agNULL,
  552                        tiIntrEventTypeDiscovery,
  553                        tiDiscFailed,
  554                        agNULL
  555                        );
  556     break;
  557   }
  558   case OSSA_DISCOVER_ABORT_ERROR_1:
  559   {
  560     TI_DBG3(("ossaDiscoverSasCB: ERROR 1\n"));
  561     /* letting OS layer know discovery has not been successfully complete */
  562     ostiInitiatorEvent(
  563                        tiRoot,
  564                        tiPortalContext,
  565                        agNULL,
  566                        tiIntrEventTypeDiscovery,
  567                        tiDiscFailed,
  568                        agNULL
  569                        );
  570     break;
  571   }
  572 
  573   case OSSA_DISCOVER_ABORT_ERROR_2:
  574   {
  575     TI_DBG3(("ossaDiscoverSasCB: ERROR 2\n"));
  576     /* letting OS layer know discovery has not been successfully complete */
  577     ostiInitiatorEvent(
  578                        tiRoot,
  579                        tiPortalContext,
  580                        agNULL,
  581                        tiIntrEventTypeDiscovery,
  582                        tiDiscFailed,
  583                        agNULL
  584                        );
  585     break;
  586   }
  587 
  588   case OSSA_DISCOVER_ABORT_ERROR_3:
  589   {
  590     TI_DBG3(("ossaDiscoverSasCB: ERROR 3\n"));
  591     /* letting OS layer know discovery has not been successfully complete */
  592     ostiInitiatorEvent(
  593                        tiRoot,
  594                        tiPortalContext,
  595                        agNULL,
  596                        tiIntrEventTypeDiscovery,
  597                        tiDiscFailed,
  598                        agNULL
  599                        );
  600     break;
  601   }
  602   case OSSA_DISCOVER_ABORT_ERROR_4:
  603   {
  604     TI_DBG3(("ossaDiscoverSasCB: ERROR 4\n"));
  605     /* letting OS layer know discovery has not been successfully complete */
  606     ostiInitiatorEvent(
  607                        tiRoot,
  608                        tiPortalContext,
  609                        agNULL,
  610                        tiIntrEventTypeDiscovery,
  611                        tiDiscFailed,
  612                        agNULL
  613                        );
  614         break;
  615   }
  616   case OSSA_DISCOVER_ABORT_ERROR_5:
  617   {
  618     TI_DBG3(("ossaDiscoverSasCB: ERROR 5\n"));
  619     /* letting OS layer know discovery has not been successfully complete */
  620     ostiInitiatorEvent(
  621                        tiRoot,
  622                        tiPortalContext,
  623                        agNULL,
  624                        tiIntrEventTypeDiscovery,
  625                        tiDiscFailed,
  626                        agNULL
  627                        );
  628     break;
  629   }
  630   case OSSA_DISCOVER_ABORT_ERROR_6:
  631   {
  632     TI_DBG3(("ossaDiscoverSasCB: ERROR 6\n"));
  633     /* letting OS layer know discovery has not been successfully complete */
  634     ostiInitiatorEvent(
  635                        tiRoot,
  636                        tiPortalContext,
  637                        agNULL,
  638                        tiIntrEventTypeDiscovery,
  639                        tiDiscFailed,
  640                        agNULL
  641                        );
  642     break;
  643   }
  644   case OSSA_DISCOVER_ABORT_ERROR_7:
  645   {
  646     TI_DBG3(("ossaDiscoverSasCB: ERROR 7\n"));
  647     /* letting OS layer know discovery has not been successfully complete */
  648     ostiInitiatorEvent(
  649                        tiRoot,
  650                        tiPortalContext,
  651                        agNULL,
  652                        tiIntrEventTypeDiscovery,
  653                        tiDiscFailed,
  654                        agNULL
  655                        );
  656     break;
  657   }
  658   case OSSA_DISCOVER_ABORT_ERROR_8:
  659   {
  660     TI_DBG3(("ossaDiscoverSasCB: ERROR 8\n"));
  661     /* letting OS layer know discovery has not been successfully complete */
  662     ostiInitiatorEvent(
  663                        tiRoot,
  664                        tiPortalContext,
  665                        agNULL,
  666                        tiIntrEventTypeDiscovery,
  667                        tiDiscFailed,
  668                        agNULL
  669                        );
  670     break;
  671   }
  672   case OSSA_DISCOVER_ABORT_ERROR_9:
  673   {
  674     TI_DBG3(("ossaDiscoverSasCB: ERROR 9\n"));
  675     /* letting OS layer know discovery has not been successfully complete */
  676     ostiInitiatorEvent(
  677                        tiRoot,
  678                        tiPortalContext,
  679                        agNULL,
  680                        tiIntrEventTypeDiscovery,
  681                        tiDiscFailed,
  682                        agNULL
  683                        );
  684     break;
  685   }
  686   default:
  687     TI_DBG3(("ossaDiscoverSasCB: ERROR default event 0x%x\n", event));
  688     /* letting OS layer know discovery has not been successfully complete */
  689     ostiInitiatorEvent(
  690                        tiRoot,
  691                        tiPortalContext,
  692                        agNULL,
  693                        tiIntrEventTypeDiscovery,
  694                        tiDiscFailed,
  695                        agNULL
  696                        );
  697     break;
  698   } /* end of switch */
  699   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y1");
  700   return;
  701 }
  702 #endif // #ifdef INITIATOR_DRIVER
  703 
  704 osGLOBAL void ossaLogTrace0(
  705                agsaRoot_t           *agRoot,
  706                bit32               traceCode
  707                )
  708 {
  709   return;
  710 }
  711 
  712 osGLOBAL void ossaLogTrace1(
  713                agsaRoot_t           *agRoot,
  714                bit32               traceCode,
  715                bit32               value1
  716                )
  717 {
  718   return;
  719 }
  720 
  721 osGLOBAL void ossaLogTrace2(
  722                agsaRoot_t           *agRoot,
  723                bit32               traceCode,
  724                bit32               value1,
  725                bit32               value2
  726                )
  727 {
  728   return;
  729 }
  730 
  731 osGLOBAL void ossaLogTrace3(
  732                agsaRoot_t           *agRoot,
  733                bit32               traceCode,
  734                bit32               value1,
  735                bit32               value2,
  736                bit32               value3
  737                )
  738 {
  739   return;
  740 }
  741 
  742 
  743 osGLOBAL void
  744 ossaLogTrace4(
  745                agsaRoot_t           *agRoot,
  746                bit32               traceCode,
  747                bit32               value1,
  748                bit32               value2,
  749                bit32               value3,
  750                bit32               value4
  751                )
  752 {
  753   return;
  754 }
  755 
  756 
  757 /*****************************************************************************
  758 *! \brief ossaHwCB
  759 *
  760 *  Purpose:  This function is called by lower layer to inform TD layer of
  761 *            HW related results
  762 *
  763 *  \param   agRoot         Pointer to chip/driver Instance.
  764 *  \param   agPortContext  Pointer to the port context of TD and Lower layer
  765 *  \param   event          event type
  766 *  \param   eventParm1     event-specific parameter
  767 *  \param   eventParm2     event-specific parameter
  768 *  \param   eventParm3     event-specific parameter of pointer type
  769 *
  770 *  \return: none
  771 *
  772 *  \note -  For details, refer to SAS/SATA Low-Level API Specification
  773 *
  774 *****************************************************************************/
  775 osGLOBAL void ossaHwCB(
  776          agsaRoot_t        *agRoot,
  777          agsaPortContext_t *agPortContext,
  778          bit32             event,
  779          bit32             eventParm1,
  780          void              *eventParm2,
  781          void              *eventParm3
  782          )
  783 {
  784   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
  785   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
  786   tdsaContext_t       *tdsaAllShared = (tdsaContext_t *)osData->tdsaAllShared;
  787   tdList_t            *PortContextList = agNULL;
  788   tdsaPortContext_t   *onePortContext = agNULL;
  789   agsaDevHandle_t     *agDevHandle = agNULL;
  790   agsaSASIdentify_t   *IDframe = agNULL;
  791   int                 i = 0;
  792 #ifdef INITIATOR_DRIVER
  793   tdsaSASSubID_t      agSASSubID;
  794 #endif
  795   bit32               PhyID;
  796   bit32               PhyStatus;
  797   bit32               LinkRate;
  798   bit32               PortState;
  799   bit32               HwAckSatus = AGSA_RC_SUCCESS;
  800 
  801 // #ifdef INITIATOR_DRIVER
  802 #ifdef INITIATOR_DRIVER
  803   agsaFisRegDeviceToHost_t *RegD2H = agNULL;
  804   tdsaDeviceData_t         *oneDeviceData = agNULL;
  805   tdList_t                 *DeviceListList;
  806 #endif
  807 #ifdef REMOVED
  808   bit32                    found = agFALSE;
  809 #endif
  810   agsaHWEventEncrypt_t     *pEncryptCBData;
  811   agsaEncryptInfo_t        *pEncryptInfo;
  812   agsaHWEventMode_t        *pModeEvent;
  813   tiEncryptPort_t          encryptEventData;
  814   tiEncryptInfo_t          encryptInfo;
  815   bit32                    *pModePage;
  816   bit32                    securityMode;
  817   bit32                    cipherMode;
  818   bit32                    encryptStatus;
  819   bit32                    securitySetModeStatus;
  820   bit32                    securityModeStatus;
  821 
  822 // #endif /* INITIATOR_DRIVER */
  823   agsaPhyErrCountersPage_t *agPhyErrCountersPage;
  824   agsaEventSource_t        eventSource;
  825 
  826 #ifdef FDS_DM
  827   dmRoot_t                 *dmRoot = &(tdsaAllShared->dmRoot);
  828   dmPortContext_t          *dmPortContext = agNULL;
  829   bit32                    status = DM_RC_FAILURE;
  830   dmPortInfo_t             dmPortInfo;
  831 //  bit32                    discStatus = dmDiscInProgress;
  832 #endif
  833 
  834   smTraceFuncEnter(hpDBG_VERY_LOUD,"Y2");
  835 
  836   TI_DBG2(("ossaHwCB: agPortContext %p event 0x%x eventParm1 0x%x eventParm2 %p eventParm3 %p\n",
  837                       agPortContext,event,eventParm1,eventParm2,eventParm3 ));
  838 
  839   switch ( event )
  840   {
  841   case OSSA_HW_EVENT_SAS_PHY_UP:
  842   {
  843     PhyID = TD_GET_PHY_ID(eventParm1);
  844     LinkRate = TD_GET_LINK_RATE(eventParm1);
  845     PortState = TD_GET_PORT_STATE(eventParm1);
  846     agDevHandle = agNULL;
  847     IDframe = (agsaSASIdentify_t *)eventParm3;
  848 
  849 
  850     TI_DBG2(("ossaHwCB: Phy%d SAS link Up\n", PhyID));
  851 
  852     if (agPortContext == agNULL)
  853     {
  854       TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
  855       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y2");
  856       return;
  857     }
  858     if (agDevHandle == agNULL)
  859     {
  860       TI_DBG3(("ossaHwCB: agDevHandle null by design change\n"));
  861     }
  862 
  863     if (IDframe == agNULL)
  864     {
  865       TI_DBG1(("ossaHwCB: IDframe null, wrong\n"));
  866       smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y2");
  867       return;
  868     }
  869     /* debugging only */
  870     if (LinkRate == 0x01)
  871     {
  872       TI_DBG1(("ossaHwCB: SAS Link Rate is 1.5 Gbps PhyID %d\n",PhyID));
  873     }
  874     if (LinkRate == 0x02)
  875     {
  876       TI_DBG1(("ossaHwCB: SAS Link Rate is 3.0 Gbps PhyID %d\n",PhyID));
  877     }
  878     if (LinkRate == 0x04)
  879     {
  880       TI_DBG1(("ossaHwCB: SAS Link Rate is 6.0 Gbps PhyID %d\n",PhyID));
  881     }
  882     if (LinkRate == 0x08)
  883     {
  884       TI_DBG1(("ossaHwCB: SAS Link Rate is 12.0 Gbps PhyID %d\n",PhyID));
  885     }
  886 
  887     if (PortState == OSSA_PORT_INVALID)
  888     {
  889       TI_DBG1(("ossaHwCB: Wrong port state with SAS link up\n"));
  890       smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y2");
  891       return;
  892     }
  893 
  894     if ( agPortContext->osData == agNULL)
  895     {/* if */
  896       TI_DBG6 (("ossaHwCB: PhyID %d tdsaAllShared %p\n", PhyID, tdsaAllShared));
  897       if (tdsaAllShared->Ports[PhyID].tiPortalContext == agNULL)
  898       {
  899         TI_DBG6(("ossaHwCB: NULL portalcontext\n"));
  900       }
  901       else
  902       {
  903         TI_DBG6(("ossaHwCB: NOT NULL portalcontext\n"));
  904       }
  905 
  906       if (IDframe == agNULL)
  907       {
  908         TI_DBG1(("ossaHwCB: IDFrame is NULL; SATA !!!!\n"));
  909       }
  910       else
  911       {
  912         TI_DBG3(("ossaHwCB: IDframe->sasAddressHi 0x%08x \n",
  913                  SA_IDFRM_GET_SAS_ADDRESSHI(IDframe)));
  914         TI_DBG3(("ossaHwCB: IDframe->sasAddressLo 0x%08x \n",
  915                  SA_IDFRM_GET_SAS_ADDRESSLO(IDframe)));
  916 
  917       }
  918       /*
  919         setting tdsaPortContext fields
  920         take the head from the FreeLink of tdsaPortContext_t
  921         then modify it
  922         then put it in MainLink of tdsaPortContext_t
  923       */
  924       tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
  925       if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
  926       {
  927         TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
  928         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
  929         onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
  930         TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
  931         TI_DBG6(("ossaHwCB: onePortContext %p\n", onePortContext));
  932         if (onePortContext == agNULL)
  933         {
  934           TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
  935           return;
  936         }
  937 
  938         /* sets fields of tdsaportcontext */
  939 #ifdef INITIATOR_DRIVER
  940         onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
  941         onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
  942 #endif
  943         onePortContext->PhyIDList[PhyID] = agTRUE;
  944         if (IDframe == agNULL)
  945         {
  946           onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
  947           onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
  948           onePortContext->directAttatchedSAS = agTRUE;
  949         }
  950         else
  951         {
  952           onePortContext->sasRemoteAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
  953           onePortContext->sasRemoteAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
  954           /* Create ID frame and storing ID frame */
  955           osti_memcpy(&onePortContext->sasIDframe, IDframe, sizeof(agsaSASIdentify_t));
  956           tdhexdump("ossaHWCB: sasIDframe", (bit8 *)(&onePortContext->sasIDframe), sizeof(agsaSASIdentify_t));
  957           if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE)
  958           {
  959             onePortContext->directAttatchedSAS = agTRUE;
  960           }
  961 #ifdef FDS_DM
  962           if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_EDGE_EXPANDER_DEVICE ||
  963               SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_FANOUT_EXPANDER_DEVICE
  964              )
  965           {
  966             onePortContext->UseDM = agTRUE;
  967           }
  968 #endif
  969         }
  970 
  971         onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
  972         onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
  973         onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
  974         onePortContext->agRoot = agRoot;
  975         onePortContext->agPortContext = agPortContext;
  976         tdsaAllShared->Ports[PhyID].portContext = onePortContext;
  977         agPortContext->osData = onePortContext;
  978         onePortContext->valid = agTRUE;
  979         if (LinkRate == 0x01)
  980         {
  981           onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
  982         }
  983         else if (LinkRate == 0x02)
  984         {
  985           onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
  986         }
  987         else if (LinkRate == 0x04)
  988         {
  989           onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
  990         }
  991         else /* (LinkRate == 0x08) */
  992         {
  993           onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
  994         }
  995 
  996         tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
  997         TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
  998         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
  999 #ifdef FDS_DM
 1000         dmPortContext = &(onePortContext->dmPortContext);
 1001         dmPortContext->tdData = onePortContext;
 1002         /* set up dmPortInfo_t */
 1003         PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(&dmPortInfo, onePortContext->sasRemoteAddressLo);
 1004         PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(&dmPortInfo, onePortContext->sasRemoteAddressHi);
 1005         PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(&dmPortInfo, onePortContext->sasLocalAddressLo);
 1006         PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(&dmPortInfo, onePortContext->sasLocalAddressHi);
 1007 
 1008         TI_DBG2(("ossaHwCB: phy %d hi 0x%x lo 0x%x\n", PhyID,
 1009                  SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[PhyID].SASID)),
 1010                  SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[PhyID].SASID))));
 1011         TI_DBG2(("ossaHwCB: LocalAddrHi 0x%08x LocaAddrLo 0x%08x\n", onePortContext->sasLocalAddressHi, onePortContext->sasLocalAddressLo));
 1012 
 1013         dmPortInfo.flag = onePortContext->LinkRate;
 1014 
 1015         if (onePortContext->UseDM == agTRUE)
 1016         {
 1017           TI_DBG1(("ossaHwCB: calling dmCreatePort\n"));
 1018           status = dmCreatePort(dmRoot, dmPortContext, &dmPortInfo);
 1019           if (status != DM_RC_SUCCESS)
 1020           {
 1021             TI_DBG1(("ossaHwCB: dmCreatePort failed!!! 0x%x\n", status));
 1022           }
 1023         }
 1024 #endif
 1025 
 1026       }
 1027       else
 1028       {
 1029         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 1030         TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
 1031       }
 1032 #ifdef TD_INTERNAL_DEBUG     /* for debugging only */
 1033 
 1034       print_tdlist_flink(&(tdsaPortContext->FreeLink), 1, 1);
 1035       print_tdlist_flink(&(tdsaPortContext->MainLink), 1, 2);
 1036       print_tdlist_flink(&(tdsaDeviceData->FreeLink), 2, 1);
 1037       print_tdlist_flink(&(tdsaDeviceData->MainLink), 2, 2);
 1038 #endif
 1039 
 1040 #ifdef TD_INTERNAL_DEBUG      /* for debugging */
 1041       PortContextList = tdsaPortContext->MainLink.flink;
 1042       while (PortContextList != &(tdsaPortContext->MainLink))
 1043       {
 1044         twoPortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
 1045         TI_DBG6(("ossaHwCB: in while portContext ID %d\n", twoPortContext->id));
 1046         TI_DBG6(("ossaHwCB: in while PortContext %p\n", twoPortContext));
 1047         PortContextList = PortContextList->flink;
 1048       }
 1049 #endif
 1050       /* add agDevHandle */
 1051       if (SA_IDFRM_GET_DEVICETTYPE(IDframe) != SAS_NO_DEVICE)
 1052       {
 1053 #ifdef INITIATOR_DRIVER
 1054         agSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
 1055         agSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
 1056         agSASSubID.initiator_ssp_stp_smp = IDframe->initiator_ssp_stp_smp;
 1057         agSASSubID.target_ssp_stp_smp = IDframe->target_ssp_stp_smp;
 1058 #endif
 1059 
 1060         TI_DBG2(("ossaHwCB: adding ....\n"));
 1061         /* uses only SASIDframe not agsaSASDeviceInfo_t */
 1062 #ifdef INITIATOR_DRIVER
 1063         tdssAddSASToSharedcontext(
 1064                                   onePortContext,
 1065                                   agRoot,
 1066                                   agDevHandle, /* agNULL */
 1067                                   &agSASSubID,
 1068                                   agTRUE,
 1069                                   (bit8)PhyID,
 1070                                   TD_OPERATION_INITIATOR
 1071                                   );
 1072 #endif
 1073 
 1074 #ifdef FDS_DM
 1075         if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE &&
 1076             SA_IDFRM_IS_SSP_TARGET(IDframe) )
 1077         {
 1078           TI_DBG2(("ossaHwCB: NOTIFY_ENABLE_SPINUP PhyID %d \n", PhyID));
 1079          
 1080           for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
 1081           {
 1082             saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
 1083           }
 1084         }
 1085 
 1086         /* update MCN */
 1087         tdsaUpdateMCN(dmRoot, onePortContext);
 1088 #endif
 1089 
 1090 #ifdef TARGET_DRIVER
 1091         TI_DBG1(("ossaHwCB: target, link up PhyID 0x%x\n",PhyID));
 1092 
 1093         /* notifying link up */
 1094         ostiPortEvent (
 1095                        tiRoot,
 1096                        tiPortLinkUp,
 1097                        tiSuccess,
 1098                        (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
 1099                        );
 1100 #endif
 1101       }
 1102       else
 1103       {
 1104         TI_DBG5(("ossaHwCB: $$$$$ not end device. not adding....\n"));
 1105       }
 1106 
 1107       saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RECOVERY_TIME */
 1108                     agNULL,
 1109                     0,
 1110                     agPortContext,
 1111                     AGSA_PORT_SET_PORT_RECOVERY_TIME,
 1112                     tdsaAllShared->portTMO, //PORT_RECOVERY_TIMEOUT
 1113                     0
 1114                     );
 1115       /* setting SAS PORT RESET TMO and SATA PORT RESET TMO*/
 1116       if (tIsSPCV12G(agRoot))
 1117       {
 1118         saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
 1119                       agNULL,
 1120                       0,
 1121                       agPortContext,
 1122                       AGSA_PORT_SET_PORT_RESET_TIME,
 1123                       SAS_12G_PORT_RESET_TMO, // 800 ms
 1124                       0
 1125                       );
 1126       }
 1127       else
 1128       {
 1129         saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
 1130                       agNULL,
 1131                       0,
 1132                       agPortContext,
 1133                       AGSA_PORT_SET_PORT_RESET_TIME,
 1134                       SAS_PORT_RESET_TMO, // 300 ms
 1135                       0
 1136                       );
 1137       }
 1138     }
 1139     else
 1140     {
 1141       /*
 1142         an existing portcontext
 1143         to be tested
 1144       */
 1145 
 1146       TI_DBG2(("ossaHwCB: SAS existing portcontext returned\n"));
 1147 
 1148       onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
 1149       if (onePortContext == agNULL)
 1150       {
 1151         TI_DBG1(("ossaHwCB: onePortContext is NULL, wrong!\n"));
 1152         return;
 1153       }
 1154       if (onePortContext->valid == agFALSE)
 1155       {
 1156         /* port has been invalidated; needs to be allocated */
 1157         TI_DBG2(("ossaHwCB: SAS allocating port context\n"));
 1158 
 1159         tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 1160         if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
 1161         {
 1162           TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
 1163           tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 1164           onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
 1165           TI_DBG2(("ossaHwCB: allocating pid %d\n", onePortContext->id));
 1166           TI_DBG6(("ossaHwCB: allocating onePortContext %p\n", onePortContext));
 1167           if (onePortContext == agNULL)
 1168           {
 1169             TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
 1170             return;
 1171           }
 1172           /* sets fields of tdsaportcontext */
 1173 #ifdef INITIATOR_DRIVER
 1174           onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
 1175           onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
 1176 #endif
 1177           onePortContext->PhyIDList[PhyID] = agTRUE;
 1178           if (IDframe == agNULL)
 1179           {
 1180             onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
 1181             onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
 1182             onePortContext->directAttatchedSAS = agTRUE;
 1183           }
 1184           else
 1185           {
 1186             onePortContext->sasRemoteAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
 1187             onePortContext->sasRemoteAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
 1188             /* Create ID frame and storing ID frame */
 1189             osti_memcpy(&onePortContext->sasIDframe, IDframe, sizeof(agsaSASIdentify_t));
 1190             tdhexdump("ossaHWCB: sasIDframe", (bit8 *)(&onePortContext->sasIDframe), sizeof(agsaSASIdentify_t));
 1191             if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE)
 1192             {
 1193               onePortContext->directAttatchedSAS = agTRUE;
 1194             }
 1195           }
 1196 
 1197           onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
 1198           onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
 1199           onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
 1200           onePortContext->agRoot = agRoot;
 1201           onePortContext->agPortContext = agPortContext;
 1202           tdsaAllShared->Ports[PhyID].portContext = onePortContext;
 1203           agPortContext->osData = onePortContext;
 1204           onePortContext->valid = agTRUE;
 1205           if (LinkRate == 0x01)
 1206           {
 1207             onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
 1208           }
 1209           else if (LinkRate == 0x02)
 1210           {
 1211             onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
 1212           }
 1213           else if (LinkRate == 0x04)
 1214           {
 1215             onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
 1216           }
 1217           else /* (LinkRate == 0x08) */
 1218           {
 1219             onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
 1220           }
 1221           tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 1222           TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
 1223           tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 1224         }
 1225         else
 1226         {
 1227           tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 1228           TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
 1229           smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y2");
 1230           return;
 1231         }
 1232       } /* invalidated port */
 1233       else
 1234       {
 1235         /* already alloacated */
 1236         TI_DBG2(("ossaHwCB: SAS already allocated port context\n"));
 1237         if (TDLIST_EMPTY(&(tdsaAllShared->MainPortContextList)))
 1238         {
 1239           TI_DBG1(("ossaHwCB: wrong!!!  null tdsaPortContext list\n"));
 1240           smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y2");
 1241           return;
 1242         }
 1243         if (onePortContext == agNULL)
 1244         {
 1245           TI_DBG1(("ossaHwCB: wrong !!! No corressponding tdsaPortContext\n"));
 1246           smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "Y2");
 1247           return;
 1248         }
 1249 
 1250         TI_DBG2(("ossaHwCB: existing pid %d\n", onePortContext->id));
 1251         if (tdsaAllShared->Ports[PhyID].portContext == agNULL)
 1252         {
 1253           TI_DBG1(("ossaHwCB: existing allshared pid is NULL\n"));
 1254         }
 1255         else
 1256         {
 1257           TI_DBG2(("ossaHwCB: existing allshared pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id));
 1258         }
 1259         /* updates PhyID belong to a port */
 1260         onePortContext->PhyIDList[PhyID] = agTRUE;
 1261 #ifdef FDS_DM
 1262         if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE &&
 1263             SA_IDFRM_IS_SSP_TARGET(IDframe) )
 1264         {
 1265           TI_DBG2(("ossaHwCB: NOTIFY_ENABLE_SPINUP PhyID %d \n", PhyID));
 1266           
 1267           for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
 1268           {
 1269             saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
 1270           }
 1271         }
 1272 
 1273         /* update MCN */
 1274         tdsaUpdateMCN(dmRoot, onePortContext);
 1275 #endif
 1276       }
 1277       onePortContext->SeenLinkUp = agTRUE;
 1278     } /* else, old portcontext */
 1279 
 1280     break;
 1281   }
 1282 #ifdef INITIATOR_DRIVER
 1283   case OSSA_HW_EVENT_SATA_PHY_UP:
 1284   {
 1285     PhyID = TD_GET_PHY_ID(eventParm1);
 1286     LinkRate = TD_GET_LINK_RATE(eventParm1);
 1287     PortState = TD_GET_PORT_STATE(eventParm1);
 1288     agDevHandle = agNULL;
 1289     RegD2H = ( agsaFisRegDeviceToHost_t *)eventParm3;
 1290 
 1291     TI_DBG2(("ossaHwCB: Phy%d SATA link Up\n", PhyID));
 1292 
 1293     if (agDevHandle == agNULL)
 1294     {
 1295       TI_DBG3(("ossaHwCB: agDevHandle null by design change\n"));
 1296     }
 1297 
 1298     if (RegD2H == agNULL)
 1299     {
 1300       TI_DBG1(("ossaHwCB: RegD2H null, wrong\n"));
 1301       smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "Y2");
 1302       return;
 1303     }
 1304 
 1305 
 1306     TI_DBG2(("ossaHwCB: agDevHandle %p\n", agDevHandle));
 1307     tdhexdump("ossaHWCB RegD2H", (bit8 *)RegD2H, sizeof(agsaFisRegDeviceToHost_t));
 1308     TI_DBG2(("ossaHwCB: Sector Count %d\n", RegD2H->d.sectorCount));
 1309     TI_DBG2(("ossaHwCB: LBA LOW %d\n", RegD2H->d.lbaLow));
 1310     TI_DBG2(("ossaHwCB: LBA MID  %d\n", RegD2H->d.lbaMid));
 1311     TI_DBG2(("ossaHwCB: LBA HIGH  %d\n", RegD2H->d.lbaHigh));
 1312     TI_DBG2(("ossaHwCB: DEVICE  %d\n", RegD2H->d.device));
 1313 
 1314     /* debugging only */
 1315     if (LinkRate == 0x01)
 1316     {
 1317       TI_DBG1(("ossaHwCB: SATA Link Rate is 1.5 Gbps PhyID %d\n",PhyID));
 1318     }
 1319     if (LinkRate == 0x02)
 1320     {
 1321       TI_DBG1(("ossaHwCB: SATA Link Rate is 3.0 Gbps PhyID %d\n",PhyID));
 1322     }
 1323     if (LinkRate == 0x04)
 1324     {
 1325       TI_DBG1(("ossaHwCB: SATA Link Rate is 6.0 Gbps PhyID %d\n",PhyID));
 1326     }
 1327     if (LinkRate == 0x08)
 1328     {
 1329       TI_DBG1(("ossaHwCB: SATA Link Rate is 12.0 Gbps PhyID %d\n",PhyID));
 1330     }
 1331 
 1332     if (PortState == OSSA_PORT_INVALID)
 1333     {
 1334       TI_DBG1(("ossaHwCB: Wrong port state with SATA link up\n"));
 1335       smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "Y2");
 1336       return;
 1337     }
 1338 
 1339     if ( agPortContext->osData == agNULL)
 1340     {/* if */
 1341       TI_DBG6 (("ossaHwCB: PhyID %d tdsaAllShared %p\n", PhyID, tdsaAllShared));
 1342       tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 1343       if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
 1344       {
 1345         TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
 1346         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 1347         onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
 1348         TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
 1349         TI_DBG6(("ossaHwCB: onePortContext %p\n", onePortContext));
 1350         if (onePortContext == agNULL)
 1351         {
 1352           TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
 1353           return;
 1354         }
 1355 
 1356         /* sets fields of tdsaportcontext */
 1357         onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
 1358         onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
 1359         onePortContext->PhyIDList[PhyID] = agTRUE;
 1360         /* NO sas address for SATA */
 1361         onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
 1362         onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
 1363         /* copying the signature */
 1364         onePortContext->remoteSignature[0] = RegD2H->d.sectorCount;
 1365         onePortContext->remoteSignature[1] = RegD2H->d.lbaLow;
 1366         onePortContext->remoteSignature[2] = RegD2H->d.lbaMid;
 1367         onePortContext->remoteSignature[3] = RegD2H->d.lbaHigh;
 1368         onePortContext->remoteSignature[4] = RegD2H->d.device;
 1369 
 1370         onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
 1371         onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
 1372         onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
 1373         onePortContext->agRoot = agRoot;
 1374         onePortContext->agPortContext = agPortContext;
 1375         tdsaAllShared->Ports[PhyID].portContext = onePortContext;
 1376         agPortContext->osData = onePortContext;
 1377         onePortContext->nativeSATAMode = agTRUE;
 1378         onePortContext->valid = agTRUE;
 1379         if (LinkRate == 0x01)
 1380         {
 1381           onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
 1382         }
 1383         else if (LinkRate == 0x02)
 1384         {
 1385           onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
 1386         }
 1387         else if (LinkRate == 0x04)
 1388         {
 1389           onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
 1390         }
 1391         else /* (LinkRate == 0x08) */
 1392         {
 1393           onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
 1394         }
 1395 
 1396         tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 1397         TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
 1398         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 1399       }
 1400       else
 1401       {
 1402         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 1403         TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
 1404         smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "Y2");
 1405         return;
 1406       }
 1407 #ifdef SATA_ENABLE
 1408       /* tdssAddSATAToSharedcontext() sends identify device data to find out the uniqueness of
 1409          target. In identify device data CB fn (satAddSATAIDDevCB()),
 1410          tiPortLinkUp and tiPortDiscoveryReady happen
 1411       */
 1412       tdssAddSATAToSharedcontext(
 1413                                   onePortContext,
 1414                                   agRoot,
 1415                                   agDevHandle, /* agNULL */
 1416                                   agNULL,
 1417                                   agTRUE,
 1418                                   (bit8)PhyID
 1419                                   );
 1420 #endif
 1421       /* setting SAS PORT RESET TMO and SATA PORT RESET TMO*/
 1422       saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
 1423                     agNULL,
 1424                     0,
 1425                     agPortContext,
 1426                     AGSA_PORT_SET_PORT_RESET_TIME,
 1427                     0,
 1428                     SATA_PORT_RESET_TMO // 8000 ms
 1429                     );
 1430 
 1431     }
 1432     else
 1433     {
 1434       /*
 1435         an existing portcontext
 1436         to be tested
 1437       */
 1438 
 1439       TI_DBG1(("ossaHwCB: SATA existing portcontext returned. need testing\n"));
 1440       onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
 1441       /* for debugging only */
 1442       if (onePortContext->valid == agFALSE)
 1443       {
 1444         /* port has been invalidated; needs to be allocated */
 1445         TI_DBG2(("ossaHwCB: SATA allocating port context\n"));
 1446       }
 1447       else
 1448       {
 1449         /* already alloacated */
 1450         TI_DBG1(("ossaHwCB: Wrong!!! SATA already allocated port context\n"));
 1451         smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "Y2");
 1452         return;
 1453       }
 1454 
 1455       tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 1456       if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
 1457       {
 1458         TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
 1459         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 1460         onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
 1461         TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
 1462         TI_DBG6(("ossaHwCB: onePortContext %p\n", onePortContext));
 1463         if (onePortContext == agNULL)
 1464         {
 1465           TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
 1466           return;
 1467         }
 1468 
 1469         /* sets fields of tdsaportcontext */
 1470         onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
 1471         onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
 1472         onePortContext->PhyIDList[PhyID] = agTRUE;
 1473         /* NO sas address for SATA */
 1474         onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
 1475         onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
 1476         /* copying the signature */
 1477         onePortContext->remoteSignature[0] = RegD2H->d.sectorCount;
 1478         onePortContext->remoteSignature[1] = RegD2H->d.lbaLow;
 1479         onePortContext->remoteSignature[2] = RegD2H->d.lbaMid;
 1480         onePortContext->remoteSignature[3] = RegD2H->d.lbaHigh;
 1481         onePortContext->remoteSignature[4] = RegD2H->d.device;
 1482 
 1483         onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
 1484         onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
 1485         onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
 1486         onePortContext->agRoot = agRoot;
 1487         onePortContext->agPortContext = agPortContext;
 1488         tdsaAllShared->Ports[PhyID].portContext = onePortContext;
 1489         agPortContext->osData = onePortContext;
 1490         onePortContext->nativeSATAMode = agTRUE;
 1491         onePortContext->valid = agTRUE;
 1492         if (LinkRate == 0x01)
 1493         {
 1494           onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
 1495         }
 1496         else if (LinkRate == 0x02)
 1497         {
 1498           onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
 1499         }
 1500         else if (LinkRate == 0x04)
 1501         {
 1502           onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
 1503         }
 1504         else /* (LinkRate == 0x08) */
 1505         {
 1506           onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
 1507         }
 1508 
 1509         tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 1510         TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
 1511         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 1512       }
 1513       else
 1514       {
 1515         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 1516         TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
 1517         smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "Y2");
 1518         return;
 1519       }
 1520 
 1521 
 1522       /*hotplug */
 1523 #ifdef SATA_ENABLE
 1524       tdssAddSATAToSharedcontext(
 1525                                   onePortContext,
 1526                                   agRoot,
 1527                                   agDevHandle, /* agNULL */
 1528                                   agNULL,
 1529                                   agTRUE,
 1530                                   (bit8)PhyID
 1531                                   );
 1532 #endif
 1533     /* end hotplug */
 1534     }
 1535 
 1536     break;
 1537   }
 1538 #endif
 1539   case OSSA_HW_EVENT_SATA_SPINUP_HOLD:
 1540   {
 1541     PhyID = TD_GET_PHY_ID(eventParm1);
 1542 
 1543     TI_DBG2(("ossaHwCB: spinup hold PhyID %d\n", PhyID));
 1544     break;
 1545   }
 1546 
 1547   case OSSA_HW_EVENT_PHY_DOWN:
 1548   {
 1549     bit32 AllPhyDown = agTRUE;
 1550 
 1551     /* 4/15/08 spec */
 1552     PhyID = TD_GET_PHY_ID(eventParm1);
 1553     LinkRate = TD_GET_LINK_RATE(eventParm1);
 1554     PortState = TD_GET_PORT_STATE(eventParm1);
 1555 
 1556 
 1557     TI_DBG2(("ossaHwCB: Phy%d link Down\n", PhyID));
 1558 
 1559     if (agPortContext == agNULL)
 1560     {
 1561       TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
 1562       smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "Y2");
 1563       return;
 1564     }
 1565 
 1566     if ( agPortContext->osData == agNULL)
 1567     { /* if */
 1568       /* PortContext must exit at this point */
 1569       TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
 1570     }
 1571     else
 1572     {
 1573       TI_DBG3(("ossaHwCB: NOT NULL portalcontext\n"));
 1574       onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
 1575       if (onePortContext == agNULL)
 1576       {
 1577         TI_DBG1(("ossaHwCB: wrong !!! No corressponding tdsaPortContext\n"));
 1578         smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "Y2");
 1579         return;
 1580       }
 1581       onePortContext->PhyIDList[PhyID] = agFALSE;
 1582       for(i=0;i<TD_MAX_NUM_PHYS;i++)
 1583       {
 1584         if (onePortContext->PhyIDList[i] == agTRUE)
 1585         {
 1586           TI_DBG3(("ossaHwCB: Phy %d is still up\n", i));
 1587           AllPhyDown = agFALSE;
 1588           break;
 1589         }
 1590       }
 1591 
 1592       /* last phy belong to the portcontext */
 1593       if (AllPhyDown == agTRUE)
 1594       {
 1595 #ifdef NOT_YET  
 1596         TI_DBG1(("ossaHwCB: calling tiPortLinkDown\n"));
 1597         ostiPortEvent (
 1598                        tiRoot,
 1599                        tiPortLinkDown,
 1600                        tiSuccess,
 1601                        (void *)onePortContext->tiPortalContext
 1602                        );
 1603 #endif
 1604       }
 1605 
 1606       if (PortState == OSSA_PORT_VALID)
 1607       {
 1608         /* do nothing */
 1609         /* no ack for every phy down */
 1610 #ifdef FDS_DM
 1611         /* update MCN for all devices belong to this port */
 1612         tdsaUpdateMCN(dmRoot, onePortContext);
 1613 #endif
 1614       }
 1615       else if (PortState == OSSA_PORT_LOSTCOMM)
 1616       {
 1617         /*
 1618          1. Mark the port as invalid and stop the io for that port and its device
 1619          No ack here. Otherwise, port will be released by FW.
 1620         */
 1621         TI_DBG2(("ossaHwCB: phy Down and OSSA_PORT_LOSTCOMM\n"));
 1622         /* save eventSource related information in tdsaAllShared */
 1623         tdsaAllShared->eventSource[PhyID].EventValid =  agTRUE;
 1624         tdsaAllShared->eventSource[PhyID].Source.agPortContext =  agPortContext;
 1625         tdsaAllShared->eventSource[PhyID].Source.event =  OSSA_HW_EVENT_PHY_DOWN;
 1626         /* phy ID */
 1627         tdsaAllShared->eventSource[PhyID].Source.param =  PhyID;
 1628         /* phy ID */
 1629         onePortContext->eventPhyID = PhyID;
 1630         /* to stop IO's */
 1631         onePortContext->valid = agFALSE;
 1632         break;
 1633       }
 1634       else if (PortState == OSSA_PORT_IN_RESET)
 1635       {
 1636         TI_DBG2(("ossaHwCB: phy Down and OSSA_PORT_IN_RESET\n"));
 1637         /* save eventSource related information in tdsaAllShared */
 1638         tdsaAllShared->eventSource[PhyID].EventValid =  agTRUE;
 1639         tdsaAllShared->eventSource[PhyID].Source.agPortContext =  agPortContext;
 1640         tdsaAllShared->eventSource[PhyID].Source.event =  OSSA_HW_EVENT_PHY_DOWN;
 1641         /* phy ID */
 1642         tdsaAllShared->eventSource[PhyID].Source.param =  PhyID;
 1643         /* phy ID */
 1644         onePortContext->eventPhyID = PhyID;
 1645         /* to stop IO's */
 1646         onePortContext->valid = agFALSE;
 1647         break;
 1648       }
 1649       else if (PortState == OSSA_PORT_INVALID)
 1650       {
 1651         TI_DBG1(("ossaHwCB: Last phy Down and port invalid OSSA_PORT_INVALID\n"));
 1652         /*
 1653           invalidate port
 1654           then, saHwEventAck() in ossaDeregisterDeviceHandleCB()
 1655         */
 1656 
 1657         /* save eventSource related information in tdsaAllShared */
 1658         tdsaAllShared->eventSource[PhyID].EventValid =  agTRUE;
 1659         tdsaAllShared->eventSource[PhyID].Source.agPortContext =  agPortContext;
 1660         tdsaAllShared->eventSource[PhyID].Source.event =  OSSA_HW_EVENT_PHY_DOWN;
 1661         /* phy ID */
 1662         tdsaAllShared->eventSource[PhyID].Source.param =  PhyID;
 1663         /* phy ID */
 1664         onePortContext->eventPhyID = PhyID;
 1665 
 1666         onePortContext->valid = agFALSE;
 1667 
 1668         TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
 1669 #ifdef INITIATOR_DRIVER
 1670         /* notifying link down (all links belonging to a port are down) */
 1671         ostiPortEvent(
 1672                       tiRoot,
 1673                       tiPortStopped,
 1674                       tiSuccess,
 1675                       (void *)onePortContext->tiPortalContext
 1676                       );
 1677 #endif
 1678 
 1679 #ifdef TARGET_DRIVER
 1680         ostiPortEvent(
 1681                       tiRoot,
 1682                       tiPortLinkDown,
 1683                       tiSuccess,
 1684                       (void *)onePortContext->tiPortalContext
 1685                       );
 1686 
 1687 #endif
 1688 
 1689 #ifdef INITIATOR_DRIVER
 1690         tdssReportRemovals(agRoot,
 1691                          onePortContext,
 1692                          agFALSE
 1693                         );
 1694 #endif
 1695 #ifdef TARGET_DRIVER
 1696         ttdssReportRemovals(agRoot,
 1697                             onePortContext,
 1698                             agFALSE
 1699                            );
 1700 
 1701 #endif
 1702 
 1703         /* find a PhyID and reset for portContext in tdssSASShared */
 1704         for(i=0;i<TD_MAX_NUM_PHYS;i++)
 1705         {
 1706           if (onePortContext->PhyIDList[i] == agTRUE)
 1707           {
 1708             tdsaAllShared->Ports[i].portContext = agNULL;
 1709           }
 1710         }
 1711     /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
 1712        ossaDeregisterDeviceHandleCB
 1713      */
 1714       }/* OSSA_PORT_INVALID */
 1715       else
 1716       {
 1717         /* other newly defined port state */
 1718         /* do nothing */
 1719         TI_DBG2(("ossaHwCB: portstate 0x%x\n", PortState));
 1720       }
 1721     } /* big else */
 1722     break;
 1723   }
 1724   case OSSA_HW_EVENT_PHY_START_STATUS:
 1725   {
 1726     PhyID = TD_GET_PHY_ID(eventParm1);
 1727     PhyStatus =  TD_GET_PHY_STATUS(eventParm1);
 1728 
 1729     TI_DBG6(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS\n"));
 1730     if (PhyStatus == 0x00)
 1731     {
 1732       TI_DBG6(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, SUCCESS\n"));
 1733     }
 1734     else if (PhyStatus == 0x01)
 1735     {
 1736       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, INVALID_PHY\n"));
 1737     }
 1738     else if (PhyStatus == 0x02)
 1739     {
 1740       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, PHY_NOT_DISABLED\n"));
 1741     }
 1742     else
 1743     {
 1744       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, OTHER_FAILURE %d\n", PhyStatus));
 1745     }
 1746     break;
 1747   }
 1748   case OSSA_HW_EVENT_PHY_STOP_STATUS:
 1749   {
 1750     agsaContext_t     *agContext;
 1751     PhyID = TD_GET_PHY_ID(eventParm1);
 1752     PhyStatus =  TD_GET_PHY_STATUS(eventParm1);
 1753     PortState = TD_GET_PORT_STATE(eventParm1);
 1754 
 1755     TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS\n"));
 1756     if (PhyStatus == 0x00)
 1757     {
 1758       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, SUCCESS\n"));
 1759       agContext = (agsaContext_t *)eventParm2;
 1760       onePortContext  = (tdsaPortContext_t *)agContext->osData;
 1761       if (onePortContext == agNULL)
 1762       {
 1763         TI_DBG1(("ossaHwCB: onePortContext is null, wrong!!!\n"));
 1764         return;
 1765       }
 1766       onePortContext->PhyIDList[PhyID] = agFALSE;
 1767       if (PortState == OSSA_PORT_INVALID) /* invalid port */
 1768       {
 1769         TI_DBG1(("ossaHwCB: OSSA_PORT_INVALID\n"));
 1770         tdsaAllShared->eventSource[PhyID].EventValid =  NO_ACK;
 1771         onePortContext->eventPhyID = PhyID;
 1772         onePortContext->valid = agFALSE;
 1773 
 1774         TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
 1775 #ifdef INITIATOR_DRIVER
 1776         /* notifying link down (all links belonging to a port are down) */
 1777         ostiPortEvent(
 1778                       tiRoot,
 1779                       tiPortStopped,
 1780                       tiSuccess,
 1781                       (void *)onePortContext->tiPortalContext
 1782                       );
 1783 #endif
 1784 
 1785 #ifdef TARGET_DRIVER
 1786         ostiPortEvent(
 1787                       tiRoot,
 1788                       tiPortLinkDown,
 1789                       tiSuccess,
 1790                       (void *)onePortContext->tiPortalContext
 1791                       );
 1792 
 1793 #endif
 1794 
 1795 #ifdef INITIATOR_DRIVER
 1796         tdssReportRemovals(agRoot,
 1797                            onePortContext,
 1798                            agFALSE
 1799                           );
 1800 #endif
 1801 #ifdef TARGET_DRIVER
 1802         ttdssReportRemovals(agRoot,
 1803                             onePortContext,
 1804                             agFALSE
 1805                            );
 1806 
 1807 #endif
 1808 
 1809         /* find a PhyID and reset for portContext in tdssSASShared */
 1810         for(i=0;i<TD_MAX_NUM_PHYS;i++)
 1811         {
 1812           if (onePortContext->PhyIDList[i] == agTRUE)
 1813           {
 1814             tdsaAllShared->Ports[i].portContext = agNULL;
 1815           }
 1816         }
 1817     /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
 1818        ossaDeregisterDeviceHandleCB
 1819      */
 1820       } /* invalid port */
 1821     }
 1822     else if (PhyStatus == 0x01)
 1823     {
 1824       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, INVALID_PHY\n"));
 1825     }
 1826     else if (PhyStatus == 0x02)
 1827     {
 1828       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, DEVICES_ATTACHED\n"));
 1829     }
 1830     else if (PhyStatus == 0x03)
 1831     {
 1832       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, OTHER_FAILURE\n"));
 1833     }
 1834     else if (PhyStatus == 0x04)
 1835     {
 1836       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, PHY_NOT_DISABLED\n"));
 1837     }
 1838     else
 1839     {
 1840       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, Unknown %d\n", PhyStatus));
 1841     }
 1842     break;
 1843   }
 1844 
 1845   case OSSA_HW_EVENT_RESET_START:
 1846   {
 1847     bit32 new_status = TD_GET_RESET_STATUS(eventParm1);
 1848     TI_DBG2(("ossaHwCB: RESET_START, status %d\n", new_status));
 1849     if (new_status == OSSA_SUCCESS)
 1850     {
 1851       tdsaAllShared->flags.resetInProgress = agTRUE;
 1852       TI_DBG2(("ossaHwCB: RESET_START, SUCCESS\n"));
 1853     }
 1854     else if (new_status == OSSA_FAILURE)
 1855     {
 1856       TI_DBG1(("ossaHwCB: RESET_START, FAILURE\n"));
 1857     }
 1858     else
 1859     {
 1860       TI_DBG1(("ossaHwCB: RESET_START, PENDING\n"));
 1861     }
 1862     break;
 1863   }
 1864 
 1865   case OSSA_HW_EVENT_RESET_COMPLETE:
 1866   {
 1867     bit32 new_status = TD_GET_RESET_STATUS(eventParm1);
 1868 #ifdef SOFT_RESET_TEST
 1869     DbgPrint("Reset Complete\n");
 1870 #endif
 1871     TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_RESET_COMPLETE, status %d\n", new_status));
 1872     if (new_status == OSSA_SUCCESS)
 1873     {
 1874       /* remove all portcontext and devices */
 1875 #ifdef INITIATOR_DRIVER
 1876       tdssRemoveSASSATAFromSharedcontextByReset(agRoot);
 1877 #endif
 1878       tdsaAllShared->flags.resetInProgress = agFALSE;
 1879       /*
 1880         a callback notifying reset completion
 1881       */
 1882       ostiPortEvent(
 1883                     tiRoot,
 1884                     tiPortResetComplete,
 1885                     tiSuccess,
 1886                     agNULL
 1887                     );
 1888     }
 1889     else
 1890     {
 1891       /*
 1892         a callback notifying reset completion
 1893       */
 1894       tdsaAllShared->flags.resetInProgress = agFALSE;
 1895       ostiPortEvent(
 1896                     tiRoot,
 1897                     tiPortResetComplete,
 1898                     tiError,
 1899                     agNULL
 1900                     );
 1901 
 1902     }
 1903     break;
 1904   }
 1905 
 1906   case OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC:
 1907   {
 1908     PhyID = TD_GET_PHY_ID(eventParm1);
 1909     PortState = TD_GET_PORT_STATE(eventParm1);
 1910     agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
 1911 
 1912     TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC from PhyID %d; to be tested\n", PhyID));
 1913 
 1914     if (PortState == OSSA_PORT_INVALID)
 1915     {
 1916       TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC\n"));
 1917       smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "Y2");
 1918       return;
 1919     }
 1920 
 1921     if (agPhyErrCountersPage != agNULL)
 1922     {
 1923       TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC from PhyID %d\n", PhyID));
 1924       TI_DBG1(("ossaHwCB: iDw %d rDE %d cV %d lS %d rP %d iCRC %d\n",
 1925                         agPhyErrCountersPage->invalidDword,
 1926                         agPhyErrCountersPage->runningDisparityError,
 1927                         agPhyErrCountersPage->codeViolation,
 1928                         agPhyErrCountersPage->lossOfDwordSynch,
 1929                         agPhyErrCountersPage->phyResetProblem,
 1930                         agPhyErrCountersPage->inboundCRCError ));
 1931     }
 1932     else
 1933     {
 1934       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC: Error!!!  eventParm2 is NULL\n"));
 1935     }
 1936 
 1937     /* saHwEventAck() */
 1938     eventSource.agPortContext = agPortContext;
 1939     eventSource.event = OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC;
 1940     /* phy ID */
 1941     eventSource.param = PhyID;
 1942     HwAckSatus = saHwEventAck(
 1943                               agRoot,
 1944                               agNULL, /* agContext */
 1945                               0,
 1946                               &eventSource, /* agsaEventSource_t */
 1947                               0,
 1948                               0
 1949                               );
 1950     if ( HwAckSatus != AGSA_RC_SUCCESS)
 1951     {
 1952       TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
 1953       smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "Y2");
 1954       return;
 1955     }
 1956     break;
 1957   }
 1958 #ifdef REMOVED
 1959   case OSSA_HW_EVENT_PORT_INVALID:
 1960   {
 1961     TI_DBG1(("ossaHwCB: PORT_INVALID\n"));
 1962 
 1963     if ( agPortContext == agNULL)
 1964     {
 1965       TI_DBG1(("ossaHwCB: agPortContext is NULL, wrong.\n"));
 1966       smTraceFuncExit(hpDBG_VERY_LOUD, 'p', "Y2");
 1967       return;
 1968     }
 1969     if ( agPortContext->osData != agNULL)
 1970     {
 1971       TI_DBG1(("ossaHwCB: NOT NULL osDATA\n"));
 1972       /*
 1973         put the old portcontext back to free list
 1974       */
 1975       onePortContext = (tdsaPortContext_t *)agPortContext->osData;
 1976       TI_DBG1(("ossaHwCB: pid %d\n", onePortContext->id));
 1977 
 1978 #ifdef INITIATOR_DRIVER
 1979       /* notifying link down (all links belonging to a port are down) */
 1980       ostiPortEvent (
 1981                      tiRoot,
 1982                      tiPortStopped,
 1983                      tiSuccess,
 1984                      (void *)onePortContext->tiPortalContext
 1985 
 1986                      );
 1987 #endif /* INITIATOR_DRIVER */
 1988 #ifdef TARGET_DRIVER
 1989         ostiPortEvent(
 1990                       tiRoot,
 1991                       tiPortLinkDown,
 1992                       tiSuccess,
 1993                       (void *)onePortContext->tiPortalContext
 1994                       );
 1995 
 1996 #endif /*TARGET_DRIVER  */
 1997 
 1998       /* find the device belonging to the port and remove it from the device list */
 1999       //tdssRemoveSASSATAFromSharedcontext(agRoot, tdsaDeviceData, onePortContext);
 2000 
 2001 
 2002 #ifdef INITIATOR_DRIVER
 2003       /* reset the fields of portcontext */
 2004       onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
 2005       tdssReportRemovals(agRoot,
 2006                          onePortContext,
 2007                          agFALSE
 2008                         );
 2009 
 2010       onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
 2011       onePortContext->DiscoveryRdyGiven = agFALSE;
 2012       onePortContext->SeenLinkUp = agFALSE;
 2013 
 2014 #endif /* INITIATOR_DRIVER */
 2015 
 2016 
 2017 
 2018       /* for hotplug */
 2019 
 2020       /* find a PhyID and reset for portContext in tdssSASShared */
 2021       for(i=0;i<TD_MAX_NUM_PHYS;i++)
 2022       {
 2023         if (onePortContext->PhyIDList[i] == agTRUE)
 2024         {
 2025           tdsaAllShared->Ports[i].portContext = agNULL;
 2026         }
 2027       }
 2028 
 2029       /* reset PhyIDList in portcontext */
 2030       for(i=0;i<TD_MAX_NUM_PHYS;i++)
 2031       {
 2032         onePortContext->PhyIDList[i] = agFALSE;
 2033       }
 2034 
 2035 //      onePortContext->tiPortalContext = agNULL;
 2036 //      onePortContext->agRoot = agNULL;
 2037       onePortContext->agPortContext = agNULL;
 2038       onePortContext->valid = agFALSE;
 2039 
 2040       TI_DBG4(("ossaHwCB: pid %d count %d\n", onePortContext->id, onePortContext->Count));
 2041 
 2042       /* resets the number of devices in onePortContext */
 2043       onePortContext->Count = 0;
 2044       onePortContext->discovery.pendingSMP = 0;
 2045       onePortContext->discovery.SeenBC = agFALSE;
 2046 
 2047 
 2048       /*
 2049         put all devices belonging to the onePortContext
 2050         back to the free link
 2051       */
 2052 
 2053       tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 2054       TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
 2055       TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaPortContext->FreeLink));
 2056       tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 2057     }
 2058     else
 2059     {
 2060       TI_DBG1(("ossaHwCB: NULL osDATA: wrong\n"));
 2061     }
 2062     TI_DBG6(("ossaHwCB: PORT_INVALID end\n"));
 2063     break;
 2064   }
 2065 #endif /* REMOVED */
 2066 
 2067   case OSSA_HW_EVENT_BROADCAST_CHANGE:
 2068   {
 2069     PhyID = TD_GET_PHY_ID(eventParm1);
 2070     PortState = TD_GET_PORT_STATE(eventParm1);
 2071     TI_DBG1(("ossaHwCB: BROADCAST_CHANGE from PhyID %d\n", PhyID));
 2072 
 2073     if (PortState == OSSA_PORT_INVALID)
 2074     {
 2075       TI_DBG1(("ossaHwCB: Wrong port state with  BROADCAST_CHANGE\n"));
 2076       smTraceFuncExit(hpDBG_VERY_LOUD, 'q', "Y2");
 2077       return;
 2078     }
 2079     /* saHwEventAck() */
 2080     eventSource.agPortContext = agPortContext;
 2081     eventSource.event = OSSA_HW_EVENT_BROADCAST_CHANGE;
 2082     /* phy ID */
 2083     eventSource.param = PhyID;
 2084     HwAckSatus = saHwEventAck(
 2085                               agRoot,
 2086                               agNULL, /* agContext */
 2087                               0,
 2088                               &eventSource, /* agsaEventSource_t */
 2089                               0,
 2090                               0
 2091                               );
 2092     TI_DBG4(("ossaHwCB: calling saHwEventAck\n"));
 2093 
 2094     if ( HwAckSatus != AGSA_RC_SUCCESS)
 2095     {
 2096       TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
 2097       smTraceFuncExit(hpDBG_VERY_LOUD, 'r', "Y2");
 2098       return;
 2099     }
 2100     if (tIsSPC12SATA(agRoot))
 2101     {
 2102       TI_DBG1(("ossaHwCB: BROADCAST_CHANGE received for SATA Controller\n"));
 2103       break;
 2104     }
 2105     /*
 2106      * incremental discovery is to be tested and debugged further
 2107      */
 2108 
 2109      /* just for testing discovery abort */
 2110 #ifdef FDS_DM_NO
 2111     if (agPortContext == agNULL)
 2112     {
 2113       /* this case happens when broadcase is received first before the link up */
 2114       TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
 2115     }
 2116     else if ( agPortContext->osData != agNULL)
 2117     {
 2118       dmRoot = &(tdsaAllShared->dmRoot);
 2119       onePortContext = (tdsaPortContext_t *)agPortContext->osData;
 2120       dmPortContext = &(onePortContext->dmPortContext);
 2121 
 2122       dmQueryDiscovery(dmRoot, dmPortContext);
 2123 //      dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_ABORT);
 2124 
 2125 #if 1
 2126       if (onePortContext->DMDiscoveryState == dmDiscInProgress)
 2127       {
 2128         dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_ABORT);
 2129       }
 2130 #endif /* 1 */
 2131 
 2132       TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
 2133       if (onePortContext->DMDiscoveryState == dmDiscCompleted ||
 2134           onePortContext->DMDiscoveryState == dmDiscAborted ||
 2135           onePortContext->DMDiscoveryState == dmDiscAbortInvalid )
 2136       {
 2137         TI_DBG1(("ossaHwCB: BROADCAST_CHANGE; calling dmNotifyBC and does incremental discovery\n"));
 2138         dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
 2139         dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_INCREMENTAL_START);
 2140 
 2141       }
 2142       else
 2143       {
 2144         TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
 2145         dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
 2146       }
 2147     }
 2148     else
 2149     {
 2150       TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
 2151     }
 2152 
 2153 
 2154 #endif /* FDS_DM_NO */
 2155 
 2156 #ifdef FDS_DM
 2157     if (agPortContext == agNULL)
 2158     {
 2159       /* this case happens when broadcase is received first before the link up */
 2160       TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
 2161     }
 2162     else if ( agPortContext->osData != agNULL)
 2163     {
 2164       dmRoot = &(tdsaAllShared->dmRoot);
 2165       onePortContext = (tdsaPortContext_t *)agPortContext->osData;
 2166       dmPortContext = &(onePortContext->dmPortContext);
 2167 
 2168       dmQueryDiscovery(dmRoot, dmPortContext);
 2169 
 2170       TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
 2171       if (onePortContext->DMDiscoveryState == dmDiscCompleted ||
 2172           onePortContext->DMDiscoveryState == dmDiscAborted ||
 2173           onePortContext->DMDiscoveryState == dmDiscAbortInvalid )
 2174       {
 2175         TI_DBG1(("ossaHwCB: BROADCAST_CHANGE; calling dmNotifyBC and does incremental discovery, pid %d\n", onePortContext->id));
 2176         onePortContext->DiscoveryState = ITD_DSTATE_STARTED;
 2177         dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
 2178         dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_INCREMENTAL_START);
 2179 
 2180       }
 2181       else if (onePortContext->DMDiscoveryState == dmDiscFailed )
 2182       {
 2183         TI_DBG1(("ossaHwCB: dmDiscFailed; pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
 2184         onePortContext->DiscFailNSeenBC = agTRUE;
 2185         dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
 2186       }
 2187       else
 2188       {
 2189         TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
 2190         dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
 2191       }
 2192     }
 2193     else
 2194     {
 2195       TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
 2196     }
 2197 #endif /* FDS_DM */
 2198 
 2199 #ifdef FDS_DM_WORKED
 2200     if (agPortContext == agNULL)
 2201     {
 2202       /* this case happens when broadcase is received first before the link up */
 2203       TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
 2204     }
 2205     else if ( agPortContext->osData != agNULL)
 2206     {
 2207       onePortContext = (tdsaPortContext_t *)agPortContext->osData;
 2208       TI_DBG2(("ossaHwCB: calling dmNotifyBC\n"));
 2209       dmRoot = &(tdsaAllShared->dmRoot);
 2210       dmPortContext = &(onePortContext->dmPortContext);
 2211       dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
 2212     }
 2213 #endif /* FDS_DM_WORKED */
 2214 
 2215 #ifndef FDS_DM
 2216 #ifdef INITIATOR_DRIVER
 2217     if (agPortContext == agNULL)
 2218     {
 2219       /* this case happens when broadcase is received first before the link up */
 2220       TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
 2221     }
 2222     else if ( agPortContext->osData != agNULL)
 2223     {
 2224       onePortContext = (tdsaPortContext_t *)agPortContext->osData;
 2225       TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
 2226       if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
 2227       {
 2228         TI_DBG1(("ossaHwCB: BROADCAST_CHANGE; does incremental discovery\n"));
 2229         onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
 2230         onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_INCREMENTAL_START;
 2231         /* processed broadcast change */
 2232         onePortContext->discovery.SeenBC = agFALSE;
 2233 #ifdef TD_DISCOVER
 2234         if (tdsaAllShared->ResetInDiscovery != 0 &&
 2235             onePortContext->discovery.ResetTriggerred == agTRUE)
 2236         {
 2237           TI_DBG2(("ossaHwCB: tdsaBCTimer\n"));
 2238           tdsaBCTimer(tiRoot, onePortContext);
 2239         }
 2240         else
 2241         {
 2242           tdsaDiscover(
 2243                      tiRoot,
 2244                      onePortContext,
 2245                      TDSA_DISCOVERY_TYPE_SAS,
 2246                      TDSA_DISCOVERY_OPTION_INCREMENTAL_START
 2247                     );
 2248         }
 2249 #else
 2250         saDiscover(agRoot,
 2251                    agPortContext,
 2252                    AG_SA_DISCOVERY_TYPE_SAS,
 2253                    onePortContext->discoveryOptions);
 2254 #endif
 2255       }
 2256       else
 2257       {
 2258         TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. Do nothing.\n", onePortContext->id));
 2259         onePortContext->discovery.SeenBC = agTRUE;
 2260       }
 2261     }
 2262     else
 2263     {
 2264       TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
 2265     }
 2266 #endif
 2267 #endif /* ifndef FDS_DM */
 2268 
 2269     break;
 2270   }
 2271 
 2272   case OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO:
 2273   {
 2274     PhyID = TD_GET_PHY_ID(eventParm1);
 2275     PortState = TD_GET_PORT_STATE(eventParm1);
 2276 
 2277     /*
 2278       1. tear town the portcontext just like link down last phy down
 2279       2. ack
 2280       port state must be invalid
 2281     */
 2282 
 2283     TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO\n"));
 2284 
 2285     if (PortState == OSSA_PORT_VALID)
 2286     {
 2287       TI_DBG1(("ossaHwCB: Wrong port state\n"));
 2288       smTraceFuncExit(hpDBG_VERY_LOUD, 's', "Y2");
 2289       return;
 2290     }
 2291 
 2292     TD_ASSERT(agPortContext, "agPortContext");
 2293     if ( agPortContext->osData == agNULL)
 2294     { /* if */
 2295       /* PortContext must exit at this point */
 2296       TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
 2297     }
 2298     else
 2299     {
 2300       onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
 2301       onePortContext->valid = agFALSE;
 2302 
 2303       TI_DBG1(("ossaHwCB: tiPortStopped pid %d\n", onePortContext->id));
 2304 #ifdef INITIATOR_DRIVER
 2305       /* notifying link down (all links belonging to a port are down) */
 2306       ostiPortEvent(
 2307                     tiRoot,
 2308                     tiPortStopped,
 2309                     tiSuccess,
 2310                     (void *)onePortContext->tiPortalContext
 2311                     );
 2312 #endif
 2313 
 2314 #ifdef TARGET_DRIVER
 2315         ostiPortEvent(
 2316                       tiRoot,
 2317                       tiPortLinkDown,
 2318                       tiSuccess,
 2319                       (void *)onePortContext->tiPortalContext
 2320                       );
 2321 
 2322 #endif
 2323 
 2324 #ifdef INITIATOR_DRIVER
 2325       tdssReportRemovals(agRoot,
 2326                          onePortContext,
 2327                          agFALSE
 2328                          );
 2329 #endif
 2330 #ifdef TARGET_DRIVER
 2331       ttdssReportRemovals(agRoot,
 2332                           onePortContext,
 2333                           agFALSE
 2334                          );
 2335 
 2336 #endif
 2337       /* find a PhyID and reset for portContext in tdssSASShared */
 2338       for(i=0;i<TD_MAX_NUM_PHYS;i++)
 2339       {
 2340         if (onePortContext->PhyIDList[i] == agTRUE)
 2341         {
 2342           tdsaAllShared->Ports[i].portContext = agNULL;
 2343         }
 2344       }
 2345       /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
 2346          ossaDeregisterDeviceHandleCB
 2347        */
 2348     }
 2349 
 2350     break;
 2351   }
 2352 
 2353   case OSSA_HW_EVENT_PORT_RESET_TIMER_TMO:
 2354   {
 2355     /*
 2356        clean up
 2357     */
 2358     PhyID = TD_GET_PHY_ID(eventParm1);
 2359     PortState = TD_GET_PORT_STATE(eventParm1);
 2360 
 2361     TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RESET_TIMER_TMO\n"));
 2362 
 2363     if (PortState == OSSA_PORT_VALID)
 2364     {
 2365       TI_DBG1(("ossaHwCB: Wrong port state\n"));
 2366       smTraceFuncExit(hpDBG_VERY_LOUD, 't', "Y2");
 2367       return;
 2368     }
 2369 
 2370     if (agPortContext == agNULL)
 2371     {
 2372       TI_DBG1(("ossaHwCB: agPortContext is NULL, error\n"));
 2373       smTraceFuncExit(hpDBG_VERY_LOUD, 'u', "Y2");
 2374       return;
 2375     }
 2376 
 2377     if ( agPortContext->osData == agNULL)
 2378     { /* if */
 2379       /* PortContext must exit at this point */
 2380       TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
 2381     }
 2382     else
 2383     {
 2384       onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
 2385       onePortContext->valid = agFALSE;
 2386 
 2387       TI_DBG1(("ossaHwCB: pid %d tiPortStopped\n", onePortContext->id));
 2388 
 2389 #ifdef INITIATOR_DRIVER
 2390       /* notifying link down (all links belonging to a port are down) */
 2391       ostiPortEvent(
 2392                     tiRoot,
 2393                     tiPortStopped,
 2394                     tiSuccess,
 2395                     (void *)onePortContext->tiPortalContext
 2396                     );
 2397 #endif
 2398 
 2399 #ifdef TARGET_DRIVER
 2400         ostiPortEvent(
 2401                       tiRoot,
 2402                       tiPortLinkDown,
 2403                       tiSuccess,
 2404                       (void *)onePortContext->tiPortalContext
 2405                       );
 2406 
 2407 #endif
 2408 
 2409 #ifdef INITIATOR_DRIVER
 2410       tdssReportRemovals(agRoot,
 2411                          onePortContext,
 2412                          agFALSE
 2413                          );
 2414 #endif
 2415 #ifdef TARGET_DRIVER
 2416       ttdssReportRemovals(agRoot,
 2417                           onePortContext,
 2418                           agFALSE
 2419                          );
 2420 
 2421 #endif
 2422       /* find a PhyID and reset for portContext in tdssSASShared */
 2423       for(i=0;i<TD_MAX_NUM_PHYS;i++)
 2424       {
 2425         if (onePortContext->PhyIDList[i] == agTRUE)
 2426         {
 2427           tdsaAllShared->Ports[i].portContext = agNULL;
 2428         }
 2429       }
 2430       /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
 2431          ossaDeregisterDeviceHandleCB
 2432        */
 2433     }
 2434 
 2435     break;
 2436   }
 2437 
 2438   case OSSA_HW_EVENT_PORT_RESET_COMPLETE:
 2439   {
 2440 #ifdef INITIATOR_DRIVER
 2441     tiIORequest_t *currentTaskTag = agNULL;
 2442 #endif
 2443 
 2444 #ifdef REMOVED
 2445     smRoot_t  *smRoot = &(tdsaAllShared->smRoot);
 2446 #endif
 2447 
 2448     PhyID = TD_GET_PHY_ID(eventParm1);
 2449     PortState = TD_GET_PORT_STATE(eventParm1);
 2450     IDframe = (agsaSASIdentify_t *)eventParm3;
 2451 
 2452     /* completes for Lun Reset and Target reset for directly attached SATA */
 2453     /* completes for Target reset for directly attached SAS */
 2454 
 2455     TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PORT_RESET_COMPLETE, phyID %d\n", PhyID));
 2456 
 2457     /* error check */
 2458     if (PortState == OSSA_PORT_INVALID)
 2459     {
 2460       TI_DBG1(("ossaHwCB: Wrong port state\n"));
 2461       smTraceFuncExit(hpDBG_VERY_LOUD, 'v', "Y2");
 2462       return;
 2463     }
 2464 
 2465     if (agPortContext == agNULL)
 2466     {
 2467       TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
 2468       smTraceFuncExit(hpDBG_VERY_LOUD, 'w', "Y2");
 2469       return;
 2470     }
 2471     if ( agPortContext->osData == agNULL)
 2472     {
 2473       TI_DBG1(("ossaHwCB: agPortContext->osData null, wrong\n"));
 2474       smTraceFuncExit(hpDBG_VERY_LOUD, 'x', "Y2");
 2475       return;
 2476     }
 2477 
 2478     /* find a corresponding portcontext */
 2479     onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
 2480 
 2481     if (onePortContext == agNULL)
 2482     {
 2483       TI_DBG1(("ossaHwCB: oneportContext is NULL; wrong??????\n"));
 2484     }
 2485     else
 2486     {
 2487       TI_DBG1(("ossaHwCB: oneportContext %p pid %d\n", onePortContext, onePortContext->id));
 2488       onePortContext->valid = agTRUE;
 2489 #ifdef INITIATOR_DRIVER
 2490 #ifdef REMOVED
 2491       if (tdsaAllShared->ResetInDiscovery != 0)
 2492       {
 2493         DeviceListList = tdsaAllShared->MainDeviceList.flink;
 2494         while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 2495         {
 2496           oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 2497           if (oneDeviceData->tdPortContext != onePortContext)
 2498           {
 2499             DeviceListList = DeviceListList->flink;
 2500           }
 2501           else
 2502           {
 2503             found = agTRUE;
 2504             break;
 2505           }
 2506         } /* while */
 2507         if (found == agTRUE)
 2508         {
 2509           /* applied to only SATA devices */
 2510           if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
 2511           {
 2512           #ifdef FDS_SM
 2513             tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
 2514           #else
 2515             tdssRetrySATAID(tiRoot, oneDeviceData);
 2516           #endif
 2517           }
 2518         }
 2519         else
 2520         {
 2521           TI_DBG1(("ossaHwCB: no onedevicedata found!\n"));
 2522         }
 2523       }
 2524 #endif
 2525       /* completed TM */
 2526       DeviceListList = tdsaAllShared->MainDeviceList.flink;
 2527       while (DeviceListList != &(tdsaAllShared->MainDeviceList))
 2528       {
 2529         oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
 2530         if ( oneDeviceData == agNULL)
 2531         {
 2532           TI_DBG1(("ossaHwCB: oneDeviceData is NULL!!!\n"));
 2533           return;
 2534         }
 2535 
 2536         if ( (oneDeviceData->tdPortContext == onePortContext) &&
 2537              (oneDeviceData->directlyAttached == agTRUE) &&
 2538              (oneDeviceData->phyID == PhyID) )
 2539         {
 2540           TI_DBG1(("ossaHwCB: found the onePortContext and oneDeviceData!!\n"));
 2541 
 2542           currentTaskTag = (tiIORequest_t *)oneDeviceData->agDeviceResetContext.osData;
 2543           if (currentTaskTag != agNULL )
 2544           {
 2545             /* applied to only SATA devices */
 2546             if (DEVICE_IS_SATA_DEVICE(oneDeviceData))
 2547             {
 2548                tdIORequestBody_t  *SMTMtdIORequestBody = agNULL;
 2549                SMTMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
 2550                if (SMTMtdIORequestBody != agNULL)
 2551                {
 2552                  /* free the SMTMtdIORequestBody memory allocated in tiINITaskManagement function */
 2553                  ostiFreeMemory(
 2554                        tiRoot,
 2555                        SMTMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 2556                        sizeof(tdIORequestBody_t)
 2557                       );
 2558                }
 2559                else
 2560                {
 2561                  TI_DBG1(("ossaHwCB: SATA device but SMTMtdIORequestBody is NULL!!!\n"));
 2562                }
 2563             }
 2564             /* set device state to DS_OPERATIONAL */
 2565             saSetDeviceState(agRoot,
 2566                             agNULL,
 2567                             tdsaRotateQnumber(tiRoot, oneDeviceData),
 2568                             oneDeviceData->agDevHandle,
 2569                             SA_DS_OPERATIONAL
 2570                             );
 2571             /* notify OS layer to complete the TMF IO */
 2572             ostiInitiatorEvent(tiRoot,
 2573                               agNULL,
 2574                               agNULL,
 2575                               tiIntrEventTypeTaskManagement,
 2576                               tiTMOK,
 2577                               currentTaskTag
 2578                               );
 2579 
 2580           }
 2581           else
 2582           {
 2583             TI_DBG1(("ossaHwCB: currentTaskTag is NULL!!!\n"));
 2584           }
 2585 
 2586           break;
 2587         }
 2588         else
 2589         {
 2590           DeviceListList = DeviceListList->flink;
 2591         }
 2592       }
 2593 #endif
 2594     }
 2595     break;
 2596   }
 2597   case OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT:
 2598   {
 2599     PhyID = TD_GET_PHY_ID(eventParm1);
 2600     PortState = TD_GET_PORT_STATE(eventParm1);
 2601 
 2602     TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT\n"));
 2603     if (tIsSPC12SATA(agRoot))
 2604     {
 2605       TI_DBG1(("ossaHwCB: BROADCAST_ASYNCH_EVENT received for SATA Controller\n"));
 2606       break;
 2607     }
 2608     if (agPortContext == agNULL)
 2609     {
 2610       TI_DBG1(("ossaHwCB: Error!!! agPortContext is NULL %d\n", PhyID));
 2611       smTraceFuncExit(hpDBG_VERY_LOUD, 'y', "Y2");
 2612       return;
 2613     }
 2614     onePortContext = (tdsaPortContext_t *)agPortContext->osData;
 2615     if (onePortContext == agNULL)
 2616     {
 2617       TI_DBG1(("ossaHwCB: Error!!! onePortContext is NULL %d\n", PhyID));
 2618       smTraceFuncExit(hpDBG_VERY_LOUD, 'z', "Y2");
 2619       return;
 2620     }
 2621 
 2622     if (onePortContext->tiPortalContext != agNULL)
 2623     {
 2624 #if 0 
 2625       ostiInitiatorEvent(
 2626                          tiRoot,
 2627                          onePortContext->tiPortalContext,
 2628                          agNULL,
 2629                          tiIntrEventTypeDeviceChange,
 2630                          OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT,
 2631                          agNULL
 2632                          );
 2633 #endif
 2634     }
 2635     else
 2636     {
 2637       TI_DBG1(("ossaHwCB: Error!!! onePortContext->tiPortalContext is NULL\n"));
 2638       smTraceFuncExit(hpDBG_VERY_LOUD, 'A', "Y2");
 2639       return;
 2640     }
 2641 
 2642     break;
 2643    }
 2644 
 2645   case OSSA_HW_EVENT_PORT_RECOVER:
 2646   {
 2647 
 2648     PhyID = TD_GET_PHY_ID(eventParm1);
 2649     if (agPortContext == agNULL)
 2650     {
 2651       TI_DBG1(("ossaHwCB: Error!!! agPortContext is NULL %d\n", PhyID));
 2652       smTraceFuncExit(hpDBG_VERY_LOUD, 'B', "Y2");
 2653       return;
 2654     }
 2655 
 2656     LinkRate = TD_GET_LINK_RATE(eventParm1);
 2657     PortState = TD_GET_PORT_STATE(eventParm1);
 2658     agDevHandle = agNULL;
 2659     IDframe = (agsaSASIdentify_t *)eventParm3;
 2660 
 2661     /*
 2662       1. this is like link up
 2663       2. handle the phyID
 2664       3. no trigger discovery (broadcast change will do this later)
 2665       port state must be valid
 2666     */
 2667 
 2668     TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER, phyID %d\n", PhyID));
 2669 
 2670     if (PortState == OSSA_PORT_INVALID)
 2671     {
 2672       TI_DBG1(("ossaHwCB: Wrong port state\n"));
 2673       smTraceFuncExit(hpDBG_VERY_LOUD, 'C', "Y2");
 2674       return;
 2675     }
 2676     if ( agPortContext->osData == agNULL)
 2677     { /* if */
 2678       /* PortContext must exit at this point */
 2679       TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
 2680     }
 2681     else
 2682     {
 2683       onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
 2684       TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
 2685       onePortContext->PhyIDList[PhyID] = agTRUE;
 2686       onePortContext->valid = agTRUE;
 2687       tdsaAllShared->Ports[PhyID].portContext = onePortContext;
 2688       onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
 2689       onePortContext->PortRecoverPhyID = PhyID;
 2690       if (LinkRate == 0x01)
 2691       {
 2692         onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
 2693       }
 2694       else if (LinkRate == 0x02)
 2695       {
 2696         onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
 2697       }
 2698       else if (LinkRate == 0x04)
 2699       {
 2700         onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
 2701       }
 2702       else /* (LinkRate == 0x08) */
 2703       {
 2704         onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
 2705       }
 2706 
 2707       if (SA_IDFRM_GET_DEVICETTYPE(&onePortContext->sasIDframe) == SAS_END_DEVICE &&
 2708           SA_IDFRM_IS_SSP_TARGET(&onePortContext->sasIDframe) )
 2709       {
 2710         TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER, sending spinup on phyID %d\n", PhyID));
 2711         for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
 2712         {
 2713           saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
 2714         }
 2715       }
 2716 
 2717       /* transient period between link up and link down/port recovery */
 2718       if (onePortContext->Transient == agTRUE && onePortContext->RegisteredDevNums == 0)
 2719       {
 2720         TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER transient period"));
 2721         if (SA_IDFRM_GET_DEVICETTYPE(IDframe) != SAS_NO_DEVICE)
 2722         {
 2723 #ifdef INITIATOR_DRIVER
 2724           agSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
 2725           agSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
 2726           agSASSubID.initiator_ssp_stp_smp = IDframe->initiator_ssp_stp_smp;
 2727           agSASSubID.target_ssp_stp_smp = IDframe->target_ssp_stp_smp;
 2728           tdssAddSASToSharedcontext(
 2729                                     onePortContext,
 2730                                     agRoot,
 2731                                     agDevHandle, /* agNULL */
 2732                                     &agSASSubID,
 2733                                     agTRUE,
 2734                                     (bit8)PhyID,
 2735                                     TD_OPERATION_INITIATOR
 2736                                     );
 2737 #endif
 2738         }
 2739         onePortContext->Transient = agFALSE;
 2740       }
 2741 
 2742 
 2743 
 2744 
 2745     }
 2746     break;
 2747   }
 2748 
 2749   case OSSA_HW_EVENT_BROADCAST_SES:
 2750   {
 2751     PhyID = TD_GET_PHY_ID(eventParm1);
 2752     PortState = TD_GET_PORT_STATE(eventParm1);
 2753 
 2754     TI_DBG2(("ossaHwCB: BROADCAST_SES  from PhyID %d; to be tested\n", PhyID));
 2755     if (tIsSPC12SATA(agRoot))
 2756     {
 2757       TI_DBG1(("ossaHwCB: BROADCAST_SES received for SATA Controller\n"));
 2758       break;
 2759     }
 2760     if (PortState == OSSA_PORT_INVALID)
 2761     {
 2762       TI_DBG1(("ossaHwCB: Wrong port state with  BROADCAST_SES\n"));
 2763       smTraceFuncExit(hpDBG_VERY_LOUD, 'D', "Y2");
 2764       return;
 2765     }
 2766 
 2767     /*
 2768        let os layer read payload
 2769     */
 2770     break;
 2771   }
 2772   case OSSA_HW_EVENT_BROADCAST_EXP:
 2773   {
 2774     PhyID = TD_GET_PHY_ID(eventParm1);
 2775     PortState = TD_GET_PORT_STATE(eventParm1);
 2776 
 2777     TI_DBG2(("ossaHwCB: BROADCAST_EXP from PhyID %d; to be tested\n", PhyID));
 2778     if (tIsSPC12SATA(agRoot))
 2779     {
 2780       TI_DBG1(("ossaHwCB: BROADCAST_EXP received for SATA Controller\n"));
 2781       break;
 2782     }
 2783 
 2784     if (PortState == OSSA_PORT_INVALID)
 2785     {
 2786       TI_DBG1(("ossaHwCB: Wrong port state with  BROADCAST_EXP\n"));
 2787       smTraceFuncExit(hpDBG_VERY_LOUD, 'E', "Y2");
 2788       return;
 2789     }
 2790     /* to-do:
 2791        let os layer read payload
 2792     */
 2793     break;
 2794   }
 2795 
 2796   case OSSA_HW_EVENT_HARD_RESET_RECEIVED:
 2797   {
 2798     PhyID = TD_GET_PHY_ID(eventParm1);
 2799     PortState = TD_GET_PORT_STATE(eventParm1);
 2800 
 2801     TI_DBG2(("ossaHwCB: HARD_RESET_RECEIVED from PhyID %d\n", PhyID));
 2802 
 2803     if (PortState == OSSA_PORT_VALID && tiIS_SPC(agRoot))
 2804     {
 2805       TI_DBG1(("ossaHwCB: calling saPortControl and OSSA_PORT_VALID\n"));
 2806       saPortControl(agRoot, agNULL, 0, agPortContext, AGSA_PORT_HARD_RESET, 0,0);
 2807     }
 2808     else if (PortState == OSSA_PORT_3RDPARTY_RESET && (tIsSPCV12or6G(agRoot))  )
 2809     {
 2810       TI_DBG1(("ossaHwCB: calling saPortControl and OSSA_PORT_3RDPARTY_RESET\n"));
 2811       saPortControl(agRoot, agNULL, 0, agPortContext, AGSA_PORT_HARD_RESET, 0,0);
 2812     }
 2813     else /* PortState == OSSA_PORT_INVALID */
 2814     {
 2815       TI_DBG1(("ossaHwCB: Error. Port state is invalid\n"));
 2816 #ifdef REMOVED
 2817       TI_DBG1(("ossaHwCB: calling saLocalPhyControl on phyID %d\n", PhyID));
 2818       saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_LINK_RESET, agNULL);
 2819 #endif
 2820     }
 2821 
 2822     break;
 2823   }
 2824 
 2825   case OSSA_HW_EVENT_MALFUNCTION:
 2826   {
 2827 #ifdef TD_DEBUG_ENABLE
 2828     agsaFatalErrorInfo_t  *FatalError = (agsaFatalErrorInfo_t *)eventParm2;
 2829 #endif
 2830     TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MALFUNCTION \n"));
 2831     TI_DBG1(("ossaHwCB: errorInfo0 %8X errorInfo1 %8X\n", FatalError->errorInfo0, FatalError->errorInfo1));
 2832     TI_DBG1(("ossaHwCB: errorInfo2 %8X errorInfo3 %8X\n", FatalError->errorInfo2, FatalError->errorInfo3));
 2833     TI_DBG1(("ossaHwCB: regDumpBusBaseNum0 %8X regDumpOffset0 %8X regDumpLen0 %8X\n", FatalError->regDumpBusBaseNum0, FatalError->regDumpOffset0, FatalError->regDumpLen0));
 2834     TI_DBG1(("ossaHwCB: regDumpBusBaseNum1 %8X regDumpOffset1 %8X regDumpLen1 %8X\n", FatalError->regDumpBusBaseNum1, FatalError->regDumpOffset1, FatalError->regDumpLen1));
 2835 
 2836 
 2837     if (eventParm1 == agTRUE)
 2838     {
 2839       TI_DBG1(("ossaHwCB: fatal error\n"));
 2840       /* port panic */
 2841       ostiPortEvent (
 2842                      tiRoot,
 2843                      tiPortPanic,
 2844                      0,
 2845                      agNULL
 2846                      );
 2847     }
 2848     else
 2849     {
 2850       TI_DBG1(("ossaHwCB: non-fatal error \n"));
 2851     }
 2852     break;
 2853   }
 2854 
 2855   case OSSA_HW_EVENT_ID_FRAME_TIMEOUT:
 2856   {
 2857     PhyID = TD_GET_PHY_ID(eventParm1);
 2858     PortState = TD_GET_PORT_STATE(eventParm1);
 2859 
 2860     TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_ID_FRAME_TIMEOUT from PhyID %d\n", PhyID));
 2861 
 2862     if (PortState == OSSA_PORT_INVALID)
 2863     {
 2864       TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_ID_FRAME_TIMEOUT\n"));
 2865       smTraceFuncExit(hpDBG_VERY_LOUD, 'F', "Y2");
 2866       return;
 2867     }
 2868     break;
 2869   }
 2870 
 2871   case OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD:
 2872   {
 2873     PhyID = TD_GET_PHY_ID(eventParm1);
 2874     PortState = TD_GET_PORT_STATE(eventParm1);
 2875     agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
 2876     TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD\n"));
 2877 
 2878     if (PortState == OSSA_PORT_INVALID)
 2879     {
 2880       TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD\n"));
 2881       smTraceFuncExit(hpDBG_VERY_LOUD, 'G', "Y2");
 2882       return;
 2883     }
 2884 
 2885     if (agPhyErrCountersPage != agNULL)
 2886     {
 2887       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD from PhyID %d\n", PhyID));
 2888       TI_DBG1(("ossaHwCB: invalidDword %d\n", agPhyErrCountersPage->invalidDword));
 2889     }
 2890     else
 2891     {
 2892       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD: Error!!!  eventParm2 is NULL\n"));
 2893     }
 2894 
 2895     /* saHwEventAck() */
 2896     eventSource.agPortContext = agPortContext;
 2897     eventSource.event = OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD;
 2898     /* phy ID */
 2899     eventSource.param = PhyID;
 2900     HwAckSatus = saHwEventAck(
 2901                               agRoot,
 2902                               agNULL, /* agContext */
 2903                               0,
 2904                               &eventSource, /* agsaEventSource_t */
 2905                               0,
 2906                               0
 2907                               );
 2908     if ( HwAckSatus != AGSA_RC_SUCCESS)
 2909     {
 2910       TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
 2911       smTraceFuncExit(hpDBG_VERY_LOUD, 'H', "Y2");
 2912       return;
 2913     }
 2914 
 2915     break;
 2916   }
 2917 
 2918   case OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR:
 2919   {
 2920     PhyID = TD_GET_PHY_ID(eventParm1);
 2921     PortState = TD_GET_PORT_STATE(eventParm1);
 2922     agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
 2923     TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR\n"));
 2924 
 2925     if (PortState == OSSA_PORT_INVALID)
 2926     {
 2927       TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR\n"));
 2928       smTraceFuncExit(hpDBG_VERY_LOUD, 'I', "Y2");
 2929       return;
 2930     }
 2931 
 2932     if (agPhyErrCountersPage != agNULL)
 2933     {
 2934       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR from PhyID %d\n", PhyID));
 2935       TI_DBG1(("ossaHwCB: runningDisparityError %d\n", agPhyErrCountersPage->runningDisparityError));
 2936     }
 2937     else
 2938     {
 2939       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR: Error!!!  eventParm2 is NULL\n"));
 2940     }
 2941 
 2942     /* saHwEventAck() */
 2943     eventSource.agPortContext = agPortContext;
 2944     eventSource.event = OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR;
 2945     /* phy ID */
 2946     eventSource.param = PhyID;
 2947     HwAckSatus = saHwEventAck(
 2948                               agRoot,
 2949                               agNULL, /* agContext */
 2950                               0,
 2951                               &eventSource, /* agsaEventSource_t */
 2952                               0,
 2953                               0
 2954                               );
 2955     if ( HwAckSatus != AGSA_RC_SUCCESS)
 2956     {
 2957       TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
 2958       smTraceFuncExit(hpDBG_VERY_LOUD, 'J', "Y2");
 2959       return;
 2960     }
 2961 
 2962     break;
 2963   }
 2964 
 2965   case OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION:
 2966   {
 2967     PhyID = TD_GET_PHY_ID(eventParm1);
 2968     PortState = TD_GET_PORT_STATE(eventParm1);
 2969     agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
 2970     TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION\n"));
 2971 
 2972     if (PortState == OSSA_PORT_INVALID)
 2973     {
 2974       TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION\n"));
 2975       smTraceFuncExit(hpDBG_VERY_LOUD, 'K', "Y2");
 2976       return;
 2977     }
 2978 
 2979     if (agPhyErrCountersPage != agNULL)
 2980     {
 2981       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION from PhyID %d\n", PhyID));
 2982       TI_DBG1(("ossaHwCB: codeViolation %d\n", agPhyErrCountersPage->codeViolation));
 2983     }
 2984     else
 2985     {
 2986       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION: Error!!!  eventParm2 is NULL\n"));
 2987     }
 2988 
 2989     /* saHwEventAck() */
 2990     eventSource.agPortContext = agPortContext;
 2991     eventSource.event = OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION;
 2992     /* phy ID */
 2993     eventSource.param = PhyID;
 2994     HwAckSatus = saHwEventAck(
 2995                               agRoot,
 2996                               agNULL, /* agContext */
 2997                               0,
 2998                               &eventSource, /* agsaEventSource_t */
 2999                               0,
 3000                               0
 3001                               );
 3002     if ( HwAckSatus != AGSA_RC_SUCCESS)
 3003     {
 3004       TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
 3005       smTraceFuncExit(hpDBG_VERY_LOUD, 'L', "Y2");
 3006       return;
 3007     }
 3008 
 3009     break;
 3010   }
 3011 
 3012 #ifdef REMOVED
 3013   case OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1:
 3014   {
 3015     PhyID = eventParm1 & 0xFF;
 3016     agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
 3017 
 3018     if (agPhyErrCountersPage != agNULL)
 3019     {
 3020       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1 from PhyID %d\n", PhyID));
 3021       TI_DBG1(("ossaHwCB: invalidDword %d\n", agPhyErrCountersPage->invalidDword));
 3022       TI_DBG1(("ossaHwCB: runningDisparityError %d\n", agPhyErrCountersPage->runningDisparityError));
 3023       TI_DBG1(("ossaHwCB: codeViolation %d\n", agPhyErrCountersPage->codeViolation));
 3024       TI_DBG1(("ossaHwCB: lostOfDwordSynch %d\n", agPhyErrCountersPage->lossOfDwordSynch));
 3025       TI_DBG1(("ossaHwCB: phyResetProblem %d\n", agPhyErrCountersPage->phyResetProblem));
 3026       TI_DBG1(("ossaHwCB: inboundCRCError %d\n", agPhyErrCountersPage->inboundCRCError));
 3027     }
 3028     else
 3029     {
 3030       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1: Error!!!  eventParm2 is NULL\n"));
 3031     }
 3032     break;
 3033   }
 3034 #endif /* REMOVED */
 3035 
 3036   case OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH:
 3037   {
 3038     PhyID = TD_GET_PHY_ID(eventParm1);
 3039     PortState = TD_GET_PORT_STATE(eventParm1);
 3040     agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
 3041     TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH\n"));
 3042 
 3043     if (PortState == OSSA_PORT_INVALID)
 3044     {
 3045       TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH\n"));
 3046       smTraceFuncExit(hpDBG_VERY_LOUD, 'M', "Y2");
 3047       return;
 3048     }
 3049 
 3050     if (agPhyErrCountersPage != agNULL)
 3051     {
 3052       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH from PhyID %d\n", PhyID));
 3053       TI_DBG1(("ossaHwCB: lostOfDwordSynch %d\n", agPhyErrCountersPage->lossOfDwordSynch));
 3054     }
 3055     else
 3056     {
 3057       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH: Error!!!  eventParm2 is NULL\n"));
 3058     }
 3059 
 3060     /* saHwEventAck() */
 3061     eventSource.agPortContext = agPortContext;
 3062     eventSource.event = OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH;
 3063     /* phy ID */
 3064     eventSource.param = PhyID;
 3065     HwAckSatus = saHwEventAck(
 3066                               agRoot,
 3067                               agNULL, /* agContext */
 3068                               0,
 3069                               &eventSource, /* agsaEventSource_t */
 3070                               0,
 3071                               0
 3072                               );
 3073     if ( HwAckSatus != AGSA_RC_SUCCESS)
 3074     {
 3075       TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
 3076       smTraceFuncExit(hpDBG_VERY_LOUD, 'N', "Y2");
 3077       return;
 3078     }
 3079 
 3080     break;
 3081   }
 3082 
 3083   case OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED:
 3084   {
 3085     PhyID = TD_GET_PHY_ID(eventParm1);
 3086     PortState = TD_GET_PORT_STATE(eventParm1);
 3087     agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
 3088 
 3089     TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED\n"));
 3090 
 3091     if (PortState == OSSA_PORT_INVALID)
 3092     {
 3093       TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED\n"));
 3094       smTraceFuncExit(hpDBG_VERY_LOUD, 'O', "Y2");
 3095       return;
 3096     }
 3097 
 3098     if (agPhyErrCountersPage != agNULL)
 3099     {
 3100       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED from PhyID %d\n", PhyID));
 3101       TI_DBG1(("ossaHwCB: phyResetProblem %d\n", agPhyErrCountersPage->phyResetProblem));
 3102     }
 3103     else
 3104     {
 3105       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED: Error!!!  eventParm2 is NULL\n"));
 3106     }
 3107 
 3108     /* saHwEventAck() */
 3109     eventSource.agPortContext = agPortContext;
 3110     eventSource.event = OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED;
 3111     /* phy ID */
 3112     eventSource.param = PhyID;
 3113     HwAckSatus = saHwEventAck(
 3114                               agRoot,
 3115                               agNULL, /* agContext */
 3116                               0,
 3117                               &eventSource, /* agsaEventSource_t */
 3118                               0,
 3119                               0
 3120                               );
 3121     if ( HwAckSatus != AGSA_RC_SUCCESS)
 3122     {
 3123       TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
 3124       smTraceFuncExit(hpDBG_VERY_LOUD, 'P', "Y2");
 3125       return;
 3126     }
 3127 
 3128     break;
 3129   }
 3130 
 3131 // #ifdef INITIATOR_DRIVER
 3132   case OSSA_HW_EVENT_ENCRYPTION:
 3133   {
 3134     pEncryptCBData = (agsaHWEventEncrypt_t *) eventParm2;
 3135     TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_ENCRYPTION: encryptOperation 0x%x\n",pEncryptCBData->encryptOperation));
 3136     TI_DBG1(("ossaHwCB: event 0x%x eventParm1 0x%x eventParm2 %p eventParm3 %p\n",event,eventParm1,eventParm2,eventParm3));
 3137 
 3138     /*
 3139      * All events and status need to be translated from
 3140      * SAS specific values to TISA specific values. This
 3141      * is effectively a NOP, but the OS layer won't want to
 3142      * look for SAS values.
 3143      */
 3144     if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE)
 3145     {
 3146       TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE\n"));
 3147       encryptEventData.encryptEvent = tiEncryptKekStore;
 3148     }
 3149     else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE)
 3150     {
 3151       TI_DBG1(("ossaHwCB:OSSA_HW_ENCRYPT_KEK_UPDATE \n"));
 3152       encryptEventData.encryptEvent = tiEncryptKekAdd;
 3153     }
 3154     else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_INVALIDTE)
 3155     {
 3156       TI_DBG1(("ossaHwCB:OSSA_HW_ENCRYPT_KEK_INVALIDTE \n"));
 3157       /* none */
 3158     }
 3159     else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_DEK_UPDATE)
 3160     {
 3161       TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_DEK_UPDATE\n"));
 3162       encryptEventData.encryptEvent = tiEncryptDekAdd;
 3163     }
 3164     else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_DEK_INVALIDTE)
 3165     {
 3166       TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_DEK_INVALIDTE\n"));
 3167       encryptEventData.encryptEvent = tiEncryptDekInvalidate;
 3168     }
 3169     else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT)
 3170     {
 3171       TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT\n"));
 3172       encryptEventData.encryptEvent = tiEncryptOperatorManagement;
 3173     }
 3174     else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_TEST_EXECUTE)
 3175     {
 3176       TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_TEST_EXECUTE\n"));
 3177       encryptEventData.encryptEvent = tiEncryptSelfTest;
 3178       encryptEventData.subEvent = pEncryptCBData->eq;
 3179     }
 3180     else
 3181     {
 3182       TI_DBG1(("ossaHwCB: unknown encryptOperation 0x%x\n",pEncryptCBData->encryptOperation));
 3183     }
 3184 
 3185     if (pEncryptCBData->status != OSSA_SUCCESS)
 3186     {
 3187       encryptStatus = tiError;
 3188 
 3189       /* prints out status and error qualifier */
 3190       TI_DBG1(("ossaHwCB: encrypt response status 0x%x error qualifier 0x%x\n", pEncryptCBData->status, pEncryptCBData->eq));
 3191     }
 3192     else
 3193     {
 3194       encryptStatus = tiSuccess;
 3195     }
 3196 
 3197     if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE ||
 3198         pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE )
 3199     {
 3200       /* returning new KEK index */
 3201       encryptEventData.pData = pEncryptCBData->handle;
 3202     }
 3203     else
 3204     {
 3205       /* returning current KEK index or DEK index */
 3206       encryptEventData.pData = pEncryptCBData->param;
 3207     }
 3208 
 3209     ostiPortEvent(tiRoot,
 3210                   tiEncryptOperation,
 3211                   encryptStatus,
 3212                   &encryptEventData);
 3213     break;
 3214   }
 3215   case OSSA_HW_EVENT_SECURITY_MODE:
 3216   {
 3217     securitySetModeStatus = eventParm1;
 3218     pEncryptInfo = (agsaEncryptInfo_t *) eventParm2;
 3219 
 3220     TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_SECURITY_MODE\n"));
 3221     if (securitySetModeStatus == OSSA_SUCCESS)
 3222     {
 3223       securityModeStatus = tiSuccess;
 3224     }
 3225     else
 3226     {
 3227       securityModeStatus = tiError;
 3228     }
 3229 
 3230     encryptEventData.encryptEvent = tiEncryptSetMode;
 3231     /* process status to fill in subevent */
 3232     /* See PM 4.26.12.6 */
 3233     TI_DBG1(("ossaHwCB: pEncryptInfo->status 0x%x\n", pEncryptInfo->status));
 3234     if ( pEncryptInfo->status == OSSA_SUCCESS)
 3235     {
 3236       encryptEventData.subEvent = tiNVRAMSuccess;
 3237     }
 3238     else if (pEncryptInfo->status == 0x24)
 3239     {
 3240       encryptEventData.subEvent = tiNVRAMNotFound;
 3241     }
 3242     else if (pEncryptInfo->status == 0x05 || pEncryptInfo->status == 0x20 || pEncryptInfo->status == 0x21)
 3243     {
 3244       encryptEventData.subEvent = tiNVRAMAccessTimeout;
 3245     }
 3246     else
 3247     {
 3248       encryptEventData.subEvent = tiNVRAMWriteFail;
 3249     }
 3250 
 3251     encryptEventData.pData = agNULL;
 3252     ostiPortEvent(tiRoot,
 3253                   tiEncryptOperation,
 3254                   securityModeStatus,
 3255                   &encryptEventData);
 3256 
 3257     break;
 3258   }
 3259   case OSSA_HW_EVENT_MODE:
 3260   {
 3261     pModeEvent = (agsaHWEventMode_t *) eventParm2;
 3262     pModePage = (bit32 *) pModeEvent->modePage;
 3263 
 3264     TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MODE modePageOperation 0x%x status 0x%x modePageLen 0x%x\n",
 3265               pModeEvent->modePageOperation, pModeEvent->status, pModeEvent->modePageLen));
 3266 
 3267     if (pModeEvent->modePageOperation == agsaModePageSet)
 3268     {
 3269       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MODE page code 0x%x error qualifier 0x%x\n", (eventParm1 & 0xFF), (eventParm1 >> 16)));
 3270       ostiPortEvent(tiRoot,
 3271                     tiModePageOperation,
 3272                     pModeEvent->status,
 3273                     eventParm2);
 3274     }
 3275     else if (pModeEvent->modePageOperation == agsaModePageGet)
 3276     {
 3277       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MODE error qualifier 0x%x\n", eventParm1));
 3278       switch ((*pModePage) & 0xFF)
 3279       {
 3280       case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
 3281         TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
 3282         TI_DBG1(("ossaHwCB:modePageOperation 0x%x status 0x%x modePageLen 0x%x modePage %p context %p\n",
 3283                       pModeEvent->modePageOperation,
 3284                       pModeEvent->status,
 3285                       pModeEvent->modePageLen,
 3286                       pModeEvent->modePage,
 3287                       pModeEvent->context));
 3288         ostiPortEvent(tiRoot,
 3289                       tiModePageOperation,
 3290                       pModeEvent->status,
 3291                       eventParm2);
 3292         break;
 3293       case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
 3294         TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_DEK_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
 3295         ostiPortEvent(tiRoot,
 3296                       tiModePageOperation,
 3297                       pModeEvent->status,
 3298                       eventParm2);
 3299         break;
 3300       case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
 3301         TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_HMAC_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
 3302         ostiPortEvent(tiRoot,
 3303                       tiModePageOperation,
 3304                       pModeEvent->status,
 3305                       eventParm2);
 3306         break;
 3307       case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
 3308         TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_CONTROL_PARM_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
 3309         /*
 3310          * This page is directly related to tiCOMEncryptGetInfo() and
 3311          * will be translated into a tiEncrytOperation for the OS layer.
 3312          */
 3313 
 3314         /* Fill out tiEncryptInfo_t */
 3315         securityMode = *pModePage & 0x0F00 >> 8;
 3316         cipherMode = *pModePage & 0xF000 >> 12;
 3317 
 3318         if (securityMode == agsaEncryptSMA)
 3319         {
 3320           encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_A;
 3321         }
 3322         else if (securityMode == agsaEncryptSMB)
 3323         {
 3324           encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_B;
 3325         }
 3326         else
 3327         {
 3328           encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_FACT_INIT;
 3329         }
 3330 
 3331         if (cipherMode == agsaEncryptCipherModeECB)
 3332         {
 3333           encryptInfo.securityCipherMode |= TI_ENCRYPT_ATTRIB_CIPHER_ECB;
 3334         }
 3335 
 3336         if (cipherMode == agsaEncryptCipherModeXTS)
 3337         {
 3338           encryptInfo.securityCipherMode |= TI_ENCRYPT_ATTRIB_CIPHER_XTS;
 3339         }
 3340 
 3341         /* How will subEvents be tracked? */
 3342         encryptInfo.status = 0;
 3343 
 3344         encryptInfo.sectorSize[0] = 512;  /* DIF is allowed on 512 BPS SATA drives */
 3345         encryptInfo.sectorSize[1] = 520;
 3346         encryptInfo.sectorSize[2] = 528;
 3347         encryptInfo.sectorSize[3] = 4104;
 3348         encryptInfo.sectorSize[4] = 4168;
 3349         encryptInfo.sectorSize[5] = 4232;
 3350 
 3351         encryptEventData.encryptEvent = tiEncryptGetInfo;
 3352         encryptEventData.subEvent = 0;
 3353         encryptEventData.pData = &encryptInfo;
 3354 
 3355         ostiPortEvent(tiRoot,
 3356                     tiEncryptOperation,
 3357                     pModeEvent->status,
 3358                     &encryptEventData);
 3359         break;
 3360       case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
 3361         TI_DBG1(("ossaHwCB: AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
 3362 
 3363 #ifdef IOCTL_INTERRUPT_TIME_CONFIG
 3364          ostiPortEvent(tiRoot,
 3365                     tiModePageOperation,
 3366                     pModeEvent->status,
 3367                     eventParm2
 3368                  );
 3369 #endif /* IOCTL_INTERRUPT_TIME_CONFIG */
 3370 
 3371         /*ostiPortEvent(tiRoot,
 3372                     tiModePageOperation,
 3373                     pModeEvent->status,
 3374                     &encryptEventData);*/
 3375         break;
 3376       case AGSA_INTERRUPT_CONFIGURATION_PAGE:
 3377         TI_DBG1(("ossaHwCB: AGSA_INTERRUPT_CONFIGURATION_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
 3378 
 3379 #ifdef IOCTL_INTERRUPT_TIME_CONFIG
 3380         ostiPortEvent(tiRoot,
 3381                     tiModePageOperation,
 3382                     pModeEvent->status,
 3383                     eventParm2
 3384                     );
 3385 #endif /* IOCTL_INTERRUPT_TIME_CONFIG */
 3386 
 3387         break;
 3388       default:
 3389         TI_DBG1(("ossaHwCB: Unknown Mode Event %x\n", *pModePage));
 3390          break;
 3391       }
 3392 
 3393     }
 3394     else
 3395     {
 3396       TI_DBG1(("ossaHwCB: Unknown modePageOperation %x\n", pModeEvent->modePageOperation));
 3397     }
 3398     break;
 3399   }
 3400 
 3401 // #endif  /* INITIATOR_DRIVER */
 3402 
 3403 #ifdef REMOVED
 3404   case OSSA_HW_EVENT_PHY_UNRECOVERABLE_ERROR:
 3405   {
 3406     PhyID = TD_GET_PHY_ID(eventParm1);
 3407     PortState = TD_GET_PORT_STATE(eventParm1);
 3408 
 3409     TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_UNRECOVERABLE_ERROR\n"));
 3410 
 3411     if (PortState == OSSA_PORT_INVALID)
 3412     {
 3413       TI_DBG1(("ossaHwCB: INVALID port state\n"));
 3414     }
 3415     else
 3416     {
 3417       TI_DBG1(("ossaHwCB: VALID port state\n"));
 3418     }
 3419     break;
 3420   }
 3421 #endif /* REMOVED */
 3422     case OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED:
 3423     {
 3424       TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED\n"));
 3425       break;
 3426     }
 3427 
 3428     default:
 3429     {
 3430       TI_DBG1(("ossaHwCB: default error (0x%X)!!!!!\n",event));
 3431       break;
 3432     }
 3433   }
 3434 
 3435   smTraceFuncExit(hpDBG_VERY_LOUD, 'R', "Y2");
 3436   return;
 3437 }
 3438 
 3439 osGLOBAL void ossaPortControlCB(
 3440                   agsaRoot_t          *agRoot,
 3441                   agsaContext_t       *agContext,
 3442                   agsaPortContext_t   *agPortContext,
 3443                   bit32               portOperation,
 3444                   bit32               status)
 3445 {
 3446   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 3447   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 3448   tdsaPortContext_t   *onePortContext = agNULL;
 3449 
 3450   TI_DBG6(("ossaPortControlCB: start\n"));
 3451 
 3452   smTraceFuncEnter(hpDBG_VERY_LOUD,"Y3");
 3453   if (portOperation == AGSA_PORT_SET_SMP_PHY_WIDTH)
 3454   {
 3455     TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_SMP_PHY_WIDTH\n"));
 3456   }
 3457   else if (portOperation == AGSA_PORT_SET_PORT_RECOVERY_TIME)
 3458   {
 3459     TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_PORT_RECOVERY_TIME\n"));
 3460   }
 3461   else if (portOperation == AGSA_PORT_IO_ABORT)
 3462   {
 3463     TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_IO_ABORT\n"));
 3464     /* code is here because disocvery failed
 3465        deregister all targets. Then, later call discovery if broacast is seen in ossaDeregisterDeviceHandleCB.
 3466     */
 3467     onePortContext = (tdsaPortContext_t *)agPortContext->osData;
 3468     if (onePortContext == agNULL)
 3469     {
 3470       TI_DBG1(("ossaPortControlCB: onePortContext is NULL\n"));
 3471       return;
 3472     }
 3473     /* qqqqq deregister all devices */
 3474    tdsaDeregisterDevicesInPort(tiRoot, onePortContext);
 3475 
 3476   }
 3477   else if (portOperation == AGSA_PORT_SET_PORT_RESET_TIME)
 3478   {
 3479     TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_PORT_RESET_TIME\n"));
 3480   }
 3481   else if (portOperation == AGSA_PORT_HARD_RESET)
 3482   {
 3483     TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_HARD_RESET\n"));
 3484   }
 3485   else if (portOperation == AGSA_PORT_CLEAN_UP)
 3486   {
 3487     TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_CLEAN_UP\n"));
 3488   }
 3489   else if (portOperation == AGSA_STOP_PORT_RECOVERY_TIMER)
 3490   {
 3491     TI_DBG1(("ossaPortControlCB: portOperation AGSA_STOP_PORT_RECOVERY_TIMER\n"));
 3492   }
 3493   else
 3494   {
 3495     TI_DBG1(("ossaPortControlCB: undefined portOperation %d\n", portOperation));
 3496   }
 3497 
 3498   TI_DBG1(("ossaPortControlCB: status %d\n", status));
 3499 
 3500   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y3");
 3501   return;
 3502 }
 3503 
 3504 /*****************************************************************************
 3505 *! \brief  ossaHwRegRead
 3506 *
 3507 *  Purpose: This routine is called to read a 32-bit value from the PCI
 3508 *           registers of the controller
 3509 *
 3510 *  \param  agRoot:       Pointer to chip/driver Instance.
 3511 *  \param  regOffset:    Byte offset to chip register from which to read a 32-bit
 3512 *                        value.
 3513 *
 3514 *  \return:             32-bit value.
 3515 *
 3516 *  \note - The scope is shared target and initiator.
 3517 *
 3518 *****************************************************************************/
 3519 FORCEINLINE
 3520 bit32
 3521 ossaHwRegRead(agsaRoot_t *agRoot,
 3522               bit32      regOffset
 3523               )
 3524 {
 3525   tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
 3526   bit32 return_value;
 3527 
 3528 
 3529   return_value =  ostiChipReadBit32 (
 3530                              osData->tiRoot,
 3531                              regOffset
 3532                              );
 3533   if( agNULL != agRoot->sdkData )
 3534   {
 3535     smTrace(hpDBG_REGISTERS,"RR",regOffset);
 3536     /* TP:RR regOffset */
 3537     smTrace(hpDBG_REGISTERS,"RV",return_value);
 3538     /* TP:RV value read */
 3539   }
 3540 
 3541   return(return_value);
 3542 
 3543 }
 3544 
 3545 /*****************************************************************************
 3546 *! \brief  ossaHwRegWrite
 3547 *
 3548 *  Purpose: This routine is called to write a 32-bit value to the PCI
 3549 *           registers of the controller.
 3550 *
 3551 *  \param   agRoot:     Pointer to chip/driver Instance.
 3552 *  \param   regOffset:  Byte offset to chip register to which chipIOValue is
 3553 *                       written.
 3554 *  \param   regValue:   32-bit value to write at chipIOOffset in host byte order.
 3555 *
 3556 *  \return:             None.
 3557 *
 3558 *  \note - The scope is shared target and initiator.
 3559 *
 3560 *****************************************************************************/
 3561 FORCEINLINE
 3562 void
 3563 ossaHwRegWrite(agsaRoot_t *agRoot,
 3564                bit32      regOffset,
 3565                bit32      regValue
 3566                )
 3567 {
 3568 
 3569   tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
 3570   if( agNULL != agRoot->sdkData )
 3571   {
 3572     smTrace(hpDBG_REGISTERS,"RW",regOffset);
 3573     /* TP:RW regOffset */
 3574     smTrace(hpDBG_REGISTERS,"VW",regValue);
 3575     /* TP:VW value written */
 3576   }
 3577 
 3578   ostiChipWriteBit32 (
 3579                       osData->tiRoot,
 3580                       regOffset,
 3581                       regValue
 3582                       );
 3583   return;
 3584 }
 3585 
 3586 /*****************************************************************************
 3587 *! \brief  ossaHwRegReadExt
 3588 *
 3589 *  Purpose: This routine is called to read a 32-bit value from a bus-specific
 3590 *           mapped registers of the controller
 3591 *
 3592 *  \param  agRoot:       Pointer to chip/driver Instance.
 3593 *  \param  regOffset:    Byte offset to chip register from which to read a 32-bit
 3594 *                        value.
 3595 *
 3596 *  \return:             32-bit value.
 3597 *
 3598 *  \note - The scope is shared target and initiator.
 3599 *
 3600 *****************************************************************************/
 3601 FORCEINLINE
 3602 bit32
 3603 ossaHwRegReadExt(
 3604                  agsaRoot_t  *agRoot,
 3605                  bit32       busBaseNumber,
 3606                  bit32       regOffset
 3607                  )
 3608 {
 3609   tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
 3610 
 3611   bit32 return_value;
 3612 
 3613   return_value = ostiChipReadBit32Ext(
 3614                                osData->tiRoot,
 3615                                busBaseNumber,
 3616                                regOffset
 3617                                );
 3618 
 3619   /* TI_DBG4(("#_R: 0x%x:0x%x=0x%x\n",busBaseNumber,regOffset,return_value)); */
 3620 
 3621   if( agNULL != agRoot->sdkData )
 3622   {
 3623     smTrace(hpDBG_REGISTERS,"EB",busBaseNumber);
 3624     /* TP:EB EX read busBaseNumber */
 3625     smTrace(hpDBG_REGISTERS,"EO",regOffset);
 3626     /* TP:EO regOffset */
 3627     smTrace(hpDBG_REGISTERS,"ER",return_value);
 3628     /* TP:ER value read */
 3629   }
 3630   return(return_value);
 3631 }
 3632 
 3633 void ossaPCI_TRIGGER(agsaRoot_t  *agRoot )
 3634 {
 3635   tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
 3636   ostiPCI_TRIGGER(osData->tiRoot);
 3637 
 3638 }
 3639 
 3640 
 3641 
 3642 /*****************************************************************************
 3643 *! \brief  ossaHwRegWriteExt
 3644 *
 3645 *  Purpose: This routine is called to write a 32-bit value to a bus specific
 3646 *           mapped registers of the controller.
 3647 *
 3648 *  \param   agRoot:     Pointer to chip/driver Instance.
 3649 *  \param   regOffset:  Byte offset to chip register to which chipIOValue is
 3650 *                       written.
 3651 *  \param   regValue:   32-bit value to write at chipIOOffset in host byte order.
 3652 *
 3653 *  \return:             None.
 3654 *
 3655 *  \note - The scope is shared target and initiator.
 3656 *
 3657 *****************************************************************************/
 3658 FORCEINLINE
 3659 void
 3660 ossaHwRegWriteExt(
 3661                   agsaRoot_t  *agRoot,
 3662                   bit32       busBaseNumber,
 3663                   bit32       regOffset,
 3664                   bit32       regValue
 3665                   )
 3666 {
 3667   tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
 3668   ostiChipWriteBit32Ext(
 3669                         osData->tiRoot,
 3670                         busBaseNumber,
 3671                         regOffset,
 3672                         regValue
 3673                         );
 3674 
 3675   /*  TI_DBG4(("#_W: 0x%x:0x%x=0x%x\n",busBaseNumber,regOffset,regValue)); */
 3676 
 3677   if( agNULL != agRoot->sdkData )
 3678   {
 3679     smTrace(hpDBG_REGISTERS,"Eb",busBaseNumber);
 3680     /* TP:Eb Ex Write busBaseNumber */
 3681     smTrace(hpDBG_REGISTERS,"Eo",regOffset);
 3682     /* TP:Eo regOffset */
 3683     smTrace(hpDBG_REGISTERS,"Ew",regValue);
 3684     /* TP:Ew value written  regValue*/
 3685   }
 3686   return;
 3687 }
 3688 
 3689 
 3690 osGLOBAL bit32 ossaHwRegReadConfig32(
 3691               agsaRoot_t  *agRoot,
 3692               bit32       regOffset
 3693               )
 3694 {
 3695   tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
 3696   bit32 to_ret;
 3697   to_ret= ostiChipConfigReadBit32( osData->tiRoot, regOffset);
 3698   TI_DBG4(("ossaHwRegReadConfig32: regOffset 0x%x returns 0x%x\n",regOffset,to_ret));
 3699   return(to_ret);
 3700 }
 3701 
 3702 
 3703 
 3704 
 3705 #ifdef TD_INT_COALESCE
 3706 void
 3707 ossaIntCoalesceInitCB(
 3708                       agsaRoot_t                *agRoot,
 3709                       agsaIntCoalesceContext_t    *agIntCoContext,
 3710                       bit32                   status
 3711                       )
 3712 {
 3713   tdsaRootOsData_t          *osData = (tdsaRootOsData_t *)agRoot->osData;
 3714   tiRoot_t                  *tiRoot = (tiRoot_t *)osData->tiRoot;
 3715   tdsaContext_t             *tdsaAllShared = (tdsaContext_t *)osData->tdsaAllShared;
 3716   tiIntCoalesceContext_t    *tiIntCoalesceCxt;
 3717   tdsaIntCoalesceContext_t  *tdsaIntCoalCxt;
 3718   tdsaIntCoalesceContext_t  *tdsaIntCoalCxtHead
 3719     = (tdsaIntCoalesceContext_t *)tdsaAllShared->IntCoalesce;
 3720   bit32                     tiStatus;
 3721 
 3722   TI_DBG2(("ossaIntCoalesceInitCB: start\n"));
 3723 
 3724   tdsaIntCoalCxt = (tdsaIntCoalesceContext_t *)agIntCoContext->osData;
 3725   tiIntCoalesceCxt = tdsaIntCoalCxt->tiIntCoalesceCxt;
 3726   switch (status)
 3727   {
 3728   case AGSA_RC_SUCCESS:
 3729     tiStatus = tiSuccess;
 3730     break;
 3731   case AGSA_RC_BUSY:
 3732     tiStatus = tiBusy;
 3733     break;
 3734   case AGSA_RC_FAILURE:
 3735     tiStatus = tiError;
 3736     break;
 3737   default:
 3738     TI_DBG1(("ossaIntCoalesceInitCB: unknown status %d\n", status));
 3739     tiStatus = tiError;
 3740     break;
 3741   }
 3742 
 3743   TI_DBG2(("ossaIntCoalesceInitCB: status %d\n", tiStatus));
 3744 
 3745   /* enqueue tdsaIntCoalCxt to freelink */
 3746   tdsaIntCoalCxt->tiIntCoalesceCxt = agNULL;
 3747   TI_DBG2(("ossaIntCoalesceInitCB: id %d\n", tdsaIntCoalCxt->id));
 3748 
 3749   tdsaSingleThreadedEnter(tiRoot, TD_INTCOAL_LOCK);
 3750   TDLIST_DEQUEUE_THIS(&(tdsaIntCoalCxt->MainLink));
 3751   TDLIST_ENQUEUE_AT_TAIL(&(tdsaIntCoalCxt->FreeLink), &(tdsaIntCoalCxtHead->FreeLink));
 3752   tdsaSingleThreadedLeave(tiRoot, TD_INTCOAL_LOCK);
 3753 
 3754 #ifdef OS_INT_COALESCE
 3755   ostiInitiatorIntCoalesceInitCB(tiRoot,
 3756                                  tiIntCoalesceCxt,
 3757                                  tiStatus);
 3758 #endif
 3759 
 3760   TI_DBG2(("ossaIntCoalesceInitCB: return end\n"));
 3761 
 3762   return;
 3763 }
 3764 #endif /* TD_INT_COALESCE */
 3765 
 3766 /*****************************************************************************/
 3767 /*! \brief ossaSingleThreadedEnter
 3768  *
 3769  *
 3770  * Purpose: This routine is called to ensure that only a single thread of
 3771  *          the given port instance executes code in the region protected by
 3772  *          this function.
 3773  *
 3774  *
 3775  *  \param   agRoot:       Pointer to chip/driver Instance.
 3776  *  \param   syncLockId    to be explained.
 3777  *
 3778  *
 3779  *  \return None.
 3780  *
 3781  *  \note - The scope is shared target and initiator.
 3782  *
 3783  */
 3784 /*****************************************************************************/
 3785 FORCEINLINE
 3786 void ossaSingleThreadedEnter(
 3787      agsaRoot_t *agRoot,
 3788      bit32  syncLockId
 3789      )
 3790 {
 3791   tdsaRootOsData_t *pOsData = agNULL;
 3792   tiRoot_t  *ptiRoot = agNULL;
 3793   tdsaContext_t *tdsaAllShared = agNULL;
 3794 
 3795   TD_ASSERT(agRoot, "agRoot");
 3796   pOsData = (tdsaRootOsData_t *) (agRoot->osData);
 3797   TD_ASSERT(pOsData, "pOsData");
 3798   ptiRoot = pOsData->tiRoot;
 3799   TD_ASSERT(ptiRoot, "ptiRoot");
 3800 
 3801   tdsaAllShared = (tdsaContext_t *)pOsData->tdsaAllShared;
 3802   TD_ASSERT(tdsaAllShared, "tdsaAllShared");
 3803 
 3804   ostiSingleThreadedEnter(ptiRoot, syncLockId + tdsaAllShared->MaxNumOSLocks);
 3805   return;
 3806 }
 3807 
 3808 /*****************************************************************************/
 3809 /*! \brief ossaSingleThreadedLeave
 3810  *
 3811  *
 3812  *  Purpose: This routine is called to leave a critical region of code
 3813  *           previously protected by a call to osSingleThreadedEnter()
 3814  *
 3815  *
 3816  *  \param   agRoot:       Pointer to chip/driver Instance.
 3817  *  \param   syncLockId    to be explained.
 3818  *
 3819  *
 3820  *  \return None.
 3821  *
 3822  *  \note - The scope is shared target and initiator.
 3823  *
 3824  */
 3825 /*****************************************************************************/
 3826 FORCEINLINE
 3827 void ossaSingleThreadedLeave(
 3828      agsaRoot_t *agRoot,
 3829      bit32  syncLockId
 3830      )
 3831 {
 3832   tdsaRootOsData_t *pOsData = agNULL;
 3833   tiRoot_t  *ptiRoot = agNULL;
 3834   tdsaContext_t *tdsaAllShared = agNULL;
 3835 
 3836   TD_ASSERT(agRoot, "agRoot");
 3837   pOsData = (tdsaRootOsData_t *) (agRoot->osData);
 3838   TD_ASSERT(pOsData, "pOsData");
 3839   ptiRoot = pOsData->tiRoot;
 3840   TD_ASSERT(ptiRoot, "ptiRoot");
 3841 
 3842   tdsaAllShared = (tdsaContext_t *)pOsData->tdsaAllShared;
 3843   TD_ASSERT(tdsaAllShared, "tdsaAllShared");
 3844 
 3845   ostiSingleThreadedLeave(ptiRoot, syncLockId + tdsaAllShared->MaxNumOSLocks);
 3846   return;
 3847 }
 3848 
 3849 #ifdef PERF_COUNT
 3850 osGLOBAL void ossaEnter(agsaRoot_t *agRoot, int io)
 3851 {
 3852   ostiEnter(((tdsaRootOsData_t*)(agRoot->osData))->tiRoot, 0, io);
 3853   return;
 3854 }
 3855 
 3856 osGLOBAL void ossaLeave(agsaRoot_t *agRoot, int io)
 3857 {
 3858   ostiLeave(((tdsaRootOsData_t*)(agRoot->osData))->tiRoot, 0, io);
 3859   return;
 3860 }
 3861 #endif
 3862 
 3863 
 3864 osGLOBAL void
 3865 ossaSSPIoctlCompleted(
 3866                         agsaRoot_t                        *agRoot,
 3867                         agsaIORequest_t           *agIORequest,
 3868                         bit32                             agIOStatus,
 3869                         bit32                             agIOInfoLen,
 3870                         void                              *agParam,
 3871                         bit16                             sspTag,
 3872                         bit32                             agOtherInfo
 3873                    )
 3874 {
 3875   tdsaRootOsData_t                              *osData           = (tdsaRootOsData_t *)agRoot->osData;
 3876   tiRoot_t                                              *tiRoot           = (tiRoot_t *)osData->tiRoot;
 3877   tdIORequestBody_t                             *tdIORequestBody  = (tdIORequestBody_t *)agIORequest->osData;
 3878   agsaSASRequestBody_t                  *agSASRequestBody = agNULL;
 3879   agsaSSPInitiatorRequest_t             *agSSPFrame       = agNULL;
 3880   bit8                          scsiOpcode        = 0;
 3881 
 3882   agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
 3883   agSSPFrame = &(agSASRequestBody->sspInitiatorReq);
 3884   scsiOpcode = agSSPFrame->sspCmdIU.cdb[0];
 3885 
 3886   TI_DBG2(("ossaSSPIoctlCompleted: start\n"));
 3887 
 3888   if (agIOStatus == OSSA_SUCCESS)
 3889   {
 3890     TI_DBG2(("ossaSSPIoctlCompleted: Success status\n"));
 3891   }
 3892   else
 3893   {
 3894     TI_DBG1(("ossaSSPIoctlCompleted: Status 0x%x\n", agIOStatus));
 3895   }
 3896   switch(scsiOpcode)
 3897   {
 3898   case REPORT_LUN_OPCODE:
 3899     ostiNumOfLUNIOCTLRsp(tiRoot, agIOStatus);
 3900         break;
 3901 
 3902   default:
 3903         TI_DBG1(("ossaSSPIoctlCompleted: Unsupported SCSI command Response  0x%x\n",scsiOpcode));
 3904         break;
 3905   }
 3906   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
 3907   return;
 3908 
 3909 }
 3910 
 3911 osGLOBAL void
 3912 ossaSMPIoctlCompleted(
 3913                  agsaRoot_t            *agRoot,
 3914                  agsaIORequest_t       *agIORequest,
 3915                  bit32                 agIOStatus,
 3916                  bit32                 agIOInfoLen,
 3917                  agsaFrameHandle_t     agFrameHandle
 3918                  )
 3919 {
 3920         tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
 3921         tiRoot_t                        *tiRoot = (tiRoot_t *)osData->tiRoot;
 3922         TI_DBG2(("ossaSMPIoctlCompleted: start\n"));
 3923 
 3924         if (agIOStatus == OSSA_SUCCESS)
 3925         {
 3926           TI_DBG2(("ossaSMPIoctlCompleted: Success status\n"));
 3927         }
 3928         else
 3929         {
 3930           TI_DBG1(("ossaSMPIoctlCompleted: Status 0x%x\n", agIOStatus));
 3931         }
 3932 
 3933         ostiSendSMPIOCTLRsp(tiRoot, agIOStatus);
 3934         smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
 3935         return;
 3936 
 3937 }
 3938 
 3939 
 3940 /*****************************************************************************/
 3941 /*! \brief ossaSMPCompleted
 3942  *
 3943  *
 3944  *  Purpose: This routine is called by lower layer to indicate the completion of
 3945  *           SMP request
 3946  *
 3947  *  \param   agRoot:       Pointer to chip/driver Instance.
 3948  *  \param   agIORequest   Pointer to SMP request handle
 3949  *  \param   agIOStatus    Status
 3950  *  \param   agFrameHeader:Pointer to SMP frame header.
 3951  *  \param   agIOInfoLen   IO information length assoicated with the IO
 3952  *  \param   agFrameHandle A Handle used to refer to the response frame
 3953  *
 3954  *
 3955  *  \return None.
 3956  *
 3957  *  \note - The scope is shared target and initiator.
 3958  *          For details, refer to SAS/SATA Low-Level API Specification
 3959  */
 3960 /*****************************************************************************/
 3961 osGLOBAL void ossaSMPCompleted(
 3962                  agsaRoot_t            *agRoot,
 3963                  agsaIORequest_t       *agIORequest,
 3964                  bit32                 agIOStatus,
 3965                  bit32                 agIOInfoLen,
 3966                  agsaFrameHandle_t     agFrameHandle
 3967                  )
 3968 {
 3969 #ifdef PASSTHROUGH
 3970   tdsaRootOsData_t         *osData = (tdsaRootOsData_t *)agRoot->osData;
 3971   tiRoot_t                 *tiRoot = (tiRoot_t *)osData->tiRoot;
 3972   tdPassthroughCmndBody_t  *tdPTCmndBody  = (tdPassthroughCmndBody_t *)agIORequest->osData;
 3973   bit32                    tiStatus = tiPassthroughError;
 3974   bit8                     SMPframe[agIOInfoLen + sizeof(agsaSMPFrameHeader_t)];
 3975   bit8                     SMPpayload[agIOInfoLen];
 3976 
 3977   TI_DBG2(("ossaSMPCompleted: start and passthrough\n"));
 3978 #else /* not PASSTHROUGH */
 3979 
 3980   tdssSMPRequestBody_t *pSMPRequestBody = (tdssSMPRequestBody_t *) agIORequest->osData;
 3981   TI_DBG4(("ossaSMPCompleted: start\n"));
 3982 #endif /* end not PASSTHROUGH */
 3983 
 3984   TDSA_OUT_ENTER((tiRoot_t *)((tdsaRootOsData_t *)agRoot->osData)->tiRoot);
 3985   smTraceFuncEnter(hpDBG_VERY_LOUD,"Y4");
 3986 
 3987 #ifdef PASSTHROUGH
 3988   if (tdPTCmndBody == agNULL)
 3989   {
 3990     TI_DBG1(("ossaSMPCompleted: tdPTCmndBody is NULL \n"));
 3991     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y4");
 3992     goto ext;
 3993   }
 3994 
 3995   if (tdPTCmndBody->EventCB == agNULL)
 3996   {
 3997     TI_DBG1(("ossaSMPCompleted: tdPTCmndBody->EventCB is NULL \n"));
 3998     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y4");
 3999     goto ext;
 4000   }
 4001 
 4002   if (agIOStatus == OSSA_IO_SUCCESS)
 4003   {
 4004     tiStatus = tiPassthroughSuccess;
 4005   }
 4006   else if (agIOStatus == OSSA_IO_ABORTED)
 4007   {
 4008     tiStatus = tiPassthroughAborted;
 4009   }
 4010   else
 4011   {
 4012     tiStatus = tiPassthroughError;
 4013   }
 4014 
 4015   osti_memset(SMPpayload, 0, agIOInfoLen);
 4016   osti_memset(SMPframe, 0, agIOInfoLen + sizeof(agsaSMPFrameHeader_t));
 4017 
 4018   /* combine the header and payload */
 4019   saFrameReadBlock(agRoot, agFrameHandle, 0, &SMPpayload, agIOInfoLen);
 4020   osti_memcpy(SMPframe, agFrameHeader, sizeof(agsaSMPFrameHeader_t));
 4021   osti_memcpy(SMPframe+sizeof(agsaSMPFrameHeader_t), SMPpayload, agIOInfoLen);
 4022 
 4023   tdPTCmndBody->EventCB(tiRoot,
 4024                         tdPTCmndBody->tiPassthroughRequest,
 4025                         tiStatus,
 4026                         SMPframe,
 4027                         agIOInfoLen + sizeof(agsaSMPFrameHeader_t)
 4028                         );
 4029 
 4030 
 4031 #else /* not PASSTHROUGH */
 4032 
 4033   /*
 4034     At initiator, passing SMP to TD layer, itdssSMPCompleted(), which does nothing.
 4035     At target, passing SMP to TD layer, ttdsaSMPCompleted()
 4036   */
 4037   /*
 4038      how to use agFrameHandle, when saFrameReadBlock() is used
 4039   */
 4040 
 4041   /* SPC can't be SMP target */
 4042 
 4043   TI_DBG4(("ossaSMPCompleted: start\n"));
 4044 
 4045   if (pSMPRequestBody == agNULL)
 4046   {
 4047     TI_DBG1(("ossaSMPCompleted: pSMPRequestBody is NULL \n"));
 4048     smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y4");
 4049     goto ext;
 4050   }
 4051 
 4052   if (pSMPRequestBody->SMPCompletionFunc == agNULL)
 4053   {
 4054     TI_DBG1(("ossaSMPCompleted: pSMPRequestBody->SMPCompletionFunc is NULL \n"));
 4055     smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y4");
 4056     goto ext;
 4057   }
 4058 #ifdef TD_INTERNAL_DEBUG /* debugging */
 4059   TI_DBG4(("ossaSMPCompleted: agIOrequest %p\n", agIORequest->osData));
 4060   TI_DBG4(("ossaSMPCompleted: sizeof(tdIORequestBody_t) %d 0x%x\n", sizeof(tdIORequestBody_t),
 4061            sizeof(tdIORequestBody_t)));
 4062   TI_DBG4(("ossaSMPCompleted: SMPRequestbody %p\n", pSMPRequestBody));
 4063   TI_DBG4(("ossaSMPCompleted: calling callback fn\n"));
 4064   TI_DBG4(("ossaSMPCompleted: callback fn %p\n",pSMPRequestBody->SMPCompletionFunc));
 4065 #endif /* TD_INTERNAL_DEBUG */
 4066   /*
 4067     if initiator, calling itdssSMPCompleted() in itdcb.c
 4068     if target,    calling ttdsaSMPCompleted() in ttdsmp.c
 4069   */
 4070   pSMPRequestBody->SMPCompletionFunc(
 4071                                      agRoot,
 4072                                      agIORequest,
 4073                                      agIOStatus,
 4074                                      agIOInfoLen,
 4075                                      agFrameHandle
 4076                                      );
 4077 
 4078 #endif /* Not PASSTHROUGH */
 4079 
 4080   smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y4");
 4081 ext:
 4082   TDSA_OUT_LEAVE((tiRoot_t *)((tdsaRootOsData_t *)agRoot->osData)->tiRoot);
 4083   return;
 4084 }
 4085 
 4086 osGLOBAL void
 4087 ossaSMPReqReceived(
 4088                    agsaRoot_t           *agRoot,
 4089                    agsaDevHandle_t      *agDevHandle,
 4090                    agsaFrameHandle_t    agFrameHandle,
 4091                    bit32                agIOInfoLen,
 4092                    bit32                phyId
 4093                    )
 4094 {
 4095   smTraceFuncEnter(hpDBG_VERY_LOUD,"Y5");
 4096   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y5");
 4097   return;
 4098 }
 4099 
 4100 /*****************************************************************************/
 4101 /*! \brief ossaSMPCAMCompleted
 4102  *
 4103  *
 4104  *  Purpose: This routine is called by lower layer to indicate the completion of
 4105  *           SMP request
 4106  *
 4107  *  \param   agRoot:       Pointer to chip/driver Instance.
 4108  *  \param   agIORequest   Pointer to SMP request handle
 4109  *  \param   agIOStatus    Status
 4110  *  \param   agIOInfoLen   IO information length assoicated with the IO
 4111  *  \param   agFrameHandle A Handle used to refer to the response frame
 4112  *
 4113  *
 4114  *  \return None.
 4115  *
 4116  *  \note - The scope is shared target and initiator.
 4117  *          For details, refer to SAS/SATA Low-Level API Specification
 4118  */
 4119 /*****************************************************************************/
 4120 osGLOBAL void ossaSMPCAMCompleted(
 4121                  agsaRoot_t            *agRoot,
 4122                  agsaIORequest_t       *agIORequest,
 4123                  bit32                 agIOStatus,
 4124                  bit32                 agIOInfoLen,
 4125                  agsaFrameHandle_t     agFrameHandle
 4126                  )
 4127 {
 4128   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 4129   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 4130   tdIORequestBody_t   *tdSMPRequestBody  = agNULL;
 4131   bit32                context = osData->IntContext;
 4132   tiSMPStatus_t        status;
 4133   bit32               PhysUpper32;
 4134   bit32               PhysLower32;
 4135   bit32               memAllocStatus;
 4136   void                *osMemHandle;
 4137   bit32               *SMPpayload;
 4138   TI_DBG2(("ossaSMPCAMCompleted: start\n"));
 4139   TI_DBG2(("ossaSMPCAMCompleted: agIOInfoLen %d\n", agIOInfoLen));
 4140   if (!agIORequest->osData)
 4141   {
 4142     TD_ASSERT((0), "ossaSMPCAMCompleted agIORequest->osData");
 4143     goto ext;
 4144   }
 4145   tdSMPRequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4146   if (tdSMPRequestBody->tiIORequest->osData == agNULL)
 4147   {
 4148     TI_DBG1(("ossaSMPCAMCompleted: tdIORequestBody->tiIORequest->osData is null, wrong\n"));
 4149     goto ext;
 4150   }
 4151   /* allocating agIORequest for SMP Payload itself */
 4152   memAllocStatus = ostiAllocMemory(
 4153                                    tiRoot,
 4154                                    &osMemHandle,
 4155                                    (void **)&SMPpayload,
 4156                                    &PhysUpper32,
 4157                                    &PhysLower32,
 4158                                    8,
 4159                                    agIOInfoLen,
 4160                                    agTRUE
 4161                                    );
 4162   if (memAllocStatus != tiSuccess)
 4163   {
 4164     /* let os process IO */
 4165     TI_DBG1(("ossaSMPCAMCompleted: ostiAllocMemory failed...\n"));
 4166     goto ext;
 4167   }
 4168   if (SMPpayload == agNULL)
 4169   {
 4170     TI_DBG1(("ossaSMPCAMCompleted: ostiAllocMemory returned NULL SMPpayload\n"));
 4171     goto ext;
 4172   }
 4173   if (agIOStatus == OSSA_IO_SUCCESS)
 4174   {
 4175     TI_DBG1(("ossaSMPCAMCompleted: Success status\n"));
 4176     osti_memset(SMPpayload, 0, agIOInfoLen);
 4177     TI_DBG1(("ossaSMPCAMCompleted: after memset\n"));
 4178     saFrameReadBlock(agRoot, agFrameHandle, 0, SMPpayload, agIOInfoLen);
 4179     TI_DBG1(("ossaSMPCAMCompleted: after read \n"));
 4180     status = tiSMPSuccess;
 4181   }
 4182   else if (agIOStatus == OSSA_IO_ABORTED)
 4183   {
 4184     TI_DBG1(("ossaSMPCAMCompleted: SMP Aborted status\n"));
 4185     status = tiSMPAborted;
 4186     TI_DBG1(("ossaSMPCAMCompleted: failed status=%d\n", status));
 4187     //failed to send smp command, we need to free the memory
 4188     ostiFreeMemory(
 4189                   tiRoot,
 4190                   osMemHandle,
 4191                   agIOInfoLen
 4192                   );
 4193   }
 4194   else
 4195   {
 4196     TI_DBG1(("ossaSMPCAMCompleted: SMP failed status\n"));
 4197     status = tiSMPFailed;
 4198     TI_DBG1(("ossaSMPCAMCompleted: failed status=%d\n", status));
 4199     //failed to send smp command, we need to free the memory
 4200     ostiFreeMemory(
 4201                   tiRoot,
 4202                   osMemHandle,
 4203                   agIOInfoLen
 4204                   );
 4205   }
 4206   ostiInitiatorSMPCompleted(tiRoot,
 4207                             tdSMPRequestBody->tiIORequest,
 4208                             status,
 4209                             agIOInfoLen,
 4210                             SMPpayload,
 4211                             context
 4212                             );
 4213   ext:
 4214   TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
 4215   return;
 4216 }
 4217 #ifdef REMOVED
 4218 #ifdef TARGET_DRIVER
 4219 /*****************************************************************************/
 4220 /*! \brief ossaSMPReqReceived
 4221  *
 4222  *
 4223  *  Purpose: This routine is called by lower layer to indicate the reception of
 4224  *           SMP request
 4225  *
 4226  *  \param   agRoot:       Pointer to chip/driver Instance.
 4227  *  \param   agDevHandle   Pointer to the device handle of the device
 4228  *  \param   agFrameHandle A Handle used to refer to the response frame
 4229  *
 4230  *
 4231  *  \return None.
 4232  *
 4233  *  \note - The scope is target only
 4234  *          For details, refer to SAS/SATA Low-Level API Specification
 4235  */
 4236 /*****************************************************************************/
 4237 osGLOBAL void ossaSMPReqReceived(
 4238                    agsaRoot_t           *agRoot,
 4239                    agsaDevHandle_t      *agDevHandle,
 4240                    agsaFrameHandle_t    agFrameHandle,
 4241                    bit32                 agFrameLength,
 4242                    bit32                phyId
 4243                    )
 4244 {
 4245   bit8                   smpHeader[4];
 4246   agsaSMPFrameHeader_t   *agFrameHeader;
 4247 #ifdef PASSTHROUGH
 4248   /* call the registered function(parameter in tiTGTPassthroughCmndRegister() by target */
 4249   tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
 4250   tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
 4251   ttdsaTgt_t             *Target = (ttdsaTgt_t *)osData->ttdsaTgt;
 4252 
 4253   bit8                   SMPframe[agIOInfoLen + sizeof(agsaSMPFrameHeader_t)];
 4254   bit8                   SMPpayload[agIOInfoLen];
 4255 
 4256   TI_DBG2(("ossaSMPReqReceived: start and passthrough\n"));
 4257   osti_memset(SMPpayload, 0, agIOInfoLen);
 4258   osti_memset(SMPframe, 0, agIOInfoLen + sizeof(agsaSMPFrameHeader_t));
 4259   /* combine smp header and payload */
 4260   saFrameReadBlock(agRoot, agFrameHandle, 0, &SMPpayload, agIOInfoLen);
 4261   osti_memcpy(SMPframe, agFrameHeader, sizeof(agsaSMPFrameHeader_t));
 4262   osti_memcpy(SMPframe+sizeof(agsaSMPFrameHeader_t), SMPpayload, agIOInfoLen);
 4263 
 4264   Target->PasthroughCB(
 4265                        tiRoot,
 4266                        tiSASATA,
 4267                        tiSMP,
 4268                        tiSMPResponse,
 4269                        SMPframe,
 4270                        agIOInfoLen + sizeof(agsaSMPFrameHeader_t),
 4271                        phyId
 4272                        );
 4273 
 4274 #else
 4275 
 4276   /*
 4277     agDevHandle_t->osData points to tdssDeviceData_t
 4278    */
 4279   tdsaDeviceData_t *pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
 4280 
 4281     saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
 4282     agFrameHeader = (agsaSMPFrameHeader_t *)smpHeader;
 4283   TI_DBG4(("ossaSMPReqReceived: start\n"));
 4284 
 4285   /* tdtypes.h, calling  ttdsaSMPReqReceived in ttdsmp.c */
 4286   pDeviceData->pJumpTable->pSMPReqReceived (
 4287                                             agRoot,
 4288                                             agDevHandle,
 4289                                             agFrameHeader,
 4290                                             agFrameHandle,
 4291                                             agFrameLength,
 4292                                             phyId
 4293                                             );
 4294 #endif
 4295   return;
 4296 }
 4297 #endif
 4298 #endif
 4299 
 4300 /*****************************************************************************/
 4301 /*! \brief ossaSSPCompleted
 4302  *
 4303  *
 4304  *  Purpose: This routine is called by lower layer to indicate the completion of
 4305  *           SSP request
 4306  *
 4307  *  \param   agRoot:       Pointer to chip/driver Instance.
 4308  *  \param   agIORequest   Pointer to SMP request handle
 4309  *  \param   agIOStatus    Status
 4310  *  \param   agIOInfoLen   IO information length assoicated with the IO
 4311  *  \param   agFrameHandle A Handle used to refer to the response frame
 4312  *
 4313  *
 4314  *  \return None.
 4315  *
 4316  *  \note - The scope is shared target and initiator.
 4317  *          For details, refer to SAS/SATA Low-Level API Specification
 4318  */
 4319 /*****************************************************************************/
 4320 FORCEINLINE
 4321 void ossaSSPCompleted(
 4322                  agsaRoot_t          *agRoot,
 4323                  agsaIORequest_t     *agIORequest,
 4324                  bit32               agIOStatus,
 4325                  bit32               agIOInfoLen,
 4326                  void                *agParam,
 4327                  bit16               sspTag,
 4328                  bit32               agOtherInfo
 4329                 )
 4330 {
 4331   tdIORequestBody_t  *pIORequestBody;
 4332 #ifdef TD_DEBUG_ENABLE
 4333   tiDeviceHandle_t   *tiDeviceHandle = agNULL;
 4334   tdsaDeviceData_t   *oneDeviceData = agNULL;
 4335 #endif
 4336 
 4337   TDSA_OUT_ENTER((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
 4338   smTraceFuncEnter(hpDBG_VERY_LOUD,"2L");
 4339 
 4340   if(!agIORequest->osData)
 4341   {
 4342     TD_ASSERT((0), "ossaSSPCompleted agIORequest->osData");
 4343     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2L");
 4344     goto ext;
 4345   }
 4346   pIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4347 
 4348 
 4349   TI_DBG4(("ossaSSPCompleted: start\n"));
 4350 
 4351   if (pIORequestBody == agNULL)
 4352   {
 4353     TI_DBG1(("ossaSSPCompleted: pIORequestBody is NULL \n"));
 4354     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2L");
 4355     goto ext;
 4356   }
 4357   if (pIORequestBody->IOCompletionFunc == agNULL)
 4358   {
 4359 #ifdef TD_DEBUG_ENABLE
 4360     tiDeviceHandle = pIORequestBody->tiDevHandle;
 4361     oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
 4362 #endif
 4363     TI_DBG1(("ossaSSPCompleted: IOCompletionFunc is NULL \n"));
 4364     TI_DBG1(("ossaSSPCompleted: did %d \n", oneDeviceData->id));
 4365     smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2L");
 4366     goto ext;
 4367   }
 4368 
 4369    /*
 4370      if initiator, calling itdssIOCompleted() in itdcb.c
 4371      if initiator, calling itdssTaskCompleted in itdcb.c
 4372      if target,    calling ttdsaIOCompleted() in ttdio.c
 4373    */
 4374   pIORequestBody->IOCompletionFunc(
 4375                                    agRoot,
 4376                                    agIORequest,
 4377                                    agIOStatus,
 4378                                    agIOInfoLen,
 4379                                    agParam,
 4380                                    agOtherInfo
 4381                                    );
 4382   smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2L");
 4383 ext:
 4384   TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
 4385   return;
 4386 }
 4387 
 4388 #ifdef FAST_IO_TEST
 4389 GLOBAL void ossaFastSSPCompleted(
 4390                  agsaRoot_t          *agRoot,
 4391                  agsaIORequest_t     *cbArg,
 4392                  bit32               agIOStatus,
 4393                  bit32               agIOInfoLen,
 4394                  void                *agParam,
 4395                  bit16               sspTag,
 4396                  bit32               agOtherInfo
 4397                 )
 4398 {
 4399   agsaFastCBBuf_t    *safb = (agsaFastCBBuf_t*)cbArg;
 4400   tdsaRootOsData_t *osData = (tdsaRootOsData_t*)agRoot->osData;
 4401   tiRoot_t         *tiRoot = (tiRoot_t*)osData->tiRoot;
 4402   bit32            scsi_status;
 4403   bit32            data_status;
 4404   bit32            respLen;
 4405   bit8             respData[128];
 4406   bit32            senseLen;
 4407   agsaSSPResponseInfoUnit_t agSSPRespIU;
 4408 
 4409   TDSA_OUT_ENTER((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
 4410   smTraceFuncEnter(hpDBG_VERY_LOUD,"Y6");
 4411 
 4412   TI_DBG4(("ossaSSPCompleted: start\n"));
 4413 
 4414   if (safb->cb == agNULL || safb->cbArg == agNULL)
 4415   {
 4416     TI_DBG1(("ossaFastSSPCompleted: pIORequestBody is NULL \n"));
 4417     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y6");
 4418     TD_ASSERT((0), "");
 4419     goto ext;
 4420   }
 4421 
 4422   switch (agIOStatus)
 4423   {
 4424     case OSSA_IO_SUCCESS:
 4425 
 4426       /* ~ itdssIOSuccessHandler */
 4427       if ((agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t)))
 4428       {
 4429         ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, OSSA_IO_SUCCESS, 0);
 4430         break;
 4431       }
 4432 
 4433       /* reads agsaSSPResponseInfoUnit_t */
 4434       saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU,
 4435                        sizeof(agsaSSPResponseInfoUnit_t));
 4436 
 4437       data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
 4438       scsi_status = agSSPRespIU.status;
 4439 
 4440       TI_DBG1(("itdssIOSuccessHandler: scsi_status %d\n", scsi_status));
 4441 
 4442       /* endianess is invovled here */
 4443       senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU);
 4444       respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
 4445       TI_DBG2(("itdssIOSuccessHandler: scsi status=0x%x, senselen=0x%x resplen "
 4446                "0x%x\n", scsi_status, senseLen, respLen));
 4447 
 4448       if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
 4449       {
 4450         ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
 4451                                      tiDetailOtherError);
 4452         break;
 4453       }
 4454 
 4455       /* reads response data */
 4456       saFrameReadBlock(agRoot, agParam, sizeof(agsaSSPResponseInfoUnit_t),
 4457                        respData, respLen);
 4458       /* reads sense data */
 4459       saFrameReadBlock(agRoot, agParam, sizeof(agsaSSPResponseInfoUnit_t)
 4460                        + respLen, safb->pSenseData, senseLen);
 4461 
 4462       if (data_status == 0)
 4463       {
 4464         /* NO_DATA */
 4465         TI_DBG2(("ossaFastSSPCompleted: no data\n"));
 4466         ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess,
 4467                                      scsi_status);
 4468         break;
 4469       }
 4470 
 4471       if (data_status == 1)
 4472       {
 4473         /* RESPONSE_DATA */
 4474         TI_DBG1(("ossaFastSSPCompleted: response data \n"));
 4475         ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess, 0);
 4476         break;
 4477       }
 4478 
 4479       if (data_status == 2)
 4480       {
 4481         tiSenseData_t senseData;
 4482 
 4483         /* SENSE_DATA */
 4484         TI_DBG2(("itdssIOSuccessHandler: sense data \n"));
 4485 
 4486         senseData.senseData = safb->pSenseData;
 4487         senseData.senseLen = MIN(*(safb->senseLen), senseLen);
 4488 
 4489         /* when ASC = 0x04 - Log Unit Not Ready,
 4490            and ASCQ = 0x11 - Enable Spinup Required:
 4491            call saLocalPhyControl to notify spinup */
 4492         if (((char*)safb->pSenseData)[12] == 0x04 &&
 4493             ((char*)safb->pSenseData)[13] == 0x11)
 4494         {
 4495           int i;
 4496 
 4497           TI_DBG2(("ossaFastSSPCompleted: sending notfify spinup\n"));
 4498 
 4499           if (((tdsaDeviceData_t*)safb->oneDeviceData)->directlyAttached ==
 4500                agTRUE)
 4501           {
 4502             for (i = 0; i < TD_MAX_NUM_NOTIFY_SPINUP; i++)
 4503             {
 4504               saLocalPhyControl(agRoot, agNULL, 0,
 4505                                 ((tdsaDeviceData_t*)safb->oneDeviceData)->phyID,
 4506                                 AGSA_PHY_NOTIFY_ENABLE_SPINUP,
 4507                                 agNULL);
 4508             }
 4509           }
 4510         }
 4511 
 4512         if (*(safb->senseLen) > senseData.senseLen)
 4513           *(safb->senseLen) = senseData.senseLen;
 4514 //       memcpy((void *)safb->pSenseData, senseData.senseData, safb->senseLen);
 4515 
 4516         ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess,
 4517                                      scsi_status);
 4518         break;
 4519       }
 4520 
 4521       if (data_status == 3)
 4522       {
 4523         /* RESERVED */
 4524         TI_DBG1(("ossaFastSSPCompleted: reserved wrong!!!\n"));
 4525 
 4526         ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
 4527                                      scsi_status);
 4528         break;
 4529       }
 4530       break;
 4531 #ifdef REMOVED
 4532     case OSSA_IO_OVERFLOW:
 4533       ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOOverRun,
 4534                                    agIOInfoLen);
 4535       break;
 4536 #endif /* REMOVED */
 4537     case OSSA_IO_UNDERFLOW:
 4538       ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOUnderRun,
 4539                                    agIOInfoLen);
 4540       break;
 4541 
 4542     case OSSA_IO_ABORTED:
 4543       ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
 4544                                    tiDetailAborted);
 4545       break;
 4546     case OSSA_IO_ABORT_RESET:
 4547       ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
 4548                                    tiDetailAbortReset);
 4549       break;
 4550     case OSSA_IO_NO_DEVICE:
 4551       ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
 4552                                    tiDetailNoLogin);
 4553       break;
 4554     case OSSA_IO_DS_NON_OPERATIONAL:
 4555     {
 4556 
 4557       tdsaDeviceData_t *oneDeviceData;
 4558 
 4559       oneDeviceData = (tdsaDeviceData_t*)safb->oneDeviceData;
 4560       if (oneDeviceData->valid == agTRUE &&
 4561           oneDeviceData->registered == agTRUE &&
 4562           oneDeviceData->tdPortContext != agNULL)
 4563       {
 4564         saSetDeviceState(oneDeviceData->agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData),
 4565                          oneDeviceData->agDevHandle, SA_DS_OPERATIONAL);
 4566       }
 4567       /* fall through */
 4568     }
 4569 
 4570     default:
 4571       ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
 4572                                    tiDetailOtherError);
 4573       break;
 4574   }
 4575 
 4576   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y6");
 4577 
 4578 ext:
 4579   TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
 4580   return;
 4581 } /* ossaFastSSPCompleted */
 4582 #endif
 4583 
 4584 /*****************************************************************************/
 4585 /*! \brief ossaSSPReqReceived
 4586  *
 4587  *
 4588  *  Purpose: This routine is called by lower layer to indicate the reception of
 4589  *           SMP request
 4590  *
 4591  *  \param   agRoot:         Pointer to chip/driver Instance.
 4592  *  \param   agDevHandle     Pointer to the device handle of the device
 4593  *  \param   agFrameHandle   A Handle used to refer to the response frame
 4594  *  \param   agInitiatorTag  the initiator tag
 4595  *  \param   agFrameType     SSP frame type
 4596  *
 4597  *  \return none.
 4598  *
 4599  *  \note - The scope is target only
 4600  *          For details, refer to SAS/SATA Low-Level API Specification
 4601  */
 4602 /*****************************************************************************/
 4603 osGLOBAL void ossaSSPReqReceived(
 4604                    agsaRoot_t           *agRoot,
 4605                    agsaDevHandle_t      *agDevHandle,
 4606                    agsaFrameHandle_t    agFrameHandle,
 4607                    bit16                agInitiatorTag,
 4608                    bit32                parameter,
 4609                    bit32                agFrameLen
 4610                    )
 4611 {
 4612   /*
 4613     at target only
 4614     uses jumptable, not callback
 4615   */
 4616   /*
 4617     agDevHandle_t->osData points to tdssDeviceData_t
 4618   */
 4619   tdsaDeviceData_t *pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
 4620   smTraceFuncEnter(hpDBG_VERY_LOUD,"Y7");
 4621 
 4622   /* tdtypes.h, calling  ttdsaSSPReqReceived() in ttdio.c */
 4623   pDeviceData->pJumpTable->pSSPReqReceived (
 4624                                             agRoot,
 4625                                             agDevHandle,
 4626                                             agFrameHandle,
 4627                                             agInitiatorTag,
 4628                                             parameter,
 4629                                             agFrameLen
 4630                                             );
 4631   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y7");
 4632   return;
 4633 }
 4634 /*****************************************************************************/
 4635 /*! \brief ossaStallThread
 4636  *
 4637  *
 4638  *  Purpose: This routine is called to stall this thread for a number of
 4639  *           microseconds.
 4640  *
 4641  *
 4642  *  \param  agRoot:       Pointer to chip/driver Instance.
 4643  *  \param   microseconds: Micro second to stall.
 4644  *
 4645  *
 4646  *  \return None.
 4647  *
 4648  *  \note - The scope is shared target and initiator.
 4649  *
 4650  */
 4651 /*****************************************************************************/
 4652 osGLOBAL void ossaStallThread(agsaRoot_t *agRoot,
 4653                 bit32 microseconds
 4654                 )
 4655 {
 4656   tdsaRootOsData_t *pOsData = (tdsaRootOsData_t *) (agRoot->osData);
 4657 
 4658   ostiStallThread (
 4659                    pOsData->tiRoot,
 4660                    microseconds
 4661                    );
 4662   return;
 4663 }
 4664 
 4665 
 4666 /*****************************************************************************
 4667 *! \brief  ossaSSPEvent
 4668 *
 4669 *   This routine is called to notify the OS Layer of an event associated with
 4670 *   SAS port or SAS device
 4671 *
 4672 *  \param   agRoot:         Handles for this instance of SAS/SATA hardware
 4673 *  \param   agIORequest     Pointer to IO request
 4674 *  \param   event:          event type
 4675 *  \param   agIOInfoLen:    not in use
 4676 *  \param   agFrameHandle:  not in use
 4677 *
 4678 *  \return: none
 4679 *
 4680 *****************************************************************************/
 4681 /* in case of CMD ACK_NAK timeout, send query task */
 4682 osGLOBAL void ossaSSPEvent(
 4683              agsaRoot_t           *agRoot,
 4684              agsaIORequest_t      *agIORequest,
 4685              agsaPortContext_t    *agPortContext,
 4686              agsaDevHandle_t      *agDevHandle,
 4687              bit32                event,
 4688              bit16                sspTag,
 4689              bit32                agIOInfoLen,
 4690              void                 *agParam
 4691              )
 4692 {
 4693 #ifdef INITIATOR_DRIVER
 4694   tdsaRootOsData_t            *osData = (tdsaRootOsData_t *)agRoot->osData;
 4695   tiRoot_t                    *tiRoot = (tiRoot_t *)osData->tiRoot;
 4696   /*  bit32                       intContext = osData->IntContext; */
 4697   void                        *osMemHandle;
 4698   tdIORequestBody_t           *TMtdIORequestBody;
 4699   bit32                       PhysUpper32;
 4700   bit32                       PhysLower32;
 4701   bit32                       memAllocStatus;
 4702   bit32                       agRequestType;
 4703   agsaIORequest_t             *agTMIORequest = agNULL;  /* task management itself */
 4704   agsaSASRequestBody_t        *agSASRequestBody = agNULL;
 4705   agsaSSPScsiTaskMgntReq_t    *agSSPTaskMgntRequest;
 4706   bit32                       saStatus;
 4707   bit32                       agIORequestType;  /* type of IO recevied */
 4708   tiIORequest_t               *taskTag;                 /* being task managed one */
 4709   tdIORequestBody_t           *tdIORequestBody;
 4710 #endif
 4711 
 4712 #ifdef REMOVED
 4713   tiDeviceHandle_t            *tiDeviceHandle;
 4714   tdsaDeviceData_t            *oneDeviceData = agNULL;
 4715   tdIORequestBody_t           *tdAbortIORequestBody;
 4716 #endif
 4717   agsaDifDetails_t            agDifDetails;
 4718   bit8                        framePayload[256];
 4719 #ifdef REMOVED
 4720   bit16                       frameOffset = 0;
 4721 #endif
 4722   bit16                       frameLen = 0;
 4723 
 4724   TI_DBG6(("ossaSSPEvent: start\n"));
 4725   smTraceFuncEnter(hpDBG_VERY_LOUD,"Y9");
 4726 
 4727 
 4728 
 4729   if (event == OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT ||
 4730       event == OSSA_IO_XFER_ERROR_BREAK ||
 4731       event == OSSA_IO_XFER_ERROR_PHY_NOT_READY
 4732       )
 4733   {
 4734 
 4735     /* IO being task managed(the original IO) depending on event */
 4736 #ifdef INITIATOR_DRIVER
 4737     tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4738     taskTag         = tdIORequestBody->tiIORequest;
 4739 #endif
 4740 #ifdef REMOVED
 4741     tiDeviceHandle  = tdIORequestBody->tiDevHandle;
 4742     oneDeviceData   = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
 4743 #endif
 4744 
 4745 #ifdef INITIATOR_DRIVER
 4746     agIORequestType = tdIORequestBody->agRequestType;
 4747 
 4748     /* error checking; only command is expected here */
 4749     if (agIORequestType == AGSA_REQ_TYPE_UNKNOWN)
 4750     {
 4751       TI_DBG1(("ossaSSPEvent: incorrect frame 0x%x. Should be command\n", agIORequestType));
 4752       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y9");
 4753       return;
 4754     }
 4755 
 4756     /* Allocate memory for query task management */
 4757     memAllocStatus = ostiAllocMemory(
 4758                                      tiRoot,
 4759                                      &osMemHandle,
 4760                                      (void **)&TMtdIORequestBody,
 4761                                      &PhysUpper32,
 4762                                      &PhysLower32,
 4763                                      8,
 4764                                      sizeof(tdIORequestBody_t),
 4765                                      agTRUE
 4766                                      );
 4767 
 4768     if (memAllocStatus != tiSuccess)
 4769     {
 4770       /* let os process IO */
 4771       TI_DBG1(("ossaSSPEvent: ostiAllocMemory failed...\n"));
 4772       smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y9");
 4773       return;
 4774     }
 4775 
 4776     if (TMtdIORequestBody == agNULL)
 4777     {
 4778       /* let os process IO */
 4779       TI_DBG1(("ossaSSPEvent: ostiAllocMemory returned NULL TMIORequestBody\n"));
 4780       smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y9");
 4781       return;
 4782     }
 4783 
 4784     /* setup task management structure */
 4785     TMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
 4786     /* TD generates Query Task not OS layer */
 4787     TMtdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
 4788     TMtdIORequestBody->IOType.InitiatorTMIO.TaskTag = taskTag;
 4789 
 4790     /* initialize callback function */
 4791     TMtdIORequestBody->IOCompletionFunc = itdssQueryTaskCompleted;
 4792 
 4793     /* initialize tiDevhandle */
 4794     TMtdIORequestBody->tiDevHandle = tdIORequestBody->tiDevHandle;
 4795 
 4796 
 4797     /* initialize agIORequest */
 4798     agTMIORequest = &(TMtdIORequestBody->agIORequest);
 4799     agTMIORequest->osData = (void *) TMtdIORequestBody;
 4800     agTMIORequest->sdkData = agNULL; /* LL takes care of this */
 4801 
 4802     /* request type */
 4803     agRequestType = AGSA_SSP_TASK_MGNT_REQ;
 4804     TMtdIORequestBody->agRequestType = AGSA_SSP_TASK_MGNT_REQ;
 4805 
 4806     /*
 4807       initialize
 4808       tdIORequestBody_t tdIORequestBody -> agSASRequestBody
 4809     */
 4810     agSASRequestBody = &(TMtdIORequestBody->transport.SAS.agSASRequestBody);
 4811     agSSPTaskMgntRequest = &(agSASRequestBody->sspTaskMgntReq);
 4812 
 4813     /* fill up LUN field */
 4814     osti_memset(agSSPTaskMgntRequest->lun, 0, 8);
 4815 
 4816     /* sets taskMgntFunction field */
 4817     agSSPTaskMgntRequest->taskMgntFunction = AGSA_QUERY_TASK;
 4818     /* debugging */
 4819     if (TMtdIORequestBody->IOCompletionFunc == agNULL)
 4820     {
 4821       TI_DBG1(("ossaSSPEvent: Error !!! IOCompletionFunc is NULL\n"));
 4822     }
 4823     /* send query task management */
 4824     saStatus = saSSPStart(agRoot,
 4825                           agTMIORequest,
 4826                           0,
 4827                           agDevHandle,
 4828                           agRequestType,
 4829                           agSASRequestBody,
 4830                           agIORequest,
 4831                           &ossaSSPCompleted);
 4832 
 4833     if (saStatus != AGSA_RC_SUCCESS)
 4834     {
 4835       /* free up allocated memory */
 4836       ostiFreeMemory(
 4837                      tiRoot,
 4838                      TMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 4839                      sizeof(tdIORequestBody_t)
 4840                      );
 4841       TI_DBG1(("ossaSSPEvent: saSSPStart failed\n"));
 4842       return;
 4843     }
 4844 #endif
 4845   }
 4846 #ifdef REMOVED
 4847   else if (event == OSSA_IO_ABORTED)
 4848   {
 4849     TI_DBG2(("ossaSSPEvent: OSSA_IO_ABORTED\n"));
 4850     /* clean up TD layer's IORequestBody */
 4851     tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4852     ostiFreeMemory(
 4853                    tiRoot,
 4854                    tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 4855                    sizeof(tdIORequestBody_t)
 4856                    );
 4857 
 4858   }
 4859   else if (event == OSSA_IO_NOT_VALID)
 4860   {
 4861     TI_DBG1(("ossaSSPEvent: OSSA_IO_NOT_VALID\n"));
 4862     tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4863     ostiFreeMemory(
 4864                    tiRoot,
 4865                    tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 4866                    sizeof(tdIORequestBody_t)
 4867                    );
 4868 
 4869 
 4870   }
 4871 #endif
 4872   else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED)
 4873   {
 4874     TI_DBG2(("ossaSSPEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n"));
 4875   }
 4876   else if (event == OSSA_IO_XFER_ERROR_OFFSET_MISMATCH)
 4877   {
 4878     TI_DBG1(("ossaSSPEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH\n"));
 4879   }
 4880   else if (event == OSSA_IO_OVERFLOW)
 4881   {
 4882     TI_DBG1(("ossaSSPEvent: OSSA_IO_OVERFLOW\n"));
 4883     /*
 4884     ??? can't call; missing agIOInfoLen
 4885     ostiInitiatorIOCompleted (
 4886                               tiRoot,
 4887                               tdIORequestBody->tiIORequest,
 4888                               tiIOOverRun,
 4889                               agIOInfoLen,
 4890                               agNULL,
 4891                               intContext
 4892                               );
 4893 
 4894     */
 4895 
 4896   }
 4897   else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED)
 4898   {
 4899     TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n"));
 4900   }
 4901   else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO)
 4902   {
 4903     TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n"));
 4904   }
 4905   else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST)
 4906   {
 4907     TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n"));
 4908   }
 4909   else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE)
 4910   {
 4911     TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n"));
 4912   }
 4913   else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED)
 4914   {
 4915     TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n"));
 4916   }
 4917   else if (event == OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH)
 4918   {
 4919     TI_DBG1(("ossaSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n"));
 4920   }
 4921   else if (event == OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN)
 4922   {
 4923     TI_DBG1(("ossaSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN\n"));
 4924   }
 4925   else if (event == OSSA_IO_XFR_ERROR_DIF_MISMATCH                 ||
 4926            event == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH ||
 4927            event == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH   ||
 4928            event == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH                 )
 4929   {
 4930     TI_DBG1(("ossaSSPEvent: DIF related, event 0x%x\n", event));
 4931     /* process DIF detail information */
 4932     TI_DBG2(("ossaSSPEvent: agIOInfoLen %d\n", agIOInfoLen));
 4933     if (agParam == agNULL)
 4934     {
 4935       TI_DBG2(("ossaSSPEvent: agParam is NULL!!!\n"));
 4936       return;
 4937     }
 4938     if (agIOInfoLen < sizeof(agsaDifDetails_t))
 4939     {
 4940       TI_DBG2(("ossaSSPEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, (int)sizeof(agsaDifDetails_t)));
 4941       return;
 4942     }
 4943     /* reads agsaDifDetails_t */
 4944     saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t));
 4945 #ifdef REMOVED
 4946     frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF);
 4947 #endif
 4948     frameLen = (bit16)((agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16);
 4949 
 4950     TI_DBG2(("ossaSSPEvent: UpperLBA 0x%08x LowerLBA 0x%08x\n", agDifDetails.UpperLBA, agDifDetails.LowerLBA));
 4951     TI_DBG2(("ossaSSPEvent: SASAddrHI 0x%08x SASAddrLO 0x%08x\n",
 4952              TD_GET_SAS_ADDRESSHI(agDifDetails.sasAddressHi), TD_GET_SAS_ADDRESSLO(agDifDetails.sasAddressLo)));
 4953     TI_DBG2(("ossaSSPEvent: DIF error mask 0x%x Device ID 0x%x\n",
 4954              (agDifDetails.DIFErrDevID) & 0xFF, (agDifDetails.DIFErrDevID & 0xFFFF0000) >> 16));
 4955     if (frameLen != 0 && frameLen <= 256)
 4956     {
 4957       saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen);
 4958       tdhexdump("ossaSSPEvent frame", framePayload, frameLen);
 4959     }
 4960   }
 4961   else
 4962   {
 4963     TI_DBG1(("ossaSSPEvent: other event 0x%x\n", event));
 4964   }
 4965 
 4966   smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y9");
 4967   return;
 4968 }
 4969 
 4970 #ifdef FDS_SM
 4971 osGLOBAL void ossaSATAIDAbortCB(
 4972                agsaRoot_t               *agRoot,
 4973                agsaIORequest_t          *agIORequest,
 4974                bit32                    flag,
 4975                bit32                    status)
 4976 {
 4977   tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
 4978   tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
 4979   tdIORequestBody_t       *tdAbortIORequestBody;
 4980 
 4981   TI_DBG1(("ossaSATAIDAbortCB: start flag %d status %d\n", flag, status));
 4982 
 4983   tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 4984 
 4985   /*
 4986    triggered by tdIDStartTimerCB
 4987   */
 4988   ostiFreeMemory(
 4989                  tiRoot,
 4990                  tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 4991                  sizeof(tdIORequestBody_t)
 4992                 );
 4993   return;
 4994 }
 4995 #endif
 4996 
 4997 #ifdef INITIATOR_DRIVER
 4998 osGLOBAL void ossaSSPAbortCB(
 4999                agsaRoot_t               *agRoot,
 5000                agsaIORequest_t          *agIORequest,
 5001                bit32                    flag,
 5002                bit32                    status)
 5003 {
 5004   tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
 5005   tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
 5006   tdIORequestBody_t       *tdAbortIORequestBody = agNULL;
 5007   tdsaDeviceData_t        *oneDeviceData        = agNULL;
 5008   tiDeviceHandle_t        *tiDeviceHandle       = agNULL;
 5009   tiIORequest_t           *taskTag              = agNULL;
 5010 
 5011   TI_DBG2(("ossaSSPAbortCB: start\n"));
 5012   smTraceFuncEnter(hpDBG_VERY_LOUD,"Ya");
 5013 
 5014   tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 5015   if (tdAbortIORequestBody == agNULL)
 5016   {
 5017     TI_DBG1(("ossaSSPAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
 5018     return;
 5019   }
 5020 
 5021   if (flag == 2)
 5022   {
 5023     /* abort per port */
 5024     TI_DBG1(("ossaSSPAbortCB: abort per port\n"));
 5025   }
 5026   else if (flag == 1)
 5027   {
 5028     TI_DBG2(("ossaSSPAbortCB: abort all\n"));
 5029 
 5030     tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
 5031     if (tiDeviceHandle == agNULL)
 5032     {
 5033       TI_DBG1(("ossaSSPAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
 5034       ostiFreeMemory(
 5035                tiRoot,
 5036                tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5037                sizeof(tdIORequestBody_t)
 5038                );
 5039       return;
 5040     }
 5041 
 5042     oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
 5043     if (oneDeviceData == agNULL)
 5044     {
 5045       TI_DBG1(("ossaSSPAbortCB: oneDeviceData is NULL warning!!!!\n"));
 5046       ostiFreeMemory(
 5047                tiRoot,
 5048                tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5049                sizeof(tdIORequestBody_t)
 5050                );
 5051       return;
 5052     }
 5053 
 5054     if (status == OSSA_IO_SUCCESS)
 5055     {
 5056       TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
 5057       /* clean up TD layer's IORequestBody */
 5058       if (oneDeviceData->OSAbortAll == agTRUE)
 5059       {
 5060         oneDeviceData->OSAbortAll = agFALSE;
 5061         ostiInitiatorEvent( tiRoot,
 5062                             agNULL,
 5063                             tiDeviceHandle,
 5064                             tiIntrEventTypeLocalAbort,
 5065                             tiAbortOK,
 5066                             agNULL);
 5067       }
 5068       else
 5069       {
 5070         TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5071         saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5072       }
 5073       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5074       ostiFreeMemory(
 5075                      tiRoot,
 5076                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5077                      sizeof(tdIORequestBody_t)
 5078                      );
 5079 
 5080     }
 5081     else if (status == OSSA_IO_NOT_VALID)
 5082     {
 5083       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
 5084       /* clean up TD layer's IORequestBody */
 5085       if (oneDeviceData->OSAbortAll == agTRUE)
 5086       {
 5087         oneDeviceData->OSAbortAll = agFALSE;
 5088         ostiInitiatorEvent( tiRoot,
 5089                             agNULL,
 5090                             tiDeviceHandle,
 5091                             tiIntrEventTypeLocalAbort,
 5092                             tiAbortFailed,
 5093                             agNULL );
 5094       }
 5095       else
 5096       {
 5097         TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5098         saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5099       }
 5100       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5101       ostiFreeMemory(
 5102                      tiRoot,
 5103                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5104                      sizeof(tdIORequestBody_t)
 5105                      );
 5106     }
 5107     else if (status == OSSA_IO_NO_DEVICE)
 5108     {
 5109       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
 5110       /* clean up TD layer's IORequestBody */
 5111       if (oneDeviceData->OSAbortAll == agTRUE)
 5112       {
 5113         oneDeviceData->OSAbortAll = agFALSE;
 5114         ostiInitiatorEvent( tiRoot,
 5115                             agNULL,
 5116                             tiDeviceHandle,
 5117                             tiIntrEventTypeLocalAbort,
 5118                             tiAbortInProgress,
 5119                             agNULL );
 5120       }
 5121       else
 5122       {
 5123         TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5124         saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5125       }
 5126       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5127       ostiFreeMemory(
 5128                      tiRoot,
 5129                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5130                      sizeof(tdIORequestBody_t)
 5131                      );
 5132     }
 5133     else if (status == OSSA_IO_ABORT_IN_PROGRESS)
 5134     {
 5135       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
 5136       /* clean up TD layer's IORequestBody */
 5137       if (oneDeviceData->OSAbortAll == agTRUE)
 5138       {
 5139         oneDeviceData->OSAbortAll = agFALSE;
 5140         ostiInitiatorEvent( tiRoot,
 5141                             agNULL,
 5142                             tiDeviceHandle,
 5143                             tiIntrEventTypeLocalAbort,
 5144                             tiAbortInProgress,
 5145                             agNULL );
 5146       }
 5147       else
 5148       {
 5149         TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5150         saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5151       }
 5152       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5153       ostiFreeMemory(
 5154                      tiRoot,
 5155                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5156                      sizeof(tdIORequestBody_t)
 5157                      );
 5158     }
 5159 #ifdef REMOVED
 5160     else if (status == OSSA_IO_ABORT_DELAYED)
 5161     {
 5162       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
 5163       /* clean up TD layer's IORequestBody */
 5164       if (oneDeviceData->OSAbortAll == agTRUE)
 5165       {
 5166         oneDeviceData->OSAbortAll = agFALSE;
 5167         ostiInitiatorEvent( tiRoot,
 5168                             agNULL,
 5169                             tiDeviceHandle,
 5170                             tiIntrEventTypeLocalAbort,
 5171                             tiAbortDelayed,
 5172                             agNULL );
 5173       }
 5174       else
 5175       {
 5176         TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5177         saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5178       }
 5179       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5180       ostiFreeMemory(
 5181                      tiRoot,
 5182                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5183                      sizeof(tdIORequestBody_t)
 5184                      );
 5185     }
 5186 #endif
 5187     else
 5188     {
 5189       TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
 5190       /* clean up TD layer's IORequestBody */
 5191       if (oneDeviceData->OSAbortAll == agTRUE)
 5192       {
 5193         oneDeviceData->OSAbortAll = agFALSE;
 5194         ostiInitiatorEvent( tiRoot,
 5195                             agNULL,
 5196                             tiDeviceHandle,
 5197                             tiIntrEventTypeLocalAbort,
 5198                             tiAbortInProgress,
 5199                             agNULL );
 5200       }
 5201       else
 5202       {
 5203         TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5204         saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5205       }
 5206       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5207       ostiFreeMemory(
 5208                      tiRoot,
 5209                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5210                      sizeof(tdIORequestBody_t)
 5211                      );
 5212     }
 5213   }
 5214   else if (flag == 0)
 5215   {
 5216     TI_DBG2(("ossaSSPAbortCB: abort one\n"));
 5217     taskTag = tdAbortIORequestBody->tiIOToBeAbortedRequest;
 5218 
 5219     if ( taskTag == agNULL)
 5220     {
 5221       TI_DBG1(("ossaSSPAbortCB: taskTag is NULL; triggered by itdssQueryTaskCompleted\n"));
 5222     }
 5223     if (status == OSSA_IO_SUCCESS)
 5224     {
 5225       TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
 5226       if (taskTag != agNULL)
 5227       {
 5228         ostiInitiatorEvent( tiRoot,
 5229                             agNULL,
 5230                             agNULL,
 5231                             tiIntrEventTypeLocalAbort,
 5232                             tiAbortOK,
 5233                             taskTag );
 5234       }
 5235       ostiFreeMemory(
 5236                      tiRoot,
 5237                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5238                      sizeof(tdIORequestBody_t)
 5239                      );
 5240 
 5241     }
 5242     else if (status == OSSA_IO_NOT_VALID)
 5243     {
 5244       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
 5245 
 5246       if (taskTag != agNULL)
 5247       {
 5248         ostiInitiatorEvent( tiRoot,
 5249                             agNULL,
 5250                             agNULL,
 5251                             tiIntrEventTypeLocalAbort,
 5252                             tiAbortFailed,
 5253                             taskTag );
 5254       }
 5255       ostiFreeMemory(
 5256                      tiRoot,
 5257                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5258                      sizeof(tdIORequestBody_t)
 5259                      );
 5260     }
 5261     else if (status == OSSA_IO_NO_DEVICE)
 5262     {
 5263       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
 5264 
 5265       if (taskTag != agNULL)
 5266       {
 5267         ostiInitiatorEvent( tiRoot,
 5268                             agNULL,
 5269                             agNULL,
 5270                             tiIntrEventTypeLocalAbort,
 5271                             tiAbortInProgress,
 5272                             taskTag );
 5273       }
 5274       ostiFreeMemory(
 5275                      tiRoot,
 5276                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5277                      sizeof(tdIORequestBody_t)
 5278                      );
 5279     }
 5280     else if (status == OSSA_IO_ABORT_IN_PROGRESS)
 5281     {
 5282       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
 5283 
 5284       if (taskTag != agNULL)
 5285       {
 5286         ostiInitiatorEvent( tiRoot,
 5287                             agNULL,
 5288                             agNULL,
 5289                             tiIntrEventTypeLocalAbort,
 5290                             tiAbortInProgress,
 5291                             taskTag );
 5292       }
 5293       ostiFreeMemory(
 5294                      tiRoot,
 5295                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5296                      sizeof(tdIORequestBody_t)
 5297                      );
 5298     }
 5299 #ifdef REMOVED
 5300     else if (status == OSSA_IO_ABORT_DELAYED)
 5301     {
 5302       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
 5303 
 5304       if (taskTag != agNULL)
 5305       {
 5306         ostiInitiatorEvent( tiRoot,
 5307                             agNULL,
 5308                             agNULL,
 5309                             tiIntrEventTypeLocalAbort,
 5310                             tiAbortDelayed,
 5311                             taskTag );
 5312       }
 5313       ostiFreeMemory(
 5314                      tiRoot,
 5315                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5316                      sizeof(tdIORequestBody_t)
 5317                      );
 5318     }
 5319 #endif
 5320     else
 5321     {
 5322       TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
 5323 
 5324       if (taskTag != agNULL)
 5325       {
 5326         ostiInitiatorEvent( tiRoot,
 5327                             agNULL,
 5328                             agNULL,
 5329                             tiIntrEventTypeLocalAbort,
 5330                             tiAbortFailed,
 5331                             taskTag );
 5332       }
 5333       ostiFreeMemory(
 5334                      tiRoot,
 5335                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5336                      sizeof(tdIORequestBody_t)
 5337                      );
 5338     }
 5339   }
 5340   else
 5341   {
 5342     TI_DBG1(("ossaSSPAbortCB: wrong flag %d\n", flag));
 5343   }
 5344   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ya");
 5345   return;
 5346 
 5347 }
 5348 #endif
 5349 
 5350 
 5351 #ifdef TARGET_DRIVER
 5352 osGLOBAL void ossaSSPAbortCB(
 5353                agsaRoot_t       *agRoot,
 5354                agsaIORequest_t  *agIORequest,
 5355                bit32            flag,
 5356                bit32            status)
 5357 {
 5358   tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
 5359   tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
 5360   tdIORequestBody_t       *tdAbortIORequestBody;
 5361   tdsaDeviceData_t        *oneDeviceData;
 5362   tiDeviceHandle_t        *tiDeviceHandle;
 5363 
 5364   TI_DBG3(("ossaSSPAbortCB: start\n"));
 5365   tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 5366 
 5367   if (flag == 2)
 5368   {
 5369     /* abort per port */
 5370     TI_DBG2(("ossaSSPAbortCB: abort per port\n"));
 5371   }
 5372   else if (flag == 1)
 5373   {
 5374     TI_DBG2(("ossaSSPAbortCB: abort all\n"));
 5375     tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
 5376     oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
 5377     if (status == OSSA_IO_SUCCESS)
 5378     {
 5379       TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
 5380       /* clean up TD layer's IORequestBody */
 5381       TI_DBG3(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5382       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5383       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5384       ostiFreeMemory(
 5385                      tiRoot,
 5386                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5387                      sizeof(tdIORequestBody_t)
 5388                      );
 5389 
 5390     }
 5391     else if (status == OSSA_IO_NOT_VALID)
 5392     {
 5393       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
 5394       /* clean up TD layer's IORequestBody */
 5395       TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5396       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5397       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5398       ostiFreeMemory(
 5399                      tiRoot,
 5400                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5401                      sizeof(tdIORequestBody_t)
 5402                      );
 5403     }
 5404     else if (status == OSSA_IO_NO_DEVICE)
 5405     {
 5406       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
 5407       /* clean up TD layer's IORequestBody */
 5408       TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5409       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5410       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5411       ostiFreeMemory(
 5412                      tiRoot,
 5413                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5414                      sizeof(tdIORequestBody_t)
 5415                      );
 5416     }
 5417     else if (status == OSSA_IO_ABORT_IN_PROGRESS)
 5418     {
 5419       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
 5420       /* clean up TD layer's IORequestBody */
 5421       TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5422       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5423       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5424       ostiFreeMemory(
 5425                      tiRoot,
 5426                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5427                      sizeof(tdIORequestBody_t)
 5428                      );
 5429     }
 5430 #ifdef REMOVED
 5431     else if (status == OSSA_IO_ABORT_DELAYED)
 5432     {
 5433       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
 5434       /* clean up TD layer's IORequestBody */
 5435       TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5436       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5437       TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5438       ostiFreeMemory(
 5439                      tiRoot,
 5440                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5441                      sizeof(tdIORequestBody_t)
 5442                      );
 5443     }
 5444 #endif
 5445     else
 5446     {
 5447       TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
 5448       /* clean up TD layer's IORequestBody */
 5449       TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
 5450       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 5451       TI_DBG1(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
 5452       ostiFreeMemory(
 5453                      tiRoot,
 5454                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5455                      sizeof(tdIORequestBody_t)
 5456                      );
 5457     }
 5458   }
 5459   else if (flag == 0)
 5460   {
 5461     TI_DBG2(("ossaSSPAbortCB: abort one\n"));
 5462     if (status == OSSA_IO_SUCCESS)
 5463     {
 5464       TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
 5465       ostiFreeMemory(
 5466                      tiRoot,
 5467                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5468                      sizeof(tdIORequestBody_t)
 5469                      );
 5470 
 5471     }
 5472     else if (status == OSSA_IO_NOT_VALID)
 5473     {
 5474       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
 5475       ostiFreeMemory(
 5476                      tiRoot,
 5477                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5478                      sizeof(tdIORequestBody_t)
 5479                      );
 5480     }
 5481     else if (status == OSSA_IO_NO_DEVICE)
 5482     {
 5483       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
 5484       ostiFreeMemory(
 5485                      tiRoot,
 5486                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5487                      sizeof(tdIORequestBody_t)
 5488                      );
 5489     }
 5490     else if (status == OSSA_IO_ABORT_IN_PROGRESS)
 5491     {
 5492       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
 5493       ostiFreeMemory(
 5494                      tiRoot,
 5495                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5496                      sizeof(tdIORequestBody_t)
 5497                      );
 5498     }
 5499 #ifdef REMOVED
 5500     else if (status == OSSA_IO_ABORT_DELAYED)
 5501     {
 5502       TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
 5503       ostiFreeMemory(
 5504                      tiRoot,
 5505                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5506                      sizeof(tdIORequestBody_t)
 5507                      );
 5508     }
 5509 #endif
 5510     else
 5511     {
 5512       TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
 5513       ostiFreeMemory(
 5514                      tiRoot,
 5515                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 5516                      sizeof(tdIORequestBody_t)
 5517                      );
 5518     }
 5519   }
 5520   else
 5521   {
 5522     TI_DBG1(("ossaSSPAbortCB: wrong flag %d\n", flag));
 5523   }
 5524 
 5525   return;
 5526 
 5527 }
 5528 #endif
 5529 
 5530 
 5531 /*****************************************************************************/
 5532 /*! \brief ossaLocalPhyControlCB
 5533  *
 5534  *
 5535  *  Purpose: This routine is called by lower layer to indicate the status of
 5536  *           phy operations
 5537  *
 5538  *  \param   agRoot:       Pointer to chip/driver Instance.
 5539  *  \param   phyId         Phy id
 5540  *  \param   phyOperation  Operation to be done on the phy
 5541  *  \param   status        Phy operation specific completion status
 5542  *  \param   parm          Additional parameter, phy operation and status specific
 5543  *
 5544  *
 5545  *  \return None.
 5546  *
 5547  */
 5548 /*****************************************************************************/
 5549 osGLOBAL void ossaLocalPhyControlCB(
 5550                       agsaRoot_t  *agRoot,
 5551                       agsaContext_t *agContext,
 5552                       bit32       phyId,
 5553                       bit32       phyOperation,
 5554                       bit32       status,
 5555                       void        *parm
 5556                       )
 5557 {
 5558 #ifdef REMVOED
 5559   agsaPhyErrCounters_t    *agPhyErrCounters;
 5560 #endif
 5561 #ifdef INITIATOR_DRIVER
 5562   tdsaRootOsData_t         *osData = (tdsaRootOsData_t *)agRoot->osData;
 5563   tiRoot_t                 *tiRoot = (tiRoot_t *)osData->tiRoot;
 5564   tiIORequest_t            *currentTaskTag;
 5565   tdsaDeviceData_t         *TargetDeviceData;
 5566   satDeviceData_t          *pSatDevData;
 5567   agsaDevHandle_t          *agDevHandle = agNULL;
 5568   agsaContext_t            *agContextDevice;
 5569 #endif
 5570 
 5571   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yb");
 5572   TI_DBG3(("ossaLocalPhyControlCB: start phyID %d\n", phyId));
 5573   TI_DBG3(("ossaLocalPhyControlCB: phyOperation %d status 0x%x\n", phyOperation, status));
 5574   switch (phyOperation)
 5575   {
 5576   case AGSA_PHY_LINK_RESET: /* fall through */
 5577   case AGSA_PHY_HARD_RESET:
 5578     if (phyOperation == AGSA_PHY_LINK_RESET)
 5579     {
 5580       TI_DBG1(("ossaLocalPhyControlCB: AGSA_PHY_LINK_RESET, status 0x%x\n", status));
 5581     }
 5582     else
 5583     {
 5584       TI_DBG1(("ossaLocalPhyControlCB: AGSA_PHY_HARD_RESET, status 0x%x\n", status));
 5585     }
 5586 #ifdef INITIATOR_DRIVER
 5587     if (agContext != agNULL)
 5588     {
 5589       currentTaskTag = (tiIORequest_t *)agContext->osData;
 5590       if (status == OSSA_SUCCESS)
 5591       {
 5592         if (currentTaskTag != agNULL)
 5593         {
 5594           TI_DBG2(("ossaLocalPhyControlCB: callback to OS layer with success\n"));
 5595           TargetDeviceData = (tdsaDeviceData_t *)currentTaskTag->tdData;
 5596           pSatDevData = (satDeviceData_t *)&(TargetDeviceData->satDevData);
 5597           agDevHandle = TargetDeviceData->agDevHandle;
 5598           TI_DBG2(("ossaLocalPhyControlCB: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
 5599           TI_DBG2(("ossaLocalPhyControlCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
 5600           pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
 5601 
 5602           if (TargetDeviceData->TRflag == agTRUE)
 5603           {
 5604             saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, TargetDeviceData), agDevHandle, SA_DS_OPERATIONAL);
 5605             TargetDeviceData->TRflag = agFALSE;
 5606             ostiInitiatorEvent(tiRoot,
 5607                                TargetDeviceData->tdPortContext->tiPortalContext,
 5608                                &(TargetDeviceData->tiDeviceHandle),
 5609                                tiIntrEventTypeTransportRecovery,
 5610                                tiRecOK,
 5611                                agNULL
 5612                               );
 5613           }
 5614           else
 5615           {
 5616             agDevHandle = TargetDeviceData->agDevHandle;
 5617             if (agDevHandle == agNULL)
 5618             {
 5619               TI_DBG1(("ossaLocalPhyControlCB: wrong, agDevHandle is NULL\n"));
 5620             }
 5621             /* move this to OSSA_HW_EVENT_PORT_RESET_COMPLETE in ossaHwCB() */
 5622             agContextDevice = &(TargetDeviceData->agDeviceResetContext);
 5623             agContextDevice->osData = currentTaskTag;
 5624 
 5625 #ifdef REMOVED
 5626             ostiInitiatorEvent( tiRoot,
 5627                                 NULL,
 5628                                 NULL,
 5629                                 tiIntrEventTypeTaskManagement,
 5630                                 tiTMOK,
 5631                                 currentTaskTag );
 5632 #endif
 5633           }
 5634         }
 5635       }
 5636       else
 5637       {
 5638         if (currentTaskTag != agNULL)
 5639         {
 5640           TI_DBG1(("ossaLocalPhyControlCB: callback to OS layer with failure\n"));
 5641           TargetDeviceData = (tdsaDeviceData_t *)currentTaskTag->tdData;
 5642           pSatDevData = (satDeviceData_t *)&(TargetDeviceData->satDevData);
 5643           TI_DBG1(("ossaLocalPhyControlCB: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
 5644           TI_DBG1(("ossaLocalPhyControlCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
 5645           if (TargetDeviceData->TRflag == agTRUE)
 5646           {
 5647             TargetDeviceData->TRflag = agFALSE;
 5648             ostiInitiatorEvent(tiRoot,
 5649                                TargetDeviceData->tdPortContext->tiPortalContext,
 5650                                &(TargetDeviceData->tiDeviceHandle),
 5651                                tiIntrEventTypeTransportRecovery,
 5652                                tiRecFailed ,
 5653                                agNULL
 5654                               );
 5655           }
 5656           else
 5657           {
 5658             ostiInitiatorEvent( tiRoot,
 5659                                 NULL,
 5660                                 NULL,
 5661                                 tiIntrEventTypeTaskManagement,
 5662                                 tiTMFailed,
 5663                                 currentTaskTag );
 5664           }
 5665         }
 5666       }
 5667     }
 5668 #endif
 5669     break;
 5670 #ifdef REMOVED
 5671   case AGSA_PHY_GET_ERROR_COUNTS:
 5672 
 5673     TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_GET_ERROR_COUNTS, status 0x%x\n", status));
 5674     if(parm !=agNULL )
 5675     {
 5676       agPhyErrCounters = (agsaPhyErrCounters_t *)parm;
 5677       TI_DBG2(("ossaLocalPhyControlCB: invalidDword %d\n", agPhyErrCounters->invalidDword));
 5678       TI_DBG2(("ossaLocalPhyControlCB: runningDisparityError %d\n", agPhyErrCounters->runningDisparityError));
 5679       TI_DBG2(("ossaLocalPhyControlCB: lostOfDwordSynch %d\n", agPhyErrCounters->lossOfDwordSynch));
 5680       TI_DBG2(("ossaLocalPhyControlCB: phyResetProblem %d\n", agPhyErrCounters->phyResetProblem));
 5681       TI_DBG2(("ossaLocalPhyControlCB: elasticityBufferOverflow %d\n", agPhyErrCounters->elasticityBufferOverflow));
 5682       TI_DBG2(("ossaLocalPhyControlCB: receivedErrorPrimitive %d\n", agPhyErrCounters->receivedErrorPrimitive));
 5683     }
 5684     break;
 5685   case AGSA_PHY_CLEAR_ERROR_COUNTS:
 5686     TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_CLEAR_ERROR_COUNTS, status 0x%x\n", status));
 5687     break;
 5688 #endif
 5689   case AGSA_PHY_NOTIFY_ENABLE_SPINUP:
 5690     TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_NOTIFY_ENABLE_SPINUP, status 0x%x\n", status));
 5691     break;
 5692   case AGSA_PHY_BROADCAST_ASYNCH_EVENT:
 5693     TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_BROADCAST_ASYNCH_EVENT, status 0x%x\n", status));
 5694     if (tIsSPC12SATA(agRoot))
 5695     {
 5696       TI_DBG1(("ossaLocalPhyControlCB: BROADCAST_ASYNCH_EVENT received for SATA Controller\n"));
 5697       break;
 5698     }
 5699     break;
 5700   case AGSA_PHY_COMINIT_OOB :
 5701     TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_COMINIT_OOB, status 0x%x\n", status));
 5702     break;
 5703   default:
 5704     TI_DBG1(("ossaLocalPhyControlCB: UNKNOWN default case. phyOperation %d status 0x%x\n", phyOperation, status));
 5705     break;
 5706   }
 5707   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yb");
 5708   return;
 5709 }
 5710 
 5711 GLOBAL void   ossaGetPhyProfileCB(
 5712                       agsaRoot_t    *agRoot,
 5713                       agsaContext_t *agContext,
 5714                       bit32         status,
 5715                       bit32         ppc,
 5716                       bit32         phyID,
 5717                       void          *parm )
 5718 {
 5719 
 5720   tdsaRootOsData_t  *osData        = (tdsaRootOsData_t *)agRoot->osData;
 5721   tiRoot_t          *tiRoot        = (tiRoot_t *)osData->tiRoot;
 5722   tdsaRoot_t        *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 5723   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 5724 #ifdef CCFLAGS_PHYCONTROL_COUNTS
 5725   agsaPhyAnalogSettingsPage_t *analog;
 5726 #endif /* CCFLAGS_PHYCONTROL_COUNTS   */
 5727   tdPhyCount_t      *PhyBlob = agNULL;
 5728 
 5729   agsaPhyBWCountersPage_t       *agBWCounters;
 5730   agsaPhyErrCountersPage_t      *agPhyErrCounters;
 5731   TI_DBG1(("ossaGetPhyProfileCB: agContext %p parm %p\n", agContext, parm));
 5732 /*
 5733   if(  tdsaAllShared->tdFWControlEx.inProgress )
 5734   {
 5735     tdsaAllShared->tdFWControlEx.inProgress = 0;
 5736     PhyBlob = (tdPhyCount_t  *)tdsaAllShared->tdFWControlEx.usrAddr;
 5737   }
 5738 */
 5739   switch(ppc)
 5740   {
 5741     case  AGSA_SAS_PHY_BW_COUNTERS_PAGE:
 5742       TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_BW_COUNTERS_PAGE, status 0x%x phyID %d\n", status, phyID));
 5743       if(parm !=agNULL )
 5744       {
 5745         agBWCounters = (agsaPhyBWCountersPage_t *)parm;
 5746         TI_DBG1(("ossaGetPhyProfileCB: RX %d TX %d\n", agBWCounters->RXBWCounter,agBWCounters->TXBWCounter));
 5747         if(PhyBlob !=agNULL )
 5748         {
 5749           PhyBlob->InvalidDword = 0;
 5750           PhyBlob->runningDisparityError = 0;
 5751           PhyBlob->codeViolation = 0;
 5752           PhyBlob->phyResetProblem = 0;
 5753           PhyBlob->inboundCRCError = 0;
 5754           PhyBlob->BW_rx = agBWCounters->RXBWCounter;
 5755           PhyBlob->BW_tx = agBWCounters->TXBWCounter;
 5756         }
 5757 
 5758       }
 5759       break;
 5760     case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
 5761       if(  tdsaAllShared->tdFWControlEx.inProgress )
 5762       {
 5763           tdsaAllShared->tdFWControlEx.inProgress = 0;
 5764           PhyBlob = (tdPhyCount_t  *)tdsaAllShared->tdFWControlEx.usrAddr;
 5765       }
 5766       TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_ERR_COUNTERS_PAGE, status 0x%x phyID %d\n", status, phyID));
 5767       if(parm !=agNULL )
 5768       {
 5769         agPhyErrCounters = (agsaPhyErrCountersPage_t *)parm;
 5770         if(PhyBlob !=agNULL )
 5771         {
 5772 
 5773           PhyBlob->InvalidDword          = agPhyErrCounters->invalidDword;
 5774           PhyBlob->runningDisparityError = agPhyErrCounters->runningDisparityError;
 5775           PhyBlob->LossOfSyncDW          = agPhyErrCounters->lossOfDwordSynch;
 5776           PhyBlob->codeViolation         = agPhyErrCounters->codeViolation;
 5777           PhyBlob->phyResetProblem       = agPhyErrCounters->phyResetProblem;
 5778           PhyBlob->inboundCRCError       = agPhyErrCounters->inboundCRCError;
 5779           PhyBlob->BW_rx = 0;
 5780           PhyBlob->BW_tx = 0;
 5781 
 5782           TI_DBG2(("ossaGetPhyProfileCB: invalidDword          %d\n", agPhyErrCounters->invalidDword));
 5783           TI_DBG2(("ossaGetPhyProfileCB: runningDisparityError %d\n", agPhyErrCounters->runningDisparityError));
 5784           TI_DBG2(("ossaGetPhyProfileCB: lostOfDwordSynch      %d\n", agPhyErrCounters->lossOfDwordSynch));
 5785           TI_DBG2(("ossaGetPhyProfileCB: phyResetProblem       %d\n", agPhyErrCounters->phyResetProblem));
 5786           TI_DBG2(("ossaGetPhyProfileCB: inboundCRCError       %d\n", agPhyErrCounters->inboundCRCError));
 5787         }
 5788       }
 5789       break;
 5790     case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
 5791       TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE status 0x%x phyID %d\n", status, phyID));
 5792       break;
 5793     case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
 5794       TI_DBG1(("ossaGetPhyProfileCB:AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE status 0x%x phyID %d\n", status, phyID));
 5795 #ifdef CCFLAGS_PHYCONTROL_COUNTS
 5796       if(parm !=agNULL )
 5797       {
 5798         analog = (agsaPhyAnalogSettingsPage_t *)parm;
 5799         TI_DBG1(("ossaGetPhyProfileCB: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
 5800           analog->Dword0, analog->Dword1, analog->Dword2, analog->Dword3, analog->Dword4,
 5801           analog->Dword5, analog->Dword6, analog->Dword7, analog->Dword8, analog->Dword9));
 5802         tdsaAllShared->analog[phyID].spaRegister0 = analog->Dword0;
 5803         tdsaAllShared->analog[phyID].spaRegister1 = analog->Dword1;
 5804         tdsaAllShared->analog[phyID].spaRegister2 = analog->Dword2;
 5805         tdsaAllShared->analog[phyID].spaRegister3 = analog->Dword3;
 5806         tdsaAllShared->analog[phyID].spaRegister4 = analog->Dword4;
 5807         saSetPhyProfile( agRoot,agContext,tdsaRotateQnumber(tiRoot, agNULL), AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE,sizeof(agsaPhyAnalogSetupRegisters_t),&tdsaAllShared->analog[phyID],phyID);
 5808       }
 5809 #endif /* CCFLAGS_PHYCONTROL_COUNTS   */
 5810      break;
 5811     case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
 5812     {
 5813       TI_DBG1(("ossaGetPhyProfileCB:AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE status 0x%x phyID %d\n", status, phyID));
 5814       if( parm !=agNULL )
 5815       {
 5816 #ifdef TD_DEBUG_ENABLE
 5817         agsaSASPhyOpenRejectRetryBackOffThresholdPage_t *Backoff =
 5818           (agsaSASPhyOpenRejectRetryBackOffThresholdPage_t *)parm;
 5819 #endif
 5820         TI_DBG2(("ossaGetPhyProfileCB: DW0 0x%X DW1 0x%X DW2 0x%X DW3 0x%X\n",
 5821                  Backoff->Dword0,Backoff->Dword1,
 5822                  Backoff->Dword2,Backoff->Dword3));
 5823        }
 5824       break;
 5825     }
 5826 
 5827     case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
 5828     {
 5829       agsaSASPhyGeneralStatusPage_t * GenStatus = NULL;
 5830 
 5831       TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_GENERAL_STATUS_PAGE status 0x%x phyID %d\n",
 5832                status, phyID));
 5833       if( parm !=agNULL )
 5834       {
 5835           GenStatus=
 5836           (agsaSASPhyGeneralStatusPage_t *)parm;
 5837         TI_DBG2(("ossaGetPhyProfileCB: "
 5838                  "AGSA_SAS_PHY_GENERAL_STATUS_PAGE status %d DW0 0x%x DW1 0x%x\n",
 5839                  status, GenStatus->Dword0, GenStatus->Dword1));
 5840       }
 5841       ostiGetPhyGeneralStatusRsp(tiRoot, GenStatus, phyID);
 5842 //      break;
 5843       return ;
 5844     }
 5845 
 5846     default:
 5847       TI_DBG1(("ossaGetPhyProfileCB: UNKNOWN default case. phyOperation %d status 0x%x\n", ppc, status));
 5848       break;
 5849 
 5850   }
 5851 
 5852   ostiGetPhyProfileIOCTLRsp(tiRoot, status);
 5853 
 5854 }
 5855 
 5856 
 5857 GLOBAL void ossaSetPhyProfileCB(
 5858                      agsaRoot_t    *agRoot,
 5859                      agsaContext_t *agContext,
 5860                      bit32         status,
 5861                      bit32         ppc,
 5862                      bit32         phyID,
 5863                      void          *parm )
 5864 {
 5865   TI_DBG1(("ossaSetPhyProfileCB:agContext %p status 0x%x ppc %d phyID %d parm %p\n",agContext, status, ppc, phyID,parm));
 5866 }
 5867 
 5868 
 5869 /*****************************************************************************/
 5870 /*! \brief ossaGetDeviceHandlesCB
 5871  *
 5872  *
 5873  *  Purpose: This routine is called by lower layer to corresponding to
 5874  *           saGetDeviceHandles()
 5875  *
 5876  *  \param   agRoot:       Pointer to chip/driver Instance.
 5877  *  \param   agContext:    Context of the get device handle request originally passed into
 5878  *                         saGetDeviceHandles().
 5879  *  \param   agPortContext:Pointer to this instance of a port context
 5880  *  \param   agDev:        Array containing pointers to the device handles
 5881 
 5882  *  \param   validDevs     Number of valid device handles
 5883  *
 5884  *
 5885  *  \return None.
 5886  *
 5887  *  \note - The scope is shared target and initiator.
 5888  *          For details, refer to SAS/SATA Low-Level API Specification
 5889  */
 5890 /*****************************************************************************/
 5891 osGLOBAL void ossaGetDeviceHandlesCB(
 5892                        agsaRoot_t           *agRoot,
 5893                        agsaContext_t        *agContext,
 5894                        agsaPortContext_t    *agPortContext,
 5895                        agsaDevHandle_t      *agDev[],
 5896                        bit32                validDevs
 5897                        )
 5898 {
 5899   TI_DBG2(("ossaGetDeviceHandlesCB: start\n"));
 5900   TI_DBG2(("ossaGetDeviceHandlesCB: validDevs %d\n", validDevs));
 5901   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yc");
 5902 #ifdef TO_DO
 5903   for (i = 0 ; i < validDevs ; i++)
 5904   {
 5905     agDev[i];
 5906   }
 5907 #endif
 5908   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yc");
 5909   return;
 5910 }
 5911 
 5912 /*****************************************************************************/
 5913 /*! \brief ossaGetDeviceInfoCB
 5914  *
 5915  *
 5916  *  Purpose: This routine is called by lower layer to corresponding to
 5917  *           saGetDeviceInfo()
 5918  *
 5919  *  \param   agRoot:       Pointer to chip/driver Instance.
 5920  *  \param   agDevHandle:  Handle of the device
 5921  *  \param   status:       status
 5922  *  \param   agInfo:       Pointer to the structure that describes device information
 5923  *
 5924  *
 5925  *  \return None.
 5926  *
 5927  *  \note - The scope is shared target and initiator.
 5928  *          For details, refer to SAS/SATA Low-Level API Specification
 5929  */
 5930 /*****************************************************************************/
 5931 osGLOBAL void ossaGetDeviceInfoCB(
 5932                     agsaRoot_t        *agRoot,
 5933                     agsaContext_t     *agContext,
 5934                     agsaDevHandle_t   *agDevHandle,
 5935                     bit32             status,
 5936                     void              *agInfo
 5937                     )
 5938 {
 5939   
 5940 #ifdef TD_DEBUG_ENABLE
 5941   agsaDeviceInfo_t       *agDeviceInfo;
 5942   agsaSASDeviceInfo_t    *agSASDeviceInfo;
 5943   agsaSATADeviceInfo_t   *agSATADeviceInfo;
 5944 #endif
 5945   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yd");
 5946 
 5947   TI_DBG1(("ossaGetDeviceInfoCB: start agContext %p\n",agContext));
 5948   switch (status)
 5949   {
 5950   case OSSA_DEV_INFO_INVALID_HANDLE:
 5951     TI_DBG1(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_INVALID_HANDLE\n"));
 5952     /*ostiGetDeviceInfoIOCTLRsp(tiRoot, status, agNULL);*/
 5953     break;
 5954   case OSSA_DEV_INFO_NO_EXTENDED_INFO:
 5955 #ifdef TD_DEBUG_ENABLE
 5956     agDeviceInfo = (agsaDeviceInfo_t *)agInfo;
 5957 #endif
 5958     TI_DBG1(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_NO_EXTENDED_INFO\n"));
 5959     TI_DBG1(("ossaGetDeviceInfoCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(agDeviceInfo)));
 5960     TI_DBG1(("ossaGetDeviceInfoCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(agDeviceInfo)));
 5961     TI_DBG1(("ossaGetDeviceInfoCB: devType_S_Rate 0x%08x\n", agDeviceInfo->devType_S_Rate));
 5962     TI_DBG1(("ossaGetDeviceInfoCB: firstBurstSize 0x%08x\n", agDeviceInfo->firstBurstSize));
 5963 
 5964     /*ostiPortEvent (tiRoot, tiGetDevInfo, tiSuccess,(void *)agContext );*/
 5965     /*ostiGetDeviceInfoIOCTLRsp(tiRoot, status, agDeviceInfo);*/
 5966     break;
 5967   case OSSA_DEV_INFO_SAS_EXTENDED_INFO:
 5968 #ifdef TD_DEBUG_ENABLE
 5969     agSASDeviceInfo = (agsaSASDeviceInfo_t *)agInfo;
 5970 #endif
 5971     TI_DBG2(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_SAS_EXTENDED_INFO\n"));
 5972     TI_DBG2(("ossaGetDeviceInfoCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agSASDeviceInfo->commonDevInfo)));
 5973     TI_DBG2(("ossaGetDeviceInfoCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agSASDeviceInfo->commonDevInfo)));
 5974     TI_DBG2(("ossaGetDeviceInfoCB: initiator_ssp_stp_smp %d\n", agSASDeviceInfo->initiator_ssp_stp_smp));
 5975     TI_DBG2(("ossaGetDeviceInfoCB: target_ssp_stp_smp %d\n", agSASDeviceInfo->target_ssp_stp_smp));
 5976     TI_DBG2(("ossaGetDeviceInfoCB: numOfPhys %d\n", agSASDeviceInfo->numOfPhys));
 5977     TI_DBG2(("ossaGetDeviceInfoCB: phyIdentifier %d\n", agSASDeviceInfo->phyIdentifier));
 5978 
 5979     break;
 5980   case OSSA_DEV_INFO_SATA_EXTENDED_INFO:
 5981 #ifdef TD_DEBUG_ENABLE
 5982     agSATADeviceInfo = (agsaSATADeviceInfo_t *)agInfo;
 5983 #endif
 5984     TI_DBG2(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_SATA_EXTENDED_INFO\n"));
 5985     TI_DBG2(("ossaGetDeviceInfoCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agSATADeviceInfo->commonDevInfo)));
 5986     TI_DBG2(("ossaGetDeviceInfoCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agSATADeviceInfo->commonDevInfo)));
 5987     TI_DBG2(("ossaGetDeviceInfoCB: connection %d\n", agSATADeviceInfo->connection));
 5988     TI_DBG2(("ossaGetDeviceInfoCB: portMultiplierField %d\n", agSATADeviceInfo->portMultiplierField));
 5989     TI_DBG2(("ossaGetDeviceInfoCB: stpPhyIdentifier %d\n", agSATADeviceInfo->stpPhyIdentifier));
 5990 #ifdef TD_DEBUG_ENABLE
 5991     tdhexdump("ossaGetDeviceInfoCB: signature", (bit8 *)agSATADeviceInfo->signature, 8);
 5992 #endif
 5993      break;
 5994   default:
 5995     TI_DBG2(("ossaGetDeviceInfoCB: error default case, status is %d\n", status));
 5996     break;
 5997   }
 5998   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yd");
 5999   return;
 6000 }
 6001 
 6002 /*****************************************************************************/
 6003 /*! \brief ossaDeviceRegistrationCB
 6004  *
 6005  *
 6006  *  Purpose: This routine is called by lower layer to corresponding to
 6007  *           saRegisterNewDevice()
 6008  *
 6009  *  \param   agRoot:       Pointer to chip/driver Instance.
 6010  *  \param   agContext:    Context of the get device handle request originally
 6011  *                         passed into saRegisterNewDevice().
 6012  *  \param   status:       status
 6013  *  \param   agDevHandle:  Pointer to the assigned device handle for the
 6014  *                         registered device.
 6015  *
 6016  *
 6017  *  \return None.
 6018  *
 6019  */
 6020 /*****************************************************************************/
 6021 osGLOBAL void ossaDeviceRegistrationCB(
 6022                          agsaRoot_t        *agRoot,
 6023                          agsaContext_t     *agContext,
 6024                          bit32             status,
 6025                          agsaDevHandle_t   *agDevHandle,
 6026                          bit32             deviceID
 6027                          )
 6028 {
 6029 #ifdef INITIATOR_DRIVER
 6030   tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
 6031   tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
 6032   tdsaRoot_t           *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 6033   tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6034   bit32                Indenom = tdsaAllShared->QueueConfig.numInboundQueues;
 6035   bit32                Outdenom = tdsaAllShared->QueueConfig.numOutboundQueues;
 6036   tdsaDeviceData_t     *oneDeviceData = (tdsaDeviceData_t *)agContext->osData;
 6037   tdsaPortContext_t    *onePortContext = oneDeviceData->tdPortContext;
 6038   tiPortalContext_t    *tiPortalContext = onePortContext->tiPortalContext;
 6039 #ifdef FDS_DM
 6040   dmRoot_t             *dmRoot = &(tdsaAllShared->dmRoot);
 6041   dmPortContext_t      *dmPortContext = &(onePortContext->dmPortContext);
 6042   dmDeviceInfo_t       dmDeviceInfo;
 6043   bit32                DMstatus = DM_RC_FAILURE;
 6044   bit16                ext = 0;
 6045   bit32                expanderType = 1;
 6046 #endif
 6047 
 6048 #if defined(FDS_DM) && !defined(FDS_SM)
 6049   bit32                IDstatus;
 6050 #endif
 6051 
 6052 #ifdef FDS_SM
 6053   smRoot_t             *smRoot = &(tdsaAllShared->smRoot);
 6054   bit32                SMstatus = SM_RC_FAILURE;
 6055 #endif
 6056   smTraceFuncEnter(hpDBG_VERY_LOUD,"Ye");
 6057   TI_DBG3(("ossaDeviceRegistrationCB: start status 0x%x\n",status));
 6058   TI_DBG3(("ossaDeviceRegistrationCB: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
 6059   TI_DBG3(("ossaDeviceRegistrationCB: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
 6060   TI_DBG3(("ossaDeviceRegistrationCB: did 0x%x\n", oneDeviceData->id));
 6061   TI_DBG3(("ossaDeviceRegistrationCB: deviceID 0x%x\n", deviceID));
 6062   TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle %p %p %p\n",agDevHandle,agDevHandle->osData,agDevHandle->sdkData ));
 6063 
 6064   /* transient period caused by tdssReportRemovals(), device was in the middle
 6065     of registration but port is invalidated
 6066   */
 6067   if (oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE
 6068       && oneDeviceData->DeviceType == TD_DEFAULT_DEVICE)
 6069   {
 6070     if (status == OSSA_SUCCESS)
 6071     {
 6072       TI_DBG2(("ossaDeviceRegistrationCB: transient, calling saDeregisterDeviceHandle, did %d\n", oneDeviceData->id));
 6073       oneDeviceData->agDevHandle = agDevHandle;
 6074       agDevHandle->osData = oneDeviceData;
 6075       if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
 6076       {
 6077         if (oneDeviceData->satDevData.IDDeviceValid == agFALSE)
 6078         {
 6079           saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, 0);
 6080         }
 6081         else
 6082         {
 6083           saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 6084         }
 6085       }
 6086       else
 6087       {
 6088         saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 6089       }
 6090     }
 6091     else if (status == OSSA_FAILURE_PORT_NOT_VALID_STATE || status == OSSA_ERR_PORT_STATE_NOT_VALID)
 6092     {
 6093       /* do nothing */
 6094       TI_DBG2(("ossaDeviceRegistrationCB: transient, do nothing did %d\n", oneDeviceData->id));
 6095     }
 6096     return;
 6097   }
 6098 
 6099   if (agDevHandle == agNULL)
 6100   {
 6101     TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle is NULL\n"));
 6102   }
 6103   else
 6104   {
 6105     TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle is NOT NULL\n"));
 6106   }
 6107 
 6108   switch (status)
 6109   {
 6110   case OSSA_SUCCESS:
 6111     TI_DBG3(("ossaDeviceRegistrationCB: success\n"));
 6112     TI_DBG2(("ossaDeviceRegistrationCB: Success did %d FW did 0x%x\n", oneDeviceData->id, deviceID));
 6113     TI_DBG2(("ossaDeviceRegistrationCB: Success pid %d\n", onePortContext->id));
 6114     if (agDevHandle == agNULL)
 6115     {
 6116       TI_DBG1(("ossaDeviceRegistrationCB: agDevHandle is NULL, wrong!\n"));
 6117       return;
 6118     }
 6119     oneDeviceData->agDevHandle = agDevHandle;
 6120     agDevHandle->osData = oneDeviceData;
 6121     oneDeviceData->registered = agTRUE;
 6122     oneDeviceData->InQID = oneDeviceData->id % Indenom;
 6123     oneDeviceData->OutQID = oneDeviceData->id % Outdenom;
 6124     onePortContext->RegisteredDevNums++;
 6125 
 6126     TI_DBG3(("ossaDeviceRegistrationCB: direct %d STP target %d target_ssp_stp_smp %d\n", oneDeviceData->directlyAttached, DEVICE_IS_STP_TARGET(oneDeviceData), oneDeviceData->target_ssp_stp_smp));
 6127     TI_DBG3(("ossaDeviceRegistrationCB: pid %d registeredNumDevice %d\n", onePortContext->id, onePortContext->RegisteredDevNums));
 6128     TI_DBG3(("ossaDeviceRegistrationCB: pid %d Count %d\n", onePortContext->id, onePortContext->Count));
 6129 
 6130 #ifdef FDS_DM
 6131     /* if device is an expander, register it to DM */
 6132     if (onePortContext->valid == agTRUE)
 6133     {
 6134       if (DEVICE_IS_SMP_TARGET(oneDeviceData))
 6135       {
 6136         TI_DBG1(("ossaDeviceRegistrationCB: calling dmRegisterDevice\n"));
 6137         TI_DBG1(("ossaDeviceRegistrationCB: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
 6138         TI_DBG1(("ossaDeviceRegistrationCB: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
 6139         /* set up dmDeviceInfo */
 6140         osti_memset(&dmDeviceInfo, 0, sizeof(dmDeviceInfo_t));
 6141         DEVINFO_PUT_SAS_ADDRESSLO(&dmDeviceInfo, oneDeviceData->SASAddressID.sasAddressLo);
 6142         DEVINFO_PUT_SAS_ADDRESSHI(&dmDeviceInfo, oneDeviceData->SASAddressID.sasAddressHi);
 6143         dmDeviceInfo.initiator_ssp_stp_smp = oneDeviceData->initiator_ssp_stp_smp;
 6144         dmDeviceInfo.target_ssp_stp_smp = oneDeviceData->target_ssp_stp_smp;
 6145         dmDeviceInfo.devType_S_Rate = oneDeviceData->agDeviceInfo.devType_S_Rate;
 6146         if (oneDeviceData->directlyAttached == agTRUE)
 6147         {
 6148           /* setting SMP bit */
 6149           ext = (bit16)(ext | 0x100);
 6150           expanderType = SA_IDFRM_GET_DEVICETTYPE(&onePortContext->sasIDframe);
 6151           ext = (bit16)( ext | (expanderType << 9));
 6152           /* setting MCN field to 0xF */
 6153           ext = (bit16)(ext | (bit16)(0xF << 11));
 6154           TI_DBG1(("ossaDeviceRegistrationCB: directlyAttached ext 0x%x\n", ext));
 6155           dmDeviceInfo.ext = ext;
 6156         }
 6157         DMstatus = dmRegisterDevice(dmRoot, dmPortContext, &dmDeviceInfo, oneDeviceData->agDevHandle);
 6158         if (DMstatus != DM_RC_SUCCESS)
 6159         {
 6160           TI_DBG1(("ossaDeviceRegistrationCB: dmRegisterDevice failed!!! 0x%x\n", DMstatus));
 6161         }
 6162       }
 6163     }
 6164 #endif /* FDS_DM */
 6165 #ifdef FDS_SM
 6166     /* if device is SATA, register it to SM */
 6167     if (onePortContext->valid == agTRUE)
 6168     {
 6169       if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
 6170       {
 6171         TI_DBG1(("ossaDeviceRegistrationCB: calling smRegisterDevice\n"));
 6172         if (oneDeviceData->directlyAttached == agTRUE)
 6173         {
 6174           SMstatus = smRegisterDevice(smRoot,
 6175                                       agDevHandle,
 6176                                       &(oneDeviceData->smDeviceHandle),
 6177                                       agNULL,
 6178                                       (bit32)oneDeviceData->phyID,
 6179                                       oneDeviceData->satDevData.satDeviceType);
 6180         }
 6181         else
 6182         {
 6183           if (oneDeviceData->ExpDevice == agNULL)
 6184           {
 6185             TI_DBG1(("ossaDeviceRegistrationCB: oneDeviceData->ExpDevice NULL!!!\n"));
 6186             return;
 6187           }
 6188           if (oneDeviceData->ExpDevice->agDevHandle == agNULL)
 6189           {
 6190             TI_DBG1(("ossaDeviceRegistrationCB: oneDeviceData->ExpDevice->agDevHandle NULL!!!\n"));
 6191           }
 6192           SMstatus = smRegisterDevice(smRoot,
 6193                                       agDevHandle,
 6194                                       &(oneDeviceData->smDeviceHandle),
 6195                                       oneDeviceData->ExpDevice->agDevHandle,
 6196                                       (bit32)oneDeviceData->phyID,
 6197                                       oneDeviceData->satDevData.satDeviceType);
 6198         }
 6199         if (SMstatus != SM_RC_SUCCESS)
 6200         {
 6201           TI_DBG1(("ossaDeviceRegistrationCB: smRegisterDevice failed!!! 0x%x\n", DMstatus));
 6202         }
 6203       }
 6204     }
 6205 #endif /* FDS_SM */
 6206     /* special case for directly attached targets */
 6207     if (oneDeviceData->directlyAttached == agTRUE)
 6208     {
 6209       TI_DBG3(("ossaDeviceRegistrationCB: directly attached did %d\n", oneDeviceData->id));
 6210       if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
 6211       {
 6212         TI_DBG3(("ossaDeviceRegistrationCB: SAS target\n"));
 6213         if (onePortContext->valid == agTRUE)
 6214         {
 6215           if (onePortContext->PortRecoverPhyID != 0xFF)
 6216           {
 6217             oneDeviceData->phyID = (bit8)onePortContext->PortRecoverPhyID;
 6218             onePortContext->PortRecoverPhyID = 0xFF;
 6219             TI_DBG3(("ossaDeviceRegistrationCB: PortRecoverPhyID %d\n", oneDeviceData->phyID));
 6220           }
 6221           /* link up and discovery ready event */
 6222           if (onePortContext->DiscoveryRdyGiven == agFALSE)
 6223           {
 6224             TI_DBG2(("ossaDeviceRegistrationCB: link up and discovery ready\n"));
 6225             TI_DBG3(("ossaDeviceRegistrationCB: phyID %d pid %d\n", oneDeviceData->phyID, onePortContext->id));
 6226             TI_DBG3(("ossaDeviceRegistrationCB: tiPortalContext %p\n", tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext));
 6227             TI_DBG3(("ossaDeviceRegistrationCB: onePortContext->tiPortalContext %p\n", onePortContext->tiPortalContext));
 6228             onePortContext->DiscoveryRdyGiven = agTRUE;
 6229             if (onePortContext->DiscoveryState != ITD_DSTATE_NOT_STARTED)
 6230             {
 6231               TI_DBG1(("ossaDeviceRegistrationCB: wrong discovery state 0x%x\n", onePortContext->DiscoveryState));
 6232             }
 6233             /* notifying link up */
 6234             ostiPortEvent (
 6235                            tiRoot,
 6236                            tiPortLinkUp,
 6237                            tiSuccess,
 6238                            (void *)onePortContext->tiPortalContext
 6239                            );
 6240 #ifdef INITIATOR_DRIVER
 6241             /* triggers discovery */
 6242             ostiPortEvent(
 6243                           tiRoot,
 6244                           tiPortDiscoveryReady,
 6245                           tiSuccess,
 6246                           (void *)onePortContext->tiPortalContext
 6247                           );
 6248 #endif
 6249           }
 6250         }
 6251         else
 6252         {
 6253           TI_DBG2(("ossaDeviceRegistrationCB: abort call\n"));
 6254           /* abort all followed by deregistration of sas target */
 6255           tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
 6256         }
 6257       }
 6258       else
 6259       {
 6260         TI_DBG2(("ossaDeviceRegistrationCB: SATA target\n"));
 6261         if (onePortContext->valid == agTRUE)
 6262         {
 6263           if (oneDeviceData->satDevData.IDDeviceValid == agFALSE)
 6264           {
 6265 #ifdef FDS_SM
 6266             /* send identify device data */
 6267             tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
 6268 
 6269 #else
 6270             /* send identify device data */
 6271             tdssSubAddSATAToSharedcontext(tiRoot, oneDeviceData);
 6272 #endif
 6273           }
 6274         }
 6275         else
 6276         {
 6277           TI_DBG2(("ossaDeviceRegistrationCB: abort call\n"));
 6278           /* abort all followed by deregistration of sas target */
 6279           tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
 6280         }
 6281       }
 6282     }
 6283     else /* behind the expander */
 6284     {
 6285 #if defined(FDS_DM) && defined(FDS_SM)
 6286       /* send ID to SATA targets
 6287          needs go allocate tdIORequestBody_t for smIORequest
 6288       */
 6289 
 6290       if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
 6291           &&
 6292           oneDeviceData->satDevData.IDDeviceValid == agFALSE)
 6293       {
 6294         tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
 6295       }
 6296 
 6297 #elif defined(FDS_DM) /* worked with DM */
 6298       if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
 6299           &&
 6300           oneDeviceData->satDevData.IDDeviceValid == agFALSE)
 6301       {
 6302          IDstatus = tdsaDiscoveryStartIDDev(tiRoot,
 6303                                          agNULL,
 6304                                          &(oneDeviceData->tiDeviceHandle),
 6305                                          agNULL,
 6306                                          oneDeviceData);
 6307 
 6308         if (IDstatus != tiSuccess)
 6309         {
 6310           /* identify device data is not valid */
 6311           TI_DBG1(("ossaDeviceRegistrationCB: fail or busy %d\n", IDstatus));
 6312           oneDeviceData->satDevData.IDDeviceValid = agFALSE;
 6313         }
 6314       }
 6315 #endif
 6316 
 6317 
 6318    }
 6319     /* after discovery is finished */
 6320     if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
 6321     {
 6322       TI_DBG2(("ossaDeviceRegistrationCB: calling new device arrival\n"));
 6323       if (DEVICE_IS_SSP_TARGET(oneDeviceData))
 6324       {
 6325         /* in case registration is finished after discovery is finished */
 6326 #ifdef AGTIAPI_CTL
 6327         if (tdsaAllShared->SASConnectTimeLimit)
 6328           tdsaCTLSet(tiRoot, onePortContext, tiIntrEventTypeDeviceChange,
 6329                      tiDeviceArrival);
 6330         else
 6331 #endif
 6332           ostiInitiatorEvent(
 6333                              tiRoot,
 6334                              tiPortalContext,
 6335                              agNULL,
 6336                              tiIntrEventTypeDeviceChange,
 6337                              tiDeviceArrival,
 6338                              agNULL
 6339                              );
 6340       }
 6341       else if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
 6342                 &&
 6343                 oneDeviceData->satDevData.IDDeviceValid == agTRUE )
 6344       {
 6345         /* in case registration is finished after discovery is finished */
 6346         ostiInitiatorEvent(
 6347                            tiRoot,
 6348                            tiPortalContext,
 6349                            agNULL,
 6350                            tiIntrEventTypeDeviceChange,
 6351                            tiDeviceArrival,
 6352                            agNULL
 6353                            );
 6354       }
 6355     }
 6356     break;
 6357   case OSSA_FAILURE_OUT_OF_RESOURCE: /* fall through */
 6358   case OSSA_ERR_DEVICE_HANDLE_UNAVAILABLE:
 6359     TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_OUT_OF_RESOURCE or OSSA_ERR_DEVICE_HANDLE_UNAVAILABLE\n"));
 6360     oneDeviceData->registered = agFALSE;
 6361     break;
 6362   case OSSA_FAILURE_DEVICE_ALREADY_REGISTERED: /* fall through */
 6363   case OSSA_ERR_DEVICE_ALREADY_REGISTERED:
 6364     /* do nothing */
 6365     TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_DEVICE_ALREADY_REGISTERED or OSSA_ERR_DEVICE_ALREADY_REGISTERED\n"));
 6366     break;
 6367   case OSSA_FAILURE_INVALID_PHY_ID: /* fall through */
 6368   case OSSA_ERR_PHY_ID_INVALID:
 6369     TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_INVALID_PHY_ID or OSSA_ERR_PHY_ID_INVALID\n"));
 6370     oneDeviceData->registered = agFALSE;
 6371     break;
 6372   case OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED: /* fall through */
 6373   case OSSA_ERR_PHY_ID_ALREADY_REGISTERED:
 6374     /* do nothing */
 6375     TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED or OSSA_ERR_PHY_ID_ALREADY_REGISTERED\n"));
 6376     break;
 6377   case OSSA_FAILURE_PORT_ID_OUT_OF_RANGE: /* fall through */
 6378   case OSSA_ERR_PORT_INVALID:
 6379     TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_PORT_ID_OUT_OF_RANGE or OSSA_ERR_PORT_INVALID\n"));
 6380     oneDeviceData->registered = agFALSE;
 6381     break;
 6382   case OSSA_FAILURE_PORT_NOT_VALID_STATE: /* fall through */
 6383   case OSSA_ERR_PORT_STATE_NOT_VALID:
 6384     TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_PORT_NOT_VALID_STATE or OSSA_ERR_PORT_STATE_NOT_VALID\n"));
 6385     TI_DBG2(("ossaDeviceRegistrationCB: did %d pid %d\n", oneDeviceData->id, onePortContext->id));
 6386     oneDeviceData->registered = agFALSE;
 6387     /* transient period between link up and link down/port recovery */
 6388     onePortContext->Transient = agTRUE;
 6389     if (onePortContext->valid == agTRUE && (oneDeviceData->valid == agTRUE || oneDeviceData->valid2 == agTRUE))
 6390     {
 6391       TI_DBG1(("ossaDeviceRegistrationCB: retries regisration\n"));
 6392 #ifdef REMOVED
 6393       //temp; setting MCN to tdsaAllShared->MCN
 6394       oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | (tdsaAllShared->MCN << 16);
 6395       //end temp
 6396 #endif
 6397       saRegisterNewDevice( /* ossaDeviceRegistrationCB */
 6398                           agRoot,
 6399                           &oneDeviceData->agContext,
 6400                           0,
 6401                           &oneDeviceData->agDeviceInfo,
 6402                           onePortContext->agPortContext,
 6403                           0
 6404                          );
 6405     }
 6406     else if (oneDeviceData->directlyAttached == agTRUE && DEVICE_IS_SATA_DEVICE(oneDeviceData))
 6407     {
 6408       TI_DBG1(("ossaDeviceRegistrationCB: directly attached SATA, put back into free list\n"));
 6409       tdsaDeviceDataReInit(tiRoot, oneDeviceData);
 6410       tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 6411       TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
 6412       tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 6413     }
 6414     break;
 6415   case OSSA_FAILURE_DEVICE_TYPE_NOT_VALID: /* fall through */
 6416   case OSSA_ERR_DEVICE_TYPE_NOT_VALID:
 6417     TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_DEVICE_TYPE_NOT_VALID or OSSA_ERR_DEVICE_TYPE_NOT_VALID\n"));
 6418     oneDeviceData->registered = agFALSE;
 6419     break;
 6420   default:
 6421     TI_DBG1(("ossaDeviceRegistrationCB: wrong. default status is %d\n", status));
 6422     break;
 6423 
 6424 
 6425     }
 6426   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ye");
 6427   return;
 6428 #endif
 6429 }
 6430 
 6431 /*****************************************************************************/
 6432 /*! \brief ossaDeregisterDeviceHandleCB
 6433  *
 6434  *
 6435  *  Purpose: This routine is called by lower layer to corresponding to
 6436  *           saDeregisterDeviceHandle()
 6437  *
 6438  *  \param   agRoot:       Pointer to chip/driver Instance.
 6439  *  \param   agDevHandle:  Pointer to the assigned device handle for the
 6440  *                         registered device.
 6441  *  \param   status:       status
 6442  *
 6443  *
 6444  *  \return None.
 6445  *
 6446  */
 6447 /*****************************************************************************/
 6448 osGLOBAL void ossaDeregisterDeviceHandleCB(
 6449                              agsaRoot_t          *agRoot,
 6450                              agsaContext_t       *agContext,
 6451                              agsaDevHandle_t     *agDevHandle,
 6452                              bit32               status
 6453                              )
 6454 {
 6455   tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
 6456   tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
 6457   tdsaRoot_t           *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 6458   tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 6459   tdsaDeviceData_t     *oneDeviceData = agNULL;
 6460   tdsaPortContext_t    *onePortContext = agNULL;
 6461   agsaEventSource_t    *eventSource;
 6462   bit32                HwAckSatus;
 6463   bit32                PhyID;
 6464 #ifdef FDS_DM
 6465   dmRoot_t             *dmRoot = &(tdsaAllShared->dmRoot);
 6466   dmPortContext_t      *dmPortContext = agNULL;
 6467   dmPortInfo_t         dmPortInfo;
 6468   bit32                DMstatus = DM_RC_FAILURE;
 6469 #endif
 6470 #ifdef FDS_SM
 6471   smRoot_t             *smRoot = &(tdsaAllShared->smRoot);
 6472 #endif
 6473 
 6474   TI_DBG3(("ossaDeregisterDeviceHandleCB: start\n"));
 6475   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yf");
 6476 
 6477   if (status == OSSA_ERR_DEVICE_HANDLE_INVALID)
 6478   {
 6479     /* there is no device handle to process */
 6480     TI_DBG2(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_HANDLE_INVALID\n"));
 6481     return;
 6482   }
 6483 
 6484   oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
 6485   onePortContext = oneDeviceData->tdPortContext;
 6486 #ifdef FDS_DM
 6487   dmPortContext = &(onePortContext->dmPortContext);
 6488 #endif
 6489 
 6490   if (oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE &&
 6491       oneDeviceData->DeviceType == TD_DEFAULT_DEVICE && onePortContext->valid == agTRUE)
 6492   {
 6493     TI_DBG2(("ossaDeregisterDeviceHandleCB: transient did %d\n", oneDeviceData->id));
 6494     return;
 6495   }
 6496 
 6497   if (onePortContext != agNULL)
 6498   {
 6499     TI_DBG2(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d\n", onePortContext->id, onePortContext->RegisteredDevNums));
 6500   }
 6501 
 6502   switch (status)
 6503   {
 6504   case OSSA_SUCCESS:
 6505     TI_DBG3(("ossaDeregisterDeviceHandleCB: Success\n"));
 6506     if (onePortContext == agNULL)
 6507     {
 6508       TI_DBG1(("ossaDeregisterDeviceHandleCB: onePortContext is NULL, wrong!\n"));
 6509       return;
 6510     }
 6511     /* port is going down */
 6512     if (onePortContext->valid == agFALSE)
 6513     {
 6514       if (!(oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE && oneDeviceData->DeviceType == TD_DEFAULT_DEVICE))
 6515       {
 6516         /* remove oneDevice from MainLink */
 6517         TI_DBG2(("ossaDeregisterDeviceHandleCB: delete from MainLink\n"));
 6518 #ifdef FDS_SM
 6519         if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
 6520         {
 6521           TI_DBG1(("ossaDeregisterDeviceHandleCB: did %d calling smDeregisterDevice\n", oneDeviceData->id));
 6522           smDeregisterDevice(smRoot, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle));
 6523         }
 6524 #endif
 6525         tdsaDeviceDataReInit(tiRoot, oneDeviceData);
 6526         osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
 6527 
 6528         tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 6529         TDLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
 6530         TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
 6531         tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 6532       }
 6533       /* for portcontext */
 6534       PhyID = onePortContext->eventPhyID;
 6535       TI_DBG3(("ossaDeregisterDeviceHandleCB: PhyID %d\n", PhyID));
 6536       onePortContext->RegisteredDevNums--;
 6537       /*
 6538         check if valid in tdsaAllShared and the last registered device in a portcontext;
 6539         if so, call saHwEventAck()
 6540        */
 6541       if (tdsaAllShared->eventSource[PhyID].EventValid == agTRUE &&
 6542           onePortContext->RegisteredDevNums == 0 &&
 6543           PhyID != 0xFF
 6544           )
 6545       {
 6546         TI_DBG2(("ossaDeregisterDeviceHandleCB: calling saHwEventAck\n"));
 6547         eventSource = &(tdsaAllShared->eventSource[PhyID].Source);
 6548         HwAckSatus = saHwEventAck(
 6549                                   agRoot,
 6550                                   agNULL, /* agContext */
 6551                                   0,
 6552                                   eventSource, /* agsaEventSource_t */
 6553                                   0,
 6554                                   0
 6555                                   );
 6556         if ( HwAckSatus != AGSA_RC_SUCCESS)
 6557         {
 6558           TI_DBG1(("ossaDeregisterDeviceHandleCB: failing in saHwEventAck; status %d\n", HwAckSatus));
 6559         }
 6560 
 6561         /* toggle */
 6562         tdsaAllShared->eventSource[PhyID].EventValid = agFALSE;
 6563 
 6564 #ifdef FDS_DM
 6565         if (onePortContext->UseDM == agTRUE)
 6566         {
 6567           TI_DBG1(("ossaDeregisterDeviceHandleCB: calling dmDestroyPort\n"));
 6568           /* setup dmPortInfo */
 6569           PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(&dmPortInfo, onePortContext->sasRemoteAddressLo);
 6570           PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(&dmPortInfo, onePortContext->sasRemoteAddressHi);
 6571           PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(&dmPortInfo, onePortContext->sasLocalAddressLo);
 6572           PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(&dmPortInfo, onePortContext->sasLocalAddressHi);
 6573           DMstatus = dmDestroyPort(dmRoot, dmPortContext, &dmPortInfo);
 6574           if (DMstatus != DM_RC_SUCCESS)
 6575           {
 6576              TI_DBG1(("ossaDeregisterDeviceHandleCB: dmDestroyPort failed!!! 0x%x\n", DMstatus));
 6577           }
 6578         }
 6579 #endif
 6580         tdsaPortContextReInit(tiRoot, onePortContext);
 6581         /*
 6582           put all devices belonging to the onePortContext
 6583           back to the free link
 6584         */
 6585 
 6586         tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 6587         TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
 6588         TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaAllShared->FreePortContextList));
 6589         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 6590       }
 6591       else if (tdsaAllShared->eventSource[PhyID].EventValid == NO_ACK &&
 6592                onePortContext->RegisteredDevNums == 0
 6593               )
 6594       {
 6595         TI_DBG2(("ossaDeregisterDeviceHandleCB: NO ACK case\n"));
 6596 #ifdef FDS_DM
 6597         if (onePortContext->UseDM == agTRUE)
 6598         {
 6599           TI_DBG1(("ossaDeregisterDeviceHandleCB: calling dmDestroyPort\n"));
 6600           /* setup dmPortInfo */
 6601           PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(&dmPortInfo, onePortContext->sasRemoteAddressLo);
 6602           PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(&dmPortInfo, onePortContext->sasRemoteAddressHi);
 6603           PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(&dmPortInfo, onePortContext->sasLocalAddressLo);
 6604           PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(&dmPortInfo, onePortContext->sasLocalAddressHi);
 6605           DMstatus = dmDestroyPort(dmRoot, dmPortContext, &dmPortInfo);
 6606           if (DMstatus != DM_RC_SUCCESS)
 6607           {
 6608             TI_DBG1(("ossaDeregisterDeviceHandleCB: dmDestroyPort failed!!! 0x%x\n", DMstatus));
 6609           }
 6610         }
 6611 #endif
 6612         tdsaPortContextReInit(tiRoot, onePortContext);
 6613         /*
 6614           put all devices belonging to the onePortContext
 6615           back to the free link
 6616         */
 6617 
 6618         tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
 6619         TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
 6620         TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaAllShared->FreePortContextList));
 6621         tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
 6622       }
 6623       else
 6624       {
 6625         if (PhyID < TD_MAX_NUM_PHYS)
 6626         {
 6627           TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d eventvalid %d registeredNumDevice %d\n", onePortContext->id, tdsaAllShared->eventSource[PhyID].EventValid , onePortContext->RegisteredDevNums));
 6628         }
 6629         else
 6630         {
 6631           TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d wrong phyid %d\n", onePortContext->id, onePortContext->RegisteredDevNums, PhyID));
 6632         }
 6633       }
 6634     }
 6635     else
 6636     {
 6637       PhyID = onePortContext->eventPhyID;
 6638       TI_DBG3(("ossaDeregisterDeviceHandleCB: PhyID %d\n", PhyID));
 6639       onePortContext->RegisteredDevNums--;
 6640 #ifdef FDS_SM
 6641       oneDeviceData->satDevData.IDDeviceValid = agFALSE;
 6642       if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
 6643       {
 6644         smDeregisterDevice(smRoot, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle));
 6645       }
 6646 #endif
 6647       /*
 6648         check if valid in tdsaAllShared and the last registered device in a portcontext;
 6649         if so, call saHwEventAck()
 6650       */
 6651       if (tdsaAllShared->eventSource[PhyID].EventValid == agTRUE &&
 6652           onePortContext->RegisteredDevNums == 0 &&
 6653           PhyID != 0xFF
 6654           )
 6655       {
 6656         TI_DBG2(("ossaDeregisterDeviceHandleCB: calling saHwEventAck\n"));
 6657         eventSource = &(tdsaAllShared->eventSource[PhyID].Source);
 6658         HwAckSatus = saHwEventAck(
 6659                                   agRoot,
 6660                                   agNULL, /* agContext */
 6661                                   0,
 6662                                   eventSource, /* agsaEventSource_t */
 6663                                   0,
 6664                                   0
 6665                                   );
 6666         if ( HwAckSatus != AGSA_RC_SUCCESS)
 6667         {
 6668           TI_DBG1(("ossaDeregisterDeviceHandleCB: failing in saHwEventAck; status %d\n", HwAckSatus));
 6669         }
 6670 
 6671         /* toggle */
 6672         tdsaAllShared->eventSource[PhyID].EventValid = agFALSE;
 6673       }
 6674 #ifdef INITIATOR_DRIVER
 6675       else if (onePortContext->RegisteredDevNums == 1)
 6676       {
 6677         TI_DBG1(("ossaDeregisterDeviceHandleCB: all devices have been deregistered except directly attached EXP\n"));
 6678         /* qqqqq If broadcast has been seen, call incremental discovery*/
 6679         if (onePortContext->DiscFailNSeenBC == agTRUE)
 6680         {
 6681           TI_DBG1(("ossaDeregisterDeviceHandleCB: calling dmDiscover, incremental, pid %d\n", onePortContext->id));
 6682           dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_INCREMENTAL_START);
 6683           onePortContext->DiscFailNSeenBC = agFALSE;
 6684         }
 6685         else
 6686         {
 6687           TI_DBG1(("ossaDeregisterDeviceHandleCB: not calling dmDiscover\n"));
 6688           /* qqqqq needs to change discovery state to onePortContext->DMDiscoveryState == dmDiscCompleted
 6689              in dmQueryDiscovery
 6690              change the discovery state from dmDiscFailed to dmDiscCompleted
 6691           */
 6692           dmResetFailedDiscovery(dmRoot, dmPortContext);
 6693 
 6694         }
 6695       }
 6696 #endif
 6697       else
 6698       {
 6699         if (PhyID < TD_MAX_NUM_PHYS)
 6700         {
 6701           TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d eventvalid %d registeredNumDevice %d\n", onePortContext->id, tdsaAllShared->eventSource[PhyID].EventValid , onePortContext->RegisteredDevNums));
 6702         }
 6703         else
 6704         {
 6705           TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d wrong phyid %d\n", onePortContext->id, onePortContext->RegisteredDevNums, PhyID));
 6706         }
 6707       }
 6708     }
 6709     break;
 6710   case OSSA_INVALID_HANDLE:
 6711     TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_INVALID_HANDLE\n"));
 6712     break;
 6713 #ifdef REMOVED
 6714   case OSSA_FAILURE_DEVICE_DIRECT_ATTACH:
 6715     TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_FAILURE_DEVICE_DIRECT_ATTACH\n"));
 6716     break;
 6717 #endif
 6718   case OSSA_ERR_DEVICE_HANDLE_INVALID:
 6719     TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_HANDLE_INVALID\n"));
 6720     break;
 6721   case OSSA_ERR_DEVICE_BUSY:
 6722     TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_BUSY\n"));
 6723     break;
 6724   default:
 6725     TI_DBG1(("ossaDeregisterDeviceHandleCB: unknown status 0x%x\n", status));
 6726     break;
 6727   }
 6728 
 6729   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yf");
 6730   return;
 6731 }
 6732 
 6733 /*****************************************************************************/
 6734 /*! \brief ossaDeviceHandleRemovedEvent
 6735  *
 6736  *
 6737  *  Purpose: This routine is called by lower layer to notify the device removal
 6738  *
 6739  *
 6740  *  \param   agRoot:       Pointer to chip/driver Instance.
 6741  *  \param   agDevHandle:  Pointer to the assigned device handle for the
 6742  *                         registered device.
 6743  *  \param   agPortContext:Pointer to this instance of port context.
 6744  *
 6745  *
 6746  *  \return None.
 6747  *
 6748  */
 6749 /*****************************************************************************/
 6750 osGLOBAL void ossaDeviceHandleRemovedEvent (
 6751                                 agsaRoot_t        *agRoot,
 6752                                 agsaDevHandle_t   *agDevHandle,
 6753                                 agsaPortContext_t *agPortContext
 6754                                 )
 6755 {
 6756 #ifdef NOT_YET
 6757   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 6758   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 6759 #endif
 6760   tdsaPortContext_t *onePortContext = agNULL;
 6761   tdsaDeviceData_t  *oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
 6762 
 6763   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yg");
 6764   TI_DBG2(("ossaDeviceHandleRemovedEvent: start\n"));
 6765   if (oneDeviceData == agNULL)
 6766   {
 6767     TI_DBG1(("ossaDeviceHandleRemovedEvent: Wrong! oneDeviceData is NULL\n"));
 6768     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yg");
 6769     return;
 6770   }
 6771   TI_DBG2(("ossaDeviceHandleRemovedEvent: did %d\n", oneDeviceData->id));
 6772   oneDeviceData->registered = agFALSE;
 6773   onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
 6774   if (onePortContext == agNULL)
 6775   {
 6776     TI_DBG1(("ossaDeviceHandleRemovedEvent: Wrong! onePortContext is NULL\n"));
 6777     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Yg");
 6778     return;
 6779   }
 6780   TI_DBG2(("ossaDeviceHandleRemovedEvent: pid %d\n", onePortContext->id));
 6781   onePortContext->RegisteredDevNums--;
 6782 #ifdef NOT_YET
 6783   ostiInitiatorEvent(
 6784                      tiRoot,
 6785                      onePortContext->tiPortalContext,
 6786                      agNULL,
 6787                      tiIntrEventTypeDeviceChange,
 6788                      tiDeviceRemoval,
 6789                      agNULL
 6790                      );
 6791 #endif
 6792 
 6793   smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Yg");
 6794   return;
 6795 }
 6796 
 6797 #ifdef SPC_ENABLE_PROFILE
 6798 /*****************************************************************************/
 6799 /*! \brief ossaFwProfileCB
 6800  *
 6801  *
 6802  *  Purpose: This routine is called by lower layer to corresponding to
 6803  *           saFwProfile()
 6804  *
 6805  *  \param   agRoot:       Pointer to chip/driver Instance.
 6806  *  \param   agContext:    Context of the operation originally passed
 6807  *                         into saFwProfile()
 6808  *  \param   status:       status
 6809  *
 6810  *
 6811  *  \return None.
 6812  *
 6813  */
 6814 /*****************************************************************************/
 6815 osGLOBAL void ossaFwProfileCB(
 6816                     agsaRoot_t          *agRoot,
 6817                     agsaContext_t       *agContext,
 6818                     bit32                status,
 6819                     bit32                len)
 6820 {
 6821   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 6822   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 6823 
 6824   TI_DBG2(("ossaFwProfileCB: start\n"));
 6825 
 6826   switch (status)
 6827   {
 6828     case AGSA_RC_SUCCESS:
 6829     {
 6830       TI_DBG2(("ossaFwProfileCB: SUCCESS\n"));
 6831       break;
 6832     }
 6833     case AGSA_RC_FAILURE:
 6834     {
 6835       TI_DBG1(("ossaFwProfileCB: FAIL\n"));
 6836       break;
 6837     }
 6838     default:
 6839     {
 6840       TI_DBG1(("ossaFwProfileCB: !!! default, status %d\n", status));
 6841       break;
 6842     }
 6843   }
 6844 
 6845   ostiFWProfileIOCTLRsp(tiRoot, status, len);
 6846   return;
 6847 }
 6848 #endif
 6849 /*****************************************************************************/
 6850 /*! \brief ossaFwFlashUpdateCB
 6851  *
 6852  *
 6853  *  Purpose: This routine is called by lower layer to corresponding to
 6854  *           saFwFlashUpdate()
 6855  *
 6856  *  \param   agRoot:       Pointer to chip/driver Instance.
 6857  *  \param   agContext:    Context of the operation originally passed
 6858  *                         into saFwFlashUpdate()
 6859  *  \param   status:       status
 6860  *
 6861  *
 6862  *  \return None.
 6863  *
 6864  */
 6865 /*****************************************************************************/
 6866 osGLOBAL void ossaFwFlashUpdateCB(
 6867                     agsaRoot_t          *agRoot,
 6868                     agsaContext_t       *agContext,
 6869                     bit32               status
 6870                     )
 6871 {
 6872   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 6873   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 6874 
 6875   TI_DBG2(("ossaFwFlashUpdateCB: start\n"));
 6876 
 6877   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yh");
 6878   switch (status)
 6879   {
 6880   case OSSA_FLASH_UPDATE_COMPLETE_PENDING_REBOOT:
 6881   {
 6882     TI_DBG2(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_COMPLETE_PENDING_REBOOT\n"));
 6883     break;
 6884   }
 6885   case OSSA_FLASH_UPDATE_IN_PROGRESS:
 6886   {
 6887     TI_DBG2(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_IN_PROGRESS\n"));
 6888     break;
 6889   }
 6890   case OSSA_FLASH_UPDATE_HDR_ERR:
 6891   {
 6892     TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HDR_ERR\n"));
 6893     break;
 6894   }
 6895   case OSSA_FLASH_UPDATE_OFFSET_ERR:
 6896   {
 6897     TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_OFFSET_ERR\n"));
 6898     break;
 6899   }
 6900   case OSSA_FLASH_UPDATE_CRC_ERR:
 6901   {
 6902     TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_CRC_ERR\n"));
 6903     break;
 6904   }
 6905   case OSSA_FLASH_UPDATE_LENGTH_ERR:
 6906   {
 6907     TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_LENGTH_ERR\n"));
 6908     break;
 6909   }
 6910   case OSSA_FLASH_UPDATE_HW_ERR:
 6911   {
 6912     TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HW_ERR\n"));
 6913     break;
 6914   }
 6915   case OSSA_FLASH_UPDATE_DNLD_NOT_SUPPORTED:
 6916   {
 6917     TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_DNLD_NOT_SUPPORTED\n"));
 6918     break;
 6919   }
 6920   case OSSA_FLASH_UPDATE_DISABLED:
 6921   {
 6922     TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_DISABLED\n"));
 6923     break;
 6924   }
 6925   case OSSA_FLASH_FWDNLD_DEVICE_UNSUPPORT:
 6926   {
 6927     TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_FWDNLD_DEVICE_UNSUPPORT\n"));
 6928     break;
 6929   }
 6930   case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
 6931   {
 6932     TI_DBG1(("ossaFwFlashUpdateCB: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE\n"));
 6933     break;
 6934   }
 6935   case OSSA_FLASH_UPDATE_HMAC_ERR:
 6936   {
 6937     TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HMAC_ERR\n"));
 6938     break;
 6939   }
 6940 
 6941   default:
 6942   {
 6943     TI_DBG1(("ossaFwFlashUpdateCB: !!! default, status 0x%X\n", status));
 6944     break;
 6945   }
 6946   }
 6947 
 6948   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yh");
 6949   ostiCOMMgntIOCTLRsp(tiRoot, status);
 6950   return;
 6951 
 6952 }
 6953 
 6954 
 6955 GLOBAL void   ossaFlashExtExecuteCB(
 6956                       agsaRoot_t               *agRoot,
 6957                       agsaContext_t            *agContext,
 6958                       bit32                    status,
 6959                       bit32                    command,
 6960                       agsaFlashExtResponse_t  *agFlashExtRsp)
 6961 {
 6962     TI_DBG1(("ossaFlashExtExecuteCB: command  0x%X status 0x%X\n",command, status));
 6963 
 6964 }
 6965 
 6966 
 6967 
 6968 /*****************************************************************************/
 6969 /*! \brief ossaGetNVMDResponseCB
 6970  *
 6971  *
 6972  *  Purpose: This routine is called by lower layer to corresponding to
 6973  *           saGetNVMDCommand()
 6974  *
 6975  *  \param   agRoot:           Pointer to chip/driver Instance.
 6976  *  \param   agContext:        Context of the operation originally passed
 6977  *                             into saGetVPDCommand()
 6978  *  \param   status:           status
 6979  *  \param   indirectPayload:  The value passed in agsaNVMDData_t when
 6980  *                             calling saGetNVMDCommand()
 6981  *  \param   agInfoLen:        the length of VPD information
 6982  *  \param   agFrameHandle:    handler of VPD information
 6983  *
 6984  *
 6985  *  \return None.
 6986  *
 6987  */
 6988 /*****************************************************************************/
 6989 osGLOBAL void ossaGetNVMDResponseCB(
 6990                       agsaRoot_t                    *agRoot,
 6991                       agsaContext_t                 *agContext,
 6992                       bit32                         status,
 6993                       bit8                          indirectPayload,
 6994                       bit32                         agInfoLen,
 6995                       agsaFrameHandle_t             agFrameHandle
 6996 )
 6997 {
 6998   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 6999   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 7000   TI_DBG2(("ossaGetNVMDResponseCB: start\n"));
 7001   TI_DBG2(("ossaGetNVMDResponseCB: agInfoLen %d\n", agInfoLen));
 7002   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yi");
 7003 
 7004   if (status == OSSA_SUCCESS)
 7005   {
 7006     TI_DBG2(("ossaGetNVMDResponseCB: Success status\n"));
 7007     if (indirectPayload == 0 && agInfoLen != 0)
 7008     {
 7009       TI_DBG2(("ossaGetNVMDResponseCB: direct\n"));
 7010       tdhexdump("ossaGetNVMDResponseCB", (bit8 *)agFrameHandle, agInfoLen);
 7011     }
 7012   }
 7013   else
 7014   {
 7015     TI_DBG1(("ossaGetNVMDResponseCB: Status 0x%x\n", status));
 7016   }
 7017 
 7018   if (indirectPayload == 0)
 7019   {
 7020     TI_DBG2(("ossaGetNVMDResponseCB: direct\n"));
 7021   }
 7022   else
 7023   {
 7024     TI_DBG2(("ossaGetNVMDResponseCB: indirect\n"));
 7025   }
 7026 
 7027   ostiGetNVMDIOCTLRsp(tiRoot, status);
 7028   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
 7029   return;
 7030 }
 7031 
 7032 
 7033 /*****************************************************************************/
 7034 /*! \brief ossaSetNVMDResponseCB
 7035  *
 7036  *
 7037  *  Purpose: This routine is called by lower layer to corresponding to
 7038  *           saSetNVMDCommand()
 7039  *
 7040  *  \param   agRoot:       Pointer to chip/driver Instance.
 7041  *  \param   agContext:    Context of the operation originally passed
 7042  *                         into saSetVPDCommand()
 7043  *  \param   status:       status
 7044  *
 7045  *
 7046  *  \return None.
 7047  *
 7048  */
 7049 /*****************************************************************************/
 7050 osGLOBAL void ossaSetNVMDResponseCB(
 7051                       agsaRoot_t            *agRoot,
 7052                       agsaContext_t         *agContext,
 7053                       bit32                 status
 7054                       )
 7055 {
 7056   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 7057   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 7058   TI_DBG2(("ossaSetNVMDResponseCB: start\n"));
 7059   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yj");
 7060   if (status == OSSA_SUCCESS)
 7061   {
 7062     TI_DBG2(("ossaSetNVMDResponseCB: success\n"));
 7063   }
 7064   else
 7065   {
 7066     TI_DBG1(("ossaSetNVMDResponseCB: fail or undefined staus %d\n", status));
 7067   }
 7068   ostiSetNVMDIOCTLRsp(tiRoot, status);
 7069   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yj");
 7070   return;
 7071 }
 7072 
 7073 
 7074 #ifdef REMOVED
 7075 /*****************************************************************************/
 7076 /*! \brief ossaGetVPDResponseCB
 7077  *
 7078  *
 7079  *  Purpose: This routine is called by lower layer to corresponding to
 7080  *           saGetVPDCommand()
 7081  *
 7082  *  \param   agRoot:       Pointer to chip/driver Instance.
 7083  *  \param   agContext:    Context of the operation originally passed
 7084  *                         into saGetVPDCommand()
 7085  *  \param   status:       status
 7086  *  \param   agInfoLen:    the length of VPD information
 7087  *  \param   agFrameHandle:handler of VPD information
 7088  *
 7089  *
 7090  *  \return None.
 7091  *
 7092  */
 7093 /*****************************************************************************/
 7094 osGLOBAL void ossaGetVPDResponseCB(
 7095                      agsaRoot_t         *agRoot,
 7096                      agsaContext_t      *agContext,
 7097                      bit32              status,
 7098                      bit8               indirectMode,
 7099                      bit32              agInfoLen,
 7100                      agsaFrameHandle_t  agFrameHandle
 7101                      )
 7102 {
 7103   bit8 VPDData[48];
 7104 
 7105   TI_DBG2(("ossaGetVPDResponseCB: start\n"));
 7106 
 7107   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yk");
 7108   if (status == OSSA_SUCCESS)
 7109   {
 7110     TI_DBG2(("ossaGetVPDResponseCB: agInfoLen %d\n", agInfoLen));
 7111     osti_memset(VPDData, 0, 48);
 7112     /* We can read only in case of Direct */
 7113     saFrameReadBlock(agRoot, agFrameHandle, 0, VPDData, agInfoLen);
 7114     tdhexdump("ossaGetVPDResponseCB", (bit8 *)VPDData, agInfoLen);
 7115     /*
 7116       callback osti....
 7117     */
 7118   }
 7119   else
 7120   {
 7121     TI_DBG1(("ossaGetVPDResponseCB: fail or undefined staus %d\n", status));
 7122   }
 7123   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yk");
 7124   return;
 7125 }
 7126 
 7127 
 7128 /*****************************************************************************/
 7129 /*! \brief ossaSetVPDResponseCB
 7130  *
 7131  *
 7132  *  Purpose: This routine is called by lower layer to corresponding to
 7133  *           saSetVPDCommand()
 7134  *
 7135  *  \param   agRoot:       Pointer to chip/driver Instance.
 7136  *  \param   agContext:    Context of the operation originally passed
 7137  *                         into saSetVPDCommand()
 7138  *  \param   status:       status
 7139  *
 7140  *
 7141  *  \return None.
 7142  *
 7143  */
 7144 /*****************************************************************************/
 7145 osGLOBAL void ossaSetVPDResponseCB(
 7146                      agsaRoot_t         *agRoot,
 7147                      agsaContext_t      *agContext,
 7148                      bit32              status
 7149                      )
 7150 {
 7151   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 7152   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 7153 
 7154   TI_DBG2(("ossaSetVPDResponseCB: start\n"));
 7155   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yl");
 7156 
 7157   if (status == OSSA_SUCCESS)
 7158   {
 7159     TI_DBG2(("ossaSetVPDResponseCB: success\n"));
 7160     ostiCOMMgntVPDSetIOCTLRsp(tiRoot, 0);
 7161     /*
 7162       callback osti.....
 7163     */
 7164 
 7165 #ifdef VPD_TESTING
 7166     /* temporary to test saSetVPDCommand() and saGetVPDCommand */
 7167     tdsaVPDGet(tiRoot);
 7168 #endif
 7169 
 7170   }
 7171   else
 7172   {
 7173     TI_DBG1(("ossaSetVPDResponseCB: fail or undefined staus %d\n", status));
 7174   }
 7175   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yl");
 7176   return;
 7177 }
 7178 #endif
 7179 
 7180 /*****************************************************************************/
 7181 /*! \brief ossaEchoCB
 7182  *
 7183  *
 7184  *  Purpose: This routine is called by lower layer to corresponding to
 7185  *           saEchoCommand()
 7186  *
 7187  *  \param   agRoot:        Pointer to chip/driver Instance.
 7188  *  \param   agContext:     Context of the operation originally passed
 7189  *                          into saEchoCommand()
 7190  *  \param   echoPayload:   Pointer to the echo payload
 7191  *
 7192  *
 7193  *  \return None.
 7194  *
 7195  */
 7196 /*****************************************************************************/
 7197 osGLOBAL void ossaEchoCB(
 7198             agsaRoot_t      *agRoot,
 7199             agsaContext_t   *agContext,
 7200             void            *echoPayload
 7201           )
 7202 {
 7203 #ifdef ECHO_TESTING
 7204   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 7205   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 7206   bit8                payload[56];
 7207 #endif
 7208 
 7209   TI_DBG2(("ossaEchoCB: start\n"));
 7210   smTraceFuncEnter(hpDBG_VERY_LOUD,"Ym");
 7211 
 7212   /* dumping received echo payload is 56 bytes */
 7213   tdhexdump("ossaEchoCB: echoPayload", (bit8 *)(echoPayload), 56);
 7214 
 7215 #ifdef ECHO_TESTING
 7216   /* temporary to test saEchoCommand() */
 7217 
 7218   /* new echo payload */
 7219   osti_memset(payload,0, sizeof(payload));
 7220 
 7221   payload[0] = gEcho;
 7222   payload[55] = gEcho;
 7223 
 7224   TI_DBG2(("ossaEchoCB: gEcho %d\n", gEcho));
 7225 
 7226   saEchoCommand(agRoot, agNULL, tdsaRotateQnumber(tiRoot, agNULL), (void *)&payload);
 7227 
 7228   if (gEcho == 0xFF)
 7229   {
 7230     gEcho = 0;
 7231   }
 7232   else
 7233   {
 7234     gEcho++;
 7235   }
 7236 #endif
 7237 
 7238   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ym");
 7239   return;
 7240 }
 7241 
 7242 /*****************************************************************************/
 7243 /*! \brief ossaGpioResponseCB
 7244  *
 7245  *
 7246  *  Purpose: This routine is called by lower layer to corresponding to
 7247  *           saGpioEventSetup(), saGpioPinSetup(), saGpioRead(), or
 7248  *           saGpioWrite()
 7249  *
 7250  *  \param   agRoot:              Pointer to chip/driver Instance.
 7251  *  \param   agContext:           Context of the operation originally passed
 7252  *                                in.
 7253  *  \param   status:              GPIO operation completion status
 7254  *  \param   gpioReadValue:       a bit map containing the corresponding
 7255  *                                value for each GPIO pin.
 7256  *  \param   gpioPinSetupInfo:    Pointer to agsaGpioPinSetupInfo_t structure
 7257  *                                describing the GPIO pin setup
 7258  *  \param   gpioEventSetupInfo   Pointer to agsaGpioEventSetupInfo_t structure
 7259  *                                describing the GPIO event setups
 7260  *
 7261  *
 7262  *  \return None.
 7263  *
 7264  */
 7265 /*****************************************************************************/
 7266 osGLOBAL void ossaGpioResponseCB(
 7267                    agsaRoot_t               *agRoot,
 7268                    agsaContext_t            *agContext,
 7269                    bit32                    status,
 7270                    bit32                    gpioReadValue,
 7271                    agsaGpioPinSetupInfo_t   *gpioPinSetupInfo,
 7272                    agsaGpioEventSetupInfo_t *gpioEventSetupInfo
 7273                    )
 7274 {
 7275   TI_DBG2(("ossaGpioResponseCB: start\n"));
 7276   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yn");
 7277   if (status == OSSA_SUCCESS)
 7278   {
 7279     TI_DBG2(("ossaGpioResponseCB: Success\n"));
 7280     /* printing gpioReadValue, agsaGpioPinSetupInfo_t and agsaGpioEventSetupInfo_t */
 7281     TI_DBG2(("ossaGpioResponseCB: gpioReadValue 0x%x\n", gpioReadValue));
 7282     TI_DBG2(("ossaGpioResponseCB: PinSetupInfo gpioInputEnabled 0x%x\n", gpioPinSetupInfo->gpioInputEnabled));
 7283     TI_DBG2(("ossaGpioResponseCB: PinSetupInfo gpioTypePart1 0x%x\n", gpioPinSetupInfo->gpioTypePart1));
 7284     TI_DBG2(("ossaGpioResponseCB: PinSetupInfo gpioTypePart2 0x%x\n", gpioPinSetupInfo->gpioTypePart2));
 7285     TI_DBG2(("ossaGpioResponseCB: EventSetupInfo gpioEventLevel 0x%x\n", gpioEventSetupInfo->gpioEventLevel));
 7286     TI_DBG2(("ossaGpioResponseCB: EventSetupInfo gpioEventRisingEdge 0x%x\n", gpioEventSetupInfo->gpioEventRisingEdge));
 7287     TI_DBG2(("ossaGpioResponseCB: EventSetupInfo gpioEventFallingEdge 0x%x\n", gpioEventSetupInfo->gpioEventFallingEdge));
 7288   }
 7289   else
 7290   {
 7291     TI_DBG1(("ossaGpioResponseCB: Failure\n"));
 7292   }
 7293   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yn");
 7294   return;
 7295 }
 7296 
 7297 /*****************************************************************************/
 7298 /*! \brief ossaGpioEvent
 7299  *
 7300  *
 7301  *  Purpose: This routine is called by lower layer to corresponding to
 7302  *           saGpioEventSetup(), saGpioPinSetup(), saGpioRead(), or
 7303  *           saGpioWrite()
 7304  *
 7305  *  \param   agRoot:              Pointer to chip/driver Instance.
 7306  *  \param   gpioEvent:           a bit map that indicates which GPIO
 7307  *                                input pins have generated the event.
 7308  *
 7309  *
 7310  *  \return None.
 7311  *
 7312  */
 7313 /*****************************************************************************/
 7314 osGLOBAL void ossaGpioEvent(
 7315               agsaRoot_t    *agRoot,
 7316               bit32         gpioEvent
 7317               )
 7318 {
 7319   TI_DBG2(("ossaGpioEvent: start\n"));
 7320   TI_DBG2(("ossaGpioEvent: gpioEvent 0x%x\n", gpioEvent));
 7321   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yo");
 7322   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yo");
 7323   return;
 7324 }
 7325 
 7326 
 7327 /*****************************************************************************/
 7328 /*! \brief ossaSASDiagExecuteCB
 7329  *
 7330  *
 7331  *  Purpose: This routine is called by lower layer to corresponding to
 7332  *           saSASDiagExecute()
 7333  *
 7334  *  \param   agRoot:              Pointer to chip/driver Instance.
 7335  *  \param   agContext:           Context of the operation originally passed
 7336  *                                in.
 7337  *  \param   status:              Diagnostic operation completion status
 7338  *  \param   command:             SAS diagnostic command field in agsaSASDiagExecute_t
 7339  *                                structure passed in saSASDiagExecute().
 7340  *  \param   reportData:          Report Diagnostic Data
 7341  *
 7342  *
 7343  *  \return None.
 7344  *
 7345  */
 7346 /*****************************************************************************/
 7347 osGLOBAL void ossaSASDiagExecuteCB(
 7348                       agsaRoot_t      *agRoot,
 7349                       agsaContext_t   *agContext,
 7350                       bit32           status,
 7351                       bit32           command,
 7352                       bit32           reportData)
 7353 {
 7354   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yq");
 7355   TI_DBG2(("ossaSASDiagExecuteCB: start\n"));
 7356   TI_DBG2(("ossaSASDiagExecuteCB: status %d\n", status));
 7357   TI_DBG2(("ossaSASDiagExecuteCB: command %d\n", command));
 7358   TI_DBG2(("ossaSASDiagExecuteCB: reportData %d\n", reportData));
 7359 
 7360   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yq");
 7361   return;
 7362 
 7363 }
 7364 
 7365 
 7366 /*****************************************************************************/
 7367 /*! \brief ossaSASDiagStartEndCB
 7368  *
 7369  *
 7370  *  Purpose: This routine is called by lower layer to corresponding to
 7371  *           saSASDiagExecute()
 7372  *
 7373  *  \param   agRoot:              Pointer to chip/driver Instance.
 7374  *  \param   agContext:           Context of the operation originally passed
 7375  *                                in.
 7376  *  \param   status:              Diagnostic operation completion status
 7377  *
 7378  *
 7379  *  \return None.
 7380  *
 7381  */
 7382 /*****************************************************************************/
 7383 osGLOBAL void ossaSASDiagStartEndCB(
 7384                       agsaRoot_t        *agRoot,
 7385                       agsaContext_t     *agContext,
 7386                       bit32             status)
 7387 {
 7388   TI_DBG2(("ossaSASDiagStartEndCB: start\n"));
 7389   TI_DBG2(("ossaSASDiagStartEndCB: status %d\n", status));
 7390   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yr");
 7391   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yr");
 7392   return;
 7393 }
 7394 
 7395 /*****************************************************************************/
 7396 /*! \brief ossaReconfigSASParamsCB
 7397  *
 7398  *
 7399  *  Purpose: This routine is called by lower layer to corresponding to
 7400  *           saReconfigSASParams()
 7401  *
 7402  *  \param   agRoot:              Pointer to chip/driver Instance.
 7403  *  \param   agContext:           Context of the operation originally passed
 7404  *                                in saReconfigSASParams().
 7405  *  \param   status:              saReconfigSASParams() completion status
 7406  *  \param   agSASConfig:         Pointer to the data structure agsaSASReconfig_t
 7407  *
 7408  *
 7409  *  \return None.
 7410  *
 7411  */
 7412 /*****************************************************************************/
 7413 osGLOBAL void   ossaReconfigSASParamsCB(
 7414                         agsaRoot_t        *agRoot,
 7415                         agsaContext_t     *agContext,
 7416                         bit32             status,
 7417                         agsaSASReconfig_t *agSASConfig)
 7418 {
 7419   TI_DBG2(("ossaReconfigSASParamsCB: status %d\n", status));
 7420   return;
 7421 }
 7422 
 7423 GLOBAL void ossaPCIeDiagExecuteCB(
 7424             agsaRoot_t             *agRoot,
 7425             agsaContext_t         *agContext,
 7426             bit32                  status,
 7427             bit32                  command,
 7428             agsaPCIeDiagResponse_t *resp )
 7429 {
 7430   TI_DBG2(("ossaPCIeDiagExecuteCB: status %d\n", status));
 7431   TI_DBG2(("ossaPCIeDiagExecuteCB: ERR_BLKH 0x%X\n",resp->ERR_BLKH ));
 7432   TI_DBG2(("ossaPCIeDiagExecuteCB: ERR_BLKL 0x%X\n",resp->ERR_BLKL ));
 7433   TI_DBG2(("ossaPCIeDiagExecuteCB: DWord8 0x%X\n",resp->DWord8 ));
 7434   TI_DBG2(("ossaPCIeDiagExecuteCB: DWord9 0x%X\n",resp->DWord9 ));
 7435   TI_DBG2(("ossaPCIeDiagExecuteCB: DWord10 0x%X\n",resp->DWord10 ));
 7436   TI_DBG2(("ossaPCIeDiagExecuteCB: DWord11 0x%X\n",resp->DWord11 ));
 7437   TI_DBG2(("ossaPCIeDiagExecuteCB: DIF_ERR 0x%X\n",resp->DIF_ERR ));
 7438 
 7439   return;
 7440 }
 7441 
 7442 
 7443 #ifndef BIOS
 7444 GLOBAL void ossaSGpioCB(
 7445                     agsaRoot_t              *agRoot,
 7446                     agsaContext_t           *agContext, 
 7447                     agsaSGpioReqResponse_t  *pSgpioResponse
 7448                     )
 7449 {
 7450   tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
 7451   tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
 7452         
 7453   TI_DBG2(("ossaSGpioCB:  smpFrameType: 0x%02x \n", pSgpioResponse->smpFrameType));
 7454  // printf("SS:ossaSGpioCB:  smpFrameType: 0x%02x \n", pSgpioResponse->smpFrameType);
 7455   TI_DBG2(("ossaSGpioCB:  function: 0x%02x \n", pSgpioResponse->function));
 7456   TI_DBG2(("ossaSGpioCB:  functionResult: 0x%02x \n", pSgpioResponse->functionResult));
 7457   //printf("SS:ossaSGpioCB:  functionResult: 0x%02x \n", pSgpioResponse->functionResult);
 7458   
 7459   tdhexdump("ossaSGpioCB Response", (bit8 *)pSgpioResponse, sizeof(agsaSGpioReqResponse_t));
 7460   ostiSgpioIoctlRsp(tiRoot, pSgpioResponse);    
 7461 }
 7462 
 7463 #endif /* BIOS */
 7464 
 7465 /*****************************************************************************/
 7466 /*! \brief ossaLogDebugString
 7467  *
 7468  *
 7469  *  Purpose: This routine is called by lower layer to log.
 7470  *
 7471  *  \param   agRoot:              Pointer to chip/driver Instance.
 7472  *  \param   level:               Detail of information desired.
 7473  *  \param   string:              Pointer to the character string.
 7474  *  \param   ptr1:                First pointer value.
 7475  *  \param   ptr2:                Second pointer value.
 7476  *  \param   value1:              First 32-bit value related to the specific information.
 7477  *  \param   value2:              Second 32-bit value related to the specific information.
 7478  *
 7479  *  \return None.
 7480  *
 7481  */
 7482 /*****************************************************************************/
 7483 GLOBAL void ossaLogDebugString(
 7484                          agsaRoot_t   *agRoot,
 7485                          bit32        level,
 7486                          char         *string,
 7487                          void         *ptr1,
 7488                          void         *ptr2,
 7489                          bit32        value1,
 7490                          bit32        value2
 7491                          )
 7492 {
 7493 #if defined(SALLSDK_DEBUG)
 7494   TIDEBUG_MSG(gLLDebugLevel, level, ("%s %p %p %d %d\n", string, ptr1, ptr2, value1, value2));
 7495 #endif
 7496   return;
 7497 }
 7498 
 7499 /*****************************************************************************/
 7500 /*! \brief ossaHwEventAckCB
 7501  *
 7502  *
 7503  *  Purpose: This routine is called by lower layer to corresponding to
 7504  *           saHwEventAck(()
 7505  *
 7506  *  \param   agRoot:              Pointer to chip/driver Instance.
 7507  *  \param   agContext:           Context of the operation originally passed
 7508  *                                in.
 7509  *  \param   status:              Status
 7510  *
 7511  *
 7512  *  \return None.
 7513  *
 7514  */
 7515 /*****************************************************************************/
 7516 GLOBAL void ossaHwEventAckCB(
 7517                              agsaRoot_t         *agRoot,
 7518                              agsaContext_t      *agContext,
 7519                              bit32              status
 7520                              )
 7521 {
 7522   TI_DBG3(("ossaHwEventAckCB: start\n"));
 7523   smTraceFuncEnter(hpDBG_VERY_LOUD,"Ys");
 7524   if (status == tiSuccess)
 7525   {
 7526     TI_DBG3(("ossaHwEventAckCB: SUCCESS status\n"));
 7527   }
 7528   else
 7529   {
 7530     TI_DBG1(("ossaHwEventAckCB: FAIL status 0x%X\n", status));
 7531     TI_DBG1(("ossaHwEventAckCB: invalid event status bit0 %d\n", status & 0x01));
 7532     TI_DBG1(("ossaHwEventAckCB: invalid phyid status bit1 %d\n", (status & 0x02) >> 1 ));
 7533     TI_DBG1(("ossaHwEventAckCB: invalid portcontext status bit2 %d\n", (status & 0x04) >> 2));
 7534     TI_DBG1(("ossaHwEventAckCB: invalid param0 status bit3 %d\n", (status & 0x08) >> 3));
 7535   }
 7536 
 7537   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ys");
 7538   return;
 7539 }
 7540 
 7541 /*****************************************************************************/
 7542 /*! \brief ossaGetTimeStampCB
 7543  *
 7544  *
 7545  *  Purpose: This routine is called by lower layer to corresponding to
 7546  *           saGetTimeStamp()
 7547  *
 7548  *  \param   agRoot:              Pointer to chip/driver Instance.
 7549  *  \param   agContext:           Context of the operation originally passed
 7550  *                                in.
 7551  *  \param   timeStampLower:      The controller lower 32-bit of internal time
 7552  *                                stamp associated with event log.
 7553  *  \param   timeStampUpper:      The controller upper 32-bit of internal time
 7554  *                                stamp associated with event log.
 7555  *
 7556  *
 7557  *  \return None.
 7558  *
 7559  */
 7560 /*****************************************************************************/
 7561 GLOBAL void ossaGetTimeStampCB(
 7562                          agsaRoot_t    *agRoot,
 7563                          agsaContext_t *agContext,
 7564                          bit32         timeStampLower,
 7565                          bit32         timeStampUpper
 7566                          )
 7567 {
 7568   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yt");
 7569   TI_DBG4(("ossaGetTimeStampCB: start\n"));
 7570   TI_DBG4(("ossaGetTimeStampCB: timeStampUpper 0x%x timeStampLower 0x%x\n", timeStampUpper, timeStampLower));
 7571   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yt");
 7572   return;
 7573 }
 7574 
 7575 
 7576 /*****************************************************************************/
 7577 /*! \brief ossaSMPAbortCB
 7578  *
 7579  *
 7580  *  Purpose: This routine is called by lower layer to corresponding to
 7581  *           saSMPAbort()
 7582  *
 7583  *  \param   agRoot:              Pointer to chip/driver Instance.
 7584  *  \param   agIORequest:         This is the agIORequest parameter passed in
 7585  *                                saSMPAbort()
 7586  *  \param   status:              Status of abort
 7587  *
 7588  *  \return None.
 7589  *
 7590  */
 7591 /*****************************************************************************/
 7592 GLOBAL void ossaSMPAbortCB(
 7593                            agsaRoot_t           *agRoot,
 7594                            agsaIORequest_t      *agIORequest,
 7595                            bit32                flag,
 7596                            bit32                status)
 7597 {
 7598   tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
 7599   tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
 7600   tdIORequestBody_t       *tdAbortIORequestBody = agNULL;
 7601   tdsaDeviceData_t        *oneDeviceData        = agNULL;
 7602   tiDeviceHandle_t        *tiDeviceHandle       = agNULL;
 7603 
 7604   TI_DBG4(("ossaSMPAbortCB: start\n"));
 7605   TI_DBG4(("ossaSMPAbortCB: flag %d\n", flag));
 7606   TI_DBG4(("ossaSMPAbortCB: status %d\n", status));
 7607   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yu");
 7608 
 7609   tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 7610   if (tdAbortIORequestBody == agNULL)
 7611   {
 7612     TI_DBG1(("ossaSMPAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
 7613     return;
 7614   }
 7615 
 7616   if (flag == 2)
 7617   {
 7618     /* abort per port */
 7619     TI_DBG2(("ossaSMPAbortCB: abort per port\n"));
 7620   }
 7621   else if (flag == 1)
 7622   {
 7623     TI_DBG2(("ossaSMPAbortCB: abort all\n"));
 7624 
 7625     tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
 7626     if (tiDeviceHandle == agNULL)
 7627     {
 7628       TI_DBG1(("ossaSMPAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
 7629       ostiFreeMemory(
 7630                tiRoot,
 7631                tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7632                sizeof(tdIORequestBody_t)
 7633                );
 7634       return;
 7635     }
 7636 
 7637     oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
 7638     if (oneDeviceData == agNULL)
 7639     {
 7640       TI_DBG1(("ossaSMPAbortCB: oneDeviceData is NULL warning!!!!\n"));
 7641       ostiFreeMemory(
 7642                tiRoot,
 7643                tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7644                sizeof(tdIORequestBody_t)
 7645                );
 7646       return;
 7647     }
 7648 
 7649     if (status == OSSA_IO_SUCCESS)
 7650     {
 7651       TI_DBG2(("ossaSMPAbortCB: OSSA_IO_SUCCESS\n"));
 7652       /* clean up TD layer's IORequestBody */
 7653       TI_DBG3(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
 7654       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 7655       TI_DBG2(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
 7656       ostiFreeMemory(
 7657                      tiRoot,
 7658                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7659                      sizeof(tdIORequestBody_t)
 7660                      );
 7661 
 7662     }
 7663     else if (status == OSSA_IO_NOT_VALID)
 7664     {
 7665       TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NOT_VALID\n"));
 7666       /* clean up TD layer's IORequestBody */
 7667       TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
 7668       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 7669       TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
 7670       ostiFreeMemory(
 7671                      tiRoot,
 7672                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7673                      sizeof(tdIORequestBody_t)
 7674                      );
 7675     }
 7676     else if (status == OSSA_IO_NO_DEVICE)
 7677     {
 7678       TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NO_DEVICE\n"));
 7679       /* clean up TD layer's IORequestBody */
 7680       TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
 7681       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 7682       TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
 7683       ostiFreeMemory(
 7684                      tiRoot,
 7685                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7686                      sizeof(tdIORequestBody_t)
 7687                      );
 7688     }
 7689     else if (status == OSSA_IO_ABORT_IN_PROGRESS)
 7690     {
 7691       TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
 7692       /* clean up TD layer's IORequestBody */
 7693       TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
 7694       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 7695       TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
 7696       ostiFreeMemory(
 7697                      tiRoot,
 7698                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7699                      sizeof(tdIORequestBody_t)
 7700                      );
 7701     }
 7702 #ifdef REMOVED
 7703     else if (status == OSSA_IO_ABORT_DELAYED)
 7704     {
 7705       TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
 7706       /* clean up TD layer's IORequestBody */
 7707       TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
 7708       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 7709       TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
 7710       ostiFreeMemory(
 7711                      tiRoot,
 7712                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7713                      sizeof(tdIORequestBody_t)
 7714                      );
 7715     }
 7716 #endif
 7717     else
 7718     {
 7719       TI_DBG1(("ossaSMPAbortCB: other status %d\n", status));
 7720       /* clean up TD layer's IORequestBody */
 7721       TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
 7722       saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
 7723       TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
 7724       ostiFreeMemory(
 7725                      tiRoot,
 7726                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7727                      sizeof(tdIORequestBody_t)
 7728                      );
 7729     }
 7730   }
 7731   else if (flag == 0)
 7732   {
 7733     TI_DBG2(("ossaSMPAbortCB: abort one\n"));
 7734     if (status == OSSA_IO_SUCCESS)
 7735     {
 7736       TI_DBG2(("ossaSMPAbortCB: OSSA_IO_SUCCESS\n"));
 7737       ostiFreeMemory(
 7738                      tiRoot,
 7739                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7740                      sizeof(tdIORequestBody_t)
 7741                      );
 7742 
 7743     }
 7744     else if (status == OSSA_IO_NOT_VALID)
 7745     {
 7746       TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NOT_VALID\n"));
 7747       ostiFreeMemory(
 7748                      tiRoot,
 7749                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7750                      sizeof(tdIORequestBody_t)
 7751                      );
 7752     }
 7753     else if (status == OSSA_IO_NO_DEVICE)
 7754     {
 7755       TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NO_DEVICE\n"));
 7756       ostiFreeMemory(
 7757                      tiRoot,
 7758                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7759                      sizeof(tdIORequestBody_t)
 7760                      );
 7761     }
 7762     else if (status == OSSA_IO_ABORT_IN_PROGRESS)
 7763     {
 7764       TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
 7765       ostiFreeMemory(
 7766                      tiRoot,
 7767                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7768                      sizeof(tdIORequestBody_t)
 7769                      );
 7770     }
 7771 #ifdef REMOVED
 7772     else if (status == OSSA_IO_ABORT_DELAYED)
 7773     {
 7774       TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
 7775       ostiFreeMemory(
 7776                      tiRoot,
 7777                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7778                      sizeof(tdIORequestBody_t)
 7779                      );
 7780     }
 7781 #endif
 7782     else
 7783     {
 7784       TI_DBG1(("ossaSMPAbortCB: other status %d\n", status));
 7785       ostiFreeMemory(
 7786                      tiRoot,
 7787                      tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 7788                      sizeof(tdIORequestBody_t)
 7789                      );
 7790     }
 7791   }
 7792   else
 7793   {
 7794     TI_DBG1(("ossaSMPAbortCB: wrong flag %d\n", flag));
 7795   }
 7796 
 7797 
 7798   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yu");
 7799   return;
 7800 }
 7801 
 7802 /*****************************************************************************/
 7803 /*! \brief ossaGeneralEvent
 7804  *
 7805  *
 7806  *  Purpose: This is the event notification for debugging purposes sent to
 7807  *           inform the OS layer of some general error related to a specific
 7808  *           inbound operation.
 7809  *
 7810  *  \param   agRoot:              Pointer to chip/driver Instance.
 7811  *  \param   status:              Status associated with this event
 7812  *  \param   msg:                 Pointer to controller specific command
 7813  *                                massage that caused the error
 7814  *
 7815  *  \return None.
 7816  *
 7817  */
 7818 /*****************************************************************************/
 7819 GLOBAL void ossaGeneralEvent(
 7820                              agsaRoot_t    *agRoot,
 7821                              bit32         status,
 7822                              agsaContext_t *agContext,
 7823                              bit32         *msg)
 7824 {
 7825   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 7826   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 7827 
 7828   TI_DBG1(("ossaGeneralEvent: start\n"));
 7829   TI_DBG1(("ossaGeneralEvent: status %d\n", status));
 7830 
 7831   if(msg)
 7832   {
 7833     TI_DBG1(("ossaGeneralEvent: *msg %X\n", *msg));
 7834   }
 7835 
 7836   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yv");
 7837   ostiGenEventIOCTLRsp(tiRoot, status);
 7838   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yv");
 7839   return;
 7840 }
 7841 
 7842 GLOBAL void   ossaGetForensicDataCB (
 7843         agsaRoot_t         *agRoot,
 7844         agsaContext_t      *agContext,
 7845         bit32              status,
 7846         agsaForensicData_t *forensicData)
 7847 {
 7848   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 7849   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 7850 
 7851   ostiGetForensicDataIOCTLRsp(tiRoot, status, forensicData);
 7852   return;
 7853 }
 7854 
 7855 
 7856 #ifdef INITIATOR_DRIVER
 7857 
 7858 GLOBAL void ossaGetIOErrorStatsCB (
 7859                       agsaRoot_t               *agRoot,
 7860                       agsaContext_t            *agContext,
 7861                       bit32                     status,
 7862                       agsaIOErrorEventStats_t  *stats)
 7863 
 7864 {
 7865   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 7866   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 7867 
 7868   ostiGetIoErrorStatsIOCTLRsp(tiRoot, status, stats);
 7869 }
 7870 #else
 7871 GLOBAL void ossaGetIOErrorStatsCB (
 7872                       agsaRoot_t               *agRoot,
 7873                       agsaContext_t            *agContext,
 7874                       bit32                     status,
 7875                       agsaIOErrorEventStats_t  *stats)
 7876 
 7877 {
 7878 
 7879 }
 7880 
 7881 #endif
 7882 
 7883 GLOBAL void ossaGetIOEventStatsCB (
 7884                       agsaRoot_t               *agRoot,
 7885                       agsaContext_t            *agContext,
 7886                       bit32                     status,
 7887                       agsaIOErrorEventStats_t  *stats)
 7888 
 7889 {
 7890   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 7891   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 7892 
 7893   ostiGetIoEventStatsIOCTLRsp(tiRoot, status, stats);
 7894 }
 7895 
 7896 
 7897 /*****************************************************************************/
 7898 /*! \brief ossaGetRegisterDumpCB
 7899  *
 7900  *
 7901  *  Purpose: ossaGetRegisterDumpCB() is the response callback function
 7902  *           called by the LL Layer to indicate a response to
 7903  *           saGetRegisterDump()
 7904  *
 7905  *  \param   agRoot:              Pointer to chip/driver Instance.
 7906  *  \param   agContext:           Context of the operation originally
 7907  *                                passed into saGetRegisterDump()
 7908  *  \param   status:              status
 7909  *
 7910  *  \return None.
 7911  *
 7912  */
 7913 /*****************************************************************************/
 7914 GLOBAL void ossaGetRegisterDumpCB(
 7915                                   agsaRoot_t    *agRoot,
 7916                                   agsaContext_t *agContext,
 7917                                   bit32         status
 7918 )
 7919 {
 7920   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 7921   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 7922 
 7923   TI_DBG4(("ossaGetRegisterDumpCB: start\n"));
 7924   TI_DBG4(("ossaGetRegisterDumpCB: status %d\n", status));
 7925   smTraceFuncEnter(hpDBG_VERY_LOUD,"Yw");
 7926 
 7927   ostiRegDumpIOCTLRsp(tiRoot, status);
 7928   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yw");
 7929   return;
 7930 }
 7931 
 7932 /*****************************************************************************/
 7933 /*! \brief ossaSetDeviceStateCB
 7934  *
 7935  *
 7936  *  Purpose: ossaSetDeviceStateCB() is the response callback function
 7937  *           called by the LL Layer to indicate a response to
 7938  *           saSetDeviceState()
 7939  *
 7940  *  \param   agRoot:              Pointer to chip/driver Instance.
 7941  *  \param   agContext:           Context of the operation originally
 7942  *                                passed into saGetRegisterDump()
 7943  *  \param   agDevHandle          Pointer to the device handle of the device
 7944  *  \param   status:              status
 7945  *  \param   newDeviceState:      newly set device status
 7946  *  \param   previousDeviceState: old device status
 7947  *
 7948  *  \return None.
 7949  *
 7950  */
 7951 /*****************************************************************************/
 7952 GLOBAL void ossaSetDeviceStateCB(
 7953                                  agsaRoot_t         *agRoot,
 7954                                  agsaContext_t      *agContext,
 7955                                  agsaDevHandle_t    *agDevHandle,
 7956                                  bit32              status,
 7957                                  bit32              newDeviceState,
 7958                                  bit32              previousDeviceState
 7959                                  )
 7960 {
 7961   tdsaDeviceData_t            *oneDeviceData = agNULL;
 7962 
 7963   TI_DBG2(("ossaSetDeviceStateCB: start\n"));
 7964   TI_DBG2(("ossaSetDeviceStateCB: status %d\n", status));
 7965   TI_DBG2(("ossaSetDeviceStateCB: newDeviceState %d\n", newDeviceState));
 7966   TI_DBG2(("ossaSetDeviceStateCB: previousDeviceState %d\n", previousDeviceState));
 7967 
 7968   if (agDevHandle == agNULL)
 7969   {
 7970     TI_DBG4(("ossaSetDeviceStateCB: agDevHandle is NULL\n"));
 7971     return;
 7972   }
 7973 
 7974   oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
 7975 
 7976   if (oneDeviceData == agNULL)
 7977   {
 7978     TI_DBG1(("ossaSetDeviceStateCB: wrong; oneDeviceData is NULL\n"));
 7979   }
 7980   else
 7981   {
 7982     TI_DBG2(("ossaSetDeviceStateCB: did %d\n", oneDeviceData->id));
 7983   }
 7984 
 7985   return;
 7986 }
 7987 
 7988 /*****************************************************************************/
 7989 /*! \brief ossaGetDeviceStateCB
 7990  *
 7991  *
 7992  *  Purpose: ossaGetDeviceStateCB() is the response callback function
 7993  *           called by the LL Layer to indicate a response to
 7994  *           saGetDeviceState()
 7995  *
 7996  *  \param   agRoot:              Pointer to chip/driver Instance.
 7997  *  \param   agContext:           Context of the operation originally
 7998  *                                passed into saGetRegisterDump()
 7999  *  \param   agDevHandle          Pointer to the device handle of the device
 8000  *  \param   status:              status
 8001  *  \param   deviceState:         device status
 8002  *
 8003  *  \return None.
 8004  *
 8005  */
 8006 /*****************************************************************************/
 8007 GLOBAL void ossaGetDeviceStateCB(
 8008                                  agsaRoot_t         *agRoot,
 8009                                  agsaContext_t      *agContext,
 8010                                  agsaDevHandle_t    *agDevHandle,
 8011                                  bit32              status,
 8012                                  bit32              deviceState
 8013                                  )
 8014 {
 8015   TI_DBG4(("ossaGetDeviceStateCB: start\n"));
 8016   TI_DBG4(("ossaGetDeviceStateCB: status %d\n", status));
 8017   TI_DBG4(("ossaGetDeviceStateCB: deviceState %d\n", deviceState));
 8018 
 8019   return;
 8020 }
 8021 
 8022 #ifdef INITIATOR_DRIVER
 8023 /*****************************************************************************/
 8024 /*! \brief ossaIniSetDeviceInfoCB
 8025  *
 8026  *
 8027  *  Purpose: ossaIniSetDeviceInfoCB() is the response callback function
 8028  *           called by the LL Layer to indicate a response to
 8029  *           saSetDeviceInfo()
 8030  *
 8031  *  \param   agRoot:              Pointer to chip/driver Instance.
 8032  *  \param   agContext:           Context of the operation originally
 8033  *                                passed into saSetDeviceInfo()
 8034  *  \param   agDevHandle          Pointer to the device handle of the device
 8035  *  \param   status:              status
 8036  *  \param   option:              option parameter passed in saSetDeviceInfo()
 8037  *  \param   param:               param parameter passed in saSetDeviceInfo()
 8038  *
 8039  *  \return None.
 8040  *
 8041  */
 8042 /*****************************************************************************/
 8043 osGLOBAL void
 8044 ossaIniSetDeviceInfoCB(
 8045                         agsaRoot_t        *agRoot,
 8046                         agsaContext_t     *agContext,
 8047                         agsaDevHandle_t   *agDevHandle,
 8048                         bit32             status,
 8049                         bit32             option,
 8050                         bit32             param
 8051                       )
 8052 {
 8053   tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
 8054   tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
 8055   tdsaRoot_t             *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 8056   tdsaContext_t          *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 8057   itdsaIni_t             *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
 8058   bit32                  intContext = osData->IntContext;
 8059   tdIORequestBody_t      *tdIORequestBody = agNULL;
 8060   agsaIORequest_t        *agIORequest = agNULL;
 8061   bit32                  saStatus = AGSA_RC_FAILURE;
 8062   bit8                   devType_S_Rate;
 8063   tdsaDeviceData_t       *oneDeviceData = agNULL;
 8064 
 8065   TI_DBG4(("ossaIniSetDeviceInfoCB: start\n"));
 8066   TI_DBG4(("ossaIniSetDeviceInfoCB: status 0x%x\n", status));
 8067   TI_DBG4(("ossaIniSetDeviceInfoCB: option 0x%x\n", option));
 8068   TI_DBG4(("ossaIniSetDeviceInfoCB: param 0x%x\n", param));
 8069 
 8070   if (status != OSSA_SUCCESS)
 8071   {
 8072     TI_DBG1(("ossaIniSetDeviceInfoCB: status %d\n", status));
 8073     TI_DBG1(("ossaIniSetDeviceInfoCB: option 0x%x\n", option));
 8074     TI_DBG1(("ossaIniSetDeviceInfoCB: param 0x%x\n", param));
 8075     if (option == 32) /* set connection rate */
 8076     {
 8077       TI_DBG1(("ossaIniSetDeviceInfoCB: IO failure\n"));
 8078       agIORequest = (agsaIORequest_t *)agContext->osData;
 8079       tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 8080       ostiInitiatorIOCompleted(
 8081                                tiRoot,
 8082                                tdIORequestBody->tiIORequest,
 8083                                tiIOFailed,
 8084                                tiDetailOtherError,
 8085                                agNULL,
 8086                                intContext
 8087                                );
 8088     }
 8089   }
 8090   if (agDevHandle == agNULL)
 8091   {
 8092     TI_DBG4(("ossaIniSetDeviceInfoCB: agDevHandle is NULL\n"));
 8093     return;
 8094   }
 8095   oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
 8096   if (oneDeviceData == agNULL)
 8097   {
 8098     TI_DBG1(("ossaIniSetDeviceInfoCB: wrong; oneDeviceData is NULL\n"));
 8099     return;
 8100   }
 8101   else
 8102   {
 8103     TI_DBG4(("ossaIniSetDeviceInfoCB: did %d\n", oneDeviceData->id));
 8104   }
 8105 
 8106   /* retry IOs */
 8107   if (option == 32) /* set connection rate */
 8108   {
 8109     TI_DBG1(("ossaIniSetDeviceInfoCB: set connection rate option\n"));
 8110     agIORequest = (agsaIORequest_t *)agContext->osData;
 8111     tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
 8112     devType_S_Rate = oneDeviceData->agDeviceInfo.devType_S_Rate;
 8113     devType_S_Rate = (devType_S_Rate & 0xF0) | (param >> 28);
 8114     oneDeviceData->agDeviceInfo.devType_S_Rate =  devType_S_Rate;
 8115     TI_DBG1(("ossaIniSetDeviceInfoCB: new rate is 0x%x\n", DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo)));
 8116     if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
 8117         oneDeviceData->tdPortContext != agNULL )
 8118     {
 8119       saStatus = saSSPStart(agRoot,
 8120                             agIORequest,
 8121                             tdsaRotateQnumber(tiRoot, oneDeviceData),
 8122                             agDevHandle,
 8123                             tdIORequestBody->agRequestType,
 8124                             &(tdIORequestBody->transport.SAS.agSASRequestBody),
 8125                             agNULL,
 8126                             &ossaSSPCompleted);
 8127       if (saStatus == AGSA_RC_SUCCESS)
 8128       {
 8129         TI_DBG1(("ossaIniSetDeviceInfoCB: retried\n"));
 8130         Initiator->NumIOsActive++;
 8131         tdIORequestBody->ioStarted = agTRUE;
 8132         tdIORequestBody->ioCompleted = agFALSE;
 8133         return;
 8134       }
 8135       else
 8136       {
 8137         TI_DBG1(("ossaIniSetDeviceInfoCB: retry failed\n"));
 8138         tdIORequestBody->ioStarted = agFALSE;
 8139         tdIORequestBody->ioCompleted = agTRUE;
 8140         ostiInitiatorIOCompleted(
 8141                                  tiRoot,
 8142                                  tdIORequestBody->tiIORequest,
 8143                                  tiIOFailed,
 8144                                  tiDetailOtherError,
 8145                                  agNULL,
 8146                                  intContext
 8147                                  );
 8148        }
 8149     }
 8150   }
 8151   return;
 8152 }
 8153 #endif
 8154 /*****************************************************************************/
 8155 /*! \brief ossaSetDeviceInfoCB
 8156  *
 8157  *
 8158  *  Purpose: ossaSetDeviceInfoCB() is the response callback function
 8159  *           called by the LL Layer to indicate a response to
 8160  *           saSetDeviceInfo()
 8161  *
 8162  *  \param   agRoot:              Pointer to chip/driver Instance.
 8163  *  \param   agContext:           Context of the operation originally
 8164  *                                passed into saSetDeviceInfo()
 8165  *  \param   agDevHandle          Pointer to the device handle of the device
 8166  *  \param   status:              status
 8167  *  \param   option:              option parameter passed in saSetDeviceInfo()
 8168  *  \param   param:               param parameter passed in saSetDeviceInfo()
 8169  *
 8170  *  \return None.
 8171  *
 8172  */
 8173 /*****************************************************************************/
 8174 GLOBAL void ossaSetDeviceInfoCB(
 8175                                  agsaRoot_t         *agRoot,
 8176                                  agsaContext_t      *agContext,
 8177                                  agsaDevHandle_t    *agDevHandle,
 8178                                  bit32              status,
 8179                                  bit32              option,
 8180                                  bit32              param
 8181                                 )
 8182 {
 8183   tdsaDeviceData_t       *oneDeviceData = agNULL;
 8184 
 8185   TI_DBG4(("ossaSetDeviceInfoCB: start\n"));
 8186   TI_DBG4(("ossaSetDeviceInfoCB: status 0x%x\n", status));
 8187   TI_DBG4(("ossaSetDeviceInfoCB: option 0x%x\n", option));
 8188   TI_DBG4(("ossaSetDeviceInfoCB: param 0x%x\n", param));
 8189 
 8190   if (status != OSSA_SUCCESS)
 8191   {
 8192     TI_DBG1(("ossaSetDeviceInfoCB: status %d\n", status));
 8193     TI_DBG1(("ossaSetDeviceInfoCB: option 0x%x\n", option));
 8194     TI_DBG1(("ossaSetDeviceInfoCB: param 0x%x\n", param));
 8195   }
 8196 
 8197   if (agDevHandle == agNULL)
 8198   {
 8199     TI_DBG4(("ossaSetDeviceInfoCB: agDevHandle is NULL\n"));
 8200     return;
 8201   }
 8202 
 8203   oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
 8204 
 8205   if (oneDeviceData == agNULL)
 8206   {
 8207     TI_DBG1(("ossaSetDeviceInfoCB: wrong; oneDeviceData is NULL\n"));
 8208   }
 8209   else
 8210   {
 8211     TI_DBG4(("ossaSetDeviceInfoCB: did %d\n", oneDeviceData->id));
 8212   }
 8213 
 8214   return;
 8215 }
 8216 
 8217 /*****************************************************************************/
 8218 /*! \brief ossaGetDFEDataCB
 8219  *
 8220  *
 8221  *  Purpose: ossaGetDFEDataCB() is the response callback function
 8222  *           called by the LL Layer to indicate a response to
 8223  *           saGetDFEData()
 8224  *
 8225  *  \param   agRoot:              Pointer to chip/driver Instance.
 8226  *  \param   agContext:           Context of the operation originally
 8227  *                                passed into saGetDFEData()
 8228  *  \param   status:              status
 8229  *  \param   agInfoLen:           length in bytes of DFE data captured and transferred
 8230  *
 8231  *  \return None.
 8232  *
 8233  */
 8234 /*****************************************************************************/
 8235 GLOBAL void ossaGetDFEDataCB(
 8236                              agsaRoot_t     *agRoot,
 8237                              agsaContext_t  *agContext,
 8238                              bit32   status,
 8239                              bit32   agInfoLen)
 8240 {
 8241   TI_DBG1(("ossaGetDFEDataCB: start\n"));
 8242   TI_DBG1(("ossaGetDFEDataCB: status 0x%x agInfoLen 0x%x\n", status, agInfoLen));
 8243   return;
 8244 }
 8245 
 8246 /*****************************************************************************/
 8247 /*! \brief ossaVhistCaptureCB
 8248  *
 8249  *
 8250  *  Purpose: ossaVhistCaptureCB() is the response callback function
 8251  *           called by the LL Layer to indicate a response to
 8252  *           saGetDFEData()
 8253  *
 8254  *  \param   agRoot:              Pointer to chip/driver Instance.
 8255  *  \param   agContext:           Context of the operation originally
 8256  *                                passed into ()
 8257  *  \param   status:              status
 8258  *  \param   len:           length in bytes of Vis data captured and transferred
 8259  *
 8260  *  \return None.
 8261  *
 8262  */
 8263 /*****************************************************************************/
 8264 
 8265 void ossaVhistCaptureCB(
 8266         agsaRoot_t    *agRoot,
 8267         agsaContext_t *agContext,
 8268         bit32         status,
 8269         bit32         len)
 8270 {
 8271   TI_DBG1(("ossaVhistCaptureCB: start\n"));
 8272   TI_DBG1(("ossaVhistCaptureCB: status 0x%x agInfoLen 0x%x\n", status,len ));
 8273   return;
 8274 }
 8275 
 8276 GLOBAL void ossaOperatorManagementCB(
 8277                   agsaRoot_t    *agRoot,
 8278                   agsaContext_t *agContext,
 8279                   bit32          status,
 8280                   bit32          eq
 8281                   )
 8282 {
 8283   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 8284   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 8285   tiEncryptPort_t      encryptEventData;
 8286 
 8287   TI_DBG1(("ossaOperatorManagementCB: status 0x%x eq 0x%x\n", status, eq));
 8288 
 8289   osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
 8290   encryptEventData.encryptEvent = tiEncryptOperatorManagement;
 8291   encryptEventData.subEvent = eq;
 8292   encryptEventData.pData = agNULL;
 8293 
 8294   ostiPortEvent(tiRoot,
 8295               tiEncryptOperation,
 8296               status,
 8297               &encryptEventData);
 8298 }
 8299 
 8300 GLOBAL void ossaEncryptSelftestExecuteCB (
 8301                         agsaRoot_t    *agRoot,
 8302                         agsaContext_t *agContext,
 8303                         bit32          status,
 8304                         bit32          type,
 8305                         bit32          length,
 8306                         void          *TestResult
 8307                         )
 8308 {
 8309   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 8310   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 8311   tiEncryptPort_t      encryptEventData;
 8312 
 8313   TI_DBG1(("ossaEncryptSelftestExecuteCB: status 0x%x type 0x%x length 0x%x\n", status, type, length));
 8314 
 8315   osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
 8316   encryptEventData.encryptEvent = tiEncryptSelfTest;
 8317   encryptEventData.subEvent = type;
 8318   encryptEventData.pData = (void*)TestResult;
 8319 
 8320   ostiPortEvent(tiRoot,
 8321               tiEncryptOperation,
 8322               status,
 8323               &encryptEventData);
 8324 }
 8325 
 8326 GLOBAL void ossaGetOperatorCB(
 8327                agsaRoot_t    *agRoot,
 8328                agsaContext_t *agContext,
 8329                bit32          status,
 8330                bit32          option,
 8331                bit32          num,
 8332                bit32          role,
 8333                agsaID_t      *id
 8334                )
 8335 {
 8336 
 8337   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 8338   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 8339   tiEncryptPort_t      encryptEventData;
 8340 
 8341   TI_DBG1(("ossaGetOperatorCB: status 0x%x option 0x%x num 0x%x role 0x%x\n",
 8342                 status, option, num, role));
 8343   TI_DBG1(("ossaGetOperatorCB: agContext %p id %p\n",agContext,id));
 8344   osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
 8345   encryptEventData.encryptEvent = tiEncryptGetOperator;
 8346   encryptEventData.subEvent = option;
 8347   encryptEventData.pData = agNULL;
 8348 
 8349   switch(status)
 8350   {
 8351     case OSSA_IO_SUCCESS:
 8352       TI_DBG1(("ossaGetOperatorCB: OSSA_IO_SUCCESS option 0x%x\n", option));
 8353       if(option == 1)
 8354       {
 8355         TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[0], id->ID[1], id->ID[2], id->ID[3]));
 8356         TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[4], id->ID[5], id->ID[6], id->ID[7]));
 8357         TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[8], id->ID[9], id->ID[10],id->ID[11]));
 8358         TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[12],id->ID[13],id->ID[14],id->ID[15]));
 8359         TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[16],id->ID[17],id->ID[18],id->ID[19]));
 8360         TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[20],id->ID[21],id->ID[22],id->ID[23]));
 8361         TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[24],id->ID[25],id->ID[26],id->ID[27]));
 8362         TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x\n",       id->ID[28],id->ID[29],id->ID[30]));
 8363       }else if(option == 2)
 8364       {
 8365         TI_DBG1(("ossaGetOperatorCB: number operators 0x%02x\n", num ));
 8366       }
 8367 
 8368       encryptEventData.pData = id;
 8369       break;
 8370     case OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION:
 8371       TI_DBG1(("ossaGetOperatorCB: OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION 0x%x\n",option));
 8372       break;
 8373     case OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE:
 8374       TI_DBG1(("ossaGetOperatorCB: OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE 0x%x\n",option));
 8375       break;
 8376     default:
 8377       TI_DBG1(("ossaGetOperatorCB: Unknown status 0x%x\n",status));
 8378   }
 8379   ostiPortEvent(tiRoot,
 8380               tiEncryptOperation,
 8381               status,
 8382               &encryptEventData);
 8383 
 8384 }
 8385 
 8386 GLOBAL void ossaSetOperatorCB(
 8387               agsaRoot_t    *agRoot,
 8388               agsaContext_t *agContext,
 8389               bit32          status,
 8390               bit32          eq
 8391               )
 8392 {
 8393   tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
 8394   tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
 8395   tiEncryptPort_t      encryptEventData;
 8396 
 8397   TI_DBG1(("ossaSetOperatorCB: agContext %p status 0x%x eq 0x%x\n",agContext, status, eq));
 8398 
 8399   osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
 8400   encryptEventData.encryptEvent = tiEncryptSetOperator;
 8401   encryptEventData.subEvent = 0;
 8402   switch(status)
 8403   {
 8404     case OSSA_IO_SUCCESS:
 8405       TI_DBG1(("ossaSetOperatorCB: OSSA_IO_SUCCESS\n"));
 8406       encryptEventData.pData = agNULL;
 8407       break;
 8408     case OSSA_MPI_ENC_ERR_CONTROLLER_NOT_IDLE:
 8409       TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_CONTROLLER_NOT_IDLE\n"));
 8410       break;
 8411     case OSSA_MPI_ENC_OPERATOR_AUTH_FAILURE:
 8412       TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_AUTH_FAILURE error qualifier 0x%x\n",eq));
 8413       break;
 8414     case OSSA_MPI_ENC_OPERATOR_OPERATOR_ALREADY_LOGGED_IN:
 8415       TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_OPERATOR_ALREADY_LOGGED_IN\n"));
 8416       break;
 8417     case OSSA_MPI_ENC_OPERATOR_ILLEGAL_PARAMETER:
 8418       TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_ILLEGAL_PARAMETER\n"));
 8419       break;
 8420     case OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION:
 8421       TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION\n"));
 8422       break;
 8423     case OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE:
 8424       TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE\n"));
 8425       break;
 8426     default:
 8427       TI_DBG1(("ossaGetOperatorCB: Unknown status 0x%x\n",status));
 8428   }
 8429   ostiPortEvent(tiRoot,
 8430               tiEncryptOperation,
 8431               status,
 8432               &encryptEventData);
 8433 }
 8434 
 8435 GLOBAL void ossaDIFEncryptionOffloadStartCB(
 8436                              agsaRoot_t     *agRoot,
 8437                              agsaContext_t  *agContext,
 8438                              bit32   status,
 8439                              agsaOffloadDifDetails_t *agsaOffloadDifDetails)
 8440 {
 8441   TI_DBG1(("ossaDIFEncryptionOffloadStartCB: start\n"));
 8442   TI_DBG1(("ossaDIFEncryptionOffloadStartCB: status 0x%x agsaOffloadDifDetails=%p\n", status, agsaOffloadDifDetails));
 8443   return;
 8444 }
 8445 
 8446 GLOBAL bit32 ossaTimeStamp( agsaRoot_t     *agRoot )
 8447 {
 8448   tdsaRootOsData_t    *osData= agNULL;
 8449   tiRoot_t            *tiRoot= agNULL;
 8450   if(agRoot)
 8451   {
 8452     osData = (tdsaRootOsData_t *)agRoot->osData;
 8453   }
 8454   if(osData)
 8455   {
 8456     tiRoot = (tiRoot_t *)osData->tiRoot;
 8457   }
 8458   return(ostiTimeStamp(tiRoot));
 8459 } 
 8460 
 8461 GLOBAL bit64 ossaTimeStamp64( agsaRoot_t     *agRoot)
 8462 {
 8463   tdsaRootOsData_t    *osData= agNULL;
 8464   tiRoot_t            *tiRoot= agNULL;
 8465   if(agRoot)
 8466   {
 8467     osData = (tdsaRootOsData_t *)agRoot->osData;
 8468   }
 8469   if(osData)
 8470   {
 8471     tiRoot = (tiRoot_t *)osData->tiRoot;
 8472   }
 8473   return(ostiTimeStamp64(tiRoot));
 8474 } 
 8475 
 8476 #ifdef FDS_SM
 8477 osGLOBAL void
 8478 tdIDStartTimer(tiRoot_t                 *tiRoot,
 8479                   smIORequest_t            *smIORequest,
 8480                   tdsaDeviceData_t         *oneDeviceData
 8481                   )
 8482 {
 8483   tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 8484   tdsaContext_t               *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 8485   itdsaIni_t                  *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
 8486 
 8487   TI_DBG1(("tdIDStartTimer: start\n"));
 8488 
 8489   tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
 8490   if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
 8491   {
 8492     tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
 8493     tdsaKillTimer(
 8494                   tiRoot,
 8495                   &oneDeviceData->tdIDTimer
 8496                   );
 8497   }
 8498   else
 8499   {
 8500     tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
 8501   }
 8502 
 8503   tdsaSetTimerRequest(
 8504                       tiRoot,
 8505                       &oneDeviceData->tdIDTimer,
 8506                       SATA_ID_DEVICE_DATA_TIMER_VALUE/Initiator->OperatingOption.UsecsPerTick,
 8507                       tdIDStartTimerCB,
 8508                       smIORequest,
 8509                       oneDeviceData,
 8510                       agNULL
 8511                      );
 8512 
 8513   tdsaAddTimer(
 8514                tiRoot,
 8515                &Initiator->timerlist,
 8516                &oneDeviceData->tdIDTimer
 8517               );
 8518   TI_DBG1(("tdIDStartTimer: end\n"));
 8519   return;
 8520 }
 8521 
 8522 osGLOBAL void
 8523 tdIDStartTimerCB(
 8524                   tiRoot_t    * tiRoot,
 8525                   void        * timerData1,
 8526                   void        * timerData2,
 8527                   void        * timerData3
 8528                 )
 8529 {
 8530   tdsaRoot_t         *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
 8531   tdsaContext_t      *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 8532   smIORequest_t      *smIORequest;
 8533   tdsaDeviceData_t   *oneDeviceData;
 8534   smRoot_t           *smRoot;
 8535   tdIORequestBody_t  *tdIORequestBody;
 8536   smDeviceHandle_t   *smDeviceHandle;
 8537   tdsaPortContext_t  *onePortContext;
 8538 #ifdef REMOVED
 8539   agsaRoot_t         *agRoot;
 8540   bit32               IDstatus;
 8541 //#endif
 8542 //#ifdef REMOVED
 8543   agsaIORequest_t    *agAbortIORequest = agNULL;
 8544   tdIORequestBody_t  *tdAbortIORequestBody = agNULL;
 8545   bit32               PhysUpper32;
 8546   bit32               PhysLower32;
 8547   bit32               memAllocStatus;
 8548   void               *osMemHandle;
 8549 #endif // REMOVED
 8550 #ifdef  TD_DEBUG_ENABLE
 8551   bit32               status = AGSA_RC_FAILURE;
 8552 #endif
 8553 
 8554   TI_DBG1(("tdIDStartTimerCB start\n"));
 8555   smIORequest = (smIORequest_t *)timerData1;
 8556   oneDeviceData = (tdsaDeviceData_t *)timerData2;
 8557   smRoot = &(tdsaAllShared->smRoot);
 8558 #ifdef REMOVED
 8559   agRoot = oneDeviceData->agRoot;
 8560 #endif // REMOVED
 8561 
 8562   if (smIORequest == agNULL)
 8563   {
 8564     TI_DBG1(("tdIDStartTimerCB: smIORequest == agNULL !!!!!!\n"));
 8565     return;
 8566   }
 8567 
 8568   if (oneDeviceData == agNULL)
 8569   {
 8570     TI_DBG1(("tdIDStartTimerCB: oneDeviceData == agNULL !!!!!!\n"));
 8571     return;
 8572   }
 8573 
 8574   if (oneDeviceData->satDevData.IDPending == agFALSE || oneDeviceData->satDevData.IDDeviceValid == agTRUE)
 8575   {
 8576      /*the Identify Device command already normally completed, just return*/
 8577      return;
 8578   }
 8579 
 8580   tdIORequestBody = (tdIORequestBody_t *)smIORequest->tdData;
 8581   smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
 8582   onePortContext = oneDeviceData->tdPortContext;
 8583   if (tdIORequestBody == agNULL)
 8584   {
 8585     TI_DBG1(("tdIDStartTimerCB: tdIORequestBody == agNULL !!!!!!\n"));
 8586     return;
 8587   }
 8588 
 8589   if (smDeviceHandle == agNULL)
 8590   {
 8591     TI_DBG1(("tdIDStartTimerCB: smDeviceHandle == agNULL !!!!!!\n"));
 8592     return;
 8593   }
 8594 
 8595   if (onePortContext == agNULL)
 8596   {
 8597     TI_DBG1(("tdIDStartTimerCB: onePortContext == agNULL !!!!!!\n"));
 8598     return;
 8599   }
 8600 
 8601   TI_DBG1(("tdIDStartTimerCB: did %d\n", oneDeviceData->id));
 8602   /*
 8603    1. smIOabort()
 8604    2. in tdsmIDCompletedCB(), retry
 8605   */
 8606   if (oneDeviceData->valid == agFALSE)
 8607   {
 8608     TI_DBG1(("tdIDStartTimerCB: invalid device\n"));
 8609     return;
 8610   }
 8611 #ifdef  TD_DEBUG_ENABLE
 8612   status = smIOAbort( smRoot, smIORequest );
 8613 #else
 8614   smIOAbort( smRoot, smIORequest );
 8615 #endif
 8616 
 8617 #ifdef REMOVED
 8618   /* allocating agIORequest for abort itself */
 8619   memAllocStatus = ostiAllocMemory(
 8620                                    tiRoot,
 8621                                    &osMemHandle,
 8622                                    (void **)&tdAbortIORequestBody,
 8623                                    &PhysUpper32,
 8624                                    &PhysLower32,
 8625                                    8,
 8626                                    sizeof(tdIORequestBody_t),
 8627                                    agTRUE
 8628                                    );
 8629   if (memAllocStatus != tiSuccess)
 8630   {
 8631     /* let os process IO */
 8632     TI_DBG1(("tdIDStartTimerCB: ostiAllocMemory failed...; can't retry ID data \n"));
 8633     return;
 8634   }
 8635   if (tdAbortIORequestBody == agNULL)
 8636   {
 8637     /* let os process IO */
 8638     TI_DBG1(("tdIDStartTimerCB: ostiAllocMemory returned NULL tdAbortIORequestBody; can't retry ID data\n"));
 8639     return;
 8640   }
 8641   /* setup task management structure */
 8642   tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
 8643   /* setting callback but not used later */
 8644   tdAbortIORequestBody->IOCompletionFunc = agNULL;
 8645   //tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
 8646   tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(oneDeviceData->tiDeviceHandle);
 8647   /* initialize agIORequest */
 8648   agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
 8649   agAbortIORequest->osData = (void *) tdAbortIORequestBody;
 8650   agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
 8651 //#endif
 8652 //#ifdef REMOVED
 8653   status = saSATAAbort(agRoot,
 8654                        agAbortIORequest,
 8655                        0,
 8656                        oneDeviceData->agDevHandle,
 8657                        1, /* abort all */
 8658                        agNULL,
 8659                        ossaSATAIDAbortCB
 8660                        );
 8661   status = saSATAAbort(agRoot,
 8662                        agAbortIORequest,
 8663                        0,
 8664                        oneDeviceData->agDevHandle,
 8665                        0, /* abort one */
 8666                        agIORequest,
 8667                        ossaSATAIDAbortCB
 8668                        );
 8669 //#endif
 8670 //#ifdef REMOVED
 8671   if (status != AGSA_RC_SUCCESS)
 8672   {
 8673     TI_DBG1(("tdIDStartTimerCB: saSATAAbort failed; can't retry ID data\n"));
 8674   }
 8675   if (oneDeviceData->satDevData.IDDeviceValid == agTRUE)
 8676   {
 8677     TI_DBG1(("tdIDStartTimerCB: IDDeviceValid is valid, no need to retry\n"));
 8678     return;
 8679   }
 8680   if (tdIORequestBody->reTries <= SM_RETRIES)
 8681   {
 8682     tdIORequestBody->tiIORequest = agNULL; /* not in use */
 8683     tdIORequestBody->pid = onePortContext->id;
 8684     smIORequest->tdData = tdIORequestBody;
 8685     smIORequest->smData = &tdIORequestBody->smIORequestBody;
 8686     smDeviceHandle->tdData = oneDeviceData;
 8687     IDstatus = smIDStart(smRoot, smIORequest, smDeviceHandle );
 8688     if (IDstatus == SM_RC_SUCCESS)
 8689     {
 8690       TI_DBG1(("tdIDStartTimerCB: being retried!!!\n"));
 8691       tdIORequestBody->reTries++;
 8692       tdIORequestBody->ioCompleted = agFALSE;
 8693       tdIORequestBody->ioStarted = agTRUE;
 8694       tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
 8695     }
 8696     else
 8697     {
 8698       /* identify device data is not valid */
 8699       TI_DBG1(("tdIDStartTimerCB: smIDStart fail or busy %d!!!\n", IDstatus));
 8700       tdIORequestBody->reTries = 0;
 8701       tdIORequestBody->ioCompleted = agTRUE;
 8702       tdIORequestBody->ioStarted = agFALSE;
 8703       ostiFreeMemory( tiRoot,
 8704                       tdIORequestBody->osMemHandle,
 8705                       sizeof(tdIORequestBody_t)
 8706                     );
 8707       oneDeviceData->satDevData.IDDeviceValid = agFALSE;
 8708       smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
 8709       return;
 8710     }
 8711   }
 8712   else
 8713   {
 8714     /* give up */
 8715     TI_DBG1(("tdIDStartTimerCB: retries are over!!!\n"));
 8716     if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
 8717     {
 8718       tdsaKillTimer( tiRoot, &oneDeviceData->tdIDTimer );
 8719     }
 8720     tdIORequestBody->reTries = 0;
 8721     tdIORequestBody->ioCompleted = agTRUE;
 8722     tdIORequestBody->ioStarted = agFALSE;
 8723     ostiFreeMemory(
 8724                    tiRoot,
 8725                    tdIORequestBody->osMemHandle,
 8726                    sizeof(tdIORequestBody_t)
 8727             );
 8728     oneDeviceData->satDevData.IDDeviceValid = agFALSE;
 8729 
 8730     if (oneDeviceData->SMNumOfID <= 0) /* does SMP HARD RESET only upto one time */
 8731     {
 8732       TI_DBG1(("tdIDStartTimerCB: fail; sending HARD_RESET\n"));
 8733       oneDeviceData->SMNumOfID++;
 8734       if (oneDeviceData->directlyAttached == agTRUE)
 8735       {
 8736         saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_HARD_RESET, agNULL);
 8737       }
 8738       else
 8739       {
 8740         tdsaPhyControlSend(tiRoot,
 8741                            oneDeviceData,
 8742                            SMP_PHY_CONTROL_HARD_RESET,
 8743                            agNULL);
 8744       }
 8745     }
 8746     else
 8747     {
 8748       /* given up after one time of SMP HARD RESET; */
 8749       TI_DBG1(("tdIDStartTimerCB: fail; but giving up sending HARD_RESET!!!\n"));
 8750       if (oneDeviceData->directlyAttached == agTRUE)
 8751       {
 8752         smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
 8753       }
 8754       else
 8755       {
 8756         smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
 8757       }
 8758     }
 8759   }
 8760 #endif // REMOVED
 8761 
 8762   TI_DBG1(("tdIDStartTimerCB: end, smIOAbort status %d\n", status));
 8763   return;
 8764 }
 8765 #endif // FDS_SM
 8766 
 8767 
 8768 #if defined(FDS_DM) && defined(FDS_SM)
 8769 //start here
 8770 GLOBAL void
 8771 tdIDStart(
 8772            tiRoot_t             *tiRoot,
 8773            agsaRoot_t           *agRoot,
 8774            smRoot_t             *smRoot,
 8775            tdsaDeviceData_t     *oneDeviceData,
 8776            tdsaPortContext_t    *onePortContext
 8777           )
 8778 {
 8779   tdsaRoot_t           *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
 8780   tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
 8781   bit32                SMstatus = SM_RC_FAILURE;
 8782   tdIORequestBody_t    *tdIORequestBody;
 8783   smIORequest_t        *smIORequest;
 8784   smDeviceHandle_t     *smDeviceHandle;
 8785   bit32                PhysUpper32;
 8786   bit32                PhysLower32;
 8787   bit32                memAllocStatus;
 8788   void                 *osMemHandle;
 8789 
 8790 
 8791   TI_DBG1(("tdIDStart: start, did %d\n",oneDeviceData->id));
 8792  
 8793   if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData)|| DEVICE_IS_STP_TARGET(oneDeviceData))
 8794       &&
 8795       oneDeviceData->satDevData.IDDeviceValid == agFALSE
 8796       &&
 8797       oneDeviceData->satDevData.IDPending == agFALSE
 8798       )
 8799   {
 8800     TI_DBG2(("tdIDStart: in loop, did %d\n", oneDeviceData->id));
 8801     /* allocating tdIORequestBody */
 8802     memAllocStatus = ostiAllocMemory(
 8803                                       tiRoot,
 8804                                       &osMemHandle,
 8805                                       (void **)&tdIORequestBody,
 8806                                       &PhysUpper32,
 8807                                       &PhysLower32,
 8808                                       8,
 8809                                       sizeof(tdIORequestBody_t),
 8810                                       agTRUE
 8811                                     );
 8812     if (memAllocStatus != tiSuccess || tdIORequestBody == agNULL)
 8813     {
 8814       /* let os process IO */
 8815       TI_DBG1(("tdIDStart: ostiAllocMemory failed... or ostiAllocMemory returned NULL tdIORequestBody!!!\n"));
 8816       oneDeviceData->satDevData.IDDeviceValid = agFALSE;
 8817       if (oneDeviceData->directlyAttached == agTRUE)
 8818       {
 8819         /* notifying link up */
 8820         ostiPortEvent(
 8821                        tiRoot,
 8822                        tiPortLinkUp,
 8823                        tiSuccess,
 8824                        (void *)onePortContext->tiPortalContext
 8825                      );
 8826 #ifdef INITIATOR_DRIVER
 8827         /* triggers discovery */
 8828         ostiPortEvent(
 8829                        tiRoot,
 8830                        tiPortDiscoveryReady,
 8831                        tiSuccess,
 8832                        (void *) onePortContext->tiPortalContext
 8833                      );
 8834 #endif
 8835       }
 8836     }
 8837     else
 8838     {
 8839       /* initialize */
 8840       osti_memset(tdIORequestBody, 0, sizeof(tdIORequestBody_t));
 8841 
 8842       tdIORequestBody->osMemHandle = osMemHandle;
 8843       TI_DBG2(("tdIDStart: tdIORequestBody %p  tdIORequestBody->osMemHandle %p\n", tdIORequestBody, tdIORequestBody->osMemHandle));
 8844 
 8845       /* not in use */
 8846       tdIORequestBody->IOCompletionFunc = agNULL;
 8847       tdIORequestBody->tiDevHandle = agNULL;
 8848 
 8849       tdIORequestBody->tiIORequest = agNULL; /* not in use */
 8850       tdIORequestBody->pid = onePortContext->id;
 8851       tdIORequestBody->reTries = 0;
 8852       smIORequest = (smIORequest_t *)&(tdIORequestBody->smIORequest);
 8853       smIORequest->tdData = tdIORequestBody;
 8854       smIORequest->smData = &tdIORequestBody->smIORequestBody;
 8855 
 8856       smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
 8857       smDeviceHandle->tdData = oneDeviceData;
 8858 
 8859       TI_DBG2(("tdIDStart: smIORequest %p\n", smIORequest));
 8860 
 8861       SMstatus = smIDStart(smRoot,
 8862                            smIORequest,
 8863                            &(oneDeviceData->smDeviceHandle)
 8864                            );
 8865 
 8866       if (SMstatus == SM_RC_SUCCESS)
 8867       {
 8868         if (oneDeviceData->directlyAttached == agTRUE)
 8869         {
 8870           TI_DBG2(("tdIDStart: successfully sent identify device data\n"));
 8871 
 8872           /* Add the devicedata to the mainlink */
 8873           tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 8874           TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
 8875           tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 8876           TI_DBG6(("tdIDStart: one case did %d \n", oneDeviceData->id));
 8877         }
 8878         oneDeviceData->satDevData.IDPending = agTRUE;
 8879         /* start a timer */
 8880         tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
 8881       }
 8882       else
 8883       {
 8884         /* failed to send  */
 8885         TI_DBG1(("tdIDStart: smIDStart fail or busy %d\n", SMstatus));
 8886 
 8887         /* free up allocated memory */
 8888         ostiFreeMemory(
 8889                    tiRoot,
 8890                    tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
 8891                    sizeof(tdIORequestBody_t)
 8892                    );
 8893 
 8894         oneDeviceData->satDevData.IDDeviceValid = agFALSE;
 8895         if (oneDeviceData->directlyAttached == agTRUE)
 8896         {
 8897           TI_DBG1(("tdIDStart: failed in sending identify device data\n"));
 8898           /* put onedevicedata back to free list */
 8899           tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
 8900           TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
 8901           tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
 8902           /* notifying link up */
 8903           ostiPortEvent(
 8904                          tiRoot,
 8905                          tiPortLinkUp,
 8906                          tiSuccess,
 8907                          (void *)onePortContext->tiPortalContext
 8908                        );
 8909 #ifdef INITIATOR_DRIVER
 8910           /* triggers discovery */
 8911           ostiPortEvent(
 8912                          tiRoot,
 8913                          tiPortDiscoveryReady,
 8914                          tiSuccess,
 8915                          (void *) onePortContext->tiPortalContext
 8916                        );
 8917 #endif
 8918         }
 8919         else
 8920         {
 8921           smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
 8922         }
 8923       }
 8924     }
 8925   }
 8926   TI_DBG1(("tdIDStart: exit\n"));
 8927   return;
 8928 }
 8929 
 8930 #endif
 8931 
 8932 #ifdef SALLSDK_OS_IOMB_LOG_ENABLE
 8933 GLOBAL void ossaLogIomb(agsaRoot_t  *agRoot,
 8934                         bit32        queueNum,
 8935                         agBOOLEAN      isInbound,
 8936                         void        *pMsg,
 8937                         bit32        msgLength)
 8938 {
 8939   return;
 8940 }
 8941 #endif /* SALLSDK_OS_IOMB_LOG_ENABLE */
 8942 
 8943 #ifndef SATA_ENABLE
 8944 /*
 8945  * These callback routines are defined in ossasat.c which are included in the
 8946  * compilation if SATA_ENABLED is defined.
 8947  */
 8948 
 8949 /*****************************************************************************
 8950 *! \brief ossaDiscoverSataCB
 8951 *
 8952 *  Purpose:  This function is called by lower layer to inform TD layer of
 8953 *            STP/SATA discovery results
 8954 *
 8955 *
 8956 *  \param   agRoot         Pointer to chip/driver Instance.
 8957 *  \param   agPortContext  Pointer to the port context of TD and Lower layer
 8958 *  \param   event          event type
 8959 *  \param   pParm1         Pointer to data associated with event
 8960 *  \param   pParm2         Pointer to data associated with event
 8961 *
 8962 *  \return: none
 8963 *
 8964 *  \note -  For details, refer to SAS/SATA Low-Level API Specification
 8965 *
 8966 *****************************************************************************/
 8967 
 8968 osGLOBAL void ossaDiscoverSataCB( agsaRoot_t        *agRoot,
 8969                     agsaPortContext_t *agPortContext,
 8970                     bit32             event,
 8971                     void              *pParm1,
 8972                     void              *pParm2
 8973                     )
 8974 {
 8975   return;
 8976 }
 8977 
 8978 
 8979 /*****************************************************************************
 8980 *! \brief  ossaSATACompleted
 8981 *
 8982 *   This routine is called to complete a SATA request previously issued to the
 8983 *    LL Layer in saSATAStart()
 8984 *
 8985 *  \param   agRoot:      Handles for this instance of SAS/SATA hardware
 8986 *  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
 8987 *  \param   agIOStatus:  Status of completed I/O.
 8988 *  \param   agFirstDword:Pointer to the four bytes of FIS.
 8989 *  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
 8990 *                        length.
 8991 *  \param   agParam:     Additional info based on status.
 8992 *
 8993 *  \return: none
 8994 *
 8995 *****************************************************************************/
 8996 GLOBAL void ossaSATACompleted(
 8997                   agsaRoot_t        *agRoot,
 8998                   agsaIORequest_t   *agIORequest,
 8999                   bit32             agIOStatus,
 9000                   void              *agFirstDword,
 9001                   bit32             agIOInfoLen,
 9002                   void              *agParam
 9003                   )
 9004 {
 9005   return;
 9006 }
 9007 
 9008 
 9009 /*****************************************************************************
 9010 *! \brief  ossaSATAEvent
 9011 *
 9012 *   This routine is called to notify the OS Layer of an event associated with
 9013 *   SATA port or SATA device
 9014 *
 9015 *  \param   agRoot:        Handles for this instance of SAS/SATA hardware
 9016 *  \param   agIORequest:   Pointer to the LL I/O request context for this I/O.
 9017 *  \param   agPortContext  Pointer to the port context of TD and Lower layer
 9018 *  \param   agDevHandle:   Pointer to a device handle
 9019 *  \param   event:         event type
 9020 *
 9021 *  \return: none
 9022 *
 9023 *****************************************************************************/
 9024 osGLOBAL void ossaSATAEvent(
 9025                         agsaRoot_t        *agRoot,
 9026                         agsaIORequest_t   *agIORequest,
 9027                         agsaPortContext_t *agPortContext,
 9028                         agsaDevHandle_t   *agDevHandle,
 9029                         bit32             event,
 9030                         bit32             agIOInfoLen,
 9031                         void              *agParam
 9032                         )
 9033 {
 9034   return;
 9035 }
 9036 
 9037 
 9038 /*****************************************************************************
 9039 *! \brief  ossaSATADeviceResetCB
 9040 *
 9041 *   This routine is called to complete a SATA device reset request previously
 9042 *   issued to the LL Layer in saSATADeviceReset().
 9043 *
 9044 *  \param agRoot:      Handles for this instance of SAS/SATA hardware
 9045 *  \param agDevHandle: Pointer to a device handle
 9046 *  \param resetStatus: Reset status:
 9047 *                      OSSA_SUCCESS: The reset operation completed successfully.
 9048 *                      OSSA_FAILURE: The reset operation failed.
 9049 *  \param resetparm:  Pointer to the Device-To-Host FIS received from the device.
 9050 *
 9051 *  \return: none
 9052 *
 9053 *****************************************************************************/
 9054 osGLOBAL void ossaSATADeviceResetCB(
 9055                       agsaRoot_t        *agRoot,
 9056                       agsaDevHandle_t   *agDevHandle,
 9057                       bit32             resetStatus,
 9058                       void              *resetparm)
 9059 {
 9060 
 9061   return;
 9062 
 9063 }
 9064 
 9065 /*****************************************************************************
 9066 *! \brief ossaDiscoverSasCB
 9067 *
 9068 *  Purpose:  This function is called by lower layer to inform TD layer of
 9069 *            SAS discovery results
 9070 *
 9071 *
 9072 *  \param   agRoot         Pointer to chip/driver Instance.
 9073 *  \param   agPortContext  Pointer to the port context of TD and Lower layer
 9074 *  \param   event          event type
 9075 *  \param   pParm1         Pointer to data associated with event
 9076 *  \param   pParm2         Pointer to data associated with event
 9077 *
 9078 *  \return: none
 9079 *
 9080 *  \note -  For details, refer to SAS/SATA Low-Level API Specification
 9081 *
 9082 *****************************************************************************/
 9083 osGLOBAL void ossaDiscoverSasCB(agsaRoot_t        *agRoot,
 9084                   agsaPortContext_t *agPortContext,
 9085                   bit32             event,
 9086                   void              *pParm1,
 9087                   void              *pParm2
 9088                   )
 9089 {
 9090   return;
 9091 }
 9092 #endif
 9093 

Cache object: bb6aaf51cc226bd99d15e857b32aefca


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