/*******************************************************************************
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 maxRxPktSize;
		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);

#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__ */
