Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

/*******************************************************************************
*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
*
*Redistribution and use in source and binary forms, with or without modification, are permitted provided 
*that the following conditions are met: 
*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
*following disclaimer. 
*2. Redistributions in binary form must reproduce the above copyright notice, 
*this list of conditions and the following disclaimer in the documentation and/or other materials provided
*with the distribution. 
*
*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 
*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE

********************************************************************************/
/*******************************************************************************/
/*! \file saframe.c
 *  \brief The file implements the functions to read frame content
 */


/******************************************************************************/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <dev/pms/config.h>

#include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
#ifdef SA_ENABLE_TRACE_FUNCTIONS
#ifdef siTraceFileID
#undef siTraceFileID
#endif
#define siTraceFileID 'D'
#endif

/******************************************************************************/
/*! \brief Read 32 bits from a frame
 *
 *  Read 32 bits from a frame
 *
 *  \param agRoot       Handles for this instance of SAS/SATA LLL
 *  \param agFrame      The frame handler
 *  \param frameOffset  Offset in bytes from the beginning of valid frame bytes or IU
                        to the 32-bit value to read
 *
 *  \return The read value
 *
 */
/*******************************************************************************/
GLOBAL bit32 saFrameReadBit32(
  agsaRoot_t          *agRoot,
  agsaFrameHandle_t   agFrame,
  bit32               frameOffset
  )
{
  bit8                    *payloadAddr;
  bit32                   value = 0;

  smTraceFuncEnter(hpDBG_VERY_LOUD, "zr");

  if ( agNULL != agFrame )
  {
    /* Find the address of the payload */
    payloadAddr = (bit8 *)(agFrame) + frameOffset;

    /* read one DW Data */
    value = *(bit32 *)payloadAddr;
  }


  /* (5) return value */
  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "zr");
  return value;
}

/******************************************************************************/
/*! \brief Read a block from a frame
 *
 *  Read a block from a frame
 *
 *  \param agRoot         Handles for this instance of SAS/SATA LLL
 *  \param agFrame        The frame handler
 *  \param frameOffset    The offset of the frame to start read
 *  \param frameBuffer    The pointer to the destination of data read from the frame
 *  \param frameBufLen    Number of bytes to read from the frame
 *
 *  \return -void-
 *
 */
/*******************************************************************************/
GLOBAL void saFrameReadBlock (
  agsaRoot_t          *agRoot,
  agsaFrameHandle_t   agFrame,
  bit32               frameOffset,
  void                *frameBuffer,
  bit32               frameBufLen
  )
{
  bit8                    *payloadAddr;
  bit32                   i;

  smTraceFuncEnter(hpDBG_VERY_LOUD, "zi");

  /* Sanity check */
  SA_ASSERT(frameBufLen < 4096, "saFrameReadBlock read more than 4k");

  if ( agNULL != agFrame )
  {
    /* Find the address of the payload */
    payloadAddr = (bit8 *)(agFrame) + frameOffset;
    /* Copy the frame data to the destination frame buffer */
    for ( i = 0; i < frameBufLen; i ++ )
    {
      *(bit8 *)((bit8 *)frameBuffer + i) = *(bit8 *)(payloadAddr + i);
    }
  }

  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "zi");
}