/* ----------------------------------------------------------------------------
 *         SAM Software Package License 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2012, Atmel Corporation
 *
 * All rights reserved.
 *
 * 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 disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL 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 */

/** \addtogroup gmacd_module
 * @{
 * Implement GMAC data transfer and PHY management functions.
 *
 * \section Usage
 * -# Implement GMAC interrupt handler, which must invoke GMACD_Handler()
 *    to handle GMAC interrupt events.
 * -# Implement sGmacd instance in application.
 * -# Initialize the instance with GMACD_Init() and GMACD_InitTransfer(),
 *    so that GMAC data can be transmitted/received.
 * -# Some management callbacks can be set by GMACD_SetRxCallback()
 *    and GMACD_SetTxWakeupCallback().
 * -# Send ethernet packets using GMACD_Send(), GMACD_TxLoad() is used
 *    to check the free space in TX queue.
 * -# Check and obtain received ethernet packets via GMACD_Poll().
 *
 * \sa \ref gmacb_module, \ref gmac_module
 *
 * Related files:\n
 * \ref gmacd.c\n
 * \ref gmacd.h.\n
 *
 *  \defgroup gmacd_defines GMAC Driver Defines
 *  \defgroup gmacd_types GMAC Driver Types
 *  \defgroup gmacd_functions GMAC Driver Functions
 */
/**@}*/

#ifndef _GMACD_H_
#define _GMACD_H_

/*---------------------------------------------------------------------------
 *         Headers
 *---------------------------------------------------------------------------*/

#include "chip.h"


/*---------------------------------------------------------------------------
 *         Definitions
 *---------------------------------------------------------------------------*/
/** \addtogroup gmacd_defines
	@{*/


/** \addtogroup gmacd_rc GMACD Return Codes
		@{*/
#define GMACD_OK                0   /**< Operation OK */
#define GMACD_TX_BUSY           1   /**< TX in progress */
#define GMACD_RX_NULL           1   /**< No data received */
/** Buffer size not enough */
#define GMACD_SIZE_TOO_SMALL    2
/** Parameter error, TX packet invalid or RX size too small */
#define GMACD_PARAM             3
/** Transfer is not initialized */
#define GMACD_NOT_INITIALIZED   4
/**     @}*/

/** @}*/

/* Should be a power of 2. 
   - Buffer Length to store the timestamps of 1588 event messages 
*/
#define EFRS_BUFFER_LEN	(1u)

/*---------------------------------------------------------------------------
*             Types
*---------------------------------------------------------------------------*/ 
/** \addtogroup gmacd_types
	@{*/

typedef enum ptpMsgType_t  
{
	SYNC_MSG_TYPE = 0,
	DELAY_REQ_MSG_TYPE = 1,
	PDELAY_REQ_TYPE = 2,
	PDELAY_RESP_TYPE = 3,
	FOLLOW_UP_MSG_TYPE = 8,
	DELAY_RESP_MSG_TYPE = 9
}ptpMsgType; 
	


/** RX callback */
typedef void (*fGmacdTransferCallback)(uint32_t status);
/** Wakeup callback */
typedef void (*fGmacdWakeupCallback)(void);
/** Tx PTP message callback */
typedef void (*fGmacdTxPtpEvtCallBack) (ptpMsgType msg, uint32_t sec, \
					uint32_t nanosec, uint16_t seqId);

/**
 * GMAC scatter-gather entry.
 */
typedef struct _GmacSG {
	uint32_t size;
	void *pBuffer;
} sGmacSG;

/**
 * GMAC scatter-gather list.
 */
typedef struct _GmacSGList {
	uint32_t len;
	sGmacSG  *sg;
} sGmacSGList;

/**
 * GMAC Queue driver.
 */
typedef struct _GmacQueueDriver {
	uint8_t *pTxBuffer;
	/** Pointer to allocated RX buffer */
	uint8_t *pRxBuffer;

	/** Pointer to Rx TDs (must be 8-byte aligned) */
	sGmacRxDescriptor *pRxD;
	/** Pointer to Tx TDs (must be 8-byte aligned) */
	sGmacTxDescriptor *pTxD;

	/** Optional callback to be invoked once a frame has been received */
	fGmacdTransferCallback fRxCb;
	/** Optional callback to be invoked once several TD have been released */
	fGmacdWakeupCallback fWakupCb;
	/** Optional callback list to be invoked once TD has been processed */
	fGmacdTransferCallback *fTxCbList;

	/** Optional callback to be invoked on transmit of PTP Event messages */
	 fGmacdTxPtpEvtCallBack fTxPtpEvtCb;

	  /** RX TD list size */
	uint16_t wRxListSize;
	/** RX index for current processing TD */
	uint16_t wRxI;

	/** TX TD list size */
	uint16_t wTxListSize;
	/** Circular buffer head pointer by upper layer (buffer to be sent) */
	uint16_t wTxHead;
	/** Circular buffer tail pointer incremented by handlers (buffer sent) */
	uint16_t wTxTail;

	/** Number of free TD before wakeup callback is invoked */
	uint8_t  bWakeupThreshold;
	
   /** RX buffer size */
	uint16_t wTxBufferSize;
	uint16_t wRxBufferSize;
	
} sGmacQd;

/**
 * GMAC driver struct.
 */
typedef struct _GmacDriver {

	/** Pointer to HW register base */
	Gmac        *pHw;
	/** HW ID */
	uint8_t bId;
	/** Base Queue list params **/
	sGmacQd     queueList[NUM_GMAC_QUEUES];    
} sGmacd;

/**
 * GMAC driver init struct.
 */
typedef struct _GmacInit {
	uint32_t bIsGem:1;
	uint32_t reserved:31;

	uint8_t bDmaBurstLength;

	/** RX descriptor and data buffers */
	uint8_t *pRxBuffer;        
	/** RX data buffers: should be wRxBufferSize * wRxSize byte long in a DMA 
	capable memory region */
	sGmacRxDescriptor *pRxD;    
	/** RX buffer descriptors: should have wRxSize entries in a DMA 
	capable memory region */
	uint16_t wRxBufferSize;     /** size of a single RX data buffer */
	uint16_t wRxSize;           /** number of RX descriptor and data buffers */

	/** TX descriptor and data buffers */
	/** TX data buffers: should be wTxBufferSize * wTxSize byte long 
		in a DMA capable memory region */
	uint8_t *pTxBuffer;
	/** TX buffer descriptors: should have wTxSize entries
		in a DMA capable non-cached memory region */
	sGmacTxDescriptor *pTxD;
	/** size of a single TX data buffer */
	uint16_t wTxBufferSize;
	/** number of TX descriptor and data buffers */
	uint16_t wTxSize;

	fGmacdTransferCallback *pTxCb;      /** should have wTxSize entries */
} sGmacInit;
/** @}*/

/** \addtogroup gmacd_functions
	@{*/

/*---------------------------------------------------------------------------
 *         GMAC Exported functions
 *---------------------------------------------------------------------------*/

extern void GMACD_Handler(sGmacd *pGmacd , gmacQueList_t queIdx);

extern void GMACD_Init(sGmacd *pGmacd,
					   Gmac *pHw,
					   uint8_t bID, 
					   uint8_t enableCAF, 
					   uint8_t enableNBC );

extern uint8_t GMACD_InitTransfer(sGmacd *pGmacd,
								   const sGmacInit *pInit, gmacQueList_t queIdx);

extern void GMACD_Reset(sGmacd *pGmacd);

extern uint8_t GMACD_SendSG(sGmacd *pGmacd,
							const sGmacSGList *sgl,
							fGmacdTransferCallback fTxCb, 
							gmacQueList_t queIdx);

extern uint8_t GMACD_Send(sGmacd *pGmacd,
						 void *pBuffer,
						 uint32_t size,
						 fGmacdTransferCallback fTxCb, 
						 gmacQueList_t queIdx );

extern  uint32_t GMACD_TxLoad(sGmacd *pGmacd, gmacQueList_t queIdx);

extern  uint8_t GMACD_Poll(sGmacd * pGmacd, 
						  uint8_t *pFrame, 
						  uint32_t frameSize, 
						  uint32_t *pRcvSize, 
						  gmacQueList_t queIdx);

extern void GMACD_SetRxCallback(sGmacd * pGmacd, fGmacdTransferCallback 
		fRxCb, gmacQueList_t queIdx);

extern uint8_t GMACD_SetTxWakeupCallback(sGmacd * pGmacd,
										 fGmacdWakeupCallback fWakeup,
										 uint8_t bThreshold, 
										 gmacQueList_t queIdx);
 
extern void GMACD_TxPtpEvtMsgCBRegister (sGmacd * pGmacd, 
										  fGmacdTxPtpEvtCallBack pTxPtpEvtCb, 
										  gmacQueList_t queIdx);

/** @}*/

#endif // #ifndef _GMACD_H_
