/*******************************************************************************
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 : Ethernet Controller
*
* DESCRIPTION:
*       This header file contains macros typedefs and function declaration for
*       Marvell Gigabit Ethernet Controllers.
*
* DEPENDENCIES:
*       None.
*
*******************************************************************************/

#ifndef __mvEth_h__
#define __mvEth_h__

#ifdef __cplusplus
extern "C" {
#endif

/* includes */
#include "ctrlEnv/mvCtrlEnvSpec.h"
#include "gbe/mvEthRegs.h"
#include "mvSysEthConfig.h"

/* defines  */

#define MV_ETH_EXTRA_FRAGS_NUM      2

	typedef struct {
		MV_U32 maxPortNum;
		MV_U32 cpuPclk;
		MV_U32 tclk;
#ifdef ETH_DESCR_IN_SRAM
		MV_U32 sramSize;
#endif

		struct {
			MV_BOOL powerOn;
			MV_32 phyAddr;
			MV_BOOL isSgmii;
			MV_ETH_MAC_SPEED macSpeed;
		} portData[MV_ETH_MAX_PORTS];
	} MV_ETH_HAL_DATA;

	typedef enum {
		MV_ETH_SPEED_AN,
		MV_ETH_SPEED_10,
		MV_ETH_SPEED_100,
		MV_ETH_SPEED_1000
	} MV_ETH_PORT_SPEED;

	typedef enum {
		MV_ETH_DUPLEX_AN,
		MV_ETH_DUPLEX_HALF,
		MV_ETH_DUPLEX_FULL
	} MV_ETH_PORT_DUPLEX;

	typedef enum {
		MV_ETH_FC_AN_ADV_DIS,
		MV_ETH_FC_AN_ADV_SYM,
		MV_ETH_FC_DISABLE,
		MV_ETH_FC_ENABLE
	} MV_ETH_PORT_FC;

	typedef enum {
		MV_ETH_PRIO_FIXED = 0,	/* Fixed priority mode */
		MV_ETH_PRIO_WRR = 1	/* Weighted round robin priority mode */
	} MV_ETH_PRIO_MODE;

/* Ethernet port specific infomation */
	typedef struct {
		int maxRxPktSize;
		int rxDefQ;
		int rxBpduQ;
		int rxArpQ;
		int rxTcpQ;
		int rxUdpQ;
		int ejpMode;
	} MV_ETH_PORT_CFG;

	typedef struct {
		int descrNum;
	} MV_ETH_RX_Q_CFG;

	typedef struct {
		int descrNum;
		MV_ETH_PRIO_MODE prioMode;
		int quota;
	} MV_ETH_TX_Q_CFG;

	typedef struct {
		int rxDefQ;
		int txDescrNum[MV_ETH_TX_Q_NUM];
		int rxDescrNum[MV_ETH_RX_Q_NUM];
		void *osHandle;
	} MV_ETH_PORT_INIT;

	typedef struct {
		MV_BOOL isLinkUp;
		MV_ETH_PORT_SPEED speed;
		MV_ETH_PORT_DUPLEX duplex;
		MV_ETH_PORT_FC flowControl;

	} MV_ETH_PORT_STATUS;

	typedef enum {
		MV_ETH_DISABLE_HEADER_MODE = 0,
		MV_ETH_ENABLE_HEADER_MODE_PRI_2_1 = 1,
		MV_ETH_ENABLE_HEADER_MODE_PRI_DBNUM = 2,
		MV_ETH_ENABLE_HEADER_MODE_PRI_SPID = 3
	} MV_ETH_HEADER_MODE;

/* ethernet.h API list */
	void mvEthHalInit(MV_ETH_HAL_DATA *halData);
	void mvEthMemAttrGet(MV_BOOL *pIsSram, MV_BOOL *pIsSwCoher);

/* Port Initalization routines */
	void *mvEthPortInit(int port, MV_ETH_PORT_INIT *pPortInit);
	void ethResetTxDescRing(void *pPortHndl, int queue);
	void ethResetRxDescRing(void *pPortHndl, int queue);

	void *mvEthPortHndlGet(int port);

	void mvEthPortFinish(void *pEthPortHndl);
	MV_STATUS mvEthPortDown(void *pEthPortHndl);
	MV_STATUS mvEthPortDisable(void *pEthPortHndl);
	MV_STATUS mvEthPortUp(void *pEthPortHndl);
	MV_STATUS mvEthPortEnable(void *pEthPortHndl);

/* Port data flow routines */
	MV_PKT_INFO *mvEthPortForceTxDone(void *pEthPortHndl, int txQueue);
	MV_PKT_INFO *mvEthPortForceRx(void *pEthPortHndl, int rxQueue);

/* Port Configuration routines */
	MV_STATUS mvEthDefaultsSet(void *pEthPortHndl);
	MV_STATUS mvEthMaxRxSizeSet(void *pPortHndl, int maxRxSize);

/* Port RX MAC Filtering control routines */
	MV_U8 mvEthMcastCrc8Get(MV_U8 *pAddr);
	MV_STATUS mvEthRxFilterModeSet(void *pPortHndl, MV_BOOL isPromisc);
	MV_STATUS mvEthMacAddrSet(void *pPortHandle, MV_U8 * pMacAddr, int queue);
	MV_STATUS mvEthMcastAddrSet(void *pPortHandle, MV_U8 * pAddr, int queue);

/* MIB Counters APIs */
	MV_U32 mvEthMibCounterRead(void *pPortHndl, unsigned int mibOffset, MV_U32 * pHigh32);
	void mvEthMibCountersClear(void *pPortHandle);

/* TX Scheduling configuration routines */
	MV_STATUS mvEthTxQueueConfig(void *pPortHandle, int txQueue, MV_ETH_PRIO_MODE txPrioMode, int txQuota);

/* RX Dispatching configuration routines */
MV_STATUS mvEthBpduRxQueue(void *pPortHandle, int bpduQueue);
MV_STATUS mvEthVlanPrioRxQueue(void *pPortHandle, int vlanPrio, int vlanPrioQueue);
MV_STATUS mvEthTosToRxqSet(void *pPortHandle, int tos, int rxq);
int mvEthTosToRxqGet(void *pPortHandle, int tos);

/* Speed, Duplex, FlowControl routines */
MV_STATUS mvEthSpeedDuplexSet(void *pPortHandle, MV_ETH_PORT_SPEED speed, MV_ETH_PORT_DUPLEX duplex);
MV_STATUS mvEthFlowCtrlSet(void *pPortHandle, MV_ETH_PORT_FC flowControl);

/* MAC special functions: implemented accordignly with MAC version */
MV_STATUS mvEthGmacRgmiiSet(int port, int enable);

#if (MV_ETH_VERSION >= 4)
	MV_STATUS mvEthEjpModeSet(void *pPortHandle, int mode);
#endif				/* (MV_ETH_VERSION >= 4) */

	void mvEthStatusGet(void *pPortHandle, MV_ETH_PORT_STATUS *pStatus);

/* Marvell Header control               */
	MV_STATUS mvEthHeaderModeSet(void *pPortHandle, MV_ETH_HEADER_MODE headerMode);

/* PHY routines */
	void mvEthPhyAddrSet(void *pPortHandle, int phyAddr);
	int mvEthPhyAddrGet(void *pPortHandle);

/* Power management routines */
	void mvEthPortPowerDown(int port);
	void mvEthPortPowerUp(int port);

	MV_STATUS mvEthWinInit(MV_U32 port, MV_UNIT_WIN_INFO *addrWinMap);
	MV_STATUS mvEthWinWrite(MV_U32 port, MV_U32 winNum, MV_UNIT_WIN_INFO *pAddrDecWin);
	MV_STATUS mvEthWinRead(MV_U32 port, MV_U32 winNum, MV_UNIT_WIN_INFO *pAddrDecWin);
	MV_STATUS mvEthWinEnable(MV_U32 port, MV_U32 winNum, MV_BOOL enable);

/******************** ETH PRIVATE ************************/

/*#define UNCACHED_TX_BUFFERS*/
/*#define UNCACHED_RX_BUFFERS*/

/* Port attributes */
/* Size of a Tx/Rx descriptor used in chain list data structure */
#define ETH_RX_DESC_ALIGNED_SIZE        32
#define ETH_TX_DESC_ALIGNED_SIZE        32

#define TX_DISABLE_TIMEOUT_MSEC     1000
#define RX_DISABLE_TIMEOUT_MSEC     1000
#define TX_FIFO_EMPTY_TIMEOUT_MSEC  10000
#define PORT_DISABLE_WAIT_TCLOCKS   5000

/* Macros that save access to desc in order to find next desc pointer  */
#define RX_NEXT_DESC_PTR(pRxDescr, pQueueCtrl)                              \
	((pRxDescr) == (pQueueCtrl)->pLastDescr) ?                          \
		(ETH_RX_DESC *)((pQueueCtrl)->pFirstDescr) :                  \
		(ETH_RX_DESC *)(((MV_ULONG)(pRxDescr)) + ETH_RX_DESC_ALIGNED_SIZE)

#define TX_NEXT_DESC_PTR(pTxDescr, pQueueCtrl)                              \
	((pTxDescr) == (pQueueCtrl)->pLastDescr) ?                          \
		(ETH_TX_DESC *)((pQueueCtrl)->pFirstDescr) :                  \
		(ETH_TX_DESC *)(((MV_ULONG)(pTxDescr)) + ETH_TX_DESC_ALIGNED_SIZE)

#define RX_PREV_DESC_PTR(pRxDescr, pQueueCtrl)                              \
	((pRxDescr) == (pQueueCtrl)->pFirstDescr) ?                          \
		(ETH_RX_DESC *)((pQueueCtrl)->pLastDescr) :                  \
		(ETH_RX_DESC *)(((MV_ULONG)(pRxDescr)) - ETH_RX_DESC_ALIGNED_SIZE)

#define TX_PREV_DESC_PTR(pTxDescr, pQueueCtrl)                              \
	((pTxDescr) == (pQueueCtrl)->pFirstDescr) ?                          \
		(ETH_TX_DESC *)((pQueueCtrl)->pLastDescr) :                  \
		(ETH_TX_DESC *)(((MV_ULONG)(pTxDescr)) - ETH_TX_DESC_ALIGNED_SIZE)

/* Queue specific information */
	typedef struct {
		void *pFirstDescr;
		void *pLastDescr;
		void *pCurrentDescr;
		void *pUsedDescr;
		int resource;
		MV_BUF_INFO descBuf;
	} ETH_QUEUE_CTRL;

/* Ethernet port specific infomation */
	typedef struct _ethPortCtrl {
		int portNo;
		ETH_QUEUE_CTRL rxQueue[MV_ETH_RX_Q_NUM];	/* Rx ring resource  */
		ETH_QUEUE_CTRL txQueue[MV_ETH_TX_Q_NUM];	/* Tx ring resource  */

		MV_ETH_PORT_CFG portConfig;
		MV_ETH_RX_Q_CFG rxQueueConfig[MV_ETH_RX_Q_NUM];
		MV_ETH_TX_Q_CFG txQueueConfig[MV_ETH_TX_Q_NUM];

		/* Register images - For DP */
		MV_U32 portTxQueueCmdReg;	/* Port active Tx queues summary    */
		MV_U32 portRxQueueCmdReg;	/* Port active Rx queues summary    */

		MV_STATE portState;

		MV_U8 mcastCount[256];
		MV_U32 *hashPtr;
		void *osHandle;
	} ETH_PORT_CTRL;

/************** MACROs ****************/

/* MACROs to Flush / Invalidate TX / RX Buffers */
#if (ETHER_DRAM_COHER == MV_CACHE_COHER_SW) && !defined(UNCACHED_TX_BUFFERS)
#   define ETH_PACKET_CACHE_FLUSH(pAddr, size)                                  \
	mvOsCacheClear(NULL, (pAddr), (size))                                   \
				/*CPU_PIPE_FLUSH; */
#else
#   define ETH_PACKET_CACHE_FLUSH(pAddr, size)                                  \
	mvOsIoVirtToPhy(NULL, (pAddr))
#endif				/* ETHER_DRAM_COHER == MV_CACHE_COHER_SW */

#if ((ETHER_DRAM_COHER == MV_CACHE_COHER_SW) && !defined(UNCACHED_RX_BUFFERS))
#   define ETH_PACKET_CACHE_INVALIDATE(pAddr, size)                             \
	mvOsCacheInvalidate(NULL, (pAddr), (size))                             \
				/*CPU_PIPE_FLUSH; */
#else
#   define ETH_PACKET_CACHE_INVALIDATE(pAddr, size)
#endif				/* ETHER_DRAM_COHER == MV_CACHE_COHER_SW && !UNCACHED_RX_BUFFERS */

#ifdef ETH_DESCR_UNCACHED

#define ETH_DESCR_FLUSH_INV(pPortCtrl, pDescr)
#define ETH_DESCR_INV(pPortCtrl, pDescr)

#else

#define ETH_DESCR_FLUSH_INV(pPortCtrl, pDescr)      \
	mvOsCacheLineFlushInv(pPortCtrl->osHandle, (MV_ULONG)(pDescr))

#define ETH_DESCR_INV(pPortCtrl, pDescr)            \
	mvOsCacheLineInv(pPortCtrl->osHandle, (MV_ULONG)(pDescr))

#endif				/* ETH_DESCR_UNCACHED */

/* #include "eth/gbe/mvEthGbe.h" */

#ifdef __cplusplus
}
#endif
#endif				/* __mvEth_h__ */
