xref: /freebsd/sys/dev/pms/RefTisa/sallsdk/spc/sadisc.c (revision 685dc743)
14e1bc9a0SAchim Leubner /*******************************************************************************
24e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
34e1bc9a0SAchim Leubner *
44e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
54e1bc9a0SAchim Leubner *that the following conditions are met:
64e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
74e1bc9a0SAchim Leubner *following disclaimer.
84e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
94e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
104e1bc9a0SAchim Leubner *with the distribution.
114e1bc9a0SAchim Leubner *
124e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
134e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
144e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
154e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
164e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
174e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
184e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
194e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
204e1bc9a0SAchim Leubner 
214e1bc9a0SAchim Leubner ********************************************************************************/
224e1bc9a0SAchim Leubner /*******************************************************************************/
234e1bc9a0SAchim Leubner /*! \file sadisc.c
244e1bc9a0SAchim Leubner  *  \brief The file implements the functions to do SAS/SATA discovery
254e1bc9a0SAchim Leubner  */
264e1bc9a0SAchim Leubner 
274e1bc9a0SAchim Leubner /******************************************************************************/
284e1bc9a0SAchim Leubner 
294e1bc9a0SAchim Leubner #include <sys/cdefs.h>
304e1bc9a0SAchim Leubner #include <dev/pms/config.h>
314e1bc9a0SAchim Leubner 
324e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
334e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
344e1bc9a0SAchim Leubner #ifdef siTraceFileID
354e1bc9a0SAchim Leubner #undef siTraceFileID
364e1bc9a0SAchim Leubner #endif
374e1bc9a0SAchim Leubner #define siTraceFileID 'C'
384e1bc9a0SAchim Leubner #endif
394e1bc9a0SAchim Leubner 
404e1bc9a0SAchim Leubner /******************************************************************************/
414e1bc9a0SAchim Leubner /*! \brief Start/Abort SAS/SATA discovery
424e1bc9a0SAchim Leubner  *
434e1bc9a0SAchim Leubner  *  Start/Abort SAS/SATA discovery
444e1bc9a0SAchim Leubner  *
454e1bc9a0SAchim Leubner  *  \param agRoot         Handles for this instance of SAS/SATA hardware
464e1bc9a0SAchim Leubner  *  \param agPortContext  Pointer to this instance of port context
474e1bc9a0SAchim Leubner  *  \param type           Specifies the type(s) of discovery operation to start or cancel
484e1bc9a0SAchim Leubner  *  \param option         Specified the discovery option
494e1bc9a0SAchim Leubner  *
504e1bc9a0SAchim Leubner  *  \return If discovery is started/aborted successfully
514e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS discovery is started/aborted successfully
524e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE discovery is not started/aborted successfully
534e1bc9a0SAchim Leubner  *
544e1bc9a0SAchim Leubner  */
554e1bc9a0SAchim Leubner /*******************************************************************************/
saDiscover(agsaRoot_t * agRoot,agsaPortContext_t * agPortContext,bit32 type,bit32 option)564e1bc9a0SAchim Leubner GLOBAL bit32 saDiscover(
574e1bc9a0SAchim Leubner   agsaRoot_t        *agRoot,
584e1bc9a0SAchim Leubner   agsaPortContext_t *agPortContext,
594e1bc9a0SAchim Leubner   bit32             type,
604e1bc9a0SAchim Leubner   bit32             option
614e1bc9a0SAchim Leubner   )
624e1bc9a0SAchim Leubner {
634e1bc9a0SAchim Leubner   /* Currently not supported */
644e1bc9a0SAchim Leubner   return AGSA_RC_FAILURE;
654e1bc9a0SAchim Leubner }
664e1bc9a0SAchim Leubner 
674e1bc9a0SAchim Leubner /******************************************************************************/
684e1bc9a0SAchim Leubner /*! \brief Function for target to remove stale initiator device handle
694e1bc9a0SAchim Leubner  *
704e1bc9a0SAchim Leubner  *  function is called to ask the LL layer to remove all LL layer and SPC firmware
714e1bc9a0SAchim Leubner  *  internal resources associated with a device handle
724e1bc9a0SAchim Leubner  *
734e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA hardware
744e1bc9a0SAchim Leubner  *  \param agDevHandle  Handle of the device that this I/O request will be made on
754e1bc9a0SAchim Leubner  *
764e1bc9a0SAchim Leubner  *  \return If the device handle is removed successfully
774e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the device handle is removed successfully
784e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the device is busy, cannot be removed now
794e1bc9a0SAchim Leubner  *
804e1bc9a0SAchim Leubner  */
814e1bc9a0SAchim Leubner /*******************************************************************************/
saDeregisterDeviceHandle(agsaRoot_t * agRoot,agsaContext_t * agContext,agsaDevHandle_t * agDevHandle,bit32 queueNum)824e1bc9a0SAchim Leubner GLOBAL bit32 saDeregisterDeviceHandle(
834e1bc9a0SAchim Leubner   agsaRoot_t      *agRoot,
844e1bc9a0SAchim Leubner   agsaContext_t   *agContext,
854e1bc9a0SAchim Leubner   agsaDevHandle_t *agDevHandle,
864e1bc9a0SAchim Leubner   bit32           queueNum
874e1bc9a0SAchim Leubner   )
884e1bc9a0SAchim Leubner {
894e1bc9a0SAchim Leubner   agsaLLRoot_t          *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
904e1bc9a0SAchim Leubner   agsaDeviceDesc_t      *pDevice;
914e1bc9a0SAchim Leubner   agsaPort_t            *pPort;
924e1bc9a0SAchim Leubner   bit32                 ret = AGSA_RC_SUCCESS;
934e1bc9a0SAchim Leubner   bit32                 deviceid, portid;
944e1bc9a0SAchim Leubner   bit32                 deviceIdx;
954e1bc9a0SAchim Leubner 
964e1bc9a0SAchim Leubner   OS_ASSERT(agDevHandle != agNULL, "saDeregisterDeviceHandle agDevHandle is NULL");
974e1bc9a0SAchim Leubner 
984e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "za");
994e1bc9a0SAchim Leubner 
1004e1bc9a0SAchim Leubner   if(agNULL == agDevHandle)
1014e1bc9a0SAchim Leubner   {
1024e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "za");
1034e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
1044e1bc9a0SAchim Leubner   }
1054e1bc9a0SAchim Leubner 
1064e1bc9a0SAchim Leubner   pDevice = (agsaDeviceDesc_t *) (agDevHandle->sdkData);
1074e1bc9a0SAchim Leubner 
1084e1bc9a0SAchim Leubner   OS_ASSERT(pDevice != agNULL, "saDeregisterDeviceHandle pDevice is NULL");
1094e1bc9a0SAchim Leubner   if(pDevice == agNULL)
1104e1bc9a0SAchim Leubner   {
1114e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "za");
1124e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
1134e1bc9a0SAchim Leubner   }
1144e1bc9a0SAchim Leubner 
1154e1bc9a0SAchim Leubner   /* find device id */
1164e1bc9a0SAchim Leubner   deviceid = pDevice->DeviceMapIndex;
1174e1bc9a0SAchim Leubner   deviceIdx = deviceid & DEVICE_ID_BITS;
1184e1bc9a0SAchim Leubner   OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
1194e1bc9a0SAchim Leubner   pPort = pDevice->pPort;
1204e1bc9a0SAchim Leubner   /* find port id */
1214e1bc9a0SAchim Leubner   portid = pPort->portId;
1224e1bc9a0SAchim Leubner 
1234e1bc9a0SAchim Leubner   SA_DBG3(("saDeregisterDeviceHandle: start DeviceHandle %p\n", agDevHandle));
1244e1bc9a0SAchim Leubner   SA_DBG1(("saDeregisterDeviceHandle: deviceId 0x%x Device Context %p\n", deviceid, pDevice));
1254e1bc9a0SAchim Leubner 
1264e1bc9a0SAchim Leubner   if ((deviceid != saRoot->DeviceMap[deviceIdx].DeviceIdFromFW) ||
1274e1bc9a0SAchim Leubner      (pDevice != saRoot->DeviceMap[deviceIdx].DeviceHandle))
1284e1bc9a0SAchim Leubner   {
1294e1bc9a0SAchim Leubner     SA_DBG1(("saDeregisterDeviceHandle: Not match failure\n"));
1304e1bc9a0SAchim Leubner     ret = AGSA_RC_FAILURE;
1314e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "za");
1324e1bc9a0SAchim Leubner     return ret;
1334e1bc9a0SAchim Leubner   }
1344e1bc9a0SAchim Leubner 
1354e1bc9a0SAchim Leubner   /* Build IOMB and send it to SPC */
1364e1bc9a0SAchim Leubner   ret = mpiDeregDevHandleCmd(agRoot, agContext, pDevice, deviceid, portid, queueNum);
1374e1bc9a0SAchim Leubner 
1384e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "za");
1394e1bc9a0SAchim Leubner   return ret;
1404e1bc9a0SAchim Leubner }
1414e1bc9a0SAchim Leubner 
1424e1bc9a0SAchim Leubner /******************************************************************************/
1434e1bc9a0SAchim Leubner /*! \brief Function for target to remove stale initiator device handle
1444e1bc9a0SAchim Leubner  *
1454e1bc9a0SAchim Leubner  *  function is called to ask the LL layer to remove all LL layer internal resources
1464e1bc9a0SAchim Leubner  *  associated with a device handle
1474e1bc9a0SAchim Leubner  *
1484e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA hardware
1494e1bc9a0SAchim Leubner  *  \param agDevHandle  Handle of the device that this I/O request will be made on
1504e1bc9a0SAchim Leubner  *
1514e1bc9a0SAchim Leubner  *  \return If the device handle is removed successfully
1524e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the device handle is removed successfully
1534e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the device is busy, cannot be removed now
1544e1bc9a0SAchim Leubner  *
1554e1bc9a0SAchim Leubner  */
1564e1bc9a0SAchim Leubner /*******************************************************************************/
siRemoveDevHandle(agsaRoot_t * agRoot,agsaDevHandle_t * agDevHandle)1574e1bc9a0SAchim Leubner GLOBAL bit32 siRemoveDevHandle(
1584e1bc9a0SAchim Leubner   agsaRoot_t      *agRoot,
1594e1bc9a0SAchim Leubner   agsaDevHandle_t *agDevHandle
1604e1bc9a0SAchim Leubner   )
1614e1bc9a0SAchim Leubner {
1624e1bc9a0SAchim Leubner   agsaDeviceDesc_t      *pDevice = (agsaDeviceDesc_t *) (agDevHandle->sdkData);
1634e1bc9a0SAchim Leubner   agsaPort_t            *pPort;
1644e1bc9a0SAchim Leubner   bit32                 ret = AGSA_RC_SUCCESS;
1654e1bc9a0SAchim Leubner 
1664e1bc9a0SAchim Leubner   OS_ASSERT(pDevice != agNULL, "siRemoveDevHandle is NULL");
1674e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"zb");
1684e1bc9a0SAchim Leubner 
1694e1bc9a0SAchim Leubner   if (pDevice == agNULL)
1704e1bc9a0SAchim Leubner   {
1714e1bc9a0SAchim Leubner     SA_DBG1(("siRemoveDevHandle: pDevice is NULL \n"));
1724e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "zb");
1734e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
1744e1bc9a0SAchim Leubner   }
1754e1bc9a0SAchim Leubner 
1764e1bc9a0SAchim Leubner   /* If it's to remove an initiator device handle */
1774e1bc9a0SAchim Leubner   if ( &(pDevice->initiatorDevHandle) == agDevHandle )
1784e1bc9a0SAchim Leubner   {
1794e1bc9a0SAchim Leubner     (pDevice->initiatorDevHandle).sdkData = agNULL;
1804e1bc9a0SAchim Leubner   }
1814e1bc9a0SAchim Leubner   /* If it's to remove an target device handle */
1824e1bc9a0SAchim Leubner   else if ( &(pDevice->targetDevHandle) == agDevHandle )
1834e1bc9a0SAchim Leubner   {
1844e1bc9a0SAchim Leubner     (pDevice->targetDevHandle).sdkData = agNULL;
1854e1bc9a0SAchim Leubner   }
1864e1bc9a0SAchim Leubner   else
1874e1bc9a0SAchim Leubner   {
1884e1bc9a0SAchim Leubner     SA_ASSERT(agFALSE, "");
1894e1bc9a0SAchim Leubner   }
1904e1bc9a0SAchim Leubner 
1914e1bc9a0SAchim Leubner   /* remove the device descriptor if it doesn't have either initiator handle and target handle */
1924e1bc9a0SAchim Leubner   if ( (agNULL == (pDevice->initiatorDevHandle).sdkData)
1934e1bc9a0SAchim Leubner       && (agNULL == (pDevice->targetDevHandle).sdkData) )
1944e1bc9a0SAchim Leubner   {
1954e1bc9a0SAchim Leubner     /* Find the port of the device */
1964e1bc9a0SAchim Leubner     pPort = pDevice->pPort;
1974e1bc9a0SAchim Leubner 
1984e1bc9a0SAchim Leubner     /* remove the device descriptor free discover list */
1994e1bc9a0SAchim Leubner     switch ( pDevice->deviceType )
2004e1bc9a0SAchim Leubner     {
2014e1bc9a0SAchim Leubner       case STP_DEVICE: /* fall through */
2024e1bc9a0SAchim Leubner       case SSP_SMP_DEVICE:
2034e1bc9a0SAchim Leubner       case DIRECT_SATA_DEVICE:
2044e1bc9a0SAchim Leubner       {
2054e1bc9a0SAchim Leubner         SA_DBG3(("siRemoveDevHandle: remove device context %p\n", pDevice));
2064e1bc9a0SAchim Leubner         siPortDeviceRemove(agRoot, pPort, pDevice, agTRUE);
2074e1bc9a0SAchim Leubner         break;
2084e1bc9a0SAchim Leubner       }
2094e1bc9a0SAchim Leubner       default:
2104e1bc9a0SAchim Leubner       {
2114e1bc9a0SAchim Leubner         SA_DBG1(("siRemoveDevHandle: switch. Not calling siPortDeviceRemove %d\n", pDevice->deviceType));
2124e1bc9a0SAchim Leubner         break;
2134e1bc9a0SAchim Leubner       }
2144e1bc9a0SAchim Leubner     }
2154e1bc9a0SAchim Leubner   }
2164e1bc9a0SAchim Leubner   else
2174e1bc9a0SAchim Leubner   {
2184e1bc9a0SAchim Leubner     SA_DBG1(("siRemoveDevHandle: else. Not caling siPortDeviceRemove\n"));
2194e1bc9a0SAchim Leubner   }
2204e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "zb");
2214e1bc9a0SAchim Leubner   return ret;
2224e1bc9a0SAchim Leubner }
2234e1bc9a0SAchim Leubner 
2244e1bc9a0SAchim Leubner /******************************************************************************/
2254e1bc9a0SAchim Leubner /*! \brief Get Device Handles from a specific local port
2264e1bc9a0SAchim Leubner  *
2274e1bc9a0SAchim Leubner  *  Get a Device Handles
2284e1bc9a0SAchim Leubner  *
2294e1bc9a0SAchim Leubner  *  \param agRoot         Handles for this instance of SAS/SATA hardware
2304e1bc9a0SAchim Leubner  *  \param agsaContext    Pointer to this API context
2314e1bc9a0SAchim Leubner  *  \param agPortContext  Pointer to this instance of port context
2324e1bc9a0SAchim Leubner  *  \param flags          Device flags
2334e1bc9a0SAchim Leubner  *  \param agDev[]        Pointer of array of device handles
2344e1bc9a0SAchim Leubner  *  \param MaxDevs        Specified Maximum number of Device Handles
2354e1bc9a0SAchim Leubner  *
2364e1bc9a0SAchim Leubner  *  \return If GetDeviceHandles is successfully or failure
2374e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS GetDeviceHandles is successfully
2384e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE GetDeviceHandles is not successfully
2394e1bc9a0SAchim Leubner  *
2404e1bc9a0SAchim Leubner  */
2414e1bc9a0SAchim Leubner /*******************************************************************************/
saGetDeviceHandles(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,agsaPortContext_t * agPortContext,bit32 flags,agsaDevHandle_t * agDev[],bit32 skipCount,bit32 MaxDevs)2424e1bc9a0SAchim Leubner GLOBAL bit32 saGetDeviceHandles(
2434e1bc9a0SAchim Leubner   agsaRoot_t        *agRoot,
2444e1bc9a0SAchim Leubner   agsaContext_t     *agContext,
2454e1bc9a0SAchim Leubner   bit32             queueNum,
2464e1bc9a0SAchim Leubner   agsaPortContext_t *agPortContext,
2474e1bc9a0SAchim Leubner   bit32             flags,
2484e1bc9a0SAchim Leubner   agsaDevHandle_t   *agDev[],
2494e1bc9a0SAchim Leubner   bit32             skipCount,
2504e1bc9a0SAchim Leubner   bit32             MaxDevs
2514e1bc9a0SAchim Leubner   )
2524e1bc9a0SAchim Leubner {
2534e1bc9a0SAchim Leubner   agsaLLRoot_t      *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
2544e1bc9a0SAchim Leubner   agsaPort_t        *pPort = (agsaPort_t *) (agPortContext->sdkData);
2554e1bc9a0SAchim Leubner   bit32             portIndex, i;
2564e1bc9a0SAchim Leubner   bit32             ret = AGSA_RC_SUCCESS;
2574e1bc9a0SAchim Leubner 
2584e1bc9a0SAchim Leubner   OS_ASSERT(pPort != agNULL, "saGetDeviceHandles is NULL");
2594e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"zc");
2604e1bc9a0SAchim Leubner 
2614e1bc9a0SAchim Leubner   if (pPort == agNULL)
2624e1bc9a0SAchim Leubner   {
2634e1bc9a0SAchim Leubner     SA_DBG1(("saGetDeviceHandles: pPort is NULL \n"));
2644e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "zc");
2654e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
2664e1bc9a0SAchim Leubner   }
2674e1bc9a0SAchim Leubner 
2684e1bc9a0SAchim Leubner   SA_DBG1(("saGetDeviceHandles: start portId %d\n", pPort->portId));
2694e1bc9a0SAchim Leubner 
2704e1bc9a0SAchim Leubner   /* save the device handles arrary pointer */
2714e1bc9a0SAchim Leubner   for (i = 0; i < MaxDevs; i ++)
2724e1bc9a0SAchim Leubner   {
2734e1bc9a0SAchim Leubner     saRoot->DeviceHandle[i] = agDev[i];
2744e1bc9a0SAchim Leubner   }
2754e1bc9a0SAchim Leubner 
2764e1bc9a0SAchim Leubner   /* send GET_DEVICE_HANDLE IOMB to SPC */
2774e1bc9a0SAchim Leubner   portIndex = pPort->portId;
2784e1bc9a0SAchim Leubner   mpiGetDeviceHandleCmd(agRoot, agContext, portIndex, flags, MaxDevs, queueNum, skipCount);
2794e1bc9a0SAchim Leubner 
2804e1bc9a0SAchim Leubner   /* return */
2814e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "zc");
2824e1bc9a0SAchim Leubner   return ret;
2834e1bc9a0SAchim Leubner }
2844e1bc9a0SAchim Leubner 
2854e1bc9a0SAchim Leubner /******************************************************************************/
2864e1bc9a0SAchim Leubner /*! \brief Register New Device from a specific local port
2874e1bc9a0SAchim Leubner  *
2884e1bc9a0SAchim Leubner  *  Register New Device API
2894e1bc9a0SAchim Leubner  *
2904e1bc9a0SAchim Leubner  *  \param agRoot         Handles for this instance of SAS/SATA hardware
2914e1bc9a0SAchim Leubner  *  \param agContext      Pointer to this API context
2924e1bc9a0SAchim Leubner  *  \param agDeviceInfo   Pointer to this instance of device info
2934e1bc9a0SAchim Leubner  *  \param agPortContext  Pointer to this instance of port context
2944e1bc9a0SAchim Leubner  *
2954e1bc9a0SAchim Leubner  *  \return If discovery is started/aborted successfully
2964e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS discovery is started/aborted successfully
2974e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE discovery is not started/aborted successfully
2984e1bc9a0SAchim Leubner  *
2994e1bc9a0SAchim Leubner  */
3004e1bc9a0SAchim Leubner /*******************************************************************************/
saRegisterNewDevice(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,agsaDeviceInfo_t * agDeviceInfo,agsaPortContext_t * agPortContext,bit16 hostAssignedDeviceId)3014e1bc9a0SAchim Leubner GLOBAL bit32 saRegisterNewDevice(
3024e1bc9a0SAchim Leubner   agsaRoot_t            *agRoot,
3034e1bc9a0SAchim Leubner   agsaContext_t         *agContext,
3044e1bc9a0SAchim Leubner   bit32                 queueNum,
3054e1bc9a0SAchim Leubner   agsaDeviceInfo_t      *agDeviceInfo,
3064e1bc9a0SAchim Leubner   agsaPortContext_t     *agPortContext,
3074e1bc9a0SAchim Leubner   bit16                 hostAssignedDeviceId
3084e1bc9a0SAchim Leubner   )
3094e1bc9a0SAchim Leubner {
3104e1bc9a0SAchim Leubner   bit32               ret = AGSA_RC_SUCCESS;
3114e1bc9a0SAchim Leubner   agsaRegDevCmd_t     payload;
3124e1bc9a0SAchim Leubner   agsaLLRoot_t        *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
3134e1bc9a0SAchim Leubner   agsaIORequestDesc_t *pRequest;
3144e1bc9a0SAchim Leubner   agsaPort_t          *pPort = (agsaPort_t *) (agPortContext->sdkData);
3154e1bc9a0SAchim Leubner   agsaSASIdentify_t   remoteIdentify;
3164e1bc9a0SAchim Leubner   bit32               i, phyId, sDTypeRate;
3174e1bc9a0SAchim Leubner   agsaDeviceDesc_t    *pDevice = agNULL;
3184e1bc9a0SAchim Leubner 
3194e1bc9a0SAchim Leubner   OS_ASSERT(pPort != agNULL, "saRegisterNewDevice is NULL");
3204e1bc9a0SAchim Leubner   OS_ASSERT(saRoot != agNULL, "saRoot is NULL");
3214e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"zd");
3224e1bc9a0SAchim Leubner 
3234e1bc9a0SAchim Leubner   if(saRoot == agNULL)
3244e1bc9a0SAchim Leubner   {
3254e1bc9a0SAchim Leubner     SA_DBG1(("saRegisterNewDevice: saRoot == agNULL\n"));
3264e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "zd");
3274e1bc9a0SAchim Leubner     return(AGSA_RC_FAILURE);
3284e1bc9a0SAchim Leubner   }
3294e1bc9a0SAchim Leubner 
3304e1bc9a0SAchim Leubner   if (pPort == agNULL)
3314e1bc9a0SAchim Leubner   {
3324e1bc9a0SAchim Leubner     SA_DBG1(("saRegisterNewDevice: pPort is NULL \n"));
3334e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "zd");
3344e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
3354e1bc9a0SAchim Leubner   }
3364e1bc9a0SAchim Leubner 
3374e1bc9a0SAchim Leubner   SA_DBG2(("saRegisterNewDevice: start portId %d Port Context %p\n", pPort->portId, agPortContext));
3384e1bc9a0SAchim Leubner 
3394e1bc9a0SAchim Leubner   SA_DBG2(("saRegisterNewDevice: smpTimeout 0x%x\n", agDeviceInfo->smpTimeout));
3404e1bc9a0SAchim Leubner   SA_DBG2(("saRegisterNewDevice: it_NexusTimeout 0x%x\n", agDeviceInfo->it_NexusTimeout));
3414e1bc9a0SAchim Leubner   SA_DBG2(("saRegisterNewDevice: firstBurstSize 0x%x\n", agDeviceInfo->firstBurstSize));
3424e1bc9a0SAchim Leubner   SA_DBG2(("saRegisterNewDevice: devType_S_Rate 0x%x\n", agDeviceInfo->devType_S_Rate));
3434e1bc9a0SAchim Leubner   SA_DBG2(("saRegisterNewDevice: flag 0x%x\n", agDeviceInfo->flag));
3444e1bc9a0SAchim Leubner   SA_DBG2(("saRegisterNewDevice: hostAssignedDeviceId  0x%x\n",hostAssignedDeviceId ));
3454e1bc9a0SAchim Leubner   SA_DBG2(("saRegisterNewDevice: Addr 0x%02x%02x%02x%02x 0x%02x%02x%02x%02x\n",
3464e1bc9a0SAchim Leubner           agDeviceInfo->sasAddressHi[0],agDeviceInfo->sasAddressHi[1],agDeviceInfo->sasAddressHi[2],agDeviceInfo->sasAddressHi[3],
3474e1bc9a0SAchim Leubner           agDeviceInfo->sasAddressLo[0],agDeviceInfo->sasAddressLo[1],agDeviceInfo->sasAddressLo[2],agDeviceInfo->sasAddressLo[3] ));
3484e1bc9a0SAchim Leubner 
3494e1bc9a0SAchim Leubner   agDeviceInfo->devType_S_Rate &= DEV_LINK_RATE;
3504e1bc9a0SAchim Leubner 
3514e1bc9a0SAchim Leubner   /*
3524e1bc9a0SAchim Leubner     Using agsaDeviceInfo_t, fill in only sas address and device type
3534e1bc9a0SAchim Leubner     of identify address frame
3544e1bc9a0SAchim Leubner   */
3554e1bc9a0SAchim Leubner   si_memset(&remoteIdentify, 0, sizeof(agsaSASIdentify_t));
3564e1bc9a0SAchim Leubner   for (i=0;i<4;i++)
3574e1bc9a0SAchim Leubner   {
3584e1bc9a0SAchim Leubner     remoteIdentify.sasAddressHi[i] = agDeviceInfo->sasAddressHi[i];
3594e1bc9a0SAchim Leubner     remoteIdentify.sasAddressLo[i] = agDeviceInfo->sasAddressLo[i];
3604e1bc9a0SAchim Leubner   }
3614e1bc9a0SAchim Leubner   remoteIdentify.deviceType_addressFrameType = (bit8)(agDeviceInfo->devType_S_Rate & 0xC0);
3624e1bc9a0SAchim Leubner 
3634e1bc9a0SAchim Leubner   /* Get request from free IORequests */
3644e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3654e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
3664e1bc9a0SAchim Leubner 
3674e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
3684e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
3694e1bc9a0SAchim Leubner   {
3704e1bc9a0SAchim Leubner     pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeReservedRequests)); /**/
3714e1bc9a0SAchim Leubner     if(agNULL != pRequest)
3724e1bc9a0SAchim Leubner     {
3734e1bc9a0SAchim Leubner       saLlistIORemove(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
3744e1bc9a0SAchim Leubner       SA_DBG1(("saRegisterNewDevice, using saRoot->freeReservedRequests\n"));
3754e1bc9a0SAchim Leubner     }
3764e1bc9a0SAchim Leubner     else
3774e1bc9a0SAchim Leubner     {
3784e1bc9a0SAchim Leubner       SA_DBG1(("saRegisterNewDevice, No request from free list Not using saRoot->freeReservedRequests\n"));
3794e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3804e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "zd");
3814e1bc9a0SAchim Leubner       return AGSA_RC_BUSY;
3824e1bc9a0SAchim Leubner     }
3834e1bc9a0SAchim Leubner   }
3844e1bc9a0SAchim Leubner   else
3854e1bc9a0SAchim Leubner   {
3864e1bc9a0SAchim Leubner     /* If LL Control request entry avaliable */
3874e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
3884e1bc9a0SAchim Leubner   }
3894e1bc9a0SAchim Leubner 
3904e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
3914e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
3924e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].agContext = agContext;
3934e1bc9a0SAchim Leubner   pRequest->valid = agTRUE;
3944e1bc9a0SAchim Leubner 
3954e1bc9a0SAchim Leubner   ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3964e1bc9a0SAchim Leubner   /* checking bit5 for SATA direct device */
3974e1bc9a0SAchim Leubner   if (!(agDeviceInfo->devType_S_Rate & 0x20))
3984e1bc9a0SAchim Leubner   {
3994e1bc9a0SAchim Leubner     /* SAS device */
4004e1bc9a0SAchim Leubner     /* Add SAS device to the device list */
4014e1bc9a0SAchim Leubner     pDevice = siPortSASDeviceAdd(agRoot,
4024e1bc9a0SAchim Leubner                        pPort,
4034e1bc9a0SAchim Leubner                        remoteIdentify,
4044e1bc9a0SAchim Leubner                        agFALSE,
4054e1bc9a0SAchim Leubner                        agDeviceInfo->smpTimeout,
4064e1bc9a0SAchim Leubner                        agDeviceInfo->it_NexusTimeout,
4074e1bc9a0SAchim Leubner                        agDeviceInfo->firstBurstSize,
4084e1bc9a0SAchim Leubner                        agDeviceInfo->devType_S_Rate,
4094e1bc9a0SAchim Leubner                        (agDeviceInfo->flag & DEV_INFO_MASK));
4104e1bc9a0SAchim Leubner    }
4114e1bc9a0SAchim Leubner    else
4124e1bc9a0SAchim Leubner    {
4134e1bc9a0SAchim Leubner     /* SATA device */
4144e1bc9a0SAchim Leubner     /* Add SATA device to the device list */
4154e1bc9a0SAchim Leubner     pDevice = siPortSATADeviceAdd(agRoot,
4164e1bc9a0SAchim Leubner                                   pPort,
4174e1bc9a0SAchim Leubner                                   agNULL,
4184e1bc9a0SAchim Leubner                                   agNULL, /* no signature */
4194e1bc9a0SAchim Leubner                                   agFALSE,
4204e1bc9a0SAchim Leubner                                   0,
4214e1bc9a0SAchim Leubner                                   agDeviceInfo->smpTimeout,
4224e1bc9a0SAchim Leubner                                   agDeviceInfo->it_NexusTimeout,
4234e1bc9a0SAchim Leubner                                   agDeviceInfo->firstBurstSize,
4244e1bc9a0SAchim Leubner                                   agDeviceInfo->devType_S_Rate,
4254e1bc9a0SAchim Leubner                                   (agDeviceInfo->flag & DEV_INFO_MASK));
4264e1bc9a0SAchim Leubner     }
4274e1bc9a0SAchim Leubner 
4284e1bc9a0SAchim Leubner     SA_DBG1(("saRegisterNewDevice: Device Context %p, TypeRate 0x%x\n", pDevice, agDeviceInfo->devType_S_Rate));
4294e1bc9a0SAchim Leubner 
4304e1bc9a0SAchim Leubner     pRequest->pDevice = pDevice;
4314e1bc9a0SAchim Leubner 
4324e1bc9a0SAchim Leubner     /* adjust the flag bit to build the IOMB; use only bit0 and 1 */
4334e1bc9a0SAchim Leubner     sDTypeRate = agDeviceInfo->devType_S_Rate << SHIFT24;
4344e1bc9a0SAchim Leubner     sDTypeRate |= (agDeviceInfo->flag & 0x01);
4354e1bc9a0SAchim Leubner     /* set AWT flag */
4364e1bc9a0SAchim Leubner     sDTypeRate |= (agDeviceInfo->flag & 0x02) << 1;
4374e1bc9a0SAchim Leubner 
4384e1bc9a0SAchim Leubner     /* If the host assigned device ID is used, then set the HA bit. */
4394e1bc9a0SAchim Leubner     if ( hostAssignedDeviceId != 0 )
4404e1bc9a0SAchim Leubner     {
4414e1bc9a0SAchim Leubner       sDTypeRate |= 2;
4424e1bc9a0SAchim Leubner       SA_DBG3(("saRegisterNewDevice:hostAssignedDeviceId 0x%x sDTypeRate 0x%x\n",hostAssignedDeviceId,sDTypeRate ));
4434e1bc9a0SAchim Leubner     }
4444e1bc9a0SAchim Leubner 
4454e1bc9a0SAchim Leubner     /* Add the MCN field */
4464e1bc9a0SAchim Leubner 
4474e1bc9a0SAchim Leubner     sDTypeRate |= ((agDeviceInfo->flag >> DEV_INFO_MCN_SHIFT) & 0xf) << 4;
4484e1bc9a0SAchim Leubner 
4494e1bc9a0SAchim Leubner     /* Add the IR field */
4504e1bc9a0SAchim Leubner     sDTypeRate |= ((agDeviceInfo->flag >> DEV_INFO_IR_SHIFT) & 0x1) <<  3;
4514e1bc9a0SAchim Leubner 
4524e1bc9a0SAchim Leubner     /* Add the ATAPI protocol flag */
4534e1bc9a0SAchim Leubner     sDTypeRate |= ((agDeviceInfo->flag & ATAPI_DEVICE_FLAG) << SHIFT9 );
4544e1bc9a0SAchim Leubner 
4554e1bc9a0SAchim Leubner     /* Add the AWT  flag */
4564e1bc9a0SAchim Leubner     sDTypeRate |= (agDeviceInfo->flag & AWT_DEVICE_FLAG) ? (1 << SHIFT2) : 0;
4574e1bc9a0SAchim Leubner 
4584e1bc9a0SAchim Leubner     /* Add the XFER_READY flag  */
4594e1bc9a0SAchim Leubner     sDTypeRate |= (agDeviceInfo->flag & XFER_RDY_PRIORTY_DEVICE_FLAG) ? (1 << SHIFT31) : 0;
4604e1bc9a0SAchim Leubner     if(agDeviceInfo->flag & XFER_RDY_PRIORTY_DEVICE_FLAG)
4614e1bc9a0SAchim Leubner     {
4624e1bc9a0SAchim Leubner       SA_DBG1(("saRegisterNewDevice: sflag XFER_RDY_PRIORTY_DEVICE_FLAG sDTypeRate 0x%x\n",sDTypeRate ));
4634e1bc9a0SAchim Leubner     }
4644e1bc9a0SAchim Leubner #ifdef CCFLAG_FORCE_AWT_ON
4654e1bc9a0SAchim Leubner     sDTypeRate |= (1 << SHIFT2);
4664e1bc9a0SAchim Leubner     SA_DBG1(("saRegisterNewDevice: Force AWT_DEVICE_FLAG sDTypeRate 0x%x\n",sDTypeRate ));
4674e1bc9a0SAchim Leubner #endif /* CCFLAG_FORCE_AWT_ON */
4684e1bc9a0SAchim Leubner 
4694e1bc9a0SAchim Leubner     /* create payload for IOMB */
4704e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaRegDevCmd_t));
4714e1bc9a0SAchim Leubner 
4724e1bc9a0SAchim Leubner     SA_DBG2(("saRegisterNewDevice,flag 0x%08X\n",agDeviceInfo->flag));
4734e1bc9a0SAchim Leubner     if ((agDeviceInfo->devType_S_Rate & 0x30) == 0x20)
4744e1bc9a0SAchim Leubner     {
4754e1bc9a0SAchim Leubner       if(smIS_SPC(agRoot))
4764e1bc9a0SAchim Leubner       {
4774e1bc9a0SAchim Leubner         /* direct SATA device */
4784e1bc9a0SAchim Leubner         phyId = (agDeviceInfo->flag & 0xF0);
4794e1bc9a0SAchim Leubner       }
4804e1bc9a0SAchim Leubner       else
4814e1bc9a0SAchim Leubner       {
4824e1bc9a0SAchim Leubner         phyId = (agDeviceInfo->flag & 0xF0) << SHIFT4;
4834e1bc9a0SAchim Leubner       }
4844e1bc9a0SAchim Leubner     }
4854e1bc9a0SAchim Leubner     else
4864e1bc9a0SAchim Leubner     {
4874e1bc9a0SAchim Leubner       phyId = 0;
4884e1bc9a0SAchim Leubner     }
4894e1bc9a0SAchim Leubner 
4904e1bc9a0SAchim Leubner     smTrace(hpDBG_VERY_LOUD,"QQ",phyId);
4914e1bc9a0SAchim Leubner     /* TP:QQ phyId */
4924e1bc9a0SAchim Leubner     smTrace(hpDBG_VERY_LOUD,"QR",pPort->portId);
4934e1bc9a0SAchim Leubner     /* TP:QR portId */
4944e1bc9a0SAchim Leubner     smTrace(hpDBG_VERY_LOUD,"QS",sDTypeRate);
4954e1bc9a0SAchim Leubner     /* TP:QS sDTypeRate */
4964e1bc9a0SAchim Leubner     smTrace(hpDBG_VERY_LOUD,"QT",agDeviceInfo->it_NexusTimeout);
4974e1bc9a0SAchim Leubner     /* TP:QT agDeviceInfo->it_NexusTimeout */
4984e1bc9a0SAchim Leubner 
4994e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaRegDevCmd_t, phyIdportId), (bit32)(pPort->portId & PORTID_MASK) | phyId);
5004e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaRegDevCmd_t, dTypeLRateAwtHa), sDTypeRate);
5014e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaRegDevCmd_t, ITNexusTimeOut), (agDeviceInfo->it_NexusTimeout));
5024e1bc9a0SAchim Leubner 
5034e1bc9a0SAchim Leubner     smTrace(hpDBG_VERY_LOUD,"QT",(bit32)(pPort->portId & PORTID_MASK) | phyId);
5044e1bc9a0SAchim Leubner     /* TP:QT phyIdportId */
5054e1bc9a0SAchim Leubner     /* no conversion is needed since SAS address is in BE format */
5064e1bc9a0SAchim Leubner     payload.sasAddrHi = *(bit32*)agDeviceInfo->sasAddressHi;
5074e1bc9a0SAchim Leubner     payload.sasAddrLo = *(bit32*)agDeviceInfo->sasAddressLo;
5084e1bc9a0SAchim Leubner 
5094e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaRegDevCmd_t, tag), pRequest->HTag);
5104e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaRegDevCmd_t, DeviceId), ((bit32)hostAssignedDeviceId) << 16);
5114e1bc9a0SAchim Leubner 
5124e1bc9a0SAchim Leubner     if(smIS_SPC(agRoot))
5134e1bc9a0SAchim Leubner     {
5144e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_SPC_REG_DEV, IOMB_SIZE64, queueNum);
5154e1bc9a0SAchim Leubner     }
5164e1bc9a0SAchim Leubner     else
5174e1bc9a0SAchim Leubner     {
5184e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_REG_DEV, IOMB_SIZE64, queueNum);
5194e1bc9a0SAchim Leubner     }
5204e1bc9a0SAchim Leubner 
5214e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
5224e1bc9a0SAchim Leubner     {
5234e1bc9a0SAchim Leubner       /* return the request to free pool */
5244e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5254e1bc9a0SAchim Leubner       /* remove the request from IOMap */
5264e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
5274e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
5284e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
5294e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
5304e1bc9a0SAchim Leubner 
5314e1bc9a0SAchim Leubner       if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
5324e1bc9a0SAchim Leubner       {
5334e1bc9a0SAchim Leubner         SA_DBG1(("saRegisterNewDevice: saving pRequest (%p) for later use\n", pRequest));
5344e1bc9a0SAchim Leubner         saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
5354e1bc9a0SAchim Leubner       }
5364e1bc9a0SAchim Leubner       else
5374e1bc9a0SAchim Leubner       {
5384e1bc9a0SAchim Leubner         /* return the request to free pool */
5394e1bc9a0SAchim Leubner         saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5404e1bc9a0SAchim Leubner       }
5414e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5424e1bc9a0SAchim Leubner       SA_DBG1(("saRegisterNewDevice, sending IOMB failed\n" ));
5434e1bc9a0SAchim Leubner     }
5444e1bc9a0SAchim Leubner     SA_DBG3(("saRegisterNewDevice: end\n"));
5454e1bc9a0SAchim Leubner 
5464e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "zd");
5474e1bc9a0SAchim Leubner     return ret;
5484e1bc9a0SAchim Leubner }
5494e1bc9a0SAchim Leubner 
5504e1bc9a0SAchim Leubner /******************************************************************************/
5514e1bc9a0SAchim Leubner /*! \brief Register a callback for a specific event
5524e1bc9a0SAchim Leubner  *
5534e1bc9a0SAchim Leubner  *  Register a callback for a Event API
5544e1bc9a0SAchim Leubner  *
5554e1bc9a0SAchim Leubner  *  \param agRoot          Handles for this instance of SAS/SATA hardware
5564e1bc9a0SAchim Leubner  *  \param eventSourceType Event Type
5574e1bc9a0SAchim Leubner  *  \param callbackPtr     Function pointer to OS layer
5584e1bc9a0SAchim Leubner  *
5594e1bc9a0SAchim Leubner  *  \return
5604e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS
5614e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE
5624e1bc9a0SAchim Leubner  *
5634e1bc9a0SAchim Leubner  */
5644e1bc9a0SAchim Leubner /*******************************************************************************/
saRegisterEventCallback(agsaRoot_t * agRoot,bit32 eventSourceType,ossaGenericCB_t callbackPtr)5654e1bc9a0SAchim Leubner GLOBAL bit32 saRegisterEventCallback(
5664e1bc9a0SAchim Leubner                         agsaRoot_t                *agRoot,
5674e1bc9a0SAchim Leubner                         bit32                     eventSourceType,
5684e1bc9a0SAchim Leubner                         ossaGenericCB_t           callbackPtr
5694e1bc9a0SAchim Leubner                         )
5704e1bc9a0SAchim Leubner {
5714e1bc9a0SAchim Leubner   agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
5724e1bc9a0SAchim Leubner   bit32               ret = AGSA_RC_FAILURE;
5734e1bc9a0SAchim Leubner 
5744e1bc9a0SAchim Leubner   SA_DBG3(("saRegisterEventCallback: start\n"));
5754e1bc9a0SAchim Leubner   switch (eventSourceType)
5764e1bc9a0SAchim Leubner   {
5774e1bc9a0SAchim Leubner     case OSSA_EVENT_SOURCE_DEVICE_HANDLE_ADDED:
5784e1bc9a0SAchim Leubner       saRoot->DeviceRegistrationCB =  (ossaDeviceRegistrationCB_t)callbackPtr;
5794e1bc9a0SAchim Leubner       ret = AGSA_RC_SUCCESS;
5804e1bc9a0SAchim Leubner       break;
5814e1bc9a0SAchim Leubner     case OSSA_EVENT_SOURCE_DEVICE_HANDLE_REMOVED:
5824e1bc9a0SAchim Leubner       saRoot->DeviceDeregistrationCB = (ossaDeregisterDeviceHandleCB_t) callbackPtr;
5834e1bc9a0SAchim Leubner       ret = AGSA_RC_SUCCESS;
5844e1bc9a0SAchim Leubner       break;
5854e1bc9a0SAchim Leubner     default:
5864e1bc9a0SAchim Leubner       SA_DBG1(("saRegisterEventCallback: not allowed case %d\n", eventSourceType));
5874e1bc9a0SAchim Leubner       ret = AGSA_RC_FAILURE;
5884e1bc9a0SAchim Leubner       break;
5894e1bc9a0SAchim Leubner   }
5904e1bc9a0SAchim Leubner   return ret;
5914e1bc9a0SAchim Leubner }
5924e1bc9a0SAchim Leubner 
5934e1bc9a0SAchim Leubner /******************************************************************************/
5944e1bc9a0SAchim Leubner /*! \brief Get Device Information
5954e1bc9a0SAchim Leubner  *
5964e1bc9a0SAchim Leubner  *  Get SAS/SATA device information API
5974e1bc9a0SAchim Leubner  *
5984e1bc9a0SAchim Leubner  *  \param agRoot          Handles for this instance of SAS/SATA hardware
5994e1bc9a0SAchim Leubner  *  \param option          device general information or extended information
6004e1bc9a0SAchim Leubner  *  \param agDevHandle     Pointer of device handle
6014e1bc9a0SAchim Leubner  *
6024e1bc9a0SAchim Leubner  *  \return
6034e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS
6044e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE
6054e1bc9a0SAchim Leubner  *
6064e1bc9a0SAchim Leubner  */
6074e1bc9a0SAchim Leubner /*******************************************************************************/
saGetDeviceInfo(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 option,bit32 queueNum,agsaDevHandle_t * agDevHandle)6084e1bc9a0SAchim Leubner GLOBAL bit32 saGetDeviceInfo(
6094e1bc9a0SAchim Leubner                         agsaRoot_t                *agRoot,
6104e1bc9a0SAchim Leubner                         agsaContext_t             *agContext,
6114e1bc9a0SAchim Leubner                         bit32                     option,
6124e1bc9a0SAchim Leubner                         bit32                     queueNum,
6134e1bc9a0SAchim Leubner                         agsaDevHandle_t           *agDevHandle
6144e1bc9a0SAchim Leubner                         )
6154e1bc9a0SAchim Leubner {
6164e1bc9a0SAchim Leubner   agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6174e1bc9a0SAchim Leubner   agsaDeviceDesc_t    *pDevice = (agsaDeviceDesc_t *) (agDevHandle->sdkData);
6184e1bc9a0SAchim Leubner   bit32               deviceid;
6194e1bc9a0SAchim Leubner   bit32               ret = AGSA_RC_FAILURE;
6204e1bc9a0SAchim Leubner 
6214e1bc9a0SAchim Leubner   OS_ASSERT(pDevice != agNULL, "saGetDeviceInfo is NULL");
6224e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"ze");
6234e1bc9a0SAchim Leubner 
6244e1bc9a0SAchim Leubner   if (pDevice == agNULL)
6254e1bc9a0SAchim Leubner   {
6264e1bc9a0SAchim Leubner     SA_DBG1(("saGetDeviceInfo: pDevice is NULL \n"));
6274e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "ze");
6284e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
6294e1bc9a0SAchim Leubner   }
6304e1bc9a0SAchim Leubner 
6314e1bc9a0SAchim Leubner   /* Get deviceid */
6324e1bc9a0SAchim Leubner   deviceid = pDevice->DeviceMapIndex;
6334e1bc9a0SAchim Leubner   SA_DBG3(("saGetDeviceInfo: start pDevice %p, deviceId %d\n", pDevice, deviceid));
6344e1bc9a0SAchim Leubner 
6354e1bc9a0SAchim Leubner   /* verify the agDeviceHandle with the one in the deviceMap */
6364e1bc9a0SAchim Leubner   if ((deviceid != saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceIdFromFW) ||
6374e1bc9a0SAchim Leubner      (pDevice != saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle))
6384e1bc9a0SAchim Leubner   {
6394e1bc9a0SAchim Leubner     SA_DBG1(("saGetDeviceInfo: Not match failure or device not exist\n"));
6404e1bc9a0SAchim Leubner     ret = AGSA_RC_FAILURE;
6414e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "ze");
6424e1bc9a0SAchim Leubner     return ret;
6434e1bc9a0SAchim Leubner   }
6444e1bc9a0SAchim Leubner 
6454e1bc9a0SAchim Leubner   /* send IOMB to the SPC */
6464e1bc9a0SAchim Leubner   ret = mpiGetDeviceInfoCmd(agRoot, agContext, deviceid, option, queueNum);
6474e1bc9a0SAchim Leubner 
6484e1bc9a0SAchim Leubner   SA_DBG3(("saGetDeviceInfo: end\n"));
6494e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "ze");
6504e1bc9a0SAchim Leubner   return ret;
6514e1bc9a0SAchim Leubner }
6524e1bc9a0SAchim Leubner 
6534e1bc9a0SAchim Leubner /******************************************************************************/
6544e1bc9a0SAchim Leubner /*! \brief Set Device Information
6554e1bc9a0SAchim Leubner  *
6564e1bc9a0SAchim Leubner  *  Set SAS/SATA device information API
6574e1bc9a0SAchim Leubner  *
6584e1bc9a0SAchim Leubner  *  \param agRoot          Handles for this instance of SAS/SATA hardware
6594e1bc9a0SAchim Leubner  *  \param agContext       Pointer to this API context
6604e1bc9a0SAchim Leubner  *  \param queueNum        IQ/OQ number
6614e1bc9a0SAchim Leubner  *  \param agDevHandle     Pointer of device handle
6624e1bc9a0SAchim Leubner  *  \param option          device general information or extended information
6634e1bc9a0SAchim Leubner  *  \param param           Parameter of Set Device Infomation
6644e1bc9a0SAchim Leubner  *
6654e1bc9a0SAchim Leubner  *  \return
6664e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS
6674e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE
6684e1bc9a0SAchim Leubner  *
6694e1bc9a0SAchim Leubner  */
6704e1bc9a0SAchim Leubner /*******************************************************************************/
saSetDeviceInfo(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,agsaDevHandle_t * agDevHandle,bit32 option,bit32 param,ossaSetDeviceInfoCB_t agCB)6714e1bc9a0SAchim Leubner GLOBAL bit32 saSetDeviceInfo(
6724e1bc9a0SAchim Leubner                         agsaRoot_t            *agRoot,
6734e1bc9a0SAchim Leubner                         agsaContext_t         *agContext,
6744e1bc9a0SAchim Leubner                         bit32                 queueNum,
6754e1bc9a0SAchim Leubner                         agsaDevHandle_t       *agDevHandle,
6764e1bc9a0SAchim Leubner                         bit32                  option,
6774e1bc9a0SAchim Leubner                         bit32                  param,
6784e1bc9a0SAchim Leubner                         ossaSetDeviceInfoCB_t  agCB
6794e1bc9a0SAchim Leubner                         )
6804e1bc9a0SAchim Leubner {
6814e1bc9a0SAchim Leubner   agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
6824e1bc9a0SAchim Leubner   agsaDeviceDesc_t    *pDevice = (agsaDeviceDesc_t *) (agDevHandle->sdkData);
6834e1bc9a0SAchim Leubner   bit32               deviceid;
6844e1bc9a0SAchim Leubner   bit32               ret = AGSA_RC_FAILURE;
6854e1bc9a0SAchim Leubner 
6864e1bc9a0SAchim Leubner   OS_ASSERT(pDevice != agNULL, "saSetDeviceInfo is NULL");
6874e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"zf");
6884e1bc9a0SAchim Leubner 
6894e1bc9a0SAchim Leubner   SA_DBG2(("saSetDeviceInfo: start pDevice %p, option=0x%x param=0x0%x\n", pDevice, option, param));
6904e1bc9a0SAchim Leubner   if(agNULL ==  pDevice )
6914e1bc9a0SAchim Leubner   {
6924e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "zf");
6934e1bc9a0SAchim Leubner     return ret;
6944e1bc9a0SAchim Leubner   }
6954e1bc9a0SAchim Leubner 
6964e1bc9a0SAchim Leubner 
6974e1bc9a0SAchim Leubner   /* Get deviceid */
6984e1bc9a0SAchim Leubner   deviceid = pDevice->DeviceMapIndex;
6994e1bc9a0SAchim Leubner   pDevice->option = option;
7004e1bc9a0SAchim Leubner   pDevice->param = param;
7014e1bc9a0SAchim Leubner 
7024e1bc9a0SAchim Leubner   SA_DBG3(("saSetDeviceInfo: deviceId %d\n", deviceid));
7034e1bc9a0SAchim Leubner 
7044e1bc9a0SAchim Leubner   /* verify the agDeviceHandle with the one in the deviceMap */
7054e1bc9a0SAchim Leubner   if ((deviceid != saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceIdFromFW) ||
7064e1bc9a0SAchim Leubner      (pDevice != saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle))
7074e1bc9a0SAchim Leubner   {
7084e1bc9a0SAchim Leubner     SA_DBG1(("saSetDeviceInfo: Not match failure or device not exist\n"));
7094e1bc9a0SAchim Leubner     ret = AGSA_RC_FAILURE;
7104e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "zf");
7114e1bc9a0SAchim Leubner     return ret;
7124e1bc9a0SAchim Leubner   }
7134e1bc9a0SAchim Leubner 
7144e1bc9a0SAchim Leubner   /* send IOMB to the SPC */
7154e1bc9a0SAchim Leubner   ret = mpiSetDeviceInfoCmd(agRoot, agContext, deviceid, option, queueNum, param, agCB);
7164e1bc9a0SAchim Leubner 
7174e1bc9a0SAchim Leubner   SA_DBG3(("saSetDeviceInfo: end\n"));
7184e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "zf");
7194e1bc9a0SAchim Leubner   return ret;
7204e1bc9a0SAchim Leubner }
7214e1bc9a0SAchim Leubner 
7224e1bc9a0SAchim Leubner /******************************************************************************/
7234e1bc9a0SAchim Leubner /*! \brief Get Device State
7244e1bc9a0SAchim Leubner  *
7254e1bc9a0SAchim Leubner  *  Get SAS/SATA device state API
7264e1bc9a0SAchim Leubner  *
7274e1bc9a0SAchim Leubner  *  \param agRoot          Handles for this instance of SAS/SATA hardware
7284e1bc9a0SAchim Leubner  *  \param agContext       Pointer to this API context
7294e1bc9a0SAchim Leubner  *  \param queueNum        IQ/OQ number
7304e1bc9a0SAchim Leubner  *  \param agDevHandle     Pointer of device handler
7314e1bc9a0SAchim Leubner  *
7324e1bc9a0SAchim Leubner  *  \return
7334e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS
7344e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE
7354e1bc9a0SAchim Leubner  *
7364e1bc9a0SAchim Leubner  */
7374e1bc9a0SAchim Leubner /*******************************************************************************/
saGetDeviceState(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,agsaDevHandle_t * agDevHandle)7384e1bc9a0SAchim Leubner GLOBAL bit32 saGetDeviceState(
7394e1bc9a0SAchim Leubner                         agsaRoot_t                *agRoot,
7404e1bc9a0SAchim Leubner                         agsaContext_t             *agContext,
7414e1bc9a0SAchim Leubner                         bit32                     queueNum,
7424e1bc9a0SAchim Leubner                         agsaDevHandle_t           *agDevHandle
7434e1bc9a0SAchim Leubner                         )
7444e1bc9a0SAchim Leubner {
7454e1bc9a0SAchim Leubner   agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
7464e1bc9a0SAchim Leubner   agsaDeviceDesc_t    *pDevice = (agsaDeviceDesc_t *) (agDevHandle->sdkData);
7474e1bc9a0SAchim Leubner   bit32               deviceid;
7484e1bc9a0SAchim Leubner   bit32               ret = AGSA_RC_FAILURE;
7494e1bc9a0SAchim Leubner 
7504e1bc9a0SAchim Leubner   OS_ASSERT(pDevice != agNULL, "saGetDeviceState is NULL");
7514e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"zg");
7524e1bc9a0SAchim Leubner 
7534e1bc9a0SAchim Leubner   if (pDevice == agNULL)
7544e1bc9a0SAchim Leubner   {
7554e1bc9a0SAchim Leubner     SA_DBG1(("saGetDeviceState: pDevice is NULL \n"));
7564e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "zg");
7574e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
7584e1bc9a0SAchim Leubner   }
7594e1bc9a0SAchim Leubner 
7604e1bc9a0SAchim Leubner   SA_DBG3(("saGetDeviceState: start pDevice %p\n", pDevice));
7614e1bc9a0SAchim Leubner 
7624e1bc9a0SAchim Leubner   /* Get deviceid */
7634e1bc9a0SAchim Leubner   deviceid = pDevice->DeviceMapIndex;
7644e1bc9a0SAchim Leubner 
7654e1bc9a0SAchim Leubner   /* verify the agDeviceHandle with the one in the deviceMap */
7664e1bc9a0SAchim Leubner   if ((deviceid != saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceIdFromFW) ||
7674e1bc9a0SAchim Leubner      (pDevice != saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle))
7684e1bc9a0SAchim Leubner   {
7694e1bc9a0SAchim Leubner     SA_DBG1(("saGetDeviceState: Not match failure or device not exist\n"));
7704e1bc9a0SAchim Leubner     ret = AGSA_RC_FAILURE;
7714e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "zg");
7724e1bc9a0SAchim Leubner     return ret;
7734e1bc9a0SAchim Leubner   }
7744e1bc9a0SAchim Leubner 
7754e1bc9a0SAchim Leubner   /* send IOMB to the SPC */
7764e1bc9a0SAchim Leubner   ret = mpiGetDeviceStateCmd(agRoot, agContext, deviceid, queueNum);
7774e1bc9a0SAchim Leubner 
7784e1bc9a0SAchim Leubner   SA_DBG3(("saGetDeviceState: end\n"));
7794e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "zg");
7804e1bc9a0SAchim Leubner   return ret;
7814e1bc9a0SAchim Leubner }
7824e1bc9a0SAchim Leubner 
7834e1bc9a0SAchim Leubner /******************************************************************************/
7844e1bc9a0SAchim Leubner /*! \brief Set Device State
7854e1bc9a0SAchim Leubner  *
7864e1bc9a0SAchim Leubner  *  Set SAS/SATA device state API
7874e1bc9a0SAchim Leubner  *
7884e1bc9a0SAchim Leubner  *  \param agRoot          Handles for this instance of SAS/SATA hardware
7894e1bc9a0SAchim Leubner  *  \param agContext       Pointer to this API context
7904e1bc9a0SAchim Leubner  *  \param queueNum        IQ/OQ number
7914e1bc9a0SAchim Leubner  *  \param agDevHandle     Pointer of device handler
7924e1bc9a0SAchim Leubner  *  \param newDeviceState  new device state
7934e1bc9a0SAchim Leubner  *
7944e1bc9a0SAchim Leubner  *  \return
7954e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS
7964e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE
7974e1bc9a0SAchim Leubner  *
7984e1bc9a0SAchim Leubner  */
7994e1bc9a0SAchim Leubner /*******************************************************************************/
saSetDeviceState(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,agsaDevHandle_t * agDevHandle,bit32 newDeviceState)8004e1bc9a0SAchim Leubner GLOBAL bit32 saSetDeviceState(
8014e1bc9a0SAchim Leubner                         agsaRoot_t      *agRoot,
8024e1bc9a0SAchim Leubner                         agsaContext_t   *agContext,
8034e1bc9a0SAchim Leubner                         bit32           queueNum,
8044e1bc9a0SAchim Leubner                         agsaDevHandle_t *agDevHandle,
8054e1bc9a0SAchim Leubner                         bit32            newDeviceState
8064e1bc9a0SAchim Leubner                         )
8074e1bc9a0SAchim Leubner {
8084e1bc9a0SAchim Leubner   agsaLLRoot_t        *saRoot;
8094e1bc9a0SAchim Leubner   agsaDeviceDesc_t    *pDevice;
8104e1bc9a0SAchim Leubner   bit32               deviceid;
8114e1bc9a0SAchim Leubner   bit32               ret = AGSA_RC_FAILURE;
8124e1bc9a0SAchim Leubner 
8134e1bc9a0SAchim Leubner   saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
8144e1bc9a0SAchim Leubner   OS_ASSERT(saRoot != agNULL, "saSetDeviceState saRoot");
8154e1bc9a0SAchim Leubner 
8164e1bc9a0SAchim Leubner   if(saRoot == agNULL )
8174e1bc9a0SAchim Leubner   {
8184e1bc9a0SAchim Leubner     SA_DBG1(("saSetDeviceState: saRoot is NULL\n"));
8194e1bc9a0SAchim Leubner     return ret;
8204e1bc9a0SAchim Leubner   }
8214e1bc9a0SAchim Leubner 
8224e1bc9a0SAchim Leubner   OS_ASSERT(agDevHandle != agNULL, "saSetDeviceState agDevHandle  is NULL");
8234e1bc9a0SAchim Leubner 
8244e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"zh");
8254e1bc9a0SAchim Leubner 
8264e1bc9a0SAchim Leubner   if(agDevHandle == agNULL )
8274e1bc9a0SAchim Leubner   {
8284e1bc9a0SAchim Leubner     SA_DBG1(("saSetDeviceState: agDevHandle is NULL\n"));
8294e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "zh");
8304e1bc9a0SAchim Leubner     return ret;
8314e1bc9a0SAchim Leubner   }
8324e1bc9a0SAchim Leubner 
8334e1bc9a0SAchim Leubner   pDevice = (agsaDeviceDesc_t *) (agDevHandle->sdkData);
8344e1bc9a0SAchim Leubner 
8354e1bc9a0SAchim Leubner   OS_ASSERT(pDevice != agNULL, "saSetDeviceState pDevice is NULL");
8364e1bc9a0SAchim Leubner 
8374e1bc9a0SAchim Leubner   SA_DBG3(("saSetDeviceState: start pDevice %p\n", pDevice));
8384e1bc9a0SAchim Leubner 
8394e1bc9a0SAchim Leubner   if(pDevice == agNULL )
8404e1bc9a0SAchim Leubner   {
8414e1bc9a0SAchim Leubner     SA_DBG1(("saSetDeviceState: pDevice is NULL\n"));
8424e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "zh");
8434e1bc9a0SAchim Leubner     return ret;
8444e1bc9a0SAchim Leubner   }
8454e1bc9a0SAchim Leubner   /* Get deviceid */
8464e1bc9a0SAchim Leubner   deviceid = pDevice->DeviceMapIndex;
8474e1bc9a0SAchim Leubner 
8484e1bc9a0SAchim Leubner   /* verify the agDeviceHandle with the one in the deviceMap */
8494e1bc9a0SAchim Leubner   if ((deviceid != saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceIdFromFW) ||
8504e1bc9a0SAchim Leubner      (pDevice != saRoot->DeviceMap[deviceid & DEVICE_ID_BITS].DeviceHandle))
8514e1bc9a0SAchim Leubner   {
8524e1bc9a0SAchim Leubner     SA_DBG1(("saSetDeviceState: Not match failure or device not exist\n"));
8534e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "zh");
8544e1bc9a0SAchim Leubner     return ret;
8554e1bc9a0SAchim Leubner   }
8564e1bc9a0SAchim Leubner 
8574e1bc9a0SAchim Leubner   /* send IOMB to the SPC */
8584e1bc9a0SAchim Leubner   ret = mpiSetDeviceStateCmd(agRoot, agContext, deviceid, newDeviceState, queueNum);
8594e1bc9a0SAchim Leubner 
8604e1bc9a0SAchim Leubner   SA_DBG3(("saSetDeviceState: end\n"));
8614e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "zh");
8624e1bc9a0SAchim Leubner   return ret;
8634e1bc9a0SAchim Leubner }
864