xref: /freebsd/sys/dev/pms/RefTisa/sallsdk/spc/sampicmd.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 sampicmd.c
244e1bc9a0SAchim Leubner  *  \brief The file implements the functions of MPI Inbound IOMB/Command to SPC
254e1bc9a0SAchim Leubner  *
264e1bc9a0SAchim Leubner  */
274e1bc9a0SAchim Leubner /******************************************************************************/
284e1bc9a0SAchim Leubner #include <sys/cdefs.h>
294e1bc9a0SAchim Leubner #include <dev/pms/config.h>
304e1bc9a0SAchim Leubner 
314e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
324e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
334e1bc9a0SAchim Leubner #ifdef siTraceFileID
344e1bc9a0SAchim Leubner #undef siTraceFileID
354e1bc9a0SAchim Leubner #endif
364e1bc9a0SAchim Leubner #define siTraceFileID 'I'
374e1bc9a0SAchim Leubner #endif
384e1bc9a0SAchim Leubner 
394e1bc9a0SAchim Leubner /******************************************************************************/
404e1bc9a0SAchim Leubner /*! \brief SAS/SATA LL API ECHO Command
414e1bc9a0SAchim Leubner  *
424e1bc9a0SAchim Leubner  *  This command used to test that MPI between host and SPC IOP is operational.
434e1bc9a0SAchim Leubner  *
444e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA hardware
454e1bc9a0SAchim Leubner  *  \param agContext    Context of SPC FW Flash Update Command
464e1bc9a0SAchim Leubner  *  \param queueNum     Inbound/outbound queue number
474e1bc9a0SAchim Leubner  *  \param echoPayload  Pointer of Echo payload of IOMB
484e1bc9a0SAchim Leubner  *
494e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
504e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
514e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
524e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
534e1bc9a0SAchim Leubner  *
544e1bc9a0SAchim Leubner  */
554e1bc9a0SAchim Leubner /*******************************************************************************/
saEchoCommand(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,void * echoPayload)564e1bc9a0SAchim Leubner GLOBAL bit32 saEchoCommand(
574e1bc9a0SAchim Leubner   agsaRoot_t            *agRoot,
584e1bc9a0SAchim Leubner   agsaContext_t         *agContext,
594e1bc9a0SAchim Leubner   bit32                 queueNum,
604e1bc9a0SAchim Leubner   void                  *echoPayload
614e1bc9a0SAchim Leubner )
624e1bc9a0SAchim Leubner {
634e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_SUCCESS;
644e1bc9a0SAchim Leubner 
654e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "xa");
664e1bc9a0SAchim Leubner 
674e1bc9a0SAchim Leubner   /* setup IOMB payload */
684e1bc9a0SAchim Leubner   ret = mpiEchoCmd(agRoot, queueNum, agContext, echoPayload);
694e1bc9a0SAchim Leubner 
704e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xa");
714e1bc9a0SAchim Leubner 
724e1bc9a0SAchim Leubner   return ret;
734e1bc9a0SAchim Leubner }
744e1bc9a0SAchim Leubner 
754e1bc9a0SAchim Leubner /******************************************************************************/
764e1bc9a0SAchim Leubner /*! \brief Build a IOMB command and send to SPC
774e1bc9a0SAchim Leubner  *
784e1bc9a0SAchim Leubner  *  Build an IOMB if there is a free message buffer and Send it to SPC
794e1bc9a0SAchim Leubner  *
804e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA hardware
814e1bc9a0SAchim Leubner  *  \param payload      Pointer of payload in the IOMB
824e1bc9a0SAchim Leubner  *  \param category     Category of IOMB
834e1bc9a0SAchim Leubner  *  \param opcode       Opcode of IOMB
844e1bc9a0SAchim Leubner  *  \param size         Size of IOMB
854e1bc9a0SAchim Leubner  *  \param queueNum     Inbound/outbound queue number
864e1bc9a0SAchim Leubner  *
874e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
884e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
894e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
904e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
914e1bc9a0SAchim Leubner  */
924e1bc9a0SAchim Leubner /*******************************************************************************/
mpiBuildCmd(agsaRoot_t * agRoot,bit32 * payload,mpiMsgCategory_t category,bit16 opcode,bit16 size,bit32 queueNum)934e1bc9a0SAchim Leubner GLOBAL bit32 mpiBuildCmd(
944e1bc9a0SAchim Leubner   agsaRoot_t        *agRoot,
954e1bc9a0SAchim Leubner   bit32             *payload,
964e1bc9a0SAchim Leubner   mpiMsgCategory_t  category,
974e1bc9a0SAchim Leubner   bit16             opcode,
984e1bc9a0SAchim Leubner   bit16             size,
994e1bc9a0SAchim Leubner   bit32             queueNum
1004e1bc9a0SAchim Leubner   )
1014e1bc9a0SAchim Leubner {
1024e1bc9a0SAchim Leubner   agsaLLRoot_t      *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
1034e1bc9a0SAchim Leubner   mpiICQueue_t      *circularQ;
1044e1bc9a0SAchim Leubner   void              *pMessage;
1054e1bc9a0SAchim Leubner   bit32             ret = AGSA_RC_SUCCESS;
1064e1bc9a0SAchim Leubner   bit32             retVal;
1074e1bc9a0SAchim Leubner   bit8              inq, outq;
1084e1bc9a0SAchim Leubner 
1094e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "xb");
1104e1bc9a0SAchim Leubner 
1114e1bc9a0SAchim Leubner   inq = (bit8)(queueNum & MPI_IB_NUM_MASK);
1124e1bc9a0SAchim Leubner   outq = (bit8)((queueNum & MPI_OB_NUM_MASK) >> MPI_OB_SHIFT);
1134e1bc9a0SAchim Leubner   SA_ASSERT((AGSA_MAX_INBOUND_Q > inq), "The IBQ Number is out of range.");
1144e1bc9a0SAchim Leubner   SA_ASSERT((AGSA_MAX_OUTBOUND_Q > outq), "The OBQ Number is out of range.");
1154e1bc9a0SAchim Leubner 
1164e1bc9a0SAchim Leubner #ifdef SA_USE_MAX_Q
1174e1bc9a0SAchim Leubner   outq = saRoot->QueueConfig.numOutboundQueues -1;
1184e1bc9a0SAchim Leubner   SA_DBG1(("mpiBuildCmd, set OBQ to  %d\n",outq));
1194e1bc9a0SAchim Leubner #endif /* SA_USE_MAX_Q */
1204e1bc9a0SAchim Leubner   /* get a free inbound queue entry */
1214e1bc9a0SAchim Leubner 
1224e1bc9a0SAchim Leubner #ifdef SA_LL_IBQ_PROTECT
1234e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
1244e1bc9a0SAchim Leubner #endif /* SA_LL_IBQ_PROTECT */
1254e1bc9a0SAchim Leubner 
1264e1bc9a0SAchim Leubner   circularQ = &saRoot->inboundQueue[inq];
1274e1bc9a0SAchim Leubner   retVal    = mpiMsgFreeGet(circularQ, size, &pMessage);
1284e1bc9a0SAchim Leubner 
1294e1bc9a0SAchim Leubner   /* return FAILURE if error happened */
1304e1bc9a0SAchim Leubner   if (AGSA_RC_FAILURE == retVal)
1314e1bc9a0SAchim Leubner   {
1324e1bc9a0SAchim Leubner #ifdef SA_LL_IBQ_PROTECT
1334e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
1344e1bc9a0SAchim Leubner #endif /* SA_LL_IBQ_PROTECT */
1354e1bc9a0SAchim Leubner     /* the message size exceeds the inbound queue message size */
1364e1bc9a0SAchim Leubner     SA_DBG1(("mpiBuildCmd, failure\n"));
1374e1bc9a0SAchim Leubner     ret = AGSA_RC_FAILURE;
1384e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xb");
1394e1bc9a0SAchim Leubner     return ret;
1404e1bc9a0SAchim Leubner   }
1414e1bc9a0SAchim Leubner 
1424e1bc9a0SAchim Leubner   /* return BUSY if no more inbound queue entry available */
1434e1bc9a0SAchim Leubner   if (AGSA_RC_BUSY == retVal)
1444e1bc9a0SAchim Leubner   {
1454e1bc9a0SAchim Leubner     SA_DBG1(("mpiBuildCmd, no more IOMB\n"));
1464e1bc9a0SAchim Leubner     ret = AGSA_RC_BUSY;
1474e1bc9a0SAchim Leubner   }
1484e1bc9a0SAchim Leubner   else
1494e1bc9a0SAchim Leubner   {
1504e1bc9a0SAchim Leubner     /* copy payload if it is necessary */
1514e1bc9a0SAchim Leubner     if (agNULL != payload)
1524e1bc9a0SAchim Leubner     {
1534e1bc9a0SAchim Leubner       si_memcpy(pMessage, payload, (size - sizeof(mpiMsgHeader_t)));
1544e1bc9a0SAchim Leubner     }
1554e1bc9a0SAchim Leubner 
1564e1bc9a0SAchim Leubner     /* post the message to SPC */
1574e1bc9a0SAchim Leubner     if (AGSA_RC_FAILURE == mpiMsgProduce(circularQ, (void *)pMessage, category, opcode, outq, (bit8)circularQ->priority))
1584e1bc9a0SAchim Leubner     {
1594e1bc9a0SAchim Leubner       ret = AGSA_RC_FAILURE;
1604e1bc9a0SAchim Leubner     }
1614e1bc9a0SAchim Leubner   }
1624e1bc9a0SAchim Leubner 
1634e1bc9a0SAchim Leubner #ifdef SA_LL_IBQ_PROTECT
1644e1bc9a0SAchim Leubner   ossaSingleThreadedLeave(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
1654e1bc9a0SAchim Leubner #endif /* SA_LL_IBQ_PROTECT */
1664e1bc9a0SAchim Leubner 
1674e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xb");
1684e1bc9a0SAchim Leubner   return ret;
1694e1bc9a0SAchim Leubner }
1704e1bc9a0SAchim Leubner 
1714e1bc9a0SAchim Leubner /******************************************************************************/
1724e1bc9a0SAchim Leubner /*! \brief SPC MPI ECHO Command
1734e1bc9a0SAchim Leubner  *
1744e1bc9a0SAchim Leubner  *  This command used to test that MPI between host and SPC IOP is operational.
1754e1bc9a0SAchim Leubner  *
1764e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
1774e1bc9a0SAchim Leubner  *  \param queueNum     Inbound/outbound queue number
1784e1bc9a0SAchim Leubner  *  \param tag          Tag of this IOMB
1794e1bc9a0SAchim Leubner  *  \param echoPayload  Pointer to the ECHO payload of inbound IOMB
1804e1bc9a0SAchim Leubner  *
1814e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
1824e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
1834e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
1844e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
1854e1bc9a0SAchim Leubner  *
1864e1bc9a0SAchim Leubner  */
1874e1bc9a0SAchim Leubner /*******************************************************************************/
mpiEchoCmd(agsaRoot_t * agRoot,bit32 queueNum,agsaContext_t * agContext,void * echoPayload)1884e1bc9a0SAchim Leubner GLOBAL bit32 mpiEchoCmd(
1894e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
1904e1bc9a0SAchim Leubner   bit32               queueNum,
1914e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
1924e1bc9a0SAchim Leubner   void                *echoPayload
1934e1bc9a0SAchim Leubner   )
1944e1bc9a0SAchim Leubner {
1954e1bc9a0SAchim Leubner   bit32               ret = AGSA_RC_SUCCESS;
1964e1bc9a0SAchim Leubner   agsaLLRoot_t        *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
1974e1bc9a0SAchim Leubner   agsaIORequestDesc_t *pRequest;
1984e1bc9a0SAchim Leubner   agsaEchoCmd_t       payload;
1994e1bc9a0SAchim Leubner 
2004e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "xc");
2014e1bc9a0SAchim Leubner 
2024e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2034e1bc9a0SAchim Leubner   /* Get request from free IORequests */
2044e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
2054e1bc9a0SAchim Leubner 
2064e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
2074e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
2084e1bc9a0SAchim Leubner   {
2094e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2104e1bc9a0SAchim Leubner     SA_DBG1(("mpiEchoCmd, No request from free list\n" ));
2114e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xc");
2124e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
2134e1bc9a0SAchim Leubner   }
2144e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
2154e1bc9a0SAchim Leubner   else
2164e1bc9a0SAchim Leubner   {
2174e1bc9a0SAchim Leubner     /* Remove the request from free list */
2184e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
2194e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
2204e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
2214e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
2224e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
2234e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
2244e1bc9a0SAchim Leubner 
2254e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2264e1bc9a0SAchim Leubner 
2274e1bc9a0SAchim Leubner 
2284e1bc9a0SAchim Leubner     /* build IOMB command and send to SPC */
2294e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaEchoCmd_t, tag), pRequest->HTag);
2304e1bc9a0SAchim Leubner     /* copy Echo payload */
2314e1bc9a0SAchim Leubner     si_memcpy(&payload.payload[0], echoPayload, (sizeof(agsaEchoCmd_t) - 4));
2324e1bc9a0SAchim Leubner     /* build IOMB command and send to SPC */
2334e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_ECHO, IOMB_SIZE64, queueNum);
2344e1bc9a0SAchim Leubner     SA_DBG3(("mpiEchoCmd, return value = %d\n", ret));
2354e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
2364e1bc9a0SAchim Leubner     {
2374e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2384e1bc9a0SAchim Leubner       /* remove the request from IOMap */
2394e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
2404e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
2414e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
2424e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
2434e1bc9a0SAchim Leubner       /* return the request to free pool */
2444e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
2454e1bc9a0SAchim Leubner 
2464e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2474e1bc9a0SAchim Leubner 
2484e1bc9a0SAchim Leubner       SA_DBG1(("mpiEchoCmd, sending IOMB failed\n" ));
2494e1bc9a0SAchim Leubner     }
2504e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
2514e1bc9a0SAchim Leubner     else
2524e1bc9a0SAchim Leubner     {
2534e1bc9a0SAchim Leubner       saRoot->LLCounters.IOCounter.numEchoSent++;
2544e1bc9a0SAchim Leubner     }
2554e1bc9a0SAchim Leubner #endif
2564e1bc9a0SAchim Leubner 
2574e1bc9a0SAchim Leubner   }
2584e1bc9a0SAchim Leubner 
2594e1bc9a0SAchim Leubner   /* return value */
2604e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xc");
2614e1bc9a0SAchim Leubner   return ret;
2624e1bc9a0SAchim Leubner }
2634e1bc9a0SAchim Leubner 
2644e1bc9a0SAchim Leubner 
2654e1bc9a0SAchim Leubner /******************************************************************************/
2664e1bc9a0SAchim Leubner /*! \brief Get Phy Profile Command SPCv
2674e1bc9a0SAchim Leubner  *
2684e1bc9a0SAchim Leubner  *  This command is get # of phys and support speeds from SPCV.
2694e1bc9a0SAchim Leubner  *
2704e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
2714e1bc9a0SAchim Leubner  *  \param agDevHandle  Handle of device
2724e1bc9a0SAchim Leubner  *
2734e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
2744e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
2754e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
2764e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
2774e1bc9a0SAchim Leubner  *
2784e1bc9a0SAchim Leubner  */
2794e1bc9a0SAchim Leubner /*******************************************************************************/
2804e1bc9a0SAchim Leubner 
2814e1bc9a0SAchim Leubner 
mpiGetPhyProfileCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 Operation,bit32 PhyId,void * agCB)2824e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetPhyProfileCmd(
2834e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
2844e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
2854e1bc9a0SAchim Leubner   bit32                Operation,
2864e1bc9a0SAchim Leubner   bit32                PhyId,
2874e1bc9a0SAchim Leubner   void                *agCB
2884e1bc9a0SAchim Leubner   )
2894e1bc9a0SAchim Leubner {
2904e1bc9a0SAchim Leubner   agsaLLRoot_t            *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
2914e1bc9a0SAchim Leubner   agsaIORequestDesc_t     *pRequest;
2924e1bc9a0SAchim Leubner   bit32                   ret = AGSA_RC_SUCCESS;
2934e1bc9a0SAchim Leubner   agsaGetPhyProfileCmd_V_t   payload;
2944e1bc9a0SAchim Leubner 
2954e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "xd");
2964e1bc9a0SAchim Leubner 
2974e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
2984e1bc9a0SAchim Leubner   /* Get request from free IORequests */
2994e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistGetHead(&(saRoot->freeIORequests));
3004e1bc9a0SAchim Leubner 
3014e1bc9a0SAchim Leubner   SA_DBG1(("mpiGetPhyProfileCmd, Operation 0x%x PhyId %d \n",Operation ,PhyId ));
3024e1bc9a0SAchim Leubner 
3034e1bc9a0SAchim Leubner   /* If no LL Control request entry avalibale */
3044e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
3054e1bc9a0SAchim Leubner   {
3064e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3074e1bc9a0SAchim Leubner     SA_DBG1(("mpiGetPhyProfileCmd, No request from free list\n" ));
3084e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
3094e1bc9a0SAchim Leubner   }
3104e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
3114e1bc9a0SAchim Leubner   else
3124e1bc9a0SAchim Leubner   {
3134e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
3144e1bc9a0SAchim Leubner 
3154e1bc9a0SAchim Leubner     /* Remove the request from free list */
3164e1bc9a0SAchim Leubner     saLlistRemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
3174e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
3184e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
3194e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
3204e1bc9a0SAchim Leubner 
3214e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
3224e1bc9a0SAchim Leubner     pRequest->completionCB  = agCB;
3234e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3244e1bc9a0SAchim Leubner 
3254e1bc9a0SAchim Leubner 
3264e1bc9a0SAchim Leubner     /* set payload to zeros */
3274e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaGetPhyProfileCmd_V_t));
3284e1bc9a0SAchim Leubner 
3294e1bc9a0SAchim Leubner     /* set tag field */
3304e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetPhyProfileCmd_V_t, tag), pRequest->HTag);
3314e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetPhyProfileCmd_V_t, Reserved_Ppc_SOP_PHYID), (((Operation & 0xF) << SHIFT8 ) | (PhyId  & 0xFF) ) );
3324e1bc9a0SAchim Leubner     /* build IOMB command and send to SPC */
3334e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_GET_PHY_PROFILE, IOMB_SIZE128, 0);
3344e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
3354e1bc9a0SAchim Leubner     {
3364e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3374e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
3384e1bc9a0SAchim Leubner       /* return the request to free pool */
3394e1bc9a0SAchim Leubner       saLlistAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
3404e1bc9a0SAchim Leubner       /* remove the request from IOMap */
3414e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
3424e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
3434e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
3444e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3454e1bc9a0SAchim Leubner 
3464e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetPhyProfileCmd, sending IOMB failed\n" ));
3474e1bc9a0SAchim Leubner     }
3484e1bc9a0SAchim Leubner     SA_DBG3(("mpiGetPhyProfileCmd, return value = %d\n", ret));
3494e1bc9a0SAchim Leubner   }
3504e1bc9a0SAchim Leubner 
3514e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xd");
3524e1bc9a0SAchim Leubner   /* return value */
3534e1bc9a0SAchim Leubner   return ret;
3544e1bc9a0SAchim Leubner }
3554e1bc9a0SAchim Leubner 
3564e1bc9a0SAchim Leubner 
mpiVHistCapCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 Channel,bit32 NumBitLo,bit32 NumBitHi,bit32 PcieAddrLo,bit32 PcieAddrHi,bit32 ByteCount)3574e1bc9a0SAchim Leubner GLOBAL bit32 mpiVHistCapCmd(
3584e1bc9a0SAchim Leubner                           agsaRoot_t    *agRoot,
3594e1bc9a0SAchim Leubner                           agsaContext_t *agContext,
3604e1bc9a0SAchim Leubner                           bit32         queueNum,
3614e1bc9a0SAchim Leubner                           bit32         Channel,
3624e1bc9a0SAchim Leubner                           bit32         NumBitLo,
3634e1bc9a0SAchim Leubner                           bit32         NumBitHi,
3644e1bc9a0SAchim Leubner                           bit32         PcieAddrLo,
3654e1bc9a0SAchim Leubner                           bit32         PcieAddrHi,
3664e1bc9a0SAchim Leubner                           bit32         ByteCount )
3674e1bc9a0SAchim Leubner {
3684e1bc9a0SAchim Leubner   agsaLLRoot_t            *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
3694e1bc9a0SAchim Leubner   agsaIORequestDesc_t     *pRequest= agNULL;
3704e1bc9a0SAchim Leubner   bit32                   ret = AGSA_RC_SUCCESS;
3714e1bc9a0SAchim Leubner   agsaGetVHistCap_V_t payload;
3724e1bc9a0SAchim Leubner 
3734e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"3C");
3744e1bc9a0SAchim Leubner   SA_DBG1(("mpiVHistCapCmd\n"));
3754e1bc9a0SAchim Leubner 
3764e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3774e1bc9a0SAchim Leubner   /* Get request from free IORequests */
3784e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistGetHead(&(saRoot->freeIORequests));
3794e1bc9a0SAchim Leubner   /* If no LL Control request entry avalibale */
3804e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
3814e1bc9a0SAchim Leubner   {
3824e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
3834e1bc9a0SAchim Leubner     SA_DBG1((", No request from free list\n" ));
3844e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3C");
3854e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
3864e1bc9a0SAchim Leubner   }
3874e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
3884e1bc9a0SAchim Leubner   else
3894e1bc9a0SAchim Leubner   {
3904e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
3914e1bc9a0SAchim Leubner     /* Remove the request from free list */
3924e1bc9a0SAchim Leubner     saLlistRemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
3934e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
3944e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
3954e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
3964e1bc9a0SAchim Leubner 
3974e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
3984e1bc9a0SAchim Leubner     pRequest->completionCB  = (void *)ossaGetPhyProfileCB;
3994e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4004e1bc9a0SAchim Leubner 
4014e1bc9a0SAchim Leubner     /* set payload to zeros */
4024e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaGetVHistCap_V_t));
4034e1bc9a0SAchim Leubner 
4044e1bc9a0SAchim Leubner     /* set tag field */
4054e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetVHistCap_V_t, tag),       pRequest->HTag);
4064e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetVHistCap_V_t, Channel),   Channel );
4074e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetVHistCap_V_t, NumBitLo),  NumBitLo);
4084e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetVHistCap_V_t, NumBitHi),  NumBitHi);
4094e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetVHistCap_V_t, PcieAddrLo),PcieAddrLo);
4104e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetVHistCap_V_t, PcieAddrHi),PcieAddrHi);
4114e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetVHistCap_V_t, ByteCount), ByteCount );
4124e1bc9a0SAchim Leubner 
4134e1bc9a0SAchim Leubner 
4144e1bc9a0SAchim Leubner     /* build IOMB command and send to SPC */
4154e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_GET_VHIST_CAP, IOMB_SIZE128,queueNum );
4164e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
4174e1bc9a0SAchim Leubner     {
4184e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4194e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
4204e1bc9a0SAchim Leubner       /* return the request to free pool */
4214e1bc9a0SAchim Leubner       saLlistAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
4224e1bc9a0SAchim Leubner       /* remove the request from IOMap */
4234e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
4244e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
4254e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
4264e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4274e1bc9a0SAchim Leubner 
4284e1bc9a0SAchim Leubner       SA_DBG1(("mpiVHistCapCmd, sending IOMB failed\n" ));
4294e1bc9a0SAchim Leubner     }
4304e1bc9a0SAchim Leubner     SA_DBG3(("mpiVHistCapCmd, return value = %d\n", ret));
4314e1bc9a0SAchim Leubner   }
4324e1bc9a0SAchim Leubner 
4334e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3C");
4344e1bc9a0SAchim Leubner   /* return value */
4354e1bc9a0SAchim Leubner 
4364e1bc9a0SAchim Leubner   return(ret);
4374e1bc9a0SAchim Leubner }
4384e1bc9a0SAchim Leubner 
mpiSetPhyProfileCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 Operation,bit32 PhyId,bit32 length,void * buffer)4394e1bc9a0SAchim Leubner GLOBAL bit32 mpiSetPhyProfileCmd(
4404e1bc9a0SAchim Leubner   agsaRoot_t    *agRoot,
4414e1bc9a0SAchim Leubner   agsaContext_t *agContext,
4424e1bc9a0SAchim Leubner   bit32         Operation,
4434e1bc9a0SAchim Leubner   bit32         PhyId,
4444e1bc9a0SAchim Leubner   bit32         length,
4454e1bc9a0SAchim Leubner   void *        buffer
4464e1bc9a0SAchim Leubner   )
4474e1bc9a0SAchim Leubner {
4484e1bc9a0SAchim Leubner   agsaLLRoot_t            *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
4494e1bc9a0SAchim Leubner   agsaIORequestDesc_t     *pRequest;
4504e1bc9a0SAchim Leubner   bit32                   ret = AGSA_RC_SUCCESS;
4514e1bc9a0SAchim Leubner   bit32                   i;
4524e1bc9a0SAchim Leubner   agsaSetPhyProfileCmd_V_t     payload;
4534e1bc9a0SAchim Leubner   bit32               * PageData =(bit32 * )buffer;
4544e1bc9a0SAchim Leubner 
4554e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"2P");
4564e1bc9a0SAchim Leubner 
4574e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4584e1bc9a0SAchim Leubner   /* Get request from free IORequests */
4594e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistGetHead(&(saRoot->freeIORequests));
4604e1bc9a0SAchim Leubner 
4614e1bc9a0SAchim Leubner   SA_DBG1(("mpiSetPhyProfileCmd, Operation 0x%x PhyId %d \n",Operation ,PhyId ));
4624e1bc9a0SAchim Leubner 
4634e1bc9a0SAchim Leubner   /* If no LL Control request entry avalibale */
4644e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
4654e1bc9a0SAchim Leubner   {
4664e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4674e1bc9a0SAchim Leubner     SA_DBG1(("mpiSetPhyProfileCmd, No request from free list\n" ));
4684e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
4694e1bc9a0SAchim Leubner   }
4704e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
4714e1bc9a0SAchim Leubner   else
4724e1bc9a0SAchim Leubner   {
4734e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
4744e1bc9a0SAchim Leubner     /* Remove the request from free list */
4754e1bc9a0SAchim Leubner     saLlistRemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
4764e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
4774e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
4784e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
4794e1bc9a0SAchim Leubner 
4804e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
4814e1bc9a0SAchim Leubner     pRequest->SOP = (bit16) Operation;
4824e1bc9a0SAchim Leubner     pRequest->completionCB  = (void *)ossaGetPhyProfileCB;
4834e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
4844e1bc9a0SAchim Leubner 
4854e1bc9a0SAchim Leubner 
4864e1bc9a0SAchim Leubner     /* set payload to zeros */
4874e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaSetPhyProfileCmd_V_t));
4884e1bc9a0SAchim Leubner 
4894e1bc9a0SAchim Leubner     /* set tag field */
4904e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetPhyProfileCmd_V_t, tag), pRequest->HTag);
4914e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetPhyProfileCmd_V_t, Reserved_Ppc_SOP_PHYID), (((Operation & 0xF) << SHIFT8 ) | (PhyId  & 0xFF) ) );
4924e1bc9a0SAchim Leubner 
4934e1bc9a0SAchim Leubner     for(i=0; i < (length / sizeof(bit32)); i++)
4944e1bc9a0SAchim Leubner     {
4954e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetPhyProfileCmd_V_t, PageSpecificArea[i]),* (PageData+i)  );
4964e1bc9a0SAchim Leubner     }
4974e1bc9a0SAchim Leubner 
4984e1bc9a0SAchim Leubner     /* build IOMB command and send to SPC */
4994e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_SET_PHY_PROFILE, IOMB_SIZE128, 0);
5004e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
5014e1bc9a0SAchim Leubner     {
5024e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5034e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
5044e1bc9a0SAchim Leubner       /* return the request to free pool */
5054e1bc9a0SAchim Leubner       saLlistAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
5064e1bc9a0SAchim Leubner       /* remove the request from IOMap */
5074e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
5084e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
5094e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
5104e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5114e1bc9a0SAchim Leubner 
5124e1bc9a0SAchim Leubner       SA_DBG1(("mpiSetPhyProfileCmd, sending IOMB failed\n" ));
5134e1bc9a0SAchim Leubner     }
5144e1bc9a0SAchim Leubner     SA_DBG3(("mpiGetPhyProfileCmd, return value = %d\n", ret));
5154e1bc9a0SAchim Leubner   }
5164e1bc9a0SAchim Leubner 
5174e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2P");
5184e1bc9a0SAchim Leubner   /* return value */
5194e1bc9a0SAchim Leubner   return ret;
5204e1bc9a0SAchim Leubner }
5214e1bc9a0SAchim Leubner 
5224e1bc9a0SAchim Leubner 
5234e1bc9a0SAchim Leubner /******************************************************************************/
5244e1bc9a0SAchim Leubner /*! \brief Get Device Information Command
5254e1bc9a0SAchim Leubner  *
5264e1bc9a0SAchim Leubner  *  This command is get # of phys and support speeds from SPC.
5274e1bc9a0SAchim Leubner  *
5284e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
5294e1bc9a0SAchim Leubner  *  \param agDevHandle  Handle of device
5304e1bc9a0SAchim Leubner  *  \param deviceid     Device Id
5314e1bc9a0SAchim Leubner  *  \param opton        oprion
5324e1bc9a0SAchim Leubner  *
5334e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
5344e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
5354e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
5364e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
5374e1bc9a0SAchim Leubner  *
5384e1bc9a0SAchim Leubner  */
5394e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetDeviceInfoCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 deviceid,bit32 option,bit32 queueNum)5404e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetDeviceInfoCmd(
5414e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
5424e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
5434e1bc9a0SAchim Leubner   bit32               deviceid,
5444e1bc9a0SAchim Leubner   bit32               option,
5454e1bc9a0SAchim Leubner   bit32               queueNum
5464e1bc9a0SAchim Leubner   )
5474e1bc9a0SAchim Leubner {
5484e1bc9a0SAchim Leubner   agsaLLRoot_t            *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
5494e1bc9a0SAchim Leubner   agsaIORequestDesc_t     *pRequest;
5504e1bc9a0SAchim Leubner   bit32                   ret = AGSA_RC_SUCCESS;
5514e1bc9a0SAchim Leubner   agsaGetDevInfoCmd_t     payload;
5524e1bc9a0SAchim Leubner 
5534e1bc9a0SAchim Leubner   SA_ASSERT((agNULL !=saRoot ), "");
5544e1bc9a0SAchim Leubner   if(saRoot == agNULL)
5554e1bc9a0SAchim Leubner   {
5564e1bc9a0SAchim Leubner     SA_DBG1(("mpiGetDeviceInfoCmd: saRoot == agNULL\n"));
5574e1bc9a0SAchim Leubner     return(AGSA_RC_FAILURE);
5584e1bc9a0SAchim Leubner   }
5594e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"2K");
5604e1bc9a0SAchim Leubner 
5614e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5624e1bc9a0SAchim Leubner   /* Get request from free IORequests */
5634e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
5644e1bc9a0SAchim Leubner 
5654e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
5664e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
5674e1bc9a0SAchim Leubner   {
5684e1bc9a0SAchim Leubner     SA_DBG1(("mpiGetDeviceInfoCmd, No request from free list\n" ));
5694e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2K");
5704e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5714e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
5724e1bc9a0SAchim Leubner   }
5734e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
5744e1bc9a0SAchim Leubner   else
5754e1bc9a0SAchim Leubner   {
5764e1bc9a0SAchim Leubner     /* Remove the request from free list */
5774e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
5784e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
5794e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
5804e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
5814e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
5824e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
5834e1bc9a0SAchim Leubner     pRequest->DeviceInfoCmdOption = (bit8)option;
5844e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
5854e1bc9a0SAchim Leubner 
5864e1bc9a0SAchim Leubner 
5874e1bc9a0SAchim Leubner     /* set payload to zeros */
5884e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaGetDevInfoCmd_t));
5894e1bc9a0SAchim Leubner 
5904e1bc9a0SAchim Leubner     /* set tag field */
5914e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetDevInfoCmd_t, tag), pRequest->HTag);
5924e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetDevInfoCmd_t, DeviceId), deviceid);
5934e1bc9a0SAchim Leubner     /* build IOMB command and send to SPC */
5944e1bc9a0SAchim Leubner     if( smIS_SPC(agRoot))
5954e1bc9a0SAchim Leubner     {
5964e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_SPC_GET_DEV_INFO, IOMB_SIZE64, queueNum);
5974e1bc9a0SAchim Leubner     }
5984e1bc9a0SAchim Leubner     else
5994e1bc9a0SAchim Leubner     {
6004e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_GET_DEV_INFO, IOMB_SIZE64, queueNum);
6014e1bc9a0SAchim Leubner     }
6024e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
6034e1bc9a0SAchim Leubner     {
6044e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6054e1bc9a0SAchim Leubner       /* remove the request from IOMap */
6064e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
6074e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
6084e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
6094e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
6104e1bc9a0SAchim Leubner       /* return the request to free pool */
6114e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
6124e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6134e1bc9a0SAchim Leubner 
6144e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetDeviceInfoCmd, sending IOMB failed\n" ));
6154e1bc9a0SAchim Leubner     }
6164e1bc9a0SAchim Leubner     SA_DBG3(("mpiGetDeviceInfoCmd, return value = %d\n", ret));
6174e1bc9a0SAchim Leubner   }
6184e1bc9a0SAchim Leubner 
6194e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2K");
6204e1bc9a0SAchim Leubner   /* return value */
6214e1bc9a0SAchim Leubner   return ret;
6224e1bc9a0SAchim Leubner }
6234e1bc9a0SAchim Leubner 
6244e1bc9a0SAchim Leubner /******************************************************************************/
6254e1bc9a0SAchim Leubner /*! \brief Set Device Information Command
6264e1bc9a0SAchim Leubner  *
6274e1bc9a0SAchim Leubner  *  This command is Set Device Information to SPC.
6284e1bc9a0SAchim Leubner  *
6294e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
6304e1bc9a0SAchim Leubner  *  \param agDevHandle  Handle of device
6314e1bc9a0SAchim Leubner  *  \param deviceid     Device Id
6324e1bc9a0SAchim Leubner  *  \param opton        oprion
6334e1bc9a0SAchim Leubner  *
6344e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
6354e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
6364e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
6374e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
6384e1bc9a0SAchim Leubner  *
6394e1bc9a0SAchim Leubner  */
6404e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSetDeviceInfoCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 deviceid,bit32 option,bit32 queueNum,bit32 param,ossaSetDeviceInfoCB_t agCB)6414e1bc9a0SAchim Leubner GLOBAL bit32 mpiSetDeviceInfoCmd(
6424e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
6434e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
6444e1bc9a0SAchim Leubner   bit32               deviceid,
6454e1bc9a0SAchim Leubner   bit32               option,
6464e1bc9a0SAchim Leubner   bit32               queueNum,
6474e1bc9a0SAchim Leubner   bit32               param,
6484e1bc9a0SAchim Leubner   ossaSetDeviceInfoCB_t   agCB
6494e1bc9a0SAchim Leubner   )
6504e1bc9a0SAchim Leubner {
6514e1bc9a0SAchim Leubner   agsaLLRoot_t            *saRoot = agNULL;
6524e1bc9a0SAchim Leubner   agsaIORequestDesc_t     *pRequest = agNULL;
6534e1bc9a0SAchim Leubner   bit32                   ret = AGSA_RC_SUCCESS;
6544e1bc9a0SAchim Leubner   agsaSetDevInfoCmd_t     payload;
6554e1bc9a0SAchim Leubner 
6564e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xe");
6574e1bc9a0SAchim Leubner 
6584e1bc9a0SAchim Leubner   /* sanity check */
6594e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != agRoot), "");
6604e1bc9a0SAchim Leubner   saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
6614e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != saRoot), "");
6624e1bc9a0SAchim Leubner 
6634e1bc9a0SAchim Leubner   /* Get request from free IORequests */
6644e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6654e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
6664e1bc9a0SAchim Leubner 
6674e1bc9a0SAchim Leubner   SA_DBG2(("mpiSetDeviceInfoCmd, param 0x%08X option 0x%08X\n",param,option ));
6684e1bc9a0SAchim Leubner 
6694e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
6704e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
6714e1bc9a0SAchim Leubner   {
6724e1bc9a0SAchim Leubner     SA_DBG1(("mpiSetDeviceInfoCmd, No request from free list\n" ));
6734e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xe");
6744e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6754e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
6764e1bc9a0SAchim Leubner   }
6774e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
6784e1bc9a0SAchim Leubner   else
6794e1bc9a0SAchim Leubner   {
6804e1bc9a0SAchim Leubner     /* Remove the request from free list */
6814e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
6824e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
6834e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
6844e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
6854e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
6864e1bc9a0SAchim Leubner     pRequest->completionCB = (ossaSSPCompletedCB_t)agCB;
6874e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
6884e1bc9a0SAchim Leubner 
6894e1bc9a0SAchim Leubner     /* set payload to zeros */
6904e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaSetDevInfoCmd_t));
6914e1bc9a0SAchim Leubner 
6924e1bc9a0SAchim Leubner     /* set tag field */
6934e1bc9a0SAchim Leubner 
6944e1bc9a0SAchim Leubner     if(smIS_SPC(agRoot))
6954e1bc9a0SAchim Leubner     {
6964e1bc9a0SAchim Leubner       option &= SET_DEV_INFO_SPC_DW3_MASK;
6974e1bc9a0SAchim Leubner       param  &= SET_DEV_INFO_SPC_DW4_MASK;
6984e1bc9a0SAchim Leubner     }
6994e1bc9a0SAchim Leubner     else
7004e1bc9a0SAchim Leubner     {
7014e1bc9a0SAchim Leubner       option &= SET_DEV_INFO_V_DW3_MASK;
7024e1bc9a0SAchim Leubner       param  &= SET_DEV_INFO_V_DW4_MASK;
7034e1bc9a0SAchim Leubner     }
7044e1bc9a0SAchim Leubner 
7054e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetDevInfoCmd_t, tag), pRequest->HTag);
7064e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetDevInfoCmd_t, deviceId), deviceid);
7074e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetDevInfoCmd_t, SA_SR_SI), option);
7084e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetDevInfoCmd_t, DEVA_MCN_R_ITNT), param );
7094e1bc9a0SAchim Leubner 
7104e1bc9a0SAchim Leubner     /* build IOMB command and send to SPC */
7114e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_SET_DEV_INFO, IOMB_SIZE64, queueNum);
7124e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
7134e1bc9a0SAchim Leubner     {
7144e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7154e1bc9a0SAchim Leubner       /* remove the request from IOMap */
7164e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
7174e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
7184e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
7194e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
7204e1bc9a0SAchim Leubner 
7214e1bc9a0SAchim Leubner       /* return the request to free pool */
7224e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
7234e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
7244e1bc9a0SAchim Leubner 
7254e1bc9a0SAchim Leubner       SA_DBG1(("mpiSetDeviceInfoCmd, sending IOMB failed\n" ));
7264e1bc9a0SAchim Leubner     }
7274e1bc9a0SAchim Leubner     SA_DBG3(("mpiSetDeviceInfoCmd, return value = %d\n", ret));
7284e1bc9a0SAchim Leubner   }
7294e1bc9a0SAchim Leubner 
7304e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xe");
7314e1bc9a0SAchim Leubner   /* return value */
7324e1bc9a0SAchim Leubner 
7334e1bc9a0SAchim Leubner   return ret;
7344e1bc9a0SAchim Leubner }
7354e1bc9a0SAchim Leubner 
7364e1bc9a0SAchim Leubner /******************************************************************************/
7374e1bc9a0SAchim Leubner /*! \brief SPC MPI Phy Start Command
7384e1bc9a0SAchim Leubner  *
7394e1bc9a0SAchim Leubner  *  This command sends to SPC for the I/O.
7404e1bc9a0SAchim Leubner  *
7414e1bc9a0SAchim Leubner  *  \param agRoot        Handles for this instance of SAS/SATA LLL
7424e1bc9a0SAchim Leubner  *  \param tag           tage for IOMB
7434e1bc9a0SAchim Leubner  *  \param phyId         the phy id of the link will be started
7444e1bc9a0SAchim Leubner  *  \param agPhyConfig   the phy properity
7454e1bc9a0SAchim Leubner  *  \param agSASIdentify the SAS identify frame will be sent by the phy
7464e1bc9a0SAchim Leubner  *
7474e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
7484e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
7494e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
7504e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
7514e1bc9a0SAchim Leubner  *
7524e1bc9a0SAchim Leubner  */
7534e1bc9a0SAchim Leubner /*******************************************************************************/
mpiPhyStartCmd(agsaRoot_t * agRoot,bit32 tag,bit32 phyId,agsaPhyConfig_t * agPhyConfig,agsaSASIdentify_t * agSASIdentify,bit32 queueNum)7544e1bc9a0SAchim Leubner GLOBAL bit32 mpiPhyStartCmd(
7554e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
7564e1bc9a0SAchim Leubner   bit32               tag,
7574e1bc9a0SAchim Leubner   bit32               phyId,
7584e1bc9a0SAchim Leubner   agsaPhyConfig_t     *agPhyConfig,
7594e1bc9a0SAchim Leubner   agsaSASIdentify_t   *agSASIdentify,
7604e1bc9a0SAchim Leubner   bit32               queueNum
7614e1bc9a0SAchim Leubner   )
7624e1bc9a0SAchim Leubner {
7634e1bc9a0SAchim Leubner   bit32               ret = AGSA_RC_SUCCESS;
7644e1bc9a0SAchim Leubner   agsaPhyStartCmd_t   payload;
7654e1bc9a0SAchim Leubner   bit32               *pValue;
7664e1bc9a0SAchim Leubner   bit32               *ptemp;
7674e1bc9a0SAchim Leubner   bit32               index;
7684e1bc9a0SAchim Leubner   bit32               dw2 = 0;
7694e1bc9a0SAchim Leubner 
7704e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
7714e1bc9a0SAchim Leubner   bit32               Sscd;
7724e1bc9a0SAchim Leubner #endif  /* SALLSDK_DEBUG */
7734e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xg");
7744e1bc9a0SAchim Leubner 
7754e1bc9a0SAchim Leubner   /* set payload to zeros */
7764e1bc9a0SAchim Leubner   si_memset(&payload, 0, sizeof(agsaPhyStartCmd_t));
7774e1bc9a0SAchim Leubner 
7784e1bc9a0SAchim Leubner   pValue = (bit32 *)agSASIdentify;
7794e1bc9a0SAchim Leubner   ptemp = (bit32 *)&payload.sasIdentify;
7804e1bc9a0SAchim Leubner   index = (agPhyConfig->phyProperties & 0x0ff00) >> SHIFT8;
7814e1bc9a0SAchim Leubner 
7824e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
7834e1bc9a0SAchim Leubner   Sscd =  (agPhyConfig->phyProperties & 0xf0000) >> SHIFT16;
7844e1bc9a0SAchim Leubner #endif  /* SALLSDK_DEBUG */
7854e1bc9a0SAchim Leubner 
7864e1bc9a0SAchim Leubner   SA_DBG1(("mpiPhyStartCmd,phyId = %d dw 2 0x%08X\n",phyId ,((phyId & SM_PHYID_MASK) | ((agPhyConfig->phyProperties & 0xfff) << SHIFT8) | (agPhyConfig->phyProperties & 0xf0000) )));
7874e1bc9a0SAchim Leubner 
7884e1bc9a0SAchim Leubner 
7894e1bc9a0SAchim Leubner   SA_DBG2(("mpiPhyStartCmd,phyId 0x%x phyProperties 0x%x index 0x%x Sscd 0x%x\n",phyId, agPhyConfig->phyProperties,index,Sscd));
7904e1bc9a0SAchim Leubner 
7914e1bc9a0SAchim Leubner   dw2 = ((phyId & SM_PHYID_MASK)                             | /* PHY id */
7924e1bc9a0SAchim Leubner         ((agPhyConfig->phyProperties & 0x000000FF) << SHIFT8)| /* SLR Mode */
7934e1bc9a0SAchim Leubner          (agPhyConfig->phyProperties & 0x000f0000)           | /* SSCD */
7944e1bc9a0SAchim Leubner          (agPhyConfig->phyProperties & 0x00700000)           | /* setting bit20, bit21 and bit22 for optical mode */
7954e1bc9a0SAchim Leubner          (agPhyConfig->phyProperties & 0x00800000) );          /* bit23 active cable mode BCT Disable 12g only*/
7964e1bc9a0SAchim Leubner 
7974e1bc9a0SAchim Leubner   /* Haileah Phy analogsetting bit enable*/
7984e1bc9a0SAchim Leubner   if(smIS_SPC(agRoot))
7994e1bc9a0SAchim Leubner   {
8004e1bc9a0SAchim Leubner     if( smIS_spc8081(agRoot))
8014e1bc9a0SAchim Leubner     {
8024e1bc9a0SAchim Leubner        dw2 = dw2 | 0x08000;
8034e1bc9a0SAchim Leubner      }
8044e1bc9a0SAchim Leubner   }
8054e1bc9a0SAchim Leubner 
8064e1bc9a0SAchim Leubner   SA_DBG1(("mpiPhyStartCmd,dw2 0x%08x\n",dw2));
8074e1bc9a0SAchim Leubner   SA_ASSERT(((agSASIdentify->sasAddressHi[0] || agSASIdentify->sasAddressHi[1] ||
8084e1bc9a0SAchim Leubner   agSASIdentify->sasAddressHi[2] || agSASIdentify->sasAddressHi[3] ||
8094e1bc9a0SAchim Leubner   agSASIdentify->sasAddressLo[0] || agSASIdentify->sasAddressLo[1] ||
8104e1bc9a0SAchim Leubner   agSASIdentify->sasAddressLo[2] || agSASIdentify->sasAddressLo[3])), "SAS Address Zero");
8114e1bc9a0SAchim Leubner 
8124e1bc9a0SAchim Leubner   SA_DBG1(("mpiPhyStartCmd,SAS addr Hi 0x%02X%02X%02X%02X Lo 0x%02X%02X%02X%02X\n",
8134e1bc9a0SAchim Leubner                                                               agSASIdentify->sasAddressHi[0],agSASIdentify->sasAddressHi[1],
8144e1bc9a0SAchim Leubner                                                               agSASIdentify->sasAddressHi[2],agSASIdentify->sasAddressHi[3],
8154e1bc9a0SAchim Leubner                                                               agSASIdentify->sasAddressLo[0],agSASIdentify->sasAddressLo[1],
8164e1bc9a0SAchim Leubner                                                               agSASIdentify->sasAddressLo[2],agSASIdentify->sasAddressLo[3]));
8174e1bc9a0SAchim Leubner 
8184e1bc9a0SAchim Leubner   /* setup phy ID field */
8194e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaPhyStartCmd_t, SscdAseSHLmMlrPhyId),dw2);
8204e1bc9a0SAchim Leubner 
8214e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaPhyStartCmd_t, tag), tag);
8224e1bc9a0SAchim Leubner 
8234e1bc9a0SAchim Leubner   /* setup analog setting index field */
8244e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaPhyStartCmd_t, analogSetupIdx), index);
8254e1bc9a0SAchim Leubner   /* copy SASIdentify to payload of IOMB */
8264e1bc9a0SAchim Leubner   si_memcpy(ptemp, pValue, sizeof(agsaSASIdentify_t));
8274e1bc9a0SAchim Leubner 
8284e1bc9a0SAchim Leubner   /* build IOMB command and send to SPC */
8294e1bc9a0SAchim Leubner   ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_PHYSTART, IOMB_SIZE64, queueNum);
8304e1bc9a0SAchim Leubner 
8314e1bc9a0SAchim Leubner   SA_DBG3(("mpiPhyStartCmd, return value = %d\n", ret));
8324e1bc9a0SAchim Leubner 
8334e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xg");
8344e1bc9a0SAchim Leubner   return ret;
8354e1bc9a0SAchim Leubner }
8364e1bc9a0SAchim Leubner 
8374e1bc9a0SAchim Leubner /******************************************************************************/
8384e1bc9a0SAchim Leubner /*! \brief SPC MPI Phy Stop Command
8394e1bc9a0SAchim Leubner  *
8404e1bc9a0SAchim Leubner  *  This command sends to SPC for the I/O.
8414e1bc9a0SAchim Leubner  *
8424e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
8434e1bc9a0SAchim Leubner  *  \param tag          tag of IOMB
8444e1bc9a0SAchim Leubner  *  \param phyId        To stop the phyId
8454e1bc9a0SAchim Leubner  *
8464e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
8474e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
8484e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
8494e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
8504e1bc9a0SAchim Leubner  *
8514e1bc9a0SAchim Leubner  */
8524e1bc9a0SAchim Leubner /*******************************************************************************/
mpiPhyStopCmd(agsaRoot_t * agRoot,bit32 tag,bit32 phyId,bit32 queueNum)8534e1bc9a0SAchim Leubner GLOBAL bit32 mpiPhyStopCmd(
8544e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
8554e1bc9a0SAchim Leubner   bit32               tag,
8564e1bc9a0SAchim Leubner   bit32               phyId,
8574e1bc9a0SAchim Leubner   bit32               queueNum
8584e1bc9a0SAchim Leubner   )
8594e1bc9a0SAchim Leubner {
8604e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_SUCCESS;
8614e1bc9a0SAchim Leubner   agsaPhyStopCmd_t    payload;
8624e1bc9a0SAchim Leubner 
8634e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xh");
8644e1bc9a0SAchim Leubner 
8654e1bc9a0SAchim Leubner   /* set payload to zeros */
8664e1bc9a0SAchim Leubner   si_memset(&payload, 0, sizeof(agsaPhyStopCmd_t));
8674e1bc9a0SAchim Leubner 
8684e1bc9a0SAchim Leubner   /* set tag */
8694e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaPhyStopCmd_t, tag), tag);
8704e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaPhyStopCmd_t, phyId), (phyId & SM_PHYID_MASK ));
8714e1bc9a0SAchim Leubner   /* build IOMB command and send to SPC */
8724e1bc9a0SAchim Leubner   ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_PHYSTOP, IOMB_SIZE64, queueNum);
8734e1bc9a0SAchim Leubner 
8744e1bc9a0SAchim Leubner   SA_DBG3(("mpiPhyStopCmd, return value = %d\n", ret));
8754e1bc9a0SAchim Leubner 
8764e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xh");
8774e1bc9a0SAchim Leubner 
8784e1bc9a0SAchim Leubner   return ret;
8794e1bc9a0SAchim Leubner }
8804e1bc9a0SAchim Leubner 
8814e1bc9a0SAchim Leubner /******************************************************************************/
8824e1bc9a0SAchim Leubner /*! \brief SPC MPI SMP Request Command
8834e1bc9a0SAchim Leubner  *
8844e1bc9a0SAchim Leubner  *  This command sends to SPC for the SMP.
8854e1bc9a0SAchim Leubner  *
8864e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
8874e1bc9a0SAchim Leubner  *  \param pIomb        pointer of IOMB
8884e1bc9a0SAchim Leubner  *  \param opcode       opcode of IOMB
8894e1bc9a0SAchim Leubner  *  \param payload      pointer of payload
8904e1bc9a0SAchim Leubner  *  \param inq          inbound queue number
8914e1bc9a0SAchim Leubner  *  \param outq         outbound queue number
8924e1bc9a0SAchim Leubner  *
8934e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
8944e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
8954e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
8964e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
8974e1bc9a0SAchim Leubner  *
8984e1bc9a0SAchim Leubner  */
8994e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSMPCmd(agsaRoot_t * agRoot,void * pIomb,bit16 opcode,agsaSMPCmd_t * payload,bit8 inq,bit8 outq)9004e1bc9a0SAchim Leubner GLOBAL bit32 mpiSMPCmd(
9014e1bc9a0SAchim Leubner   agsaRoot_t             *agRoot,
9024e1bc9a0SAchim Leubner   void                   *pIomb,
9034e1bc9a0SAchim Leubner   bit16                  opcode,
9044e1bc9a0SAchim Leubner   agsaSMPCmd_t           *payload,
9054e1bc9a0SAchim Leubner   bit8                   inq,
9064e1bc9a0SAchim Leubner   bit8                   outq
9074e1bc9a0SAchim Leubner   )
9084e1bc9a0SAchim Leubner {
9094e1bc9a0SAchim Leubner   agsaLLRoot_t   *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
9104e1bc9a0SAchim Leubner   mpiICQueue_t   *circularQ;
9114e1bc9a0SAchim Leubner   bit32          ret = AGSA_RC_SUCCESS;
9124e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
9134e1bc9a0SAchim Leubner  mpiMsgHeader_t *msgHeader;
9144e1bc9a0SAchim Leubner   bit32                bc;
9154e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
9164e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xi");
9174e1bc9a0SAchim Leubner 
9184e1bc9a0SAchim Leubner   SA_DBG6(("mpiSMPCmd: start\n"));
9194e1bc9a0SAchim Leubner 
9204e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
9214e1bc9a0SAchim Leubner   msgHeader = (mpiMsgHeader_t*)(((bit8*)pIomb) - sizeof(mpiMsgHeader_t));
9224e1bc9a0SAchim Leubner   bc = (((msgHeader->Header) >> SHIFT24) & BC_MASK);
9234e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
9244e1bc9a0SAchim Leubner   SA_DBG6(("mpiSMPCmd: before msgHeader bc %d\n", bc));
9254e1bc9a0SAchim Leubner 
9264e1bc9a0SAchim Leubner   /* copy payload if it is necessary */
9274e1bc9a0SAchim Leubner   if (agNULL != payload)
9284e1bc9a0SAchim Leubner   {
9294e1bc9a0SAchim Leubner     si_memcpy(pIomb, payload, sizeof(agsaSMPCmd_t));
9304e1bc9a0SAchim Leubner   }
9314e1bc9a0SAchim Leubner 
9324e1bc9a0SAchim Leubner   SA_DBG6(("mpiSMPCmd: after msgHeader bc %d\n", bc));
9334e1bc9a0SAchim Leubner 
9344e1bc9a0SAchim Leubner   /* post the IOMB to SPC */
9354e1bc9a0SAchim Leubner   circularQ = &saRoot->inboundQueue[inq];
9364e1bc9a0SAchim Leubner   if (AGSA_RC_FAILURE == mpiMsgProduce(circularQ, (void *)pIomb, MPI_CATEGORY_SAS_SATA, opcode, outq, (bit8)circularQ->priority))
9374e1bc9a0SAchim Leubner     ret = AGSA_RC_FAILURE;
9384e1bc9a0SAchim Leubner 
9394e1bc9a0SAchim Leubner   SA_DBG3(("mpiSMPCmd, return value = %d\n", ret));
9404e1bc9a0SAchim Leubner 
9414e1bc9a0SAchim Leubner   /* return value */
9424e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xi");
9434e1bc9a0SAchim Leubner   return ret;
9444e1bc9a0SAchim Leubner }
9454e1bc9a0SAchim Leubner 
9464e1bc9a0SAchim Leubner /******************************************************************************/
9474e1bc9a0SAchim Leubner /*! \brief SPC MPI Deregister Device Handle Command
9484e1bc9a0SAchim Leubner  *
9494e1bc9a0SAchim Leubner  *  This command used to deregister(remove) the device handle.
9504e1bc9a0SAchim Leubner  *
9514e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
9524e1bc9a0SAchim Leubner  *  \param agDevHandle  Device Handle
9534e1bc9a0SAchim Leubner  *  \param deviceId     index of device
9544e1bc9a0SAchim Leubner  *  \param portId       index of port
9554e1bc9a0SAchim Leubner  *  \param queueNum     IQ/OQ number
9564e1bc9a0SAchim Leubner  *
9574e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
9584e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
9594e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
9604e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
9614e1bc9a0SAchim Leubner  *
9624e1bc9a0SAchim Leubner  */
9634e1bc9a0SAchim Leubner /*******************************************************************************/
mpiDeregDevHandleCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,agsaDeviceDesc_t * pDevice,bit32 deviceId,bit32 portId,bit32 queueNum)9644e1bc9a0SAchim Leubner GLOBAL bit32 mpiDeregDevHandleCmd(
9654e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
9664e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
9674e1bc9a0SAchim Leubner   agsaDeviceDesc_t    *pDevice,
9684e1bc9a0SAchim Leubner   bit32               deviceId,
9694e1bc9a0SAchim Leubner   bit32               portId,
9704e1bc9a0SAchim Leubner   bit32               queueNum
9714e1bc9a0SAchim Leubner   )
9724e1bc9a0SAchim Leubner {
9734e1bc9a0SAchim Leubner   bit32                   ret = AGSA_RC_SUCCESS;
9744e1bc9a0SAchim Leubner   agsaLLRoot_t            *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
9754e1bc9a0SAchim Leubner   agsaIORequestDesc_t     *pRequest;
9764e1bc9a0SAchim Leubner   agsaDeregDevHandleCmd_t payload;
9774e1bc9a0SAchim Leubner 
9784e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xp");
9794e1bc9a0SAchim Leubner 
9804e1bc9a0SAchim Leubner   /* Get request from free IORequests */
9814e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
9824e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
9834e1bc9a0SAchim Leubner 
9844e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
9854e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
9864e1bc9a0SAchim Leubner   {
9874e1bc9a0SAchim Leubner     SA_DBG1(("mpiDeregDevHandleCmd, No request from free list\n" ));
9884e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xp");
9894e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
9904e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
9914e1bc9a0SAchim Leubner   }
9924e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
9934e1bc9a0SAchim Leubner   else
9944e1bc9a0SAchim Leubner   {
9954e1bc9a0SAchim Leubner     pRequest->pDevice = pDevice;
9964e1bc9a0SAchim Leubner     /* Remove the request from free list */
9974e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
9984e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
9994e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
10004e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
10014e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
10024e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
10034e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
10044e1bc9a0SAchim Leubner 
10054e1bc9a0SAchim Leubner     /* clean the payload to zeros */
10064e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaDeregDevHandleCmd_t));
10074e1bc9a0SAchim Leubner 
10084e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDeregDevHandleCmd_t, tag), pRequest->HTag);
10094e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDeregDevHandleCmd_t, deviceId), deviceId);
10104e1bc9a0SAchim Leubner 
10114e1bc9a0SAchim Leubner     /* build IOMB command and send it to SPC */
10124e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_DEREG_DEV_HANDLE, IOMB_SIZE64, queueNum);
10134e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
10144e1bc9a0SAchim Leubner     {
10154e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
10164e1bc9a0SAchim Leubner       /* remove the request from IOMap */
10174e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
10184e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
10194e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
10204e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
10214e1bc9a0SAchim Leubner 
10224e1bc9a0SAchim Leubner       /* return the request to free pool */
10234e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
10244e1bc9a0SAchim Leubner 
10254e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
10264e1bc9a0SAchim Leubner       SA_DBG1(("mpiSetVPDCmd, sending IOMB failed\n" ));
10274e1bc9a0SAchim Leubner     }
10284e1bc9a0SAchim Leubner     SA_DBG3(("mpiDeregDevHandleCmd, return value = %d\n", ret));
10294e1bc9a0SAchim Leubner   }
10304e1bc9a0SAchim Leubner 
10314e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xp");
10324e1bc9a0SAchim Leubner 
10334e1bc9a0SAchim Leubner   /* return value */
10344e1bc9a0SAchim Leubner   return ret;
10354e1bc9a0SAchim Leubner }
10364e1bc9a0SAchim Leubner 
10374e1bc9a0SAchim Leubner /******************************************************************************/
10384e1bc9a0SAchim Leubner /*! \brief SPC MPI Get Device Handle Command
10394e1bc9a0SAchim Leubner  *
10404e1bc9a0SAchim Leubner  *  This command used to get device handle.
10414e1bc9a0SAchim Leubner  *
10424e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
10434e1bc9a0SAchim Leubner  *  \param agContext    Context of Device Handle Command
10444e1bc9a0SAchim Leubner  *  \param portId       index of port
10454e1bc9a0SAchim Leubner  *  \param flags        flags
10464e1bc9a0SAchim Leubner  *  \param maxDevs      Maximum Device Handles
10474e1bc9a0SAchim Leubner  *  \param queueNum     IQ/OQ number
10484e1bc9a0SAchim Leubner  *  \param skipCount    skip device entry count
10494e1bc9a0SAchim Leubner  *
10504e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
10514e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
10524e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
10534e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
10544e1bc9a0SAchim Leubner  *
10554e1bc9a0SAchim Leubner  */
10564e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetDeviceHandleCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 portId,bit32 flags,bit32 maxDevs,bit32 queueNum,bit32 skipCount)10574e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetDeviceHandleCmd(
10584e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
10594e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
10604e1bc9a0SAchim Leubner   bit32               portId,
10614e1bc9a0SAchim Leubner   bit32               flags,
10624e1bc9a0SAchim Leubner   bit32               maxDevs,
10634e1bc9a0SAchim Leubner   bit32               queueNum,
10644e1bc9a0SAchim Leubner   bit32               skipCount
10654e1bc9a0SAchim Leubner   )
10664e1bc9a0SAchim Leubner {
10674e1bc9a0SAchim Leubner   bit32                 ret = AGSA_RC_SUCCESS;
10684e1bc9a0SAchim Leubner   agsaLLRoot_t          *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
10694e1bc9a0SAchim Leubner   agsaIORequestDesc_t   *pRequest;
10704e1bc9a0SAchim Leubner   agsaGetDevHandleCmd_t payload;
10714e1bc9a0SAchim Leubner   bit32               using_reserved = agFALSE;
10724e1bc9a0SAchim Leubner 
10734e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xj");
10744e1bc9a0SAchim Leubner 
10754e1bc9a0SAchim Leubner   /* Get request from free CntrlRequests */
10764e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
10774e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
10784e1bc9a0SAchim Leubner 
10794e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
10804e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
10814e1bc9a0SAchim Leubner   {
10824e1bc9a0SAchim Leubner     pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeReservedRequests)); /**/
10834e1bc9a0SAchim Leubner     if(agNULL != pRequest)
10844e1bc9a0SAchim Leubner     {
10854e1bc9a0SAchim Leubner       using_reserved = agTRUE;
10864e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetDeviceHandleCmd, using saRoot->freeReservedRequests\n"));
10874e1bc9a0SAchim Leubner     }
10884e1bc9a0SAchim Leubner     else
10894e1bc9a0SAchim Leubner     {
10904e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetDeviceHandleCmd, No request from free list Not using saRoot->freeReservedRequests\n"));
10914e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xj");
10924e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
10934e1bc9a0SAchim Leubner       return AGSA_RC_BUSY;
10944e1bc9a0SAchim Leubner     }
10954e1bc9a0SAchim Leubner   }
10964e1bc9a0SAchim Leubner 
10974e1bc9a0SAchim Leubner   /* Remove the request from free list */
10984e1bc9a0SAchim Leubner   if( using_reserved )
10994e1bc9a0SAchim Leubner   {
11004e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
11014e1bc9a0SAchim Leubner   }
11024e1bc9a0SAchim Leubner   else
11034e1bc9a0SAchim Leubner   {
11044e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
11054e1bc9a0SAchim Leubner   }
11064e1bc9a0SAchim Leubner   SA_ASSERT((!pRequest->valid), "The pRequest is in use");
11074e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
11084e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
11094e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].agContext = agContext;
11104e1bc9a0SAchim Leubner   pRequest->valid = agTRUE;
11114e1bc9a0SAchim Leubner   ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
11124e1bc9a0SAchim Leubner 
11134e1bc9a0SAchim Leubner 
11144e1bc9a0SAchim Leubner   /* clean the payload to zeros */
11154e1bc9a0SAchim Leubner   si_memset(&payload, 0, sizeof(agsaGetDevHandleCmd_t));
11164e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetDevHandleCmd_t, tag), pRequest->HTag);
11174e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetDevHandleCmd_t, DevADevTMaxDIDportId),
11184e1bc9a0SAchim Leubner                    ((portId & PORTID_MASK) | (maxDevs << SHIFT8) | (flags << SHIFT24)));
11194e1bc9a0SAchim Leubner     /* set starting Number */
11204e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetDevHandleCmd_t, skipCount), skipCount);
11214e1bc9a0SAchim Leubner 
11224e1bc9a0SAchim Leubner   /* build IOMB command and send it to SPC */
11234e1bc9a0SAchim Leubner   ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_GET_DEV_HANDLE, IOMB_SIZE64, queueNum);
11244e1bc9a0SAchim Leubner   if (AGSA_RC_SUCCESS != ret)
11254e1bc9a0SAchim Leubner   {
11264e1bc9a0SAchim Leubner     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
11274e1bc9a0SAchim Leubner     /* remove the request from IOMap */
11284e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
11294e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
11304e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agNULL;
11314e1bc9a0SAchim Leubner     pRequest->valid = agFALSE;
11324e1bc9a0SAchim Leubner     /* return the request to free pool */
11334e1bc9a0SAchim Leubner     if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
11344e1bc9a0SAchim Leubner     {
11354e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetDeviceHandleCmd: saving pRequest (%p) for later use\n", pRequest));
11364e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
11374e1bc9a0SAchim Leubner     }
11384e1bc9a0SAchim Leubner     else
11394e1bc9a0SAchim Leubner     {
11404e1bc9a0SAchim Leubner       /* return the request to free pool */
11414e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
11424e1bc9a0SAchim Leubner     }
11434e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
11444e1bc9a0SAchim Leubner 
11454e1bc9a0SAchim Leubner     SA_DBG1(("mpiGetDeviceHandleCmd, sending IOMB failed\n" ));
11464e1bc9a0SAchim Leubner   }
11474e1bc9a0SAchim Leubner   SA_DBG3(("mpiGetDeviceHandleCmd, return value = %d\n", ret));
11484e1bc9a0SAchim Leubner 
11494e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xj");
11504e1bc9a0SAchim Leubner 
11514e1bc9a0SAchim Leubner   return ret;
11524e1bc9a0SAchim Leubner }
11534e1bc9a0SAchim Leubner 
11544e1bc9a0SAchim Leubner /******************************************************************************/
11554e1bc9a0SAchim Leubner /*! \brief SPC MPI LOCAL PHY CONTROL Command
11564e1bc9a0SAchim Leubner  *
11574e1bc9a0SAchim Leubner  *  This command used to do the SPC Phy operation.
11584e1bc9a0SAchim Leubner  *
11594e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
11604e1bc9a0SAchim Leubner  *  \param tag          tag of IOMB
11614e1bc9a0SAchim Leubner  *  \param phyId        PHY Id
11624e1bc9a0SAchim Leubner  *  \param operation    operation of PHY control
11634e1bc9a0SAchim Leubner  *  \param queueNum     IQ/OQ number
11644e1bc9a0SAchim Leubner  *
11654e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
11664e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
11674e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
11684e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
11694e1bc9a0SAchim Leubner  *
11704e1bc9a0SAchim Leubner  */
11714e1bc9a0SAchim Leubner /*******************************************************************************/
mpiLocalPhyControlCmd(agsaRoot_t * agRoot,bit32 tag,bit32 phyId,bit32 operation,bit32 queueNum)11724e1bc9a0SAchim Leubner GLOBAL bit32 mpiLocalPhyControlCmd(
11734e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
11744e1bc9a0SAchim Leubner   bit32               tag,
11754e1bc9a0SAchim Leubner   bit32               phyId,
11764e1bc9a0SAchim Leubner   bit32               operation,
11774e1bc9a0SAchim Leubner   bit32               queueNum
11784e1bc9a0SAchim Leubner   )
11794e1bc9a0SAchim Leubner {
11804e1bc9a0SAchim Leubner   bit32                   ret = AGSA_RC_SUCCESS;
11814e1bc9a0SAchim Leubner   agsaLocalPhyCntrlCmd_t  payload;
11824e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xl");
11834e1bc9a0SAchim Leubner 
11844e1bc9a0SAchim Leubner   SA_DBG3(("mpiLocalPhyControlCmd, phyId 0x%X operation 0x%x dw2 0x%x\n",phyId, operation,(((operation & BYTE_MASK) << SHIFT8) | (phyId & SM_PHYID_MASK))));
11854e1bc9a0SAchim Leubner 
11864e1bc9a0SAchim Leubner   /* clean the payload field */
11874e1bc9a0SAchim Leubner   si_memset(&payload, 0, sizeof(agsaLocalPhyCntrlCmd_t));
11884e1bc9a0SAchim Leubner 
11894e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaLocalPhyCntrlCmd_t, phyOpPhyId),
11904e1bc9a0SAchim Leubner     (((operation & BYTE_MASK) << SHIFT8) | (phyId & SM_PHYID_MASK)));
11914e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaLocalPhyCntrlCmd_t, tag), tag);
11924e1bc9a0SAchim Leubner   /* build IOMB command and send to SPC */
11934e1bc9a0SAchim Leubner   ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_LOCAL_PHY_CONTROL, IOMB_SIZE64, queueNum);
11944e1bc9a0SAchim Leubner 
11954e1bc9a0SAchim Leubner   SA_DBG3(("mpiLocalPhyControlCmd, return value = %d\n", ret));
11964e1bc9a0SAchim Leubner 
11974e1bc9a0SAchim Leubner   /* return value */
11984e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xl");
11994e1bc9a0SAchim Leubner   return ret;
12004e1bc9a0SAchim Leubner }
12014e1bc9a0SAchim Leubner 
12024e1bc9a0SAchim Leubner /******************************************************************************/
12034e1bc9a0SAchim Leubner /*! \brief Device Handle Accept Command
12044e1bc9a0SAchim Leubner  *
12054e1bc9a0SAchim Leubner  *  This command is Device Handle Accept IOMB to SPC.
12064e1bc9a0SAchim Leubner  *
12074e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
12084e1bc9a0SAchim Leubner  *  \param agContext    Context for the set VPD command
12094e1bc9a0SAchim Leubner  *  \param ctag         controller tag
12104e1bc9a0SAchim Leubner  *  \param deviceId     device Id
12114e1bc9a0SAchim Leubner  *  \param action       action
12124e1bc9a0SAchim Leubner  *  \param queueNum     queue Number
12134e1bc9a0SAchim Leubner  *
12144e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
12154e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
12164e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
12174e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
12184e1bc9a0SAchim Leubner  *
12194e1bc9a0SAchim Leubner  */
12204e1bc9a0SAchim Leubner /*******************************************************************************/
mpiDevHandleAcceptCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 ctag,bit32 deviceId,bit32 action,bit32 flag,bit32 itlnx,bit32 queueNum)12214e1bc9a0SAchim Leubner GLOBAL bit32 mpiDevHandleAcceptCmd(
12224e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
12234e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
12244e1bc9a0SAchim Leubner   bit32               ctag,
12254e1bc9a0SAchim Leubner   bit32               deviceId,
12264e1bc9a0SAchim Leubner   bit32               action,
12274e1bc9a0SAchim Leubner   bit32               flag,
12284e1bc9a0SAchim Leubner   bit32               itlnx,
12294e1bc9a0SAchim Leubner   bit32               queueNum
12304e1bc9a0SAchim Leubner   )
12314e1bc9a0SAchim Leubner {
12324e1bc9a0SAchim Leubner   bit32                    ret = AGSA_RC_SUCCESS;
12334e1bc9a0SAchim Leubner   agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
12344e1bc9a0SAchim Leubner   agsaIORequestDesc_t      *pRequest;
12354e1bc9a0SAchim Leubner   agsaDevHandleAcceptCmd_t payload;
12364e1bc9a0SAchim Leubner   bit32                    DW4 =0;
12374e1bc9a0SAchim Leubner   bit32                    mcn =0;
12384e1bc9a0SAchim Leubner   bit32                    awt =0;
12394e1bc9a0SAchim Leubner   bit32                    ha =0;
12404e1bc9a0SAchim Leubner 
12414e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xt");
12424e1bc9a0SAchim Leubner 
12434e1bc9a0SAchim Leubner   if(deviceId & 0xFFFF0000)
12444e1bc9a0SAchim Leubner   {
12454e1bc9a0SAchim Leubner     ha = 1;
12464e1bc9a0SAchim Leubner   }
12474e1bc9a0SAchim Leubner   /* Get request from free IORequests */
12484e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot,LL_IOREQ_LOCKEQ_LOCK );
12494e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
12504e1bc9a0SAchim Leubner 
12514e1bc9a0SAchim Leubner   SA_DBG2(("mpiDevHandleAcceptCmd, deviceId 0x%x action 0x%x flag 0x%x itlnx 0x%x\n",deviceId,action,flag,itlnx ));
12524e1bc9a0SAchim Leubner 
12534e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
12544e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
12554e1bc9a0SAchim Leubner   {
12564e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot,LL_IOREQ_LOCKEQ_LOCK );
12574e1bc9a0SAchim Leubner     SA_DBG1(("mpiDevHandleAcceptCmd, No request from free list\n" ));
12584e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xt");
12594e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
12604e1bc9a0SAchim Leubner   }
12614e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
12624e1bc9a0SAchim Leubner   else
12634e1bc9a0SAchim Leubner   {
12644e1bc9a0SAchim Leubner     /* Remove the request from free list */
12654e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
12664e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
12674e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
12684e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
12694e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
12704e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
12714e1bc9a0SAchim Leubner 
12724e1bc9a0SAchim Leubner     /* Do not mark as valid at this IOMB does not complete in OBQ */
12734e1bc9a0SAchim Leubner 
12744e1bc9a0SAchim Leubner     /* set payload to zeros */
12754e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaDevHandleAcceptCmd_t));
12764e1bc9a0SAchim Leubner 
12774e1bc9a0SAchim Leubner     /* set tag field */
12784e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDevHandleAcceptCmd_t, tag), pRequest->HTag);
12794e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDevHandleAcceptCmd_t, deviceId), deviceId);
12804e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDevHandleAcceptCmd_t, Ctag), ctag);
12814e1bc9a0SAchim Leubner     mcn = (flag & 0xF0000) >>SHIFT16;
12824e1bc9a0SAchim Leubner     awt = (flag & 2)>>SHIFT1;
12834e1bc9a0SAchim Leubner     DW4 = (action << SHIFT24) | \
12844e1bc9a0SAchim Leubner              mcn << SHIFT20   | \
12854e1bc9a0SAchim Leubner              awt << SHIFT17   | \
12864e1bc9a0SAchim Leubner              ha  << SHIFT16   | \
12874e1bc9a0SAchim Leubner                      itlnx;
12884e1bc9a0SAchim Leubner     SA_DBG2(("mpiDevHandleAcceptCmd,DW4 0x%x\n",DW4 ));
12894e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDevHandleAcceptCmd_t, DevA_MCN_R_R_HA_ITNT),DW4);
12904e1bc9a0SAchim Leubner   }
12914e1bc9a0SAchim Leubner 
12924e1bc9a0SAchim Leubner   /* build IOMB command and send to SPC */
12934e1bc9a0SAchim Leubner   ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_DEV_HANDLE_ACCEPT, IOMB_SIZE64, queueNum);
12944e1bc9a0SAchim Leubner   if (AGSA_RC_SUCCESS != ret)
12954e1bc9a0SAchim Leubner   {
12964e1bc9a0SAchim Leubner     SA_DBG1(("mpiDevHandleAcceptCmd, sending IOMB failed\n" ));
12974e1bc9a0SAchim Leubner   }
12984e1bc9a0SAchim Leubner   else
12994e1bc9a0SAchim Leubner   {
13004e1bc9a0SAchim Leubner     SA_DBG1(("mpiDevHandleAcceptCmd, sending IOMB succeeded\n" ));
13014e1bc9a0SAchim Leubner   }
13024e1bc9a0SAchim Leubner 
13034e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
13044e1bc9a0SAchim Leubner   /* remove the request from IOMap */
13054e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
13064e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
13074e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].agContext = agNULL;
13084e1bc9a0SAchim Leubner   pRequest->valid = agFALSE;
13094e1bc9a0SAchim Leubner   /* return the request to free pool */
13104e1bc9a0SAchim Leubner   if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
13114e1bc9a0SAchim Leubner   {
13124e1bc9a0SAchim Leubner     SA_DBG1(("mpiDevHandleAcceptCmd: saving pRequest (%p) for later use\n", pRequest));
13134e1bc9a0SAchim Leubner     saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
13144e1bc9a0SAchim Leubner   }
13154e1bc9a0SAchim Leubner   else
13164e1bc9a0SAchim Leubner   {
13174e1bc9a0SAchim Leubner     /* return the request to free pool */
13184e1bc9a0SAchim Leubner     saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
13194e1bc9a0SAchim Leubner   }
13204e1bc9a0SAchim Leubner 
13214e1bc9a0SAchim Leubner   /* return value */
13224e1bc9a0SAchim Leubner   ossaSingleThreadedLeave(agRoot,LL_IOREQ_LOCKEQ_LOCK );
13234e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xt");
13244e1bc9a0SAchim Leubner   return ret;
13254e1bc9a0SAchim Leubner }
13264e1bc9a0SAchim Leubner 
13274e1bc9a0SAchim Leubner /******************************************************************************/
13284e1bc9a0SAchim Leubner /*! \brief SPC READ REGISTER DUMP Command
13294e1bc9a0SAchim Leubner  *
13304e1bc9a0SAchim Leubner  *  This command used to do the SPC Read Register Dump command.
13314e1bc9a0SAchim Leubner  *
13324e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
13334e1bc9a0SAchim Leubner  *  \param tag          tag of IOMB
13344e1bc9a0SAchim Leubner  *  \param cpuId        CPU Id
13354e1bc9a0SAchim Leubner  *  \param queueNum     IQ/OQ number
13364e1bc9a0SAchim Leubner  *  \param cpuId        AAP1 or IOP
13374e1bc9a0SAchim Leubner  *  \param cOffset      offset of the register dump data
13384e1bc9a0SAchim Leubner  *  \param addrHi       Hi address if Register Dump data
13394e1bc9a0SAchim Leubner  *  \param addrHi       Low address if Register Dump data
13404e1bc9a0SAchim Leubner  *  \param len          the length of for read
13414e1bc9a0SAchim Leubner  *
13424e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
13434e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
13444e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
13454e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
13464e1bc9a0SAchim Leubner  *
13474e1bc9a0SAchim Leubner  */
13484e1bc9a0SAchim Leubner /*******************************************************************************/
mpiNVMReadRegDumpCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 cpuId,bit32 cOffset,bit32 addrHi,bit32 addrLo,bit32 len)13494e1bc9a0SAchim Leubner GLOBAL bit32 mpiNVMReadRegDumpCmd(
13504e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
13514e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
13524e1bc9a0SAchim Leubner   bit32               queueNum,
13534e1bc9a0SAchim Leubner   bit32               cpuId,
13544e1bc9a0SAchim Leubner   bit32               cOffset,
13554e1bc9a0SAchim Leubner   bit32               addrHi,
13564e1bc9a0SAchim Leubner   bit32               addrLo,
13574e1bc9a0SAchim Leubner   bit32               len
13584e1bc9a0SAchim Leubner   )
13594e1bc9a0SAchim Leubner {
13604e1bc9a0SAchim Leubner   bit32                 ret = AGSA_RC_SUCCESS;
13614e1bc9a0SAchim Leubner   agsaLLRoot_t          *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
13624e1bc9a0SAchim Leubner   agsaIORequestDesc_t   *pRequest;
13634e1bc9a0SAchim Leubner   agsaGetNVMDataCmd_t   payload;
13644e1bc9a0SAchim Leubner   bit32 nvmd = 0;
13654e1bc9a0SAchim Leubner 
13664e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xk");
13674e1bc9a0SAchim Leubner 
13684e1bc9a0SAchim Leubner   /* Get request from free IORequests */
13694e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
13704e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
13714e1bc9a0SAchim Leubner 
13724e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
13734e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
13744e1bc9a0SAchim Leubner   {
13754e1bc9a0SAchim Leubner     SA_DBG1(("mpiNVMReadRegDumpCmd, No request from free list\n" ));
13764e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xk");
13774e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
13784e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
13794e1bc9a0SAchim Leubner   }
13804e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
13814e1bc9a0SAchim Leubner   else
13824e1bc9a0SAchim Leubner   {
13834e1bc9a0SAchim Leubner     /* Remove the request from free list */
13844e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
13854e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
13864e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
13874e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
13884e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
13894e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
13904e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
13914e1bc9a0SAchim Leubner 
13924e1bc9a0SAchim Leubner     /* clean the payload field */
13934e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaGetNVMDataCmd_t));
13944e1bc9a0SAchim Leubner 
13954e1bc9a0SAchim Leubner     /* only indirect mode */
13964e1bc9a0SAchim Leubner     if (cpuId <= 1)
13974e1bc9a0SAchim Leubner     {
13984e1bc9a0SAchim Leubner       if (cpuId == 0)
13994e1bc9a0SAchim Leubner         nvmd = AAP1_RDUMP | IRMode;
14004e1bc9a0SAchim Leubner       else
14014e1bc9a0SAchim Leubner         nvmd = IOP_RDUMP | IRMode;
14024e1bc9a0SAchim Leubner 
14034e1bc9a0SAchim Leubner       /* setup IOMB */
14044e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, tag), pRequest->HTag);
14054e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, LEN_IR_VPDD), nvmd);
14064e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, VPDOffset), cOffset);
14074e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, respAddrLo), addrLo);
14084e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, respAddrHi), addrHi);
14094e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, respLen), len);
14104e1bc9a0SAchim Leubner 
14114e1bc9a0SAchim Leubner       /* build IOMB command and send to SPC */
14124e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_GET_NVMD_DATA, IOMB_SIZE64, queueNum);
14134e1bc9a0SAchim Leubner     }
14144e1bc9a0SAchim Leubner     else
14154e1bc9a0SAchim Leubner     {
14164e1bc9a0SAchim Leubner       SA_DBG1(("mpiNVMReadRegDumpCmd, Wrong device type\n" ));
14174e1bc9a0SAchim Leubner       ret = AGSA_RC_FAILURE;
14184e1bc9a0SAchim Leubner     }
14194e1bc9a0SAchim Leubner 
14204e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
14214e1bc9a0SAchim Leubner     {
14224e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
14234e1bc9a0SAchim Leubner       /* remove the request from IOMap */
14244e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
14254e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
14264e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
14274e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
14284e1bc9a0SAchim Leubner       /* return the request to free pool */
14294e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
14304e1bc9a0SAchim Leubner 
14314e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
14324e1bc9a0SAchim Leubner       SA_DBG1(("mpiNVMReadRegDumpCmd, sending IOMB failed\n" ));
14334e1bc9a0SAchim Leubner     }
14344e1bc9a0SAchim Leubner   }
14354e1bc9a0SAchim Leubner 
14364e1bc9a0SAchim Leubner   SA_DBG3(("mpiNVMReadRegDumpCmd, return value = %d\n", ret));
14374e1bc9a0SAchim Leubner 
14384e1bc9a0SAchim Leubner   /* return value */
14394e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xk");
14404e1bc9a0SAchim Leubner 
14414e1bc9a0SAchim Leubner   return ret;
14424e1bc9a0SAchim Leubner }
14434e1bc9a0SAchim Leubner 
14444e1bc9a0SAchim Leubner /******************************************************************************/
14454e1bc9a0SAchim Leubner /*! \brief Get NVM Data command
14464e1bc9a0SAchim Leubner  *
14474e1bc9a0SAchim Leubner  *  This command is get NVM Data from SPC.
14484e1bc9a0SAchim Leubner  *
14494e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
14504e1bc9a0SAchim Leubner  *  \param agContext    Context for the VPD command
14514e1bc9a0SAchim Leubner  *  \param VPDInfo      Pointer of VPD Information
14524e1bc9a0SAchim Leubner  *  \param queueNum     Queue Number of inbound/outbound queue
14534e1bc9a0SAchim Leubner  *
14544e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
14554e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
14564e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
14574e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
14584e1bc9a0SAchim Leubner  *
14594e1bc9a0SAchim Leubner  */
14604e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetNVMDCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,agsaNVMDData_t * NVMDInfo,bit32 queueNum)14614e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetNVMDCmd(
14624e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
14634e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
14644e1bc9a0SAchim Leubner   agsaNVMDData_t      *NVMDInfo,
14654e1bc9a0SAchim Leubner   bit32               queueNum
14664e1bc9a0SAchim Leubner   )
14674e1bc9a0SAchim Leubner {
14684e1bc9a0SAchim Leubner   bit32                 ret = AGSA_RC_FAILURE;
14694e1bc9a0SAchim Leubner   agsaLLRoot_t          *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
14704e1bc9a0SAchim Leubner   agsaIORequestDesc_t   *pRequest;
14714e1bc9a0SAchim Leubner   agsaGetNVMDataCmd_t   payload;
14724e1bc9a0SAchim Leubner 
14734e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xr");
14744e1bc9a0SAchim Leubner 
14754e1bc9a0SAchim Leubner   /* Get request from free IORequests */
14764e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
14774e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
14784e1bc9a0SAchim Leubner 
14794e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
14804e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
14814e1bc9a0SAchim Leubner   {
14824e1bc9a0SAchim Leubner     SA_DBG1(("mpiGetNVMDCmd, No request from free list\n" ));
14834e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xr");
14844e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
14854e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
14864e1bc9a0SAchim Leubner   }
14874e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
14884e1bc9a0SAchim Leubner   else
14894e1bc9a0SAchim Leubner   {
14904e1bc9a0SAchim Leubner     SA_DBG3(("mpiGetNVMDCmd, Build IOMB NVMDDevice= 0x%x\n", NVMDInfo->NVMDevice));
14914e1bc9a0SAchim Leubner     /* Remove the request from free list */
14924e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
14934e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
14944e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
14954e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
14964e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
14974e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
14984e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
14994e1bc9a0SAchim Leubner 
15004e1bc9a0SAchim Leubner     /* set payload to zeros */
15014e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaGetNVMDataCmd_t));
15024e1bc9a0SAchim Leubner     /* set tag field */
15034e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, tag), pRequest->HTag);
15044e1bc9a0SAchim Leubner 
15054e1bc9a0SAchim Leubner     if (NVMDInfo->indirectPayload)
15064e1bc9a0SAchim Leubner     {
15074e1bc9a0SAchim Leubner       /* indirect payload IP = 1 */
15084e1bc9a0SAchim Leubner       switch (NVMDInfo->NVMDevice)
15094e1bc9a0SAchim Leubner       {
15104e1bc9a0SAchim Leubner       case AGSA_NVMD_TWI_DEVICES:
15114e1bc9a0SAchim Leubner         /* NVMD = 0 */
15124e1bc9a0SAchim Leubner         /* indirect payload IP = 1 and 0x0 (TWI) */
15134e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, LEN_IR_VPDD),
15144e1bc9a0SAchim Leubner           (NVMDInfo->TWIDeviceAddress << 16) | (NVMDInfo->TWIBusNumber << 12) |
15154e1bc9a0SAchim Leubner           (NVMDInfo->TWIDevicePageSize << 8) | (NVMDInfo->TWIDeviceAddressSize << 4) |
15164e1bc9a0SAchim Leubner           (NVMDInfo->indirectPayload << 31) | NVMDInfo->NVMDevice);
15174e1bc9a0SAchim Leubner             OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, VPDOffset),
15184e1bc9a0SAchim Leubner           NVMDInfo->dataOffsetAddress);
15194e1bc9a0SAchim Leubner         break;
15204e1bc9a0SAchim Leubner       case AGSA_NVMD_CONFIG_SEEPROM:
15214e1bc9a0SAchim Leubner         /* NVMD = 1 */
15224e1bc9a0SAchim Leubner         /* Data Offset should be 0 */
15234e1bc9a0SAchim Leubner         if (NVMDInfo->dataOffsetAddress != 0)
15244e1bc9a0SAchim Leubner         {
15254e1bc9a0SAchim Leubner           /* Error for Offset */
15264e1bc9a0SAchim Leubner           SA_DBG1(("mpiGetNVMDCmd, (IP=1)wrong offset = 0x%x\n", NVMDInfo->dataOffsetAddress));
15274e1bc9a0SAchim Leubner         }
15284e1bc9a0SAchim Leubner         /* indirect payload IP = 1, NVMD = 0x1 (SEEPROM0) */
15294e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, LEN_IR_VPDD),
15304e1bc9a0SAchim Leubner           (NVMDInfo->indirectPayload << SHIFT31) | (NVMDInfo->NVMDevice));
15314e1bc9a0SAchim Leubner         break;
15324e1bc9a0SAchim Leubner       case AGSA_NVMD_VPD_FLASH:
15334e1bc9a0SAchim Leubner         /* indirect payload IP = 1 and 0x4 (FLASH) */
15344e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, LEN_IR_VPDD),
15354e1bc9a0SAchim Leubner           (NVMDInfo->indirectPayload << SHIFT31) | NVMDInfo->NVMDevice);
15364e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, VPDOffset),
15374e1bc9a0SAchim Leubner           NVMDInfo->dataOffsetAddress);
15384e1bc9a0SAchim Leubner         break;
15394e1bc9a0SAchim Leubner       case AGSA_NVMD_EXPANSION_ROM:
15404e1bc9a0SAchim Leubner         /* indirect payload IP = 1 and 0x7 (EXPANSION ROM PARTITION) */
15414e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, LEN_IR_VPDD),
15424e1bc9a0SAchim Leubner           (NVMDInfo->indirectPayload << SHIFT31) | NVMDInfo->NVMDevice);
15434e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, VPDOffset),
15444e1bc9a0SAchim Leubner           NVMDInfo->dataOffsetAddress);
15454e1bc9a0SAchim Leubner         break;
15464e1bc9a0SAchim Leubner       case  AGSA_NVMD_AAP1_REG_FLASH: /* AGSA_NVMD_REG_FLASH  SPCv uses 5 as well */
15474e1bc9a0SAchim Leubner         /* indirect payload IP = 1 and 0x5 (AGSA_NVMD_AAP1_REG_FLASH ) */
15484e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, LEN_IR_VPDD),
15494e1bc9a0SAchim Leubner           (NVMDInfo->indirectPayload << SHIFT31) | NVMDInfo->NVMDevice);
15504e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, VPDOffset),
15514e1bc9a0SAchim Leubner           NVMDInfo->dataOffsetAddress);
15524e1bc9a0SAchim Leubner         break;
15534e1bc9a0SAchim Leubner       case  AGSA_NVMD_IOP_REG_FLASH:
15544e1bc9a0SAchim Leubner         /* indirect payload IP = 1 and 0x6 ( AGSA_NVMD_IOP_REG_FLASH ) */
15554e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, LEN_IR_VPDD),
15564e1bc9a0SAchim Leubner           (NVMDInfo->indirectPayload << SHIFT31) | NVMDInfo->NVMDevice);
15574e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, VPDOffset),
15584e1bc9a0SAchim Leubner           NVMDInfo->dataOffsetAddress);
15594e1bc9a0SAchim Leubner         break;
15604e1bc9a0SAchim Leubner 
15614e1bc9a0SAchim Leubner       default:
15624e1bc9a0SAchim Leubner         SA_DBG1(("mpiGetNVMDCmd, (IP=1)wrong device type = 0x%x\n", NVMDInfo->NVMDevice));
15634e1bc9a0SAchim Leubner         break;
15644e1bc9a0SAchim Leubner       }
15654e1bc9a0SAchim Leubner 
15664e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, respAddrLo), NVMDInfo->indirectAddrLower32);
15674e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, respAddrHi), NVMDInfo->indirectAddrUpper32);
15684e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, respLen), NVMDInfo->indirectLen);
15694e1bc9a0SAchim Leubner       /* build IOMB command and send to SPC */
15704e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_GET_NVMD_DATA, IOMB_SIZE64, queueNum);
15714e1bc9a0SAchim Leubner     }
15724e1bc9a0SAchim Leubner     else
15734e1bc9a0SAchim Leubner     {
15744e1bc9a0SAchim Leubner       /* direct payload IP = 0 only for TWI device */
15754e1bc9a0SAchim Leubner       if (AGSA_NVMD_TWI_DEVICES == NVMDInfo->NVMDevice)
15764e1bc9a0SAchim Leubner       {
15774e1bc9a0SAchim Leubner         /* NVMD = 0 */
15784e1bc9a0SAchim Leubner         /* indirect payload IP = 0 and 0x0 (TWI) */
15794e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, LEN_IR_VPDD),
15804e1bc9a0SAchim Leubner           (NVMDInfo->TWIDeviceAddress << SHIFT16) | (NVMDInfo->TWIBusNumber << SHIFT12) |
15814e1bc9a0SAchim Leubner           (NVMDInfo->TWIDevicePageSize << SHIFT8) | (NVMDInfo->TWIDeviceAddressSize << SHIFT4) |
15824e1bc9a0SAchim Leubner           NVMDInfo->NVMDevice);
15834e1bc9a0SAchim Leubner             OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetNVMDataCmd_t, VPDOffset),
15844e1bc9a0SAchim Leubner           NVMDInfo->dataOffsetAddress | (NVMDInfo->directLen << SHIFT24));
15854e1bc9a0SAchim Leubner         /* build IOMB command and send to SPC */
15864e1bc9a0SAchim Leubner         ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_GET_NVMD_DATA, IOMB_SIZE64, queueNum);
15874e1bc9a0SAchim Leubner       }
15884e1bc9a0SAchim Leubner       else
15894e1bc9a0SAchim Leubner       {
15904e1bc9a0SAchim Leubner         SA_DBG1(("mpiGetNVMDCmd, (IP=0)wrong device type = 0x%x\n", NVMDInfo->NVMDevice));
15914e1bc9a0SAchim Leubner         ret = AGSA_RC_FAILURE;
15924e1bc9a0SAchim Leubner         /* CB for NVMD with error */
15934e1bc9a0SAchim Leubner         ossaGetNVMDResponseCB(agRoot, agContext, OSSA_NVMD_MODE_ERROR, 0, NVMDInfo->directLen, agNULL);
15944e1bc9a0SAchim Leubner       }
15954e1bc9a0SAchim Leubner     }
15964e1bc9a0SAchim Leubner 
15974e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
15984e1bc9a0SAchim Leubner     {
15994e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
16004e1bc9a0SAchim Leubner       /* remove the request from IOMap */
16014e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
16024e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
16034e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
16044e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
16054e1bc9a0SAchim Leubner 
16064e1bc9a0SAchim Leubner       /* return the request to free pool */
16074e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
16084e1bc9a0SAchim Leubner 
16094e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
16104e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetNVMDCmd, sending IOMB failed\n" ));
16114e1bc9a0SAchim Leubner     }
16124e1bc9a0SAchim Leubner     SA_DBG3(("mpiGetNVMDCmd, return value = %d\n", ret));
16134e1bc9a0SAchim Leubner   }
16144e1bc9a0SAchim Leubner 
16154e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xr");
16164e1bc9a0SAchim Leubner 
16174e1bc9a0SAchim Leubner   /* return value */
16184e1bc9a0SAchim Leubner   return ret;
16194e1bc9a0SAchim Leubner }
16204e1bc9a0SAchim Leubner 
16214e1bc9a0SAchim Leubner /******************************************************************************/
16224e1bc9a0SAchim Leubner /*! \brief Set NVM Data Command
16234e1bc9a0SAchim Leubner  *
16244e1bc9a0SAchim Leubner  *  This command is set NVM Data to SPC.
16254e1bc9a0SAchim Leubner  *
16264e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
16274e1bc9a0SAchim Leubner  *  \param agContext    Context for the set VPD command
16284e1bc9a0SAchim Leubner  *  \param NVMDInfo      pointer of VPD information
16294e1bc9a0SAchim Leubner  *  \param queueNum     queue Number
16304e1bc9a0SAchim Leubner  *
16314e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
16324e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
16334e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
16344e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
16354e1bc9a0SAchim Leubner  *
16364e1bc9a0SAchim Leubner  */
16374e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSetNVMDCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,agsaNVMDData_t * NVMDInfo,bit32 queueNum)16384e1bc9a0SAchim Leubner GLOBAL bit32 mpiSetNVMDCmd(
16394e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
16404e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
16414e1bc9a0SAchim Leubner   agsaNVMDData_t      *NVMDInfo,
16424e1bc9a0SAchim Leubner   bit32               queueNum
16434e1bc9a0SAchim Leubner   )
16444e1bc9a0SAchim Leubner {
16454e1bc9a0SAchim Leubner   bit32               ret = AGSA_RC_FAILURE;
16464e1bc9a0SAchim Leubner   agsaLLRoot_t        *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
16474e1bc9a0SAchim Leubner   agsaIORequestDesc_t *pRequest;
16484e1bc9a0SAchim Leubner   agsaSetNVMDataCmd_t payload;
16494e1bc9a0SAchim Leubner 
16504e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xm");
16514e1bc9a0SAchim Leubner 
16524e1bc9a0SAchim Leubner 
16534e1bc9a0SAchim Leubner   /* Get request from free IORequests */
16544e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
16554e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
16564e1bc9a0SAchim Leubner 
16574e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
16584e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
16594e1bc9a0SAchim Leubner   {
16604e1bc9a0SAchim Leubner     SA_DBG1(("mpiSetNVMDCmd, No request from free list\n" ));
16614e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xm");
16624e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
16634e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
16644e1bc9a0SAchim Leubner   }
16654e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
16664e1bc9a0SAchim Leubner   else
16674e1bc9a0SAchim Leubner   {
16684e1bc9a0SAchim Leubner     SA_DBG3(("mpiSetNVMDCmd, Build IOMB NVMDDevice= 0x%x\n", NVMDInfo->NVMDevice));
16694e1bc9a0SAchim Leubner     /* Remove the request from free list */
16704e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
16714e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
16724e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
16734e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
16744e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
16754e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
16764e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
16774e1bc9a0SAchim Leubner 
16784e1bc9a0SAchim Leubner     /* set payload to zeros */
16794e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaSetNVMDataCmd_t));
16804e1bc9a0SAchim Leubner 
16814e1bc9a0SAchim Leubner     /* set tag field */
16824e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, tag), pRequest->HTag);
16834e1bc9a0SAchim Leubner 
16844e1bc9a0SAchim Leubner     if (NVMDInfo->indirectPayload)
16854e1bc9a0SAchim Leubner     {
16864e1bc9a0SAchim Leubner       /* indirect payload IP = 1 */
16874e1bc9a0SAchim Leubner       switch (NVMDInfo->NVMDevice)
16884e1bc9a0SAchim Leubner       {
16894e1bc9a0SAchim Leubner       case AGSA_NVMD_TWI_DEVICES:
16904e1bc9a0SAchim Leubner         /* NVMD = 0 */
16914e1bc9a0SAchim Leubner         /* indirect payload IP = 1 and 0x0 (TWI) */
16924e1bc9a0SAchim Leubner         /* set up signature */
16934e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, Data.indirectData.signature), NVMDInfo->signature);
16944e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, LEN_IR_VPDD),
16954e1bc9a0SAchim Leubner           (NVMDInfo->TWIDeviceAddress << SHIFT16) | (NVMDInfo->TWIBusNumber << SHIFT12) |
16964e1bc9a0SAchim Leubner           (NVMDInfo->TWIDevicePageSize << SHIFT8) | (NVMDInfo->TWIDeviceAddressSize << SHIFT4) |
16974e1bc9a0SAchim Leubner           (NVMDInfo->indirectPayload << SHIFT31) | NVMDInfo->NVMDevice);
16984e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, VPDOffset),
16994e1bc9a0SAchim Leubner           NVMDInfo->dataOffsetAddress);
17004e1bc9a0SAchim Leubner         break;
17014e1bc9a0SAchim Leubner       /* 0x01:SEEPROM-0 and 0x04:FLASH only in indirect mode */
17024e1bc9a0SAchim Leubner       case AGSA_NVMD_CONFIG_SEEPROM:
17034e1bc9a0SAchim Leubner         /* NVMD=1 */
17044e1bc9a0SAchim Leubner         /* Data Offset should be 0 */
17054e1bc9a0SAchim Leubner         /* set up signature */
17064e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, Data.indirectData.signature), NVMDInfo->signature);
17074e1bc9a0SAchim Leubner         /* indirect payload IP = 1, NVMD = 0x1 (SEEPROM0) */
17084e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, LEN_IR_VPDD),
17094e1bc9a0SAchim Leubner           (NVMDInfo->indirectPayload << SHIFT31) | NVMDInfo->NVMDevice);
17104e1bc9a0SAchim Leubner         break;
17114e1bc9a0SAchim Leubner       case AGSA_NVMD_VPD_FLASH:
17124e1bc9a0SAchim Leubner         /* indirect payload IP = 1, NVMD=0x4 (FLASH) */
17134e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, LEN_IR_VPDD),
17144e1bc9a0SAchim Leubner           (NVMDInfo->indirectPayload << SHIFT31) | NVMDInfo->NVMDevice);
17154e1bc9a0SAchim Leubner         /* set up Offset */
17164e1bc9a0SAchim Leubner             OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, VPDOffset),
17174e1bc9a0SAchim Leubner           NVMDInfo->dataOffsetAddress);
17184e1bc9a0SAchim Leubner         break;
17194e1bc9a0SAchim Leubner       default:
17204e1bc9a0SAchim Leubner         SA_DBG1(("mpiSetNVMDCmd, (IP=1)wrong device type = 0x%x\n", NVMDInfo->NVMDevice));
17214e1bc9a0SAchim Leubner         ret = AGSA_RC_FAILURE;
17224e1bc9a0SAchim Leubner         ossaSetNVMDResponseCB(agRoot, agContext, OSSA_NVMD_MODE_ERROR);
17234e1bc9a0SAchim Leubner         break;
17244e1bc9a0SAchim Leubner       }
17254e1bc9a0SAchim Leubner 
17264e1bc9a0SAchim Leubner       /* set up SGL field */
17274e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, Data.indirectData.ISglAL), (NVMDInfo->indirectAddrLower32));
17284e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, Data.indirectData.ISglAH), (NVMDInfo->indirectAddrUpper32));
17294e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, Data.indirectData.ILen), (NVMDInfo->indirectLen));
17304e1bc9a0SAchim Leubner       /* build IOMB command and send to SPC */
17314e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_SET_NVMD_DATA, IOMB_SIZE64, queueNum);
17324e1bc9a0SAchim Leubner     }
17334e1bc9a0SAchim Leubner     else
17344e1bc9a0SAchim Leubner     {
17354e1bc9a0SAchim Leubner       /* direct payload IP = 0 */
17364e1bc9a0SAchim Leubner       if (AGSA_NVMD_TWI_DEVICES == NVMDInfo->NVMDevice)
17374e1bc9a0SAchim Leubner       {
17384e1bc9a0SAchim Leubner         /* NVMD = 0 */
17394e1bc9a0SAchim Leubner         /* indirect payload IP = 0 and 0x0 (TWI) */
17404e1bc9a0SAchim Leubner         /* not allow write to Config SEEPROM for direct mode, so don't set singature */
17414e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, LEN_IR_VPDD),
17424e1bc9a0SAchim Leubner           (NVMDInfo->TWIDeviceAddress << SHIFT16) | (NVMDInfo->TWIBusNumber << SHIFT12) |
17434e1bc9a0SAchim Leubner           (NVMDInfo->TWIDevicePageSize << SHIFT8) | (NVMDInfo->TWIDeviceAddressSize << SHIFT4) |
17444e1bc9a0SAchim Leubner           NVMDInfo->NVMDevice);
17454e1bc9a0SAchim Leubner         OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetNVMDataCmd_t, VPDOffset),
17464e1bc9a0SAchim Leubner           NVMDInfo->dataOffsetAddress | (NVMDInfo->directLen << SHIFT24));
17474e1bc9a0SAchim Leubner         si_memcpy(&payload.Data.NVMData[0], NVMDInfo->directData, NVMDInfo->directLen);
17484e1bc9a0SAchim Leubner         /* build IOMB command and send to SPC */
17494e1bc9a0SAchim Leubner         ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_SET_NVMD_DATA, IOMB_SIZE64, queueNum);
17504e1bc9a0SAchim Leubner       }
17514e1bc9a0SAchim Leubner       else
17524e1bc9a0SAchim Leubner       {
17534e1bc9a0SAchim Leubner         SA_DBG1(("mpiSetNVMDCmd, (IP=0)wrong device type = 0x%x\n", NVMDInfo->NVMDevice));
17544e1bc9a0SAchim Leubner         ret = AGSA_RC_FAILURE;
17554e1bc9a0SAchim Leubner         ossaSetNVMDResponseCB(agRoot, agContext, OSSA_NVMD_MODE_ERROR);
17564e1bc9a0SAchim Leubner       }
17574e1bc9a0SAchim Leubner     }
17584e1bc9a0SAchim Leubner 
17594e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
17604e1bc9a0SAchim Leubner     {
17614e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
17624e1bc9a0SAchim Leubner       /* remove the request from IOMap */
17634e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
17644e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
17654e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
17664e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
17674e1bc9a0SAchim Leubner 
17684e1bc9a0SAchim Leubner       /* return the request to free pool */
17694e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
17704e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
17714e1bc9a0SAchim Leubner       SA_DBG1(("mpiSetVPDCmd, sending IOMB failed\n" ));
17724e1bc9a0SAchim Leubner     }
17734e1bc9a0SAchim Leubner     SA_DBG3(("mpiSetNVMDCmd, return value = %d\n", ret));
17744e1bc9a0SAchim Leubner   }
17754e1bc9a0SAchim Leubner 
17764e1bc9a0SAchim Leubner 
17774e1bc9a0SAchim Leubner   /* return value */
17784e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xm");
17794e1bc9a0SAchim Leubner   return ret;
17804e1bc9a0SAchim Leubner }
17814e1bc9a0SAchim Leubner 
17824e1bc9a0SAchim Leubner /******************************************************************************/
17834e1bc9a0SAchim Leubner /*! \brief Set Device State command
17844e1bc9a0SAchim Leubner  *
17854e1bc9a0SAchim Leubner  *  This command is set Device State to SPC.
17864e1bc9a0SAchim Leubner  *
17874e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
17884e1bc9a0SAchim Leubner  *  \param agContext    Context for the Set Nexus State command
17894e1bc9a0SAchim Leubner  *  \param deviceId     DeviceId
17904e1bc9a0SAchim Leubner  *  \param queueNum     Queue Number of inbound/outbound queue
17914e1bc9a0SAchim Leubner  *
17924e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
17934e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
17944e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
17954e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
17964e1bc9a0SAchim Leubner  *
17974e1bc9a0SAchim Leubner  */
17984e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSetDeviceStateCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 deviceId,bit32 nds,bit32 queueNum)17994e1bc9a0SAchim Leubner GLOBAL bit32 mpiSetDeviceStateCmd(
18004e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
18014e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
18024e1bc9a0SAchim Leubner   bit32               deviceId,
18034e1bc9a0SAchim Leubner   bit32               nds,
18044e1bc9a0SAchim Leubner   bit32               queueNum
18054e1bc9a0SAchim Leubner   )
18064e1bc9a0SAchim Leubner {
18074e1bc9a0SAchim Leubner   bit32                  ret = AGSA_RC_SUCCESS;
18084e1bc9a0SAchim Leubner   agsaLLRoot_t           *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
18094e1bc9a0SAchim Leubner   agsaIORequestDesc_t    *pRequest;
18104e1bc9a0SAchim Leubner   agsaSetDeviceStateCmd_t payload;
18114e1bc9a0SAchim Leubner 
18124e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xn");
18134e1bc9a0SAchim Leubner 
18144e1bc9a0SAchim Leubner   /* Get request from free IORequests */
18154e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
18164e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
18174e1bc9a0SAchim Leubner 
18184e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
18194e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
18204e1bc9a0SAchim Leubner   {
18214e1bc9a0SAchim Leubner     SA_DBG1(("mpiSetDeviceStateCmd, No request from free list\n" ));
18224e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xn");
18234e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
18244e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
18254e1bc9a0SAchim Leubner   }
18264e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
18274e1bc9a0SAchim Leubner   else
18284e1bc9a0SAchim Leubner   {
18294e1bc9a0SAchim Leubner     SA_DBG3(("mpiSetDeviceStateCmd, Build IOMB DeviceId= 0x%x\n", deviceId));
18304e1bc9a0SAchim Leubner     /* Remove the request from free list */
18314e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
18324e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
18334e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
18344e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
18354e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
18364e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
18374e1bc9a0SAchim Leubner 
18384e1bc9a0SAchim Leubner     /* set payload to zeros */
18394e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaSetDeviceStateCmd_t));
18404e1bc9a0SAchim Leubner     /* set tag field */
18414e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetDeviceStateCmd_t, tag), pRequest->HTag);
18424e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetDeviceStateCmd_t, deviceId), deviceId);
18434e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSetDeviceStateCmd_t, NDS), nds);
18444e1bc9a0SAchim Leubner 
18454e1bc9a0SAchim Leubner     /* build IOMB command and send to SPC */
18464e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_SET_DEVICE_STATE, IOMB_SIZE64, queueNum);
18474e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
18484e1bc9a0SAchim Leubner     {
18494e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
18504e1bc9a0SAchim Leubner       /* remove the request from IOMap */
18514e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
18524e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
18534e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
18544e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
18554e1bc9a0SAchim Leubner 
18564e1bc9a0SAchim Leubner       /* return the request to free pool */
18574e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
18584e1bc9a0SAchim Leubner 
18594e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
18604e1bc9a0SAchim Leubner 
18614e1bc9a0SAchim Leubner       SA_DBG1(("mpiSetNexusStateCmd, sending IOMB failed\n" ));
18624e1bc9a0SAchim Leubner     }
18634e1bc9a0SAchim Leubner    SA_DBG3(("mpiSetDeviceStateCmd, return value = %d\n", ret));
18644e1bc9a0SAchim Leubner   }
18654e1bc9a0SAchim Leubner 
18664e1bc9a0SAchim Leubner   /* return value */
18674e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xn");
18684e1bc9a0SAchim Leubner 
18694e1bc9a0SAchim Leubner   return ret;
18704e1bc9a0SAchim Leubner }
18714e1bc9a0SAchim Leubner 
18724e1bc9a0SAchim Leubner /******************************************************************************/
18734e1bc9a0SAchim Leubner /*! \brief Get Device State command
18744e1bc9a0SAchim Leubner  *
18754e1bc9a0SAchim Leubner  *  This command is get device State to SPC.
18764e1bc9a0SAchim Leubner  *
18774e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
18784e1bc9a0SAchim Leubner  *  \param agContext    Context for the Get Nexus State command
18794e1bc9a0SAchim Leubner  *  \param deviceId     DeviceId
18804e1bc9a0SAchim Leubner  *  \param queueNum     Queue Number of inbound/outbound queue
18814e1bc9a0SAchim Leubner  *
18824e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
18834e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
18844e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
18854e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
18864e1bc9a0SAchim Leubner  *
18874e1bc9a0SAchim Leubner  */
18884e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetDeviceStateCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 deviceId,bit32 queueNum)18894e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetDeviceStateCmd(
18904e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
18914e1bc9a0SAchim Leubner   agsaContext_t       *agContext,
18924e1bc9a0SAchim Leubner   bit32               deviceId,
18934e1bc9a0SAchim Leubner   bit32               queueNum
18944e1bc9a0SAchim Leubner   )
18954e1bc9a0SAchim Leubner {
18964e1bc9a0SAchim Leubner   bit32                  ret = AGSA_RC_SUCCESS;
18974e1bc9a0SAchim Leubner   agsaLLRoot_t           *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
18984e1bc9a0SAchim Leubner   agsaIORequestDesc_t    *pRequest;
18994e1bc9a0SAchim Leubner   agsaGetDeviceStateCmd_t payload;
19004e1bc9a0SAchim Leubner   bit32               using_reserved = agFALSE;
19014e1bc9a0SAchim Leubner 
19024e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xf");
19034e1bc9a0SAchim Leubner 
19044e1bc9a0SAchim Leubner   /* Get request from free IORequests */
19054e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
19064e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
19074e1bc9a0SAchim Leubner 
19084e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
19094e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
19104e1bc9a0SAchim Leubner   {
19114e1bc9a0SAchim Leubner     pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeReservedRequests)); /**/
19124e1bc9a0SAchim Leubner     /* If no LL Control request entry available */
19134e1bc9a0SAchim Leubner     if(agNULL != pRequest)
19144e1bc9a0SAchim Leubner     {
19154e1bc9a0SAchim Leubner       using_reserved = agTRUE;
19164e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetDeviceStateCmd, using saRoot->freeReservedRequests\n"));
19174e1bc9a0SAchim Leubner     }
19184e1bc9a0SAchim Leubner     else
19194e1bc9a0SAchim Leubner     {
19204e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetDeviceStateCmd, No request from free list Not using saRoot->freeReservedRequests\n"));
19214e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xf");
19224e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
19234e1bc9a0SAchim Leubner       return AGSA_RC_BUSY;
19244e1bc9a0SAchim Leubner     }
19254e1bc9a0SAchim Leubner 
19264e1bc9a0SAchim Leubner   }
19274e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
19284e1bc9a0SAchim Leubner   SA_DBG3(("mpiGetDeviceStateCmd, Build IOMB DeviceId= 0x%x\n", deviceId));
19294e1bc9a0SAchim Leubner   /* Remove the request from free list */
19304e1bc9a0SAchim Leubner   if( using_reserved )
19314e1bc9a0SAchim Leubner   {
19324e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
19334e1bc9a0SAchim Leubner   }
19344e1bc9a0SAchim Leubner   else
19354e1bc9a0SAchim Leubner   {
19364e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
19374e1bc9a0SAchim Leubner   }
19384e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
19394e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
19404e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].agContext = agContext;
19414e1bc9a0SAchim Leubner   pRequest->valid = agTRUE;
19424e1bc9a0SAchim Leubner 
19434e1bc9a0SAchim Leubner   ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
19444e1bc9a0SAchim Leubner 
19454e1bc9a0SAchim Leubner   /* set payload to zeros */
19464e1bc9a0SAchim Leubner   si_memset(&payload, 0, sizeof(agsaGetDeviceStateCmd_t));
19474e1bc9a0SAchim Leubner   /* set tag field */
19484e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetDeviceStateCmd_t, tag), pRequest->HTag);
19494e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaGetDeviceStateCmd_t, deviceId), deviceId);
19504e1bc9a0SAchim Leubner 
19514e1bc9a0SAchim Leubner   /* build IOMB command and send to SPC */
19524e1bc9a0SAchim Leubner   ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_GET_DEVICE_STATE, IOMB_SIZE64, queueNum);
19534e1bc9a0SAchim Leubner   if (AGSA_RC_SUCCESS != ret)
19544e1bc9a0SAchim Leubner   {
19554e1bc9a0SAchim Leubner     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
19564e1bc9a0SAchim Leubner     /* remove the request from IOMap */
19574e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
19584e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
19594e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
19604e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agNULL;
19614e1bc9a0SAchim Leubner     pRequest->valid = agFALSE;
19624e1bc9a0SAchim Leubner     /* return the request to free pool */
19634e1bc9a0SAchim Leubner     if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
19644e1bc9a0SAchim Leubner     {
19654e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetDeviceStateCmd: saving pRequest (%p) for later use\n", pRequest));
19664e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
19674e1bc9a0SAchim Leubner     }
19684e1bc9a0SAchim Leubner     else
19694e1bc9a0SAchim Leubner     {
19704e1bc9a0SAchim Leubner       /* return the request to free pool */
19714e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
19724e1bc9a0SAchim Leubner     }
19734e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
19744e1bc9a0SAchim Leubner 
19754e1bc9a0SAchim Leubner     SA_DBG1(("mpiGetDeviceStateCmd, sending IOMB failed\n" ));
19764e1bc9a0SAchim Leubner   }
19774e1bc9a0SAchim Leubner   SA_DBG3(("mpiGetDeviceStateCmd, return value = %d\n", ret));
19784e1bc9a0SAchim Leubner 
19794e1bc9a0SAchim Leubner   /* return value */
19804e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xf");
19814e1bc9a0SAchim Leubner 
19824e1bc9a0SAchim Leubner   return ret;
19834e1bc9a0SAchim Leubner }
19844e1bc9a0SAchim Leubner 
19854e1bc9a0SAchim Leubner /******************************************************************************/
19864e1bc9a0SAchim Leubner /*! \brief SAS ReInitialize command
19874e1bc9a0SAchim Leubner  *
19884e1bc9a0SAchim Leubner  *  This command is Reinitialize SAS paremeters to SPC.
19894e1bc9a0SAchim Leubner  *
19904e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
19914e1bc9a0SAchim Leubner  *  \param agContext    Context for the Get Nexus State command
19924e1bc9a0SAchim Leubner  *  \param agSASConfig  SAS Configuration Parameters
19934e1bc9a0SAchim Leubner  *  \param queueNum     Queue Number of inbound/outbound queue
19944e1bc9a0SAchim Leubner  *
19954e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
19964e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
19974e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
19984e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
19994e1bc9a0SAchim Leubner  *
20004e1bc9a0SAchim Leubner  */
20014e1bc9a0SAchim Leubner /*******************************************************************************/
mpiSasReinitializeCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,agsaSASReconfig_t * agSASConfig,bit32 queueNum)20024e1bc9a0SAchim Leubner GLOBAL bit32 mpiSasReinitializeCmd(
20034e1bc9a0SAchim Leubner    agsaRoot_t        *agRoot,
20044e1bc9a0SAchim Leubner    agsaContext_t     *agContext,
20054e1bc9a0SAchim Leubner    agsaSASReconfig_t *agSASConfig,
20064e1bc9a0SAchim Leubner    bit32             queueNum
20074e1bc9a0SAchim Leubner    )
20084e1bc9a0SAchim Leubner {
20094e1bc9a0SAchim Leubner   bit32                    ret = AGSA_RC_SUCCESS;
20104e1bc9a0SAchim Leubner   agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
20114e1bc9a0SAchim Leubner   agsaIORequestDesc_t      *pRequest;
20124e1bc9a0SAchim Leubner   agsaSasReInitializeCmd_t payload;
20134e1bc9a0SAchim Leubner 
20144e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"xo");
20154e1bc9a0SAchim Leubner 
20164e1bc9a0SAchim Leubner   /* Get request from free IORequests */
20174e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
20184e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
20194e1bc9a0SAchim Leubner 
20204e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
20214e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
20224e1bc9a0SAchim Leubner   {
20234e1bc9a0SAchim Leubner     SA_DBG1(("mpiSasReinitializeCmd, No request from free list\n" ));
20244e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xo");
20254e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
20264e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
20274e1bc9a0SAchim Leubner   }
20284e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
20294e1bc9a0SAchim Leubner   else
20304e1bc9a0SAchim Leubner   {
20314e1bc9a0SAchim Leubner     SA_DBG3(("mpiSasReinitializeCmd, Build IOMB SAS_RE_INITIALIZE\n"));
20324e1bc9a0SAchim Leubner     /* Remove the request from free list */
20334e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
20344e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
20354e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
20364e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
20374e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
20384e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
20394e1bc9a0SAchim Leubner 
20404e1bc9a0SAchim Leubner     /* set payload to zeros */
20414e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaSasReInitializeCmd_t));
20424e1bc9a0SAchim Leubner 
20434e1bc9a0SAchim Leubner     /* set tag field */
20444e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSasReInitializeCmd_t, tag), pRequest->HTag);
20454e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSasReInitializeCmd_t, setFlags), agSASConfig->flags);
20464e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSasReInitializeCmd_t, MaxPorts), agSASConfig->maxPorts);
20474e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSasReInitializeCmd_t, openRejReCmdData),
20484e1bc9a0SAchim Leubner                     (agSASConfig->openRejectRetriesCmd << SHIFT16) | agSASConfig->openRejectRetriesData);
20494e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaSasReInitializeCmd_t, sataHOLTMO), agSASConfig->sataHolTmo);
20504e1bc9a0SAchim Leubner 
20514e1bc9a0SAchim Leubner 
20524e1bc9a0SAchim Leubner     /* build IOMB command and send to SPC */
20534e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_SAS_RE_INITIALIZE, IOMB_SIZE64, queueNum);
20544e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
20554e1bc9a0SAchim Leubner     {
20564e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
20574e1bc9a0SAchim Leubner       /* remove the request from IOMap */
20584e1bc9a0SAchim Leubner       SA_ASSERT((!pRequest->valid), "The pRequest is in use");
20594e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
20604e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
20614e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
20624e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
20634e1bc9a0SAchim Leubner 
20644e1bc9a0SAchim Leubner       /* return the request to free pool */
20654e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
20664e1bc9a0SAchim Leubner 
20674e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
20684e1bc9a0SAchim Leubner 
20694e1bc9a0SAchim Leubner       SA_DBG1(("mpiSasReinitializeCmd, sending IOMB failed\n" ));
20704e1bc9a0SAchim Leubner     }
20714e1bc9a0SAchim Leubner     SA_DBG3(("mpiSasReinitializeCmd, return value = %d\n", ret));
20724e1bc9a0SAchim Leubner   }
20734e1bc9a0SAchim Leubner 
20744e1bc9a0SAchim Leubner   /* return value */
20754e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xo");
20764e1bc9a0SAchim Leubner 
20774e1bc9a0SAchim Leubner   return ret;
20784e1bc9a0SAchim Leubner }
20794e1bc9a0SAchim Leubner 
20804e1bc9a0SAchim Leubner /******************************************************************************/
20814e1bc9a0SAchim Leubner /*! \brief SAS Set Controller Configuration Command
20824e1bc9a0SAchim Leubner  *
20834e1bc9a0SAchim Leubner  *  This command updates the contents of a controller mode page.
20844e1bc9a0SAchim Leubner  *
20854e1bc9a0SAchim Leubner  *  \param agRoot               Handles for this instance of SAS/SATA LLL
20864e1bc9a0SAchim Leubner  *  \param agContext            Context for the Get Nexus State command
20874e1bc9a0SAchim Leubner  *  \param agControllerConfig   Mode page being sent to the controller
20884e1bc9a0SAchim Leubner  *  \param queueNum             Queue Number of inbound/outbound queue
20894e1bc9a0SAchim Leubner  *
20904e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
20914e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
20924e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
20934e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
20944e1bc9a0SAchim Leubner  *
20954e1bc9a0SAchim Leubner  */
20964e1bc9a0SAchim Leubner /*******************************************************************************/
20974e1bc9a0SAchim Leubner GLOBAL bit32
mpiSetControllerConfigCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,agsaSetControllerConfigCmd_t * agControllerConfig,bit32 queueNum,bit8 modePageContext)20984e1bc9a0SAchim Leubner mpiSetControllerConfigCmd(
20994e1bc9a0SAchim Leubner    agsaRoot_t                   *agRoot,
21004e1bc9a0SAchim Leubner    agsaContext_t                *agContext,
21014e1bc9a0SAchim Leubner    agsaSetControllerConfigCmd_t *agControllerConfig,
21024e1bc9a0SAchim Leubner    bit32                         queueNum,
21034e1bc9a0SAchim Leubner    bit8                          modePageContext
21044e1bc9a0SAchim Leubner    )
21054e1bc9a0SAchim Leubner {
21064e1bc9a0SAchim Leubner     bit32                    ret = AGSA_RC_SUCCESS;
21074e1bc9a0SAchim Leubner     agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
21084e1bc9a0SAchim Leubner     agsaIORequestDesc_t      *pRequest;
21094e1bc9a0SAchim Leubner 
21104e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"x1");
21114e1bc9a0SAchim Leubner 
21124e1bc9a0SAchim Leubner     SA_DBG2(("mpiSetControllerConfigCmd: agControllerConfig 0x%08x 0x%08x 0x%08x 0x%08x\n",
21134e1bc9a0SAchim Leubner                                      agControllerConfig->pageCode,agControllerConfig->configPage[0],
21144e1bc9a0SAchim Leubner                                      agControllerConfig->configPage[1], agControllerConfig->configPage[2]));
21154e1bc9a0SAchim Leubner     SA_DBG2(("mpiSetControllerConfigCmd: agControllerConfig 0x%08x 0x%08x 0x%08x 0x%08x\n",
21164e1bc9a0SAchim Leubner                                      agControllerConfig->configPage[3],agControllerConfig->configPage[4],
21174e1bc9a0SAchim Leubner                                      agControllerConfig->configPage[5], agControllerConfig->configPage[6]));
21184e1bc9a0SAchim Leubner     SA_DBG2(("mpiSetControllerConfigCmd: agControllerConfig 0x%08x 0x%08x 0x%08x 0x%08x\n",
21194e1bc9a0SAchim Leubner                                      agControllerConfig->configPage[7],agControllerConfig->configPage[8],
21204e1bc9a0SAchim Leubner                                      agControllerConfig->configPage[9], agControllerConfig->configPage[10]));
21214e1bc9a0SAchim Leubner     SA_DBG2(("mpiSetControllerConfigCmd: agControllerConfig 0x%08x 0x%08x\n",
21224e1bc9a0SAchim Leubner                                      agControllerConfig->configPage[11],agControllerConfig->configPage[12]));
21234e1bc9a0SAchim Leubner 
21244e1bc9a0SAchim Leubner     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
21254e1bc9a0SAchim Leubner     /* Get request from free IORequests */
21264e1bc9a0SAchim Leubner     pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
21274e1bc9a0SAchim Leubner 
21284e1bc9a0SAchim Leubner     /* If no LL Control request entry available */
21294e1bc9a0SAchim Leubner     if ( agNULL == pRequest )
21304e1bc9a0SAchim Leubner     {
21314e1bc9a0SAchim Leubner       SA_DBG1(("mpiSetControllerConfigCmd, No request from free list\n" ));
21324e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "x1");
21334e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
21344e1bc9a0SAchim Leubner       return AGSA_RC_BUSY;
21354e1bc9a0SAchim Leubner     }
21364e1bc9a0SAchim Leubner     /* If LL Control request entry avaliable */
21374e1bc9a0SAchim Leubner     else
21384e1bc9a0SAchim Leubner     {
21394e1bc9a0SAchim Leubner       SA_DBG2(("mpiSetControllerConfigCmd, Build IOMB pageCode 0x%x configPage[0] 0x%x\n",agControllerConfig->pageCode,agControllerConfig->configPage[0]));
21404e1bc9a0SAchim Leubner       /* Remove the request from free list */
21414e1bc9a0SAchim Leubner       SA_ASSERT((!pRequest->valid), "The pRequest is in use");
21424e1bc9a0SAchim Leubner       saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
21434e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
21444e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
21454e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agContext;
21464e1bc9a0SAchim Leubner       pRequest->valid = agTRUE;
21474e1bc9a0SAchim Leubner       pRequest->modePageContext = modePageContext;
21484e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
21494e1bc9a0SAchim Leubner 
21504e1bc9a0SAchim Leubner       /* set tag field */
21514e1bc9a0SAchim Leubner       agControllerConfig->tag =  pRequest->HTag;
21524e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *)agControllerConfig,
21534e1bc9a0SAchim Leubner                         MPI_CATEGORY_SAS_SATA, OPC_INB_SET_CONTROLLER_CONFIG, IOMB_SIZE64, 0);
21544e1bc9a0SAchim Leubner 
21554e1bc9a0SAchim Leubner       if (AGSA_RC_SUCCESS != ret)
21564e1bc9a0SAchim Leubner       {
21574e1bc9a0SAchim Leubner           ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
21584e1bc9a0SAchim Leubner           /* remove the request from IOMap */
21594e1bc9a0SAchim Leubner           saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
21604e1bc9a0SAchim Leubner           saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
21614e1bc9a0SAchim Leubner           saRoot->IOMap[pRequest->HTag].agContext = agNULL;
21624e1bc9a0SAchim Leubner           pRequest->valid = agFALSE;
21634e1bc9a0SAchim Leubner 
21644e1bc9a0SAchim Leubner           /* return the request to free pool */
21654e1bc9a0SAchim Leubner           saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
21664e1bc9a0SAchim Leubner 
21674e1bc9a0SAchim Leubner           ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
21684e1bc9a0SAchim Leubner 
21694e1bc9a0SAchim Leubner           SA_DBG1(("mpiSetControllerConfigCmd, sending IOMB failed\n" ));
21704e1bc9a0SAchim Leubner       }
21714e1bc9a0SAchim Leubner       SA_DBG3(("mpiSetControllerConfigCmd, return value = %d\n", ret));
21724e1bc9a0SAchim Leubner     }
21734e1bc9a0SAchim Leubner 
21744e1bc9a0SAchim Leubner     /* return value */
21754e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "x1");
21764e1bc9a0SAchim Leubner 
21774e1bc9a0SAchim Leubner     return ret;
21784e1bc9a0SAchim Leubner }
21794e1bc9a0SAchim Leubner 
21804e1bc9a0SAchim Leubner /******************************************************************************/
21814e1bc9a0SAchim Leubner /*! \brief SAS Get Controller Configuration Command
21824e1bc9a0SAchim Leubner  *
21834e1bc9a0SAchim Leubner  *  This command retrieves the contents of a controller mode page.
21844e1bc9a0SAchim Leubner  *
21854e1bc9a0SAchim Leubner  *  \param agRoot               Handles for this instance of SAS/SATA LLL
21864e1bc9a0SAchim Leubner  *  \param agContext            Context for the Get Nexus State command
21874e1bc9a0SAchim Leubner  *  \param agControllerConfig   Mode page to retrieve from the controller
21884e1bc9a0SAchim Leubner  *  \param queueNum             Queue Number of inbound/outbound queue
21894e1bc9a0SAchim Leubner  *
21904e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
21914e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
21924e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
21934e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
21944e1bc9a0SAchim Leubner  *
21954e1bc9a0SAchim Leubner  */
21964e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetControllerConfigCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,agsaGetControllerConfigCmd_t * agControllerConfig,bit32 queueNum)21974e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetControllerConfigCmd(
21984e1bc9a0SAchim Leubner    agsaRoot_t        *agRoot,
21994e1bc9a0SAchim Leubner    agsaContext_t     *agContext,
22004e1bc9a0SAchim Leubner    agsaGetControllerConfigCmd_t *agControllerConfig,
22014e1bc9a0SAchim Leubner    bit32             queueNum
22024e1bc9a0SAchim Leubner    )
22034e1bc9a0SAchim Leubner {
22044e1bc9a0SAchim Leubner     bit32                    ret = AGSA_RC_SUCCESS;
22054e1bc9a0SAchim Leubner     agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
22064e1bc9a0SAchim Leubner     agsaIORequestDesc_t      *pRequest;
22074e1bc9a0SAchim Leubner 
22084e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"xq");
22094e1bc9a0SAchim Leubner 
22104e1bc9a0SAchim Leubner     SA_DBG1(("mpiGetControllerConfigCmd: Tag 0x%0X Page Code %0X\n",agControllerConfig->tag,agControllerConfig->pageCode ));
22114e1bc9a0SAchim Leubner     /* Get request from free IORequests */
22124e1bc9a0SAchim Leubner     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
22134e1bc9a0SAchim Leubner     pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
22144e1bc9a0SAchim Leubner 
22154e1bc9a0SAchim Leubner     /* If no LL Control request entry available */
22164e1bc9a0SAchim Leubner     if ( agNULL == pRequest )
22174e1bc9a0SAchim Leubner     {
22184e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetControllerConfigCmd, No request from free list\n" ));
22194e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xq");
22204e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
22214e1bc9a0SAchim Leubner       return AGSA_RC_BUSY;
22224e1bc9a0SAchim Leubner     }
22234e1bc9a0SAchim Leubner     /* If LL Control request entry avaliable */
22244e1bc9a0SAchim Leubner     else
22254e1bc9a0SAchim Leubner     {
22264e1bc9a0SAchim Leubner       SA_DBG3(("mpiGetControllerConfig, Build IOMB mpiGetControllerConfigCmd\n"));
22274e1bc9a0SAchim Leubner       /* Remove the request from free list */
22284e1bc9a0SAchim Leubner       SA_ASSERT((!pRequest->valid), "The pRequest is in use");
22294e1bc9a0SAchim Leubner       saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
22304e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
22314e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
22324e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agContext;
22334e1bc9a0SAchim Leubner       pRequest->valid = agTRUE;
22344e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
22354e1bc9a0SAchim Leubner 
22364e1bc9a0SAchim Leubner       /* set tag field */
22374e1bc9a0SAchim Leubner       agControllerConfig->tag =  pRequest->HTag;
22384e1bc9a0SAchim Leubner 
22394e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *) agControllerConfig,
22404e1bc9a0SAchim Leubner                         MPI_CATEGORY_SAS_SATA, OPC_INB_GET_CONTROLLER_CONFIG, IOMB_SIZE64, 0);
22414e1bc9a0SAchim Leubner 
22424e1bc9a0SAchim Leubner       if (AGSA_RC_SUCCESS != ret)
22434e1bc9a0SAchim Leubner       {
22444e1bc9a0SAchim Leubner           ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
22454e1bc9a0SAchim Leubner           /* remove the request from IOMap */
22464e1bc9a0SAchim Leubner           saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
22474e1bc9a0SAchim Leubner           saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
22484e1bc9a0SAchim Leubner           saRoot->IOMap[pRequest->HTag].agContext = agNULL;
22494e1bc9a0SAchim Leubner           pRequest->valid = agFALSE;
22504e1bc9a0SAchim Leubner 
22514e1bc9a0SAchim Leubner           /* return the request to free pool */
22524e1bc9a0SAchim Leubner           saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
22534e1bc9a0SAchim Leubner 
22544e1bc9a0SAchim Leubner           ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
22554e1bc9a0SAchim Leubner 
22564e1bc9a0SAchim Leubner           SA_DBG1(("mpiGetControllerConfigCmd, sending IOMB failed\n" ));
22574e1bc9a0SAchim Leubner       }
22584e1bc9a0SAchim Leubner       else
22594e1bc9a0SAchim Leubner       {
22604e1bc9a0SAchim Leubner         SA_DBG3(("mpiGetControllerConfigCmd, set OK\n"));
22614e1bc9a0SAchim Leubner       }
22624e1bc9a0SAchim Leubner       SA_DBG3(("mpiGetControllerConfigCmd, return value = %d\n", ret));
22634e1bc9a0SAchim Leubner     }
22644e1bc9a0SAchim Leubner 
22654e1bc9a0SAchim Leubner     /* return value */
22664e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xq");
22674e1bc9a0SAchim Leubner 
22684e1bc9a0SAchim Leubner     return ret;
22694e1bc9a0SAchim Leubner }
22704e1bc9a0SAchim Leubner 
22714e1bc9a0SAchim Leubner /******************************************************************************/
22724e1bc9a0SAchim Leubner /*! \brief SAS Encryption KEK command
22734e1bc9a0SAchim Leubner  *
22744e1bc9a0SAchim Leubner  *  This command updates one or more KEK in a controller that supports encryption.
22754e1bc9a0SAchim Leubner  *
22764e1bc9a0SAchim Leubner  *  \param agRoot      Handles for this instance of SAS/SATA LLL
22774e1bc9a0SAchim Leubner  *  \param agContext   Context for the Get Nexus State command
22784e1bc9a0SAchim Leubner  *  \param agKekMgmt   Kek information that will be sent to the controller
22794e1bc9a0SAchim Leubner  *  \param queueNum    Queue Number of inbound/outbound queue
22804e1bc9a0SAchim Leubner  *
22814e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
22824e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
22834e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
22844e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
22854e1bc9a0SAchim Leubner  *
22864e1bc9a0SAchim Leubner  */
22874e1bc9a0SAchim Leubner /*******************************************************************************/
mpiKekManagementCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,agsaKekManagementCmd_t * agKekMgmt,bit32 queueNum)22884e1bc9a0SAchim Leubner GLOBAL bit32 mpiKekManagementCmd(
22894e1bc9a0SAchim Leubner    agsaRoot_t        *agRoot,
22904e1bc9a0SAchim Leubner    agsaContext_t     *agContext,
22914e1bc9a0SAchim Leubner    agsaKekManagementCmd_t *agKekMgmt,
22924e1bc9a0SAchim Leubner    bit32             queueNum
22934e1bc9a0SAchim Leubner    )
22944e1bc9a0SAchim Leubner {
22954e1bc9a0SAchim Leubner     bit32                    ret = AGSA_RC_SUCCESS;
22964e1bc9a0SAchim Leubner     agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
22974e1bc9a0SAchim Leubner     agsaIORequestDesc_t      *pRequest;
22984e1bc9a0SAchim Leubner 
22994e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"x2");
23004e1bc9a0SAchim Leubner 
23014e1bc9a0SAchim Leubner     /* Get request from free IORequests */
23024e1bc9a0SAchim Leubner     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
23034e1bc9a0SAchim Leubner     pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
23044e1bc9a0SAchim Leubner 
23054e1bc9a0SAchim Leubner     /* If no LL Control request entry available */
23064e1bc9a0SAchim Leubner     if ( agNULL == pRequest )
23074e1bc9a0SAchim Leubner     {
23084e1bc9a0SAchim Leubner       SA_DBG1(("mpiKekManagementCmd, No request from free list\n" ));
23094e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "x2");
23104e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
23114e1bc9a0SAchim Leubner       return AGSA_RC_BUSY;
23124e1bc9a0SAchim Leubner     }
23134e1bc9a0SAchim Leubner     /* If LL Control request entry avaliable */
23144e1bc9a0SAchim Leubner     else
23154e1bc9a0SAchim Leubner     {
23164e1bc9a0SAchim Leubner       SA_DBG3(("mpiKekManagementCmd, Build OPC_INB_KEK_MANAGEMENT\n"));
23174e1bc9a0SAchim Leubner       /* Remove the request from free list */
23184e1bc9a0SAchim Leubner       SA_ASSERT((!pRequest->valid), "The pRequest is in use");
23194e1bc9a0SAchim Leubner       saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
23204e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
23214e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
23224e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agContext;
23234e1bc9a0SAchim Leubner       pRequest->valid = agTRUE;
23244e1bc9a0SAchim Leubner       agKekMgmt->tag = pRequest->HTag;
23254e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
23264e1bc9a0SAchim Leubner 
23274e1bc9a0SAchim Leubner       SA_DBG1(("mpiKekManagementCmd, 0x%X 0x%X 0x%X\n", agKekMgmt->tag,agKekMgmt->NEWKIDX_CURKIDX_KBF_Reserved_SKNV_KSOP, agKekMgmt->reserved ));
23284e1bc9a0SAchim Leubner 
23294e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *)agKekMgmt, MPI_CATEGORY_SAS_SATA, OPC_INB_KEK_MANAGEMENT, IOMB_SIZE64, 0);
23304e1bc9a0SAchim Leubner 
23314e1bc9a0SAchim Leubner       if (AGSA_RC_SUCCESS != ret)
23324e1bc9a0SAchim Leubner       {
23334e1bc9a0SAchim Leubner           ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
23344e1bc9a0SAchim Leubner           /* remove the request from IOMap */
23354e1bc9a0SAchim Leubner           saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
23364e1bc9a0SAchim Leubner           saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
23374e1bc9a0SAchim Leubner           saRoot->IOMap[pRequest->HTag].agContext = agNULL;
23384e1bc9a0SAchim Leubner           pRequest->valid = agFALSE;
23394e1bc9a0SAchim Leubner           /* return the request to free pool */
23404e1bc9a0SAchim Leubner           saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
23414e1bc9a0SAchim Leubner 
23424e1bc9a0SAchim Leubner           ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
23434e1bc9a0SAchim Leubner           SA_DBG1(("mpiKekManagementCmd, sending IOMB failed\n" ));
23444e1bc9a0SAchim Leubner       }
23454e1bc9a0SAchim Leubner       SA_DBG3(("mpiKekManagementCmd, return value = %d\n", ret));
23464e1bc9a0SAchim Leubner     }
23474e1bc9a0SAchim Leubner 
23484e1bc9a0SAchim Leubner     /* return value */
23494e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "x2");
23504e1bc9a0SAchim Leubner 
23514e1bc9a0SAchim Leubner     return ret;
23524e1bc9a0SAchim Leubner }
23534e1bc9a0SAchim Leubner 
23544e1bc9a0SAchim Leubner /******************************************************************************/
23554e1bc9a0SAchim Leubner /*! \brief SAS Encryption DEK management command
23564e1bc9a0SAchim Leubner  *
23574e1bc9a0SAchim Leubner  *  This command updates one or more DEK in a controller that supports encryption.
23584e1bc9a0SAchim Leubner  *
23594e1bc9a0SAchim Leubner  *  \param agRoot      Handles for this instance of SAS/SATA LLL
23604e1bc9a0SAchim Leubner  *  \param agContext   Context for the Get Nexus State command
23614e1bc9a0SAchim Leubner  *  \param agDekMgmt   DEK information that will be sent to the controller
23624e1bc9a0SAchim Leubner  *  \param queueNum    Queue Number of inbound/outbound queue
23634e1bc9a0SAchim Leubner  *
23644e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
23654e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
23664e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
23674e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
23684e1bc9a0SAchim Leubner  *
23694e1bc9a0SAchim Leubner  */
23704e1bc9a0SAchim Leubner /*******************************************************************************/
mpiDekManagementCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,agsaDekManagementCmd_t * agDekMgmt,bit32 queueNum)23714e1bc9a0SAchim Leubner GLOBAL bit32 mpiDekManagementCmd(
23724e1bc9a0SAchim Leubner    agsaRoot_t                *agRoot,
23734e1bc9a0SAchim Leubner    agsaContext_t             *agContext,
23744e1bc9a0SAchim Leubner    agsaDekManagementCmd_t    *agDekMgmt,
23754e1bc9a0SAchim Leubner    bit32                     queueNum
23764e1bc9a0SAchim Leubner    )
23774e1bc9a0SAchim Leubner {
23784e1bc9a0SAchim Leubner      bit32                    ret = AGSA_RC_SUCCESS;
23794e1bc9a0SAchim Leubner     agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
23804e1bc9a0SAchim Leubner     agsaIORequestDesc_t      *pRequest;
23814e1bc9a0SAchim Leubner 
23824e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"xs");
23834e1bc9a0SAchim Leubner 
23844e1bc9a0SAchim Leubner     /* Get request from free IORequests */
23854e1bc9a0SAchim Leubner     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
23864e1bc9a0SAchim Leubner     pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
23874e1bc9a0SAchim Leubner 
23884e1bc9a0SAchim Leubner     /* If no LL Control request entry available */
23894e1bc9a0SAchim Leubner     if ( agNULL == pRequest )
23904e1bc9a0SAchim Leubner     {
23914e1bc9a0SAchim Leubner       SA_DBG1(("mpiDekManagementCmd, No request from free list\n" ));
23924e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xs");
23934e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
23944e1bc9a0SAchim Leubner       return AGSA_RC_BUSY;
23954e1bc9a0SAchim Leubner     }
23964e1bc9a0SAchim Leubner     /* If LL Control request entry avaliable */
23974e1bc9a0SAchim Leubner     else
23984e1bc9a0SAchim Leubner     {
23994e1bc9a0SAchim Leubner       SA_DBG1(("mpiDekManagementCmd, Build OPC_INB_DEK_MANAGEMENT pRequest %p\n",pRequest));
24004e1bc9a0SAchim Leubner       /* Remove the request from free list */
24014e1bc9a0SAchim Leubner       SA_ASSERT((!pRequest->valid), "The pRequest is in use");
24024e1bc9a0SAchim Leubner       saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
24034e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
24044e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
24054e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agContext;
24064e1bc9a0SAchim Leubner       pRequest->valid = agTRUE;
24074e1bc9a0SAchim Leubner       agDekMgmt->tag = pRequest->HTag;
24084e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
24094e1bc9a0SAchim Leubner 
24104e1bc9a0SAchim Leubner       SA_DBG1(("mpiDekManagementCmd: 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X\n",
24114e1bc9a0SAchim Leubner                                     agDekMgmt->tag,
24124e1bc9a0SAchim Leubner                                     agDekMgmt->KEKIDX_Reserved_TBLS_DSOP,
24134e1bc9a0SAchim Leubner                                     agDekMgmt->dekIndex,
24144e1bc9a0SAchim Leubner                                     agDekMgmt->tableAddrLo,
24154e1bc9a0SAchim Leubner                                     agDekMgmt->tableAddrHi,
24164e1bc9a0SAchim Leubner                                     agDekMgmt->tableEntries,
24174e1bc9a0SAchim Leubner                                     agDekMgmt->Reserved_DBF_TBL_SIZE ));
24184e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *) agDekMgmt, MPI_CATEGORY_SAS_SATA, OPC_INB_DEK_MANAGEMENT, IOMB_SIZE64, 0);
24194e1bc9a0SAchim Leubner 
24204e1bc9a0SAchim Leubner       if (AGSA_RC_SUCCESS != ret)
24214e1bc9a0SAchim Leubner       {
24224e1bc9a0SAchim Leubner         ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
24234e1bc9a0SAchim Leubner         /* remove the request from IOMap */
24244e1bc9a0SAchim Leubner         saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
24254e1bc9a0SAchim Leubner         saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
24264e1bc9a0SAchim Leubner         saRoot->IOMap[pRequest->HTag].agContext = agNULL;
24274e1bc9a0SAchim Leubner         pRequest->valid = agFALSE;
24284e1bc9a0SAchim Leubner 
24294e1bc9a0SAchim Leubner         /* return the request to free pool */
24304e1bc9a0SAchim Leubner         saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
24314e1bc9a0SAchim Leubner 
24324e1bc9a0SAchim Leubner         ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
24334e1bc9a0SAchim Leubner 
24344e1bc9a0SAchim Leubner         SA_DBG1(("mpiDekManagementCmd, sending IOMB failed\n" ));
24354e1bc9a0SAchim Leubner       }
24364e1bc9a0SAchim Leubner       SA_DBG3(("mpiDekManagementCmd, return value = %d\n", ret));
24374e1bc9a0SAchim Leubner     }
24384e1bc9a0SAchim Leubner 
24394e1bc9a0SAchim Leubner     /* return value */
24404e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "xs");
24414e1bc9a0SAchim Leubner 
24424e1bc9a0SAchim Leubner     return ret;
24434e1bc9a0SAchim Leubner }
24444e1bc9a0SAchim Leubner 
24454e1bc9a0SAchim Leubner /******************************************************************************/
24464e1bc9a0SAchim Leubner /*! \brief
24474e1bc9a0SAchim Leubner  *
24484e1bc9a0SAchim Leubner  *  This command sends operator management command.
24494e1bc9a0SAchim Leubner  *
24504e1bc9a0SAchim Leubner  *  \param agRoot      Handles for this instance of SAS/SATA LLL
24514e1bc9a0SAchim Leubner  *  \param agContext   Context
24524e1bc9a0SAchim Leubner  *  \param queueNum    Queue Number of inbound/outbound queue
24534e1bc9a0SAchim Leubner  *
24544e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
24554e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
24564e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
24574e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
24584e1bc9a0SAchim Leubner  *
24594e1bc9a0SAchim Leubner  */
24604e1bc9a0SAchim Leubner /*******************************************************************************/
mpiOperatorManagementCmd(agsaRoot_t * agRoot,bit32 queueNum,agsaContext_t * agContext,agsaOperatorMangmentCmd_t * operatorcode)24614e1bc9a0SAchim Leubner GLOBAL bit32 mpiOperatorManagementCmd(
24624e1bc9a0SAchim Leubner   agsaRoot_t                *agRoot,
24634e1bc9a0SAchim Leubner   bit32                     queueNum,
24644e1bc9a0SAchim Leubner   agsaContext_t             *agContext,
24654e1bc9a0SAchim Leubner   agsaOperatorMangmentCmd_t *operatorcode )
24664e1bc9a0SAchim Leubner {
24674e1bc9a0SAchim Leubner    bit32                    ret = AGSA_RC_SUCCESS;
24684e1bc9a0SAchim Leubner   agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
24694e1bc9a0SAchim Leubner   agsaIORequestDesc_t      *pRequest;
24704e1bc9a0SAchim Leubner 
24714e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"2q");
24724e1bc9a0SAchim Leubner 
24734e1bc9a0SAchim Leubner   SA_DBG1(("mpiOperatorManagementCmd, enter\n" ));
24744e1bc9a0SAchim Leubner 
24754e1bc9a0SAchim Leubner   /* Get request from free IORequests */
24764e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
24774e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
24784e1bc9a0SAchim Leubner 
24794e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
24804e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
24814e1bc9a0SAchim Leubner   {
24824e1bc9a0SAchim Leubner     SA_DBG1(("mpiOperatorManagementCmd, No request from free list\n" ));
24834e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2q");
24844e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
24854e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
24864e1bc9a0SAchim Leubner   }
24874e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
24884e1bc9a0SAchim Leubner   else
24894e1bc9a0SAchim Leubner   {
24904e1bc9a0SAchim Leubner     SA_DBG1(("mpiOperatorManagementCmd, Build OPC_INB_OPR_MGMT\n"));
24914e1bc9a0SAchim Leubner     /* Remove the request from free list */
24924e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
24934e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
24944e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
24954e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
24964e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
24974e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
24984e1bc9a0SAchim Leubner     operatorcode->tag = pRequest->HTag;
24994e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
25004e1bc9a0SAchim Leubner 
25014e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)operatorcode , MPI_CATEGORY_SAS_SATA, OPC_INB_OPR_MGMT, IOMB_SIZE128, 0);
25024e1bc9a0SAchim Leubner 
25034e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
25044e1bc9a0SAchim Leubner     {
25054e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
25064e1bc9a0SAchim Leubner       /* remove the request from IOMap */
25074e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
25084e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
25094e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
25104e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
25114e1bc9a0SAchim Leubner 
25124e1bc9a0SAchim Leubner       /* return the request to free pool */
25134e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
25144e1bc9a0SAchim Leubner 
25154e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
25164e1bc9a0SAchim Leubner 
25174e1bc9a0SAchim Leubner       SA_DBG1(("mpiOperatorManagementCmd, sending IOMB failed\n" ));
25184e1bc9a0SAchim Leubner     }
25194e1bc9a0SAchim Leubner     SA_DBG1(("mpiOperatorManagementCmd, return value = %d\n", ret));
25204e1bc9a0SAchim Leubner   }
25214e1bc9a0SAchim Leubner 
25224e1bc9a0SAchim Leubner   /* return value */
25234e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2q");
25244e1bc9a0SAchim Leubner 
25254e1bc9a0SAchim Leubner   return ret;
25264e1bc9a0SAchim Leubner }
25274e1bc9a0SAchim Leubner 
25284e1bc9a0SAchim Leubner /******************************************************************************/
25294e1bc9a0SAchim Leubner /*! \brief
25304e1bc9a0SAchim Leubner  *
25314e1bc9a0SAchim Leubner  *  This command sends encrypt self test command.
25324e1bc9a0SAchim Leubner  *
25334e1bc9a0SAchim Leubner  *  \param agRoot      Handles for this instance of SAS/SATA LLL
25344e1bc9a0SAchim Leubner  *  \param agContext   Context
25354e1bc9a0SAchim Leubner  *  \param queueNum    Queue Number of inbound/outbound queue
25364e1bc9a0SAchim Leubner  *
25374e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
25384e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
25394e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
25404e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
25414e1bc9a0SAchim Leubner  *
25424e1bc9a0SAchim Leubner  */
25434e1bc9a0SAchim Leubner /*******************************************************************************/
mpiEncryptBistCmd(agsaRoot_t * agRoot,bit32 queueNum,agsaContext_t * agContext,agsaEncryptBist_t * bist)25444e1bc9a0SAchim Leubner GLOBAL bit32 mpiEncryptBistCmd(
25454e1bc9a0SAchim Leubner   agsaRoot_t        *agRoot,
25464e1bc9a0SAchim Leubner   bit32              queueNum,
25474e1bc9a0SAchim Leubner   agsaContext_t     *agContext,
25484e1bc9a0SAchim Leubner   agsaEncryptBist_t *bist )
25494e1bc9a0SAchim Leubner {
25504e1bc9a0SAchim Leubner    bit32                    ret = AGSA_RC_SUCCESS;
25514e1bc9a0SAchim Leubner   agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
25524e1bc9a0SAchim Leubner   agsaIORequestDesc_t      *pRequest;
25534e1bc9a0SAchim Leubner 
25544e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"2z");
25554e1bc9a0SAchim Leubner 
25564e1bc9a0SAchim Leubner   SA_DBG1(("mpiEncryptBistCmd, enter\n" ));
25574e1bc9a0SAchim Leubner 
25584e1bc9a0SAchim Leubner   /* Get request from free IORequests */
25594e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
25604e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
25614e1bc9a0SAchim Leubner 
25624e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
25634e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
25644e1bc9a0SAchim Leubner   {
25654e1bc9a0SAchim Leubner     SA_DBG1(("mpiEncryptBistCmd, No request from free list\n" ));
25664e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2z");
25674e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
25684e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
25694e1bc9a0SAchim Leubner   }
25704e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
25714e1bc9a0SAchim Leubner   else
25724e1bc9a0SAchim Leubner   {
25734e1bc9a0SAchim Leubner     SA_DBG1(("mpiEncryptBistCmd, Build OPC_INB_ENC_TEST_EXECUTE\n"));
25744e1bc9a0SAchim Leubner     /* Remove the request from free list */
25754e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
25764e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
25774e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
25784e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
25794e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
25804e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
25814e1bc9a0SAchim Leubner     bist->tag = pRequest->HTag;
25824e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
25834e1bc9a0SAchim Leubner 
25844e1bc9a0SAchim Leubner     SA_DBG1(("mpiEncryptBistCmd: 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X\n",
25854e1bc9a0SAchim Leubner                                   bist->tag,
25864e1bc9a0SAchim Leubner                                   bist->r_subop,
25874e1bc9a0SAchim Leubner                                   bist->testDiscption[0],
25884e1bc9a0SAchim Leubner                                   bist->testDiscption[1],
25894e1bc9a0SAchim Leubner                                   bist->testDiscption[2],
25904e1bc9a0SAchim Leubner                                   bist->testDiscption[3],
25914e1bc9a0SAchim Leubner                                   bist->testDiscption[4] ));
25924e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)bist , MPI_CATEGORY_SAS_SATA, OPC_INB_ENC_TEST_EXECUTE, IOMB_SIZE64, 0);
25934e1bc9a0SAchim Leubner 
25944e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
25954e1bc9a0SAchim Leubner     {
25964e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
25974e1bc9a0SAchim Leubner       /* remove the request from IOMap */
25984e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
25994e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
26004e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
26014e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
26024e1bc9a0SAchim Leubner 
26034e1bc9a0SAchim Leubner       /* return the request to free pool */
26044e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
26054e1bc9a0SAchim Leubner 
26064e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
26074e1bc9a0SAchim Leubner 
26084e1bc9a0SAchim Leubner       SA_DBG1(("mpiEncryptBistCmd, sending IOMB failed\n" ));
26094e1bc9a0SAchim Leubner     }
26104e1bc9a0SAchim Leubner     SA_DBG1(("mpiEncryptBistCmd, return value = %d\n", ret));
26114e1bc9a0SAchim Leubner   }
26124e1bc9a0SAchim Leubner 
26134e1bc9a0SAchim Leubner   /* return value */
26144e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2z");
26154e1bc9a0SAchim Leubner 
26164e1bc9a0SAchim Leubner   return ret;
26174e1bc9a0SAchim Leubner }
26184e1bc9a0SAchim Leubner 
26194e1bc9a0SAchim Leubner /******************************************************************************/
26204e1bc9a0SAchim Leubner /*! \brief
26214e1bc9a0SAchim Leubner  *
26224e1bc9a0SAchim Leubner  *  This command sends set operator command.
26234e1bc9a0SAchim Leubner  *
26244e1bc9a0SAchim Leubner  *  \param agRoot      Handles for this instance of SAS/SATA LLL
26254e1bc9a0SAchim Leubner  *  \param agContext   Context
26264e1bc9a0SAchim Leubner  *  \param queueNum    Queue Number of inbound/outbound queue
26274e1bc9a0SAchim Leubner  *
26284e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
26294e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
26304e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
26314e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
26324e1bc9a0SAchim Leubner  *
26334e1bc9a0SAchim Leubner  */
26344e1bc9a0SAchim Leubner /*******************************************************************************/
26354e1bc9a0SAchim Leubner GLOBAL bit32
mpiSetOperatorCmd(agsaRoot_t * agRoot,bit32 queueNum,agsaContext_t * agContext,agsaSetOperatorCmd_t * operatorcode)26364e1bc9a0SAchim Leubner mpiSetOperatorCmd(
26374e1bc9a0SAchim Leubner   agsaRoot_t                *agRoot,
26384e1bc9a0SAchim Leubner   bit32                      queueNum,
26394e1bc9a0SAchim Leubner   agsaContext_t             *agContext,
26404e1bc9a0SAchim Leubner   agsaSetOperatorCmd_t      *operatorcode
26414e1bc9a0SAchim Leubner   )
26424e1bc9a0SAchim Leubner {
26434e1bc9a0SAchim Leubner    bit32                    ret = AGSA_RC_SUCCESS;
26444e1bc9a0SAchim Leubner   agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
26454e1bc9a0SAchim Leubner   agsaIORequestDesc_t      *pRequest;
26464e1bc9a0SAchim Leubner 
26474e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"39");
26484e1bc9a0SAchim Leubner 
26494e1bc9a0SAchim Leubner   SA_DBG1(("mpiSetOperatorCmd, enter\n" ));
26504e1bc9a0SAchim Leubner 
26514e1bc9a0SAchim Leubner   /* Get request from free IORequests */
26524e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
26534e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
26544e1bc9a0SAchim Leubner 
26554e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
26564e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
26574e1bc9a0SAchim Leubner   {
26584e1bc9a0SAchim Leubner     SA_DBG1(("mpiSetOperatorCmd, No request from free list\n" ));
26594e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "39");
26604e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
26614e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
26624e1bc9a0SAchim Leubner   }
26634e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
26644e1bc9a0SAchim Leubner   else
26654e1bc9a0SAchim Leubner   {
26664e1bc9a0SAchim Leubner     SA_DBG1(("mpiSetOperatorCmd, Build OPC_INB_SET_OPERATOR\n"));
26674e1bc9a0SAchim Leubner     /* Remove the request from free list */
26684e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
26694e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
26704e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
26714e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
26724e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
26734e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
26744e1bc9a0SAchim Leubner     operatorcode->tag = pRequest->HTag;
26754e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
26764e1bc9a0SAchim Leubner 
26774e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)operatorcode, MPI_CATEGORY_SAS_SATA, OPC_INB_SET_OPERATOR, IOMB_SIZE64, 0);
26784e1bc9a0SAchim Leubner 
26794e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
26804e1bc9a0SAchim Leubner     {
26814e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
26824e1bc9a0SAchim Leubner       /* remove the request from IOMap */
26834e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
26844e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
26854e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
26864e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
26874e1bc9a0SAchim Leubner 
26884e1bc9a0SAchim Leubner       /* return the request to free pool */
26894e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
26904e1bc9a0SAchim Leubner 
26914e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
26924e1bc9a0SAchim Leubner 
26934e1bc9a0SAchim Leubner       SA_DBG1(("mpiSetOperatorCmd, sending IOMB failed\n" ));
26944e1bc9a0SAchim Leubner     }
26954e1bc9a0SAchim Leubner     SA_DBG1(("mpiSetOperatorCmd, return value = %d\n", ret));
26964e1bc9a0SAchim Leubner   }
26974e1bc9a0SAchim Leubner 
26984e1bc9a0SAchim Leubner   /* return value */
26994e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "39");
27004e1bc9a0SAchim Leubner 
27014e1bc9a0SAchim Leubner   return ret;
27024e1bc9a0SAchim Leubner }
27034e1bc9a0SAchim Leubner 
27044e1bc9a0SAchim Leubner /******************************************************************************/
27054e1bc9a0SAchim Leubner /*! \brief
27064e1bc9a0SAchim Leubner  *
27074e1bc9a0SAchim Leubner  *  This command sends get operator command.
27084e1bc9a0SAchim Leubner  *
27094e1bc9a0SAchim Leubner  *  \param agRoot      Handles for this instance of SAS/SATA LLL
27104e1bc9a0SAchim Leubner  *  \param agContext   Context
27114e1bc9a0SAchim Leubner  *  \param queueNum    Queue Number of inbound/outbound queue
27124e1bc9a0SAchim Leubner  *
27134e1bc9a0SAchim Leubner  *  \return If the MPI command is sent to SPC successfully
27144e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS the MPI command is successfully
27154e1bc9a0SAchim Leubner  *          - \e AGSA_RC_BUSY the SPC is no resource, cannot send now
27164e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE the MPI command is failure
27174e1bc9a0SAchim Leubner  *
27184e1bc9a0SAchim Leubner  */
27194e1bc9a0SAchim Leubner /*******************************************************************************/
27204e1bc9a0SAchim Leubner GLOBAL bit32
mpiGetOperatorCmd(agsaRoot_t * agRoot,bit32 queueNum,agsaContext_t * agContext,agsaGetOperatorCmd_t * operatorcode)27214e1bc9a0SAchim Leubner mpiGetOperatorCmd(
27224e1bc9a0SAchim Leubner   agsaRoot_t                *agRoot,
27234e1bc9a0SAchim Leubner   bit32                      queueNum,
27244e1bc9a0SAchim Leubner   agsaContext_t             *agContext,
27254e1bc9a0SAchim Leubner   agsaGetOperatorCmd_t      *operatorcode
27264e1bc9a0SAchim Leubner   )
27274e1bc9a0SAchim Leubner {
27284e1bc9a0SAchim Leubner    bit32                    ret = AGSA_RC_SUCCESS;
27294e1bc9a0SAchim Leubner   agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
27304e1bc9a0SAchim Leubner   agsaIORequestDesc_t      *pRequest;
27314e1bc9a0SAchim Leubner 
27324e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"3e");
27334e1bc9a0SAchim Leubner 
27344e1bc9a0SAchim Leubner   SA_DBG1(("mpiGetOperatorCmd, enter\n" ));
27354e1bc9a0SAchim Leubner 
27364e1bc9a0SAchim Leubner   /* Get request from free IORequests */
27374e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
27384e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
27394e1bc9a0SAchim Leubner 
27404e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
27414e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
27424e1bc9a0SAchim Leubner   {
27434e1bc9a0SAchim Leubner     SA_DBG1(("mpiGetOperatorCmd, No request from free list\n" ));
27444e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3e");
27454e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
27464e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
27474e1bc9a0SAchim Leubner   }
27484e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
27494e1bc9a0SAchim Leubner   else
27504e1bc9a0SAchim Leubner   {
27514e1bc9a0SAchim Leubner     SA_DBG1(("mpiGetOperatorCmd, Build OPC_INB_GET_OPERATOR\n"));
27524e1bc9a0SAchim Leubner     /* Remove the request from free list */
27534e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
27544e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
27554e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
27564e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
27574e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
27584e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
27594e1bc9a0SAchim Leubner     operatorcode->tag = pRequest->HTag;
27604e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
27614e1bc9a0SAchim Leubner 
27624e1bc9a0SAchim Leubner     ret = mpiBuildCmd(agRoot, (bit32 *)operatorcode, MPI_CATEGORY_SAS_SATA, OPC_INB_GET_OPERATOR, IOMB_SIZE64, 0);
27634e1bc9a0SAchim Leubner 
27644e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
27654e1bc9a0SAchim Leubner     {
27664e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
27674e1bc9a0SAchim Leubner       /* remove the request from IOMap */
27684e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
27694e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
27704e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
27714e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
27724e1bc9a0SAchim Leubner 
27734e1bc9a0SAchim Leubner       /* return the request to free pool */
27744e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
27754e1bc9a0SAchim Leubner 
27764e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
27774e1bc9a0SAchim Leubner 
27784e1bc9a0SAchim Leubner       SA_DBG1(("mpiGetOperatorCmd, sending IOMB failed\n" ));
27794e1bc9a0SAchim Leubner     }
27804e1bc9a0SAchim Leubner     SA_DBG1(("mpiGetOperatorCmd, return value = %d\n", ret));
27814e1bc9a0SAchim Leubner   }
27824e1bc9a0SAchim Leubner 
27834e1bc9a0SAchim Leubner   /* return value */
27844e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3e");
27854e1bc9a0SAchim Leubner 
27864e1bc9a0SAchim Leubner   return ret;
27874e1bc9a0SAchim Leubner }
27884e1bc9a0SAchim Leubner 
mpiDIFEncryptionOffloadCmd(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 op,agsaDifEncPayload_t * agDifEncOffload,ossaDIFEncryptionOffloadStartCB_t agCB)27894e1bc9a0SAchim Leubner GLOBAL bit32 mpiDIFEncryptionOffloadCmd(
27904e1bc9a0SAchim Leubner    agsaRoot_t                      *agRoot,
27914e1bc9a0SAchim Leubner    agsaContext_t                   *agContext,
27924e1bc9a0SAchim Leubner    bit32                            queueNum,
27934e1bc9a0SAchim Leubner    bit32                            op,
27944e1bc9a0SAchim Leubner    agsaDifEncPayload_t             *agDifEncOffload,
27954e1bc9a0SAchim Leubner    ossaDIFEncryptionOffloadStartCB_t agCB
27964e1bc9a0SAchim Leubner    )
27974e1bc9a0SAchim Leubner {
27984e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_SUCCESS;
27994e1bc9a0SAchim Leubner   bit32 dw8=0;
28004e1bc9a0SAchim Leubner   bit32 dw9=0;
28014e1bc9a0SAchim Leubner   bit32 dw10=0;
28024e1bc9a0SAchim Leubner   bit32 dw14=0;
28034e1bc9a0SAchim Leubner   bit32 dw15=0;
28044e1bc9a0SAchim Leubner   agsaLLRoot_t             *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
28054e1bc9a0SAchim Leubner   agsaIORequestDesc_t      *pRequest;
28064e1bc9a0SAchim Leubner   agsaDifEncOffloadCmd_t   payload;
28074e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"2b");
28084e1bc9a0SAchim Leubner 
28094e1bc9a0SAchim Leubner   /* Get request from free IORequests */
28104e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
28114e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
28124e1bc9a0SAchim Leubner 
28134e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
28144e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
28154e1bc9a0SAchim Leubner   {
28164e1bc9a0SAchim Leubner     SA_DBG1(("mpiDIFEncryptionOffloadCmd: No request from free list\n" ));
28174e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2b");
28184e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
28194e1bc9a0SAchim Leubner     return AGSA_RC_BUSY;
28204e1bc9a0SAchim Leubner   }
28214e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
28224e1bc9a0SAchim Leubner   else
28234e1bc9a0SAchim Leubner   {
28244e1bc9a0SAchim Leubner     SA_DBG1(("mpiDIFEncryptionOffloadCmd: Build OPC_INB_DIF_ENC_OFFLOAD_CMD pRequest %p\n",pRequest));
28254e1bc9a0SAchim Leubner     /* Remove the request from free list */
28264e1bc9a0SAchim Leubner     SA_ASSERT((!pRequest->valid), "The pRequest is in use");
28274e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
28284e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
28294e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
28304e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agContext;
28314e1bc9a0SAchim Leubner     pRequest->valid = agTRUE;
28324e1bc9a0SAchim Leubner     pRequest->completionCB = (ossaSSPCompletedCB_t)agCB;
28334e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
28344e1bc9a0SAchim Leubner 
28354e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaDifEncOffloadCmd_t));
28364e1bc9a0SAchim Leubner     SA_DBG1(("mpiDIFEncryptionOffloadCmd: op %d\n",op));
28374e1bc9a0SAchim Leubner 
28384e1bc9a0SAchim Leubner     if(smIS_SPCV(agRoot))
28394e1bc9a0SAchim Leubner     {
28404e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, tag),            pRequest->HTag);
28414e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, option),         op);
28424e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, Src_Data_Len),   agDifEncOffload->SrcDL);
28434e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, Dst_Data_Len),   agDifEncOffload->DstDL);
28444e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, flags),          agDifEncOffload->dif.flags);
28454e1bc9a0SAchim Leubner 
28464e1bc9a0SAchim Leubner       dw8 = agDifEncOffload->dif.udrtArray[1] << SHIFT24 |
28474e1bc9a0SAchim Leubner             agDifEncOffload->dif.udrtArray[0] << SHIFT16 |
28484e1bc9a0SAchim Leubner             agDifEncOffload->dif.udtArray[1]  << SHIFT8  |
28494e1bc9a0SAchim Leubner             agDifEncOffload->dif.udtArray[0];
28504e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, UDTR01UDT01), dw8);
28514e1bc9a0SAchim Leubner 
28524e1bc9a0SAchim Leubner       dw9 = agDifEncOffload->dif.udtArray[5]  << SHIFT24 |
28534e1bc9a0SAchim Leubner             agDifEncOffload->dif.udtArray[4] << SHIFT16  |
28544e1bc9a0SAchim Leubner             agDifEncOffload->dif.udtArray[3] << SHIFT8   |
28554e1bc9a0SAchim Leubner             agDifEncOffload->dif.udtArray[2];
28564e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, UDT2345), dw9);
28574e1bc9a0SAchim Leubner       dw10 = agDifEncOffload->dif.udrtArray[5] << SHIFT24 |
28584e1bc9a0SAchim Leubner              agDifEncOffload->dif.udrtArray[4] << SHIFT16 |
28594e1bc9a0SAchim Leubner              agDifEncOffload->dif.udrtArray[3] << SHIFT8  |
28604e1bc9a0SAchim Leubner              agDifEncOffload->dif.udrtArray[2];
28614e1bc9a0SAchim Leubner 
28624e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, UDTR2345), dw10);
28634e1bc9a0SAchim Leubner 
28644e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, DPLR0SecCnt_IOSeed),
28654e1bc9a0SAchim Leubner                agDifEncOffload->dif.DIFPerLARegion0SecCount << SHIFT16 |
28664e1bc9a0SAchim Leubner                agDifEncOffload->dif.initialIOSeed);
28674e1bc9a0SAchim Leubner 
28684e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, DPL_Addr_Lo)        , agDifEncOffload->dif.DIFPerLAAddrLo);
28694e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, DPL_Addr_Hi)        , agDifEncOffload->dif.DIFPerLAAddrHi);
28704e1bc9a0SAchim Leubner 
28714e1bc9a0SAchim Leubner       dw14 =  agDifEncOffload->encrypt.dekInfo.dekIndex          << SHIFT8 |
28724e1bc9a0SAchim Leubner              (agDifEncOffload->encrypt.dekInfo.dekTable & 0x3)   << SHIFT2 |
28734e1bc9a0SAchim Leubner              (agDifEncOffload->encrypt.keyTagCheck & 0x1)        << SHIFT1;
28744e1bc9a0SAchim Leubner 
28754e1bc9a0SAchim Leubner       if (agDifEncOffload->encrypt.cipherMode == agsaEncryptCipherModeXTS)
28764e1bc9a0SAchim Leubner       {
28774e1bc9a0SAchim Leubner         dw14 |= AGSA_ENCRYPT_XTS_Mode << SHIFT4;
28784e1bc9a0SAchim Leubner       }
28794e1bc9a0SAchim Leubner       else
28804e1bc9a0SAchim Leubner       {
28814e1bc9a0SAchim Leubner         dw14 |= (agDifEncOffload->encrypt.cipherMode & 0xF) << SHIFT4;
28824e1bc9a0SAchim Leubner       }
28834e1bc9a0SAchim Leubner 
28844e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, KeyIndex_CMode_KTS_ENT_R), dw14);
28854e1bc9a0SAchim Leubner 
28864e1bc9a0SAchim Leubner       dw15 = agDifEncOffload->encrypt.EncryptionPerLRegion0SecCount << SHIFT16 |
28874e1bc9a0SAchim Leubner                            (agDifEncOffload->encrypt.kekIndex & 0xF) << SHIFT5 |
28884e1bc9a0SAchim Leubner                            (agDifEncOffload->encrypt.sectorSizeIndex & 0x1F);
28894e1bc9a0SAchim Leubner 
28904e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, EPLR0SecCnt_KS_ENSS), dw15);
28914e1bc9a0SAchim Leubner 
28924e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, keyTag_W0),   agDifEncOffload->encrypt.keyTag_W0);
28934e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, keyTag_W1),   agDifEncOffload->encrypt.keyTag_W1);
28944e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, tweakVal_W0), agDifEncOffload->encrypt.tweakVal_W0);
28954e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, tweakVal_W1), agDifEncOffload->encrypt.tweakVal_W1);
28964e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, tweakVal_W2), agDifEncOffload->encrypt.tweakVal_W2);
28974e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, tweakVal_W3), agDifEncOffload->encrypt.tweakVal_W3);
28984e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, EPL_Addr_Lo), agDifEncOffload->encrypt.EncryptionPerLAAddrLo);
28994e1bc9a0SAchim Leubner       OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaDifEncOffloadCmd_t, EPL_Addr_Hi), agDifEncOffload->encrypt.EncryptionPerLAAddrHi);
29004e1bc9a0SAchim Leubner 
29014e1bc9a0SAchim Leubner       si_memcpy((bit32 *) &(payload.SrcSgl), (bit32 *) &(agDifEncOffload->SrcSgl), sizeof(agsaSgl_t));
29024e1bc9a0SAchim Leubner       si_memcpy((bit32 *) &(payload.DstSgl), (bit32 *) &(agDifEncOffload->DstSgl), sizeof(agsaSgl_t));
29034e1bc9a0SAchim Leubner 
29044e1bc9a0SAchim Leubner       ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_DIF_ENC_OFFLOAD_CMD, IOMB_SIZE128, queueNum);
29054e1bc9a0SAchim Leubner 
29064e1bc9a0SAchim Leubner     }
29074e1bc9a0SAchim Leubner     else
29084e1bc9a0SAchim Leubner     {
29094e1bc9a0SAchim Leubner       /* SPC does not support this command */
29104e1bc9a0SAchim Leubner       ret = AGSA_RC_FAILURE;
29114e1bc9a0SAchim Leubner     }
29124e1bc9a0SAchim Leubner 
29134e1bc9a0SAchim Leubner     if (AGSA_RC_SUCCESS != ret)
29144e1bc9a0SAchim Leubner     {
29154e1bc9a0SAchim Leubner       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
29164e1bc9a0SAchim Leubner       /* remove the request from IOMap */
29174e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
29184e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
29194e1bc9a0SAchim Leubner       saRoot->IOMap[pRequest->HTag].agContext = agNULL;
29204e1bc9a0SAchim Leubner       pRequest->valid = agFALSE;
29214e1bc9a0SAchim Leubner 
29224e1bc9a0SAchim Leubner       /* return the request to free pool */
29234e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
29244e1bc9a0SAchim Leubner 
29254e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
29264e1bc9a0SAchim Leubner 
29274e1bc9a0SAchim Leubner       SA_DBG1(("mpiDIFEncryptionOffloadCmd: sending IOMB failed\n" ));
29284e1bc9a0SAchim Leubner     }
29294e1bc9a0SAchim Leubner     SA_DBG3(("mpiDIFEncryptionOffloadCmd: return value = %d\n", ret));
29304e1bc9a0SAchim Leubner   }
29314e1bc9a0SAchim Leubner 
29324e1bc9a0SAchim Leubner   /* return value */
29334e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2b");
29344e1bc9a0SAchim Leubner 
29354e1bc9a0SAchim Leubner   return ret;
29364e1bc9a0SAchim Leubner }
29374e1bc9a0SAchim Leubner 
2938