/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates
This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
Marvell GPL License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    *   Redistributions of source code must retain the above copyright notice,
	this list of conditions and the following disclaimer.

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

    *   Neither the name of Marvell nor the names of its contributors may be
	used to endorse or promote products derived from this software without
	specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.

*******************************************************************************/

/*******************************************************************************
* mvEth.h - Header File for : Marvell Gigabit Ethernet Controller
*
* DESCRIPTION:
*	This header file contains macros typedefs and function declaration specific to
*	the Marvell Gigabit Ethernet Controller.
*
* DEPENDENCIES:
*	None.
*
*******************************************************************************/

#ifndef __mvEthGbe_h__
#define __mvEthGbe_h__

#ifdef __cplusplus
extern "C" {
#endif

#include "eth/mvEth.h"

extern MV_BOOL ethDescInSram;
extern MV_BOOL ethDescSwCoher;
extern ETH_PORT_CTRL *ethPortCtrl[];

static INLINE MV_ULONG ethDescVirtToPhy(ETH_QUEUE_CTRL *pQueueCtrl, MV_U8 *pDesc)
{
#if defined(ETH_DESCR_IN_SRAM)
if (ethDescInSram)
	return mvSramVirtToPhy(pDesc);
else
#endif				/* ETH_DESCR_IN_SRAM */
return (pQueueCtrl->descBuf.bufPhysAddr+(pDesc-pQueueCtrl->descBuf.bufVirtPtr));
}

/* Return port handler */
#define mvEthPortHndlGet(port)  ethPortCtrl[port]

/* Used as WA for HW/SW race on TX */

static INLINE int mvEthPortTxEnable(void *pPortHndl, int queue, int max_deep)
{
int deep = 0;
MV_U32 txCurrReg, txEnReg;
ETH_TX_DESC *pTxLastDesc;
ETH_QUEUE_CTRL *pQueueCtrl;
ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pPortHndl;

txEnReg = MV_REG_VALUE(ETH_TX_QUEUE_COMMAND_REG(pPortCtrl->portNo));
if ((txEnReg & MV_32BIT_LE_FAST(ETH_TXQ_ENABLE_MASK)) == 0) {
	MV_REG_VALUE(ETH_TX_QUEUE_COMMAND_REG(pPortCtrl->portNo)) = pPortCtrl->portTxQueueCmdReg;
	return 0;
}
pQueueCtrl = &pPortCtrl->txQueue[queue];
pTxLastDesc = pQueueCtrl->pCurrentDescr;
txCurrReg = MV_REG_READ(ETH_TX_CUR_DESC_PTR_REG(pPortCtrl->portNo, queue));
if (ethDescVirtToPhy(pQueueCtrl, (MV_U8 *) pTxLastDesc) == txCurrReg) {
		/* All descriptors are processed, no chance for race */
		return 0;
}

/* Check distance betwee HW and SW location: */
/* If distance between HW and SW pointers is less than max_deep descriptors */
/* Race condition is possible, so wait end of TX and restart TXQ */
while (deep < max_deep) {
	pTxLastDesc = TX_PREV_DESC_PTR(pTxLastDesc, pQueueCtrl);
	if (ethDescVirtToPhy(pQueueCtrl, (MV_U8 *) pTxLastDesc) == txCurrReg) {
		int count = 0;
		while ((txEnReg & MV_32BIT_LE_FAST(ETH_TXQ_ENABLE_MASK)) != 0) {
		count++;
		if (count > 10000) {
			mvOsPrintf("mvEthPortTxEnable: timeout - TXQ_CMD=0x%08x\n",
			MV_REG_READ(ETH_TX_QUEUE_COMMAND_REG(pPortCtrl->portNo)));
			break;
		}
					txEnReg = MV_REG_VALUE(ETH_TX_QUEUE_COMMAND_REG(pPortCtrl->portNo));
		}

		MV_REG_VALUE(ETH_TX_QUEUE_COMMAND_REG(pPortCtrl->portNo)) =
		pPortCtrl->portTxQueueCmdReg;
		return count;
		}
		deep++;
		}
		/* Distance between HW and SW pointers is more than max_deep descriptors, */
		/* So NO race condition - do nothing */
		return -1;
	}

/* defines  */
#define ETH_CSUM_MIN_BYTE_COUNT     72

/* Tailgate and Kirwood have only 2K TX FIFO */
#if (MV_ETH_VERSION == 2) || (MV_ETH_VERSION == 4)
#define ETH_CSUM_MAX_BYTE_COUNT     1600
#else
#define ETH_CSUM_MAX_BYTE_COUNT     (9*1024)
#endif /* MV_ETH_VERSION */

#define ETH_MV_HEADER_SIZE	    2
#define ETH_MV_TX_EN

/* An offest in Tx descriptors to store data for buffers less than 8 Bytes */
#define MIN_TX_BUFF_LOAD            8
#define TX_BUF_OFFSET_IN_DESC       (ETH_TX_DESC_ALIGNED_SIZE - MIN_TX_BUFF_LOAD)

/* Default port configuration value */
#define PORT_CONFIG_VALUE                       \
	(ETH_DEF_RX_QUEUE_MASK(0)       |   \
	ETH_DEF_RX_ARP_QUEUE_MASK(0)   |   \
	ETH_DEF_RX_TCP_QUEUE_MASK(0)   |   \
	ETH_DEF_RX_UDP_QUEUE_MASK(0)   |   \
	ETH_DEF_RX_BPDU_QUEUE_MASK(0)  |   \
	ETH_RX_CHECKSUM_WITH_PSEUDO_HDR)

/* Default port extend configuration value */
#define PORT_CONFIG_EXTEND_VALUE            0

#define PORT_SERIAL_CONTROL_VALUE                           \
	(ETH_DISABLE_FC_AUTO_NEG_MASK                |   \
	BIT9                                        |   \
	ETH_DO_NOT_FORCE_LINK_FAIL_MASK             |   \
	ETH_MAX_RX_PACKET_1552BYTE                  |   \
	ETH_SET_FULL_DUPLEX_MASK)

#define PORT_SERIAL_CONTROL_100MB_FORCE_VALUE               \
	(ETH_FORCE_LINK_PASS_MASK                    |   \
	ETH_DISABLE_DUPLEX_AUTO_NEG_MASK            |   \
	ETH_DISABLE_FC_AUTO_NEG_MASK                |   \
	BIT9                                        |   \
	ETH_DO_NOT_FORCE_LINK_FAIL_MASK             |   \
	ETH_DISABLE_SPEED_AUTO_NEG_MASK             |   \
	ETH_SET_FULL_DUPLEX_MASK                    |   \
	ETH_SET_MII_SPEED_100_MASK                  |   \
	ETH_MAX_RX_PACKET_1552BYTE)

#define PORT_SERIAL_CONTROL_1000MB_FORCE_VALUE              \
	(ETH_FORCE_LINK_PASS_MASK                    |   \
	ETH_DISABLE_DUPLEX_AUTO_NEG_MASK            |   \
	ETH_DISABLE_FC_AUTO_NEG_MASK                |   \
	BIT9                                        |   \
	ETH_DO_NOT_FORCE_LINK_FAIL_MASK             |   \
	ETH_DISABLE_SPEED_AUTO_NEG_MASK             |   \
	ETH_SET_FULL_DUPLEX_MASK                    |   \
	ETH_SET_GMII_SPEED_1000_MASK                |   \
	ETH_MAX_RX_PACKET_1552BYTE)

#define PORT_SERIAL_CONTROL_SGMII_IBAN_VALUE                \
	(ETH_DISABLE_FC_AUTO_NEG_MASK                |   \
	BIT9                                        |   \
	ETH_IN_BAND_AN_EN_MASK                      |   \
	ETH_DO_NOT_FORCE_LINK_FAIL_MASK             |   \
	ETH_MAX_RX_PACKET_1552BYTE)

/* Function headers: */
MV_VOID mvEthSetSpecialMcastTable(int portNo, int queue);
MV_STATUS mvEthArpRxQueue(void *pPortHandle, int arpQueue);
MV_STATUS mvEthUdpRxQueue(void *pPortHandle, int udpQueue);
MV_STATUS mvEthTcpRxQueue(void *pPortHandle, int tcpQueue);
MV_STATUS mvEthMacAddrGet(int portNo, unsigned char *pAddr);
MV_VOID mvEthSetOtherMcastTable(int portNo, int queue);
MV_STATUS mvEthHeaderModeSet(void *pPortHandle, MV_ETH_HEADER_MODE headerMode);
/* Interrupt Coalesting functions */
MV_U32 mvEthRxCoalSet(void *pPortHndl, MV_U32 uSec);
MV_U32 mvEthTxCoalSet(void *pPortHndl, MV_U32 uSec);
MV_STATUS mvEthCoalGet(void *pPortHndl, MV_U32 * pRxCoal, MV_U32 * pTxCoal);

/******************************************************************************/
/*                          Data Flow functions                               */
/******************************************************************************/
static INLINE void mvEthPortTxRestart(void *pPortHndl)
{
ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *)pPortHndl;

MV_REG_VALUE(ETH_TX_QUEUE_COMMAND_REG(pPortCtrl->portNo)) = pPortCtrl->portTxQueueCmdReg;
}

/* Get number of Free resources in specific TX queue */
static INLINE int mvEthTxResourceGet(void *pPortHndl, int txQueue)
{
	ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pPortHndl;

	return (pPortCtrl->txQueue[txQueue].resource);
}

/* Get number of Free resources in specific RX queue */
static INLINE int mvEthRxResourceGet(void *pPortHndl, int rxQueue)
{
	ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pPortHndl;
	return (pPortCtrl->rxQueue[rxQueue].resource);
}

static INLINE int mvEthTxQueueIsFull(void *pPortHndl, int txQueue)
{
	ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pPortHndl;

	if (pPortCtrl->txQueue[txQueue].resource == 0)
		return MV_TRUE;

	return MV_FALSE;
}

/* Get number of Free resources in specific RX queue */
static INLINE int mvEthRxQueueIsFull(void *pPortHndl, int rxQueue)
{
	ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pPortHndl;
	ETH_QUEUE_CTRL *pQueueCtrl = &pPortCtrl->rxQueue[rxQueue];

	if ((pQueueCtrl->pUsedDescr == pQueueCtrl->pCurrentDescr) && (pQueueCtrl->resource != 0))
		return MV_TRUE;
	return MV_FALSE;
}

static INLINE int mvEthTxQueueIsEmpty(void *pPortHndl, int txQueue)
{
ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pPortHndl;
ETH_QUEUE_CTRL *pQueueCtrl = &pPortCtrl->txQueue[txQueue];
if ((pQueueCtrl->pUsedDescr == pQueueCtrl->pCurrentDescr) && (pQueueCtrl->resource != 0))
	return MV_TRUE;
return MV_FALSE;
}

/* Get number of Free resources in specific RX queue */
static INLINE int mvEthRxQueueIsEmpty(void *pPortHndl, int rxQueue)
{
	ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pPortHndl;

	if (pPortCtrl->rxQueue[rxQueue].resource == 0)
		return MV_TRUE;

	return MV_FALSE;
}

/*******************************************************************************
* mvEthPortTx - Send an Ethernet packet
*
* DESCRIPTION:
*	This routine send a given packet described by pPktInfo parameter.
*	Single buffer only.
*
* INPUT:
*       void*       pEthPortHndl  - Ethernet Port handler.
*       int         txQueue       - Number of Tx queue.
*       MV_PKT_INFO *pPktInfo     - User packet to send.
*
* RETURN:
*       MV_NO_RESOURCE  - No enough resources to send this packet.
*       MV_ERROR        - Unexpected Fatal error.
*       MV_OK           - Packet send successfully.
*
*******************************************************************************/
static INLINE MV_STATUS mvEthPortTx(void *pEthPortHndl, int txQueue, MV_PKT_INFO * pPktInfo)
{
		ETH_TX_DESC *pTxCurrDesc;
		ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pEthPortHndl;
		ETH_QUEUE_CTRL *pQueueCtrl;
		int portNo;
		MV_BUF_INFO *pBufInfo = pPktInfo->pFrags;

#ifdef ETH_DEBUG
		if (pPortCtrl->portState != MV_ACTIVE)
			return MV_BAD_STATE;
#endif /* ETH_DEBUG */

		portNo = pPortCtrl->portNo;
		pQueueCtrl = &pPortCtrl->txQueue[txQueue];

		/* Get the Tx Desc ring indexes */
		pTxCurrDesc = pQueueCtrl->pCurrentDescr;

		/* Check if there is enough resources to send the packet */
		if (pQueueCtrl->resource == 0)
			return MV_NO_RESOURCE;

#ifdef MV_LEGACY_ETH_WA
	while (MV_REG_READ(ETH_TX_QUEUE_COMMAND_REG(portNo)) & (1 << txQueue))
		continue;
	MV_REG_WRITE(ETH_TX_CUR_DESC_PTR_REG(portNo, txQueue),
			(MV_U32) ethDescVirtToPhy(pQueueCtrl, (MV_U8 *)pTxCurrDesc));
#endif

	ETH_SET_16B_DESCR_VAL(pTxCurrDesc->byteCnt, pBufInfo->dataSize);

		/* Flash Buffer */
		if (pPktInfo->pktSize != 0) {
#ifdef MV_NETBSD
		ETH_SET_32B_DESCR_VAL(pTxCurrDesc->bufPtr, pBufInfo->bufPhysAddr);
		ETH_PACKET_CACHE_FLUSH(pBufInfo->bufVirtPtr, pPktInfo->pktSize);
#else /* MV_NETBSD */
		ETH_SET_32B_DESCR_VAL(pTxCurrDesc->bufPtr,
				      ETH_PACKET_CACHE_FLUSH(pBufInfo->bufVirtPtr, pPktInfo->pktSize));
#endif /* MV_NETBSD */
		pPktInfo->pktSize = 0;
	} else
		ETH_SET_32B_DESCR_VAL(pTxCurrDesc->bufPtr, pBufInfo->bufPhysAddr);

	ETH_SET_32B_DESCR_VAL(pTxCurrDesc->returnInfo, (MV_ULONG) pPktInfo);

	/* There is only one buffer in the packet */
	/* The OSG might set some bits for checksum offload, so add them to first descriptor */
	ETH_SET_32B_DESCR_VAL(pTxCurrDesc->cmdSts,
			      pPktInfo->status |
			      ETH_BUFFER_OWNED_BY_DMA |
			      ETH_TX_GENERATE_CRC_MASK |
			      ETH_TX_ENABLE_INTERRUPT_MASK |
			      ETH_TX_ZERO_PADDING_MASK | ETH_TX_FIRST_DESC_MASK | ETH_TX_LAST_DESC_MASK);

		ETH_DESCR_FLUSH_INV(pPortCtrl, pTxCurrDesc);

		pQueueCtrl->resource--;
		pQueueCtrl->pCurrentDescr = TX_NEXT_DESC_PTR(pTxCurrDesc, pQueueCtrl);

		/* Apply send command */
		MV_REG_VALUE(ETH_TX_QUEUE_COMMAND_REG(portNo)) = pPortCtrl->portTxQueueCmdReg;

		return MV_OK;
	}

/*******************************************************************************
* mvEthPortSgTx - Send an Ethernet packet
*
* DESCRIPTION:
*       This routine send a given packet described by pBufInfo parameter. It
*       supports transmitting of a packet spaned over multiple buffers.
*
* INPUT:
*       void*       pEthPortHndl  - Ethernet Port handler.
*       int         txQueue       - Number of Tx queue.
*       MV_PKT_INFO *pPktInfo     - User packet to send.
*
* RETURN:
*       MV_NO_RESOURCE  - No enough resources to send this packet.
*       MV_ERROR        - Unexpected Fatal error.
*       MV_OK           - Packet send successfully.
*
*******************************************************************************/
static INLINE MV_STATUS mvEthPortSgTx(void *pEthPortHndl, int txQueue, MV_PKT_INFO * pPktInfo)
{
	ETH_TX_DESC *pTxFirstDesc;
	ETH_TX_DESC *pTxCurrDesc;
	ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pEthPortHndl;
	ETH_QUEUE_CTRL *pQueueCtrl;
	int portNo, bufCount;
	MV_BUF_INFO *pBufInfo = pPktInfo->pFrags;
	MV_U8 *pTxBuf;

#ifdef ETH_DEBUG
	if (pPortCtrl->portState != MV_ACTIVE)
		return MV_BAD_STATE;
#endif /* ETH_DEBUG */

	portNo = pPortCtrl->portNo;
	pQueueCtrl = &pPortCtrl->txQueue[txQueue];

	/* Get the Tx Desc ring indexes */
	pTxCurrDesc = pQueueCtrl->pCurrentDescr;

	/* Check if there is enough resources to send the packet */
	if (pQueueCtrl->resource < pPktInfo->numFrags)
		return MV_NO_RESOURCE;

	/* Remember first desc */
	pTxFirstDesc = pTxCurrDesc;

	bufCount = 0;
	while (MV_TRUE) {
		if (pBufInfo[bufCount].dataSize <= MIN_TX_BUFF_LOAD) {
				/* Buffers with a payload smaller than MIN_TX_BUFF_LOAD (8 bytes) must be aligned    */
				/* to 64-bit boundary. Two options here:                                             */
				/* 1) Usually, copy the payload to the reserved 8 bytes inside descriptor.           */
				/* 2) In the Half duplex workaround, the reserved 8 bytes inside descriptor are used */
				/*    as a pointer to the aligned buffer, copy the small payload to this buffer.     */
				pTxBuf = ((MV_U8 *) pTxCurrDesc) + TX_BUF_OFFSET_IN_DESC;
				mvOsBCopy(pBufInfo[bufCount].bufVirtPtr, pTxBuf, pBufInfo[bufCount].dataSize);
			ETH_SET_32B_DESCR_VAL(pTxCurrDesc->bufPtr, ethDescVirtToPhy(pQueueCtrl, pTxBuf));
			} else {
				/* Flash Buffer */
#ifdef MV_NETBSD
			ETH_SET_32B_DESCR_VAL(pTxCurrDesc->bufPtr, pBufInfo[bufCount].bufPhysAddr);
			ETH_PACKET_CACHE_FLUSH(pBufInfo[bufCount].bufVirtPtr, pBufInfo[bufCount].dataSize);
#else
			ETH_SET_32B_DESCR_VAL(pTxCurrDesc->bufPtr,
					      ETH_PACKET_CACHE_FLUSH(pBufInfo[bufCount].bufVirtPtr,
								     pBufInfo[bufCount].dataSize));
#endif
		}

		ETH_SET_16B_DESCR_VAL(pTxCurrDesc->byteCnt, pBufInfo[bufCount].dataSize);
		bufCount++;

		if (bufCount >= pPktInfo->numFrags)
			break;

		if (bufCount > 1) {
			/* There is middle buffer of the packet Not First and Not Last */
			ETH_SET_32B_DESCR_VAL(pTxCurrDesc->cmdSts, ETH_BUFFER_OWNED_BY_DMA);
			ETH_DESCR_FLUSH_INV(pPortCtrl, pTxCurrDesc);
		}
			/* Go to next descriptor and next buffer */
			pTxCurrDesc = TX_NEXT_DESC_PTR(pTxCurrDesc, pQueueCtrl);
	}		/* while not last */

	/* Set last desc with DMA ownership and interrupt enable. */
	ETH_SET_32B_DESCR_VAL(pTxCurrDesc->returnInfo, (MV_ULONG) pPktInfo);
	if (bufCount == 1) {
		/* There is only one buffer in the packet */
		/* The OSG might set some bits for checksum offload, so add them to first descriptor */
		ETH_SET_32B_DESCR_VAL(pTxCurrDesc->cmdSts,
				      pPktInfo->status |
				      ETH_BUFFER_OWNED_BY_DMA |
				      ETH_TX_GENERATE_CRC_MASK |
				      ETH_TX_ENABLE_INTERRUPT_MASK |
				      ETH_TX_ZERO_PADDING_MASK | ETH_TX_FIRST_DESC_MASK |
				      ETH_TX_LAST_DESC_MASK);
	} else {
		/* Last but not First */
		ETH_SET_32B_DESCR_VAL(pTxCurrDesc->cmdSts,
				      ETH_BUFFER_OWNED_BY_DMA |
				      ETH_TX_ENABLE_INTERRUPT_MASK | ETH_TX_ZERO_PADDING_MASK |
				      ETH_TX_LAST_DESC_MASK);

		/* Update First when more than one buffer in the packet */
		/* The OSG might set some bits for checksum offload, so add them to first descriptor */
		ETH_SET_32B_DESCR_VAL(pTxFirstDesc->cmdSts,
				      pPktInfo->status |
				      ETH_BUFFER_OWNED_BY_DMA | ETH_TX_GENERATE_CRC_MASK |
				      ETH_TX_FIRST_DESC_MASK);

		ETH_DESCR_FLUSH_INV(pPortCtrl, pTxFirstDesc);
	}

	ETH_DESCR_FLUSH_INV(pPortCtrl, pTxCurrDesc);

	/* Update txQueue state */
	pQueueCtrl->resource -= bufCount;
	pQueueCtrl->pCurrentDescr = TX_NEXT_DESC_PTR(pTxCurrDesc, pQueueCtrl);

	/* Apply send command */
	MV_REG_VALUE(ETH_TX_QUEUE_COMMAND_REG(portNo)) = pPortCtrl->portTxQueueCmdReg;

	return MV_OK;
}

/*******************************************************************************
* mvEthPortTxDone - Free all used Tx descriptors and mBlks.
*
* DESCRIPTION:
*       This routine returns the transmitted packet information to the caller.
*
* INPUT:
*       void*       pEthPortHndl    - Ethernet Port handler.
*       int         txQueue         - Number of Tx queue.
*
* OUTPUT:
*       MV_PKT_INFO *pPktInfo       - Pointer to packet was sent.
*
* RETURN:
*       MV_NOT_FOUND    - No transmitted packets to return. Transmit in progress.
*       MV_EMPTY        - No transmitted packets to return. TX Queue is empty.
*       MV_ERROR        - Unexpected Fatal error.
*       MV_OK           - There is transmitted packet in the queue,
*                       'pPktInfo' filled with relevant information.
*
*******************************************************************************/
static INLINE MV_PKT_INFO *mvEthPortTxDone(void *pEthPortHndl, int txQueue)
{
	ETH_TX_DESC *pTxCurrDesc;
	ETH_TX_DESC *pTxUsedDesc;
	ETH_QUEUE_CTRL *pQueueCtrl;
	ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pEthPortHndl;
	MV_PKT_INFO *pPktInfo;
	MV_U32 commandStatus;

	pQueueCtrl = &pPortCtrl->txQueue[txQueue];

	pTxUsedDesc = pQueueCtrl->pUsedDescr;
	pTxCurrDesc = pQueueCtrl->pCurrentDescr;

	while (MV_TRUE) {
		/* No more used descriptors */
		commandStatus = ETH_GET_32B_DESCR_VAL(pTxUsedDesc->cmdSts);
		if (commandStatus & (ETH_BUFFER_OWNED_BY_DMA)) {
			ETH_DESCR_INV(pPortCtrl, pTxUsedDesc);
			return NULL;
		}
		if ((pTxUsedDesc == pTxCurrDesc) && (pQueueCtrl->resource != 0))
			return NULL;

		pQueueCtrl->resource++;
		pQueueCtrl->pUsedDescr = TX_NEXT_DESC_PTR(pTxUsedDesc, pQueueCtrl);
		if (commandStatus & (ETH_TX_LAST_DESC_MASK)) {
			pPktInfo = (MV_PKT_INFO *) ETH_GET_32B_DESCR_VAL(pTxUsedDesc->returnInfo);
			pPktInfo->status = commandStatus;
			return pPktInfo;
		}
		pTxUsedDesc = pQueueCtrl->pUsedDescr;
	}
}

/*******************************************************************************
* mvEthPortRx - Get new received packets from Rx queue.
*
* DESCRIPTION:
*       This routine returns the received data to the caller. There is no
*       data copying during routine operation. All information is returned
*       using pointer to packet information struct passed from the caller.
*
* INPUT:
*       void*       pEthPortHndl    - Ethernet Port handler.
*       int         rxQueue         - Number of Rx queue.
*
* OUTPUT:
*       MV_PKT_INFO *pPktInfo       - Pointer to received packet.
*
* RETURN:
*       MV_NO_RESOURCE  - No free resources in RX queue.
*       MV_ERROR        - Unexpected Fatal error.
*       MV_OK           - New packet received and 'pBufInfo' structure filled
*                       with relevant information.
*
*******************************************************************************/
static INLINE MV_PKT_INFO *mvEthPortRx(void *pEthPortHndl, int rxQueue)
{
	ETH_RX_DESC *pRxCurrDesc;
	MV_U32 commandStatus;
	ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pEthPortHndl;
	ETH_QUEUE_CTRL *pQueueCtrl;
	MV_PKT_INFO *pPktInfo;

	pQueueCtrl = &(pPortCtrl->rxQueue[rxQueue]);

	/* Check resources */
	if (pQueueCtrl->resource == 0) {
		mvOsPrintf("ethPortRx: no more resources\n");
		return NULL;
	}
	while (MV_TRUE) {
		/* Get the Rx Desc ring 'curr and 'used' indexes */
		pRxCurrDesc = pQueueCtrl->pCurrentDescr;

		commandStatus = ETH_GET_32B_DESCR_VAL(pRxCurrDesc->cmdSts);
		if (commandStatus & (ETH_BUFFER_OWNED_BY_DMA)) {
			/* Nothing to receive... */
			ETH_DESCR_INV(pPortCtrl, pRxCurrDesc);
			return NULL;
		}

		/* Valid RX only if FIRST and LAST bits are set */
		if ((commandStatus & (ETH_RX_LAST_DESC_MASK | ETH_RX_FIRST_DESC_MASK)) ==
		    (ETH_RX_LAST_DESC_MASK | ETH_RX_FIRST_DESC_MASK)) {
			pPktInfo = (MV_PKT_INFO *) ETH_GET_32B_DESCR_VAL(pRxCurrDesc->returnInfo);
			pPktInfo->pFrags->dataSize = ETH_GET_16B_DESCR_VAL(pRxCurrDesc->byteCnt) - 4;
			pPktInfo->status = commandStatus;
			pPktInfo->fragIP =
			    ETH_GET_16B_DESCR_VAL(pRxCurrDesc->bufSize) & ETH_RX_IP_FRAGMENTED_FRAME_MASK;

			pQueueCtrl->resource--;
			/* Update 'curr' in data structure */
				pQueueCtrl->pCurrentDescr = RX_NEXT_DESC_PTR(pRxCurrDesc, pQueueCtrl);

#ifdef INCLUDE_SYNC_BARR
			mvCpuIfSyncBarr(DRAM_TARGET);
#endif
			return pPktInfo;
		} else {
			ETH_RX_DESC *pRxUsedDesc = pQueueCtrl->pUsedDescr;

#ifdef ETH_DEBUG
			mvOsPrintf("ethDrv: Unexpected Jumbo frame: "
				   "status=0x%08x, byteCnt=%d, pData=0x%x\n",
				   commandStatus, ETH_GET_16B_DESCR_VAL(pRxCurrDesc->byteCnt),
				   ETH_GET_32B_DESCR_VAL(pRxCurrDesc->bufPtr));
#endif /* ETH_DEBUG */

			/* move buffer from pCurrentDescr position to pUsedDescr position */
			pRxUsedDesc->bufPtr = pRxCurrDesc->bufPtr;
			pRxUsedDesc->returnInfo = pRxCurrDesc->returnInfo;
			pRxUsedDesc->bufSize = pRxCurrDesc->bufSize & ETH_RX_BUFFER_MASK;

			/* Return the descriptor to DMA ownership */
			ETH_SET_32B_DESCR_VAL(pRxUsedDesc->cmdSts,
					      ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT_MASK);

				/* Flush descriptor and CPU pipe */
				ETH_DESCR_FLUSH_INV(pPortCtrl, pRxUsedDesc);

				/* Move the used descriptor pointer to the next descriptor */
				pQueueCtrl->pUsedDescr = RX_NEXT_DESC_PTR(pRxUsedDesc, pQueueCtrl);
				pQueueCtrl->pCurrentDescr = RX_NEXT_DESC_PTR(pRxCurrDesc, pQueueCtrl);
			}
		}
	}

/*******************************************************************************
* mvEthPortRxDoneTest - Returns a Rx buffer back to the Rx ring.
*
* DESCRIPTION:
*       This routine performs a diagnostic for Rx buffer
*
*******************************************************************************/
static INLINE void mvEthRxDoneTest(MV_BUF_INFO *pBuf, MV_U32 alignment)
{
		MV_U32 va = (MV_U32) pBuf->bufVirtPtr;
		MV_U32 pa = (MV_U32) pBuf->bufPhysAddr;

		/*
		 * Check the manipulation of pBuf is properly done prior to RxDone
		 */
		if (((va & 0xFF) != alignment) || ((pa & 0xFF) != alignment) || pBuf->bufAddrShift) {
			mvOsPrintf("mvRxDoneTest: pBuf=%p va=%x pa=%x shift=%d\n", pBuf, va, pa, pBuf->bufAddrShift);
			/* dump_stack() */
		}
	}

/*******************************************************************************
* mvEthPortRxDone - Returns a Rx buffer back to the Rx ring.
*
* DESCRIPTION:
*       This routine returns a Rx buffer back to the Rx ring.
*
* INPUT:
*       void*       pEthPortHndl    - Ethernet Port handler.
*       int         rxQueue         - Number of Rx queue.
*       MV_PKT_INFO *pPktInfo       - Pointer to received packet.
*
* RETURN:
*       MV_ERROR        - Unexpected Fatal error.
*       MV_OUT_OF_RANGE - RX queue is already FULL, so this buffer can't be
*                       returned to this queue.
*       MV_FULL         - Buffer returned successfully and RX queue became full.
*                       More buffers should not be returned at the time.
*       MV_OK           - Buffer returned successfully and there are more free
*                       places in the queue.
*
*******************************************************************************/
static INLINE MV_STATUS mvEthPortRxDone(void *pEthPortHndl, int rxQueue, MV_PKT_INFO * pPktInfo)
{
		ETH_RX_DESC *pRxUsedDesc;
		ETH_QUEUE_CTRL *pQueueCtrl;
		ETH_PORT_CTRL *pPortCtrl = (ETH_PORT_CTRL *) pEthPortHndl;

/*
     for debug:
    mvEthRxDoneTest(pPktInfo->pFrags, CONFIG_NET_SKB_HEADROOM);
*/
		pQueueCtrl = &pPortCtrl->rxQueue[rxQueue];

		/* Get 'used' Rx descriptor */
		pRxUsedDesc = pQueueCtrl->pUsedDescr;

		/* Check that ring is not FULL */
		if ((pQueueCtrl->pUsedDescr == pQueueCtrl->pCurrentDescr) && (pQueueCtrl->resource != 0)) {
			mvOsPrintf("%s %d: out of range Error resource=%d, curr=%p, used=%p\n",
				   __func__, pPortCtrl->portNo, pQueueCtrl->resource,
				   pQueueCtrl->pCurrentDescr, pQueueCtrl->pUsedDescr);
			return MV_OUT_OF_RANGE;
		}

	ETH_SET_32B_DESCR_VAL(pRxUsedDesc->bufPtr, pPktInfo->pFrags->bufPhysAddr);
	ETH_SET_32B_DESCR_VAL(pRxUsedDesc->returnInfo, (MV_ULONG) pPktInfo);
	ETH_SET_16B_DESCR_VAL(pRxUsedDesc->bufSize, pPktInfo->pFrags->bufSize & ETH_RX_BUFFER_MASK);

	/* Invalidate data buffer accordingly with pktSize */
	if (pPktInfo->pktSize != 0) {
		ETH_PACKET_CACHE_INVALIDATE(pPktInfo->pFrags->bufVirtPtr, pPktInfo->pktSize);
		pPktInfo->pktSize = 0;
	}

	/* Return the descriptor to DMA ownership */
	ETH_SET_32B_DESCR_VAL(pRxUsedDesc->cmdSts, ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT_MASK);

	/* Flush descriptor and CPU pipe */
	ETH_DESCR_FLUSH_INV(pPortCtrl, pRxUsedDesc);

	pQueueCtrl->resource++;

	/* Move the used descriptor pointer to the next descriptor */
	pQueueCtrl->pUsedDescr = RX_NEXT_DESC_PTR(pRxUsedDesc, pQueueCtrl);

	/* If ring became Full return MV_FULL */
	if (pQueueCtrl->pUsedDescr == pQueueCtrl->pCurrentDescr)
		return MV_FULL;

	return MV_OK;
}

#ifdef __cplusplus
}
#endif

#endif /* __mvEthGbe_h__ */
