/*
 * @file:    EthDev.h
 * @purpose: Ethernet Device Definitions
 * @version: V1.10
 * @date:    24. Feb. 2009
 *----------------------------------------------------------------------------
 *
 * Copyright (C) 2009 ARM Limited. All rights reserved.
 *
 * ARM Limited (ARM) is supplying this software for use with Cortex-M3
 * processor based microcontrollers.  This file can be freely distributed
 * within development tools that are supporting such ARM based processors.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
 *
 */

#ifndef _ETHDEV__H
#define _ETHDEV__H

#ifndef NULL
 #define NULL   0
#endif

/*----------------------------------------------------------------------------
  Ethernet Device Defines
 *----------------------------------------------------------------------------*/
#define EthDev_ADDR_SIZE        6                      /*!< Ethernet Address size in bytes */
#define EthDev_MTU_SIZE         1514                   /*!< Maximum Transmission Unit      */


/*----------------------------------------------------------------------------
  Ethernet Device Configuration and Control Command Defines
 *----------------------------------------------------------------------------*/
typedef enum {
  EthDev_LINK_DOWN              = 0,                   /*!< Ethernet link not established */
  EthDev_LINK_UP                = 1,                   /*!< Ethernet link established */
} EthDev_LINK;

typedef enum {
  EthDev_SPEED_10M              = 0,                   /*!< 10.0 Mbps link speed  */
  EthDev_SPEED_100M             = 1,                   /*!< 100.0 Mbps link speed */
  EthDev_SPEED_1000M            = 2,                   /*!< 1.0 Gbps link speed   */
} EthDev_SPEED;

typedef enum {
  EthDev_DUPLEX_HALF            = 0,                   /*!< Link half duplex */
  EthDev_DUPLEX_FULL            = 1,                   /*!< Link full duplex */
} EthDev_DUPLEX;

typedef enum {
  EthDev_MODE_AUTO              = 0,
  EthDev_MODE_10M_FULL          = 1,
  EthDev_MODE_10M_HALF          = 2,
  EthDev_MODE_100M_FULL         = 3,
  EthDev_MODE_100M_HALF         = 4,
  EthDev_MODE_1000M_FULL        = 5,
  EthDev_MODE_1000M_HALF        = 6,
} EthDev_MODE;

typedef struct {
  EthDev_LINK   Link   : 1;
  EthDev_DUPLEX Duplex : 1;
  EthDev_SPEED  Speed  : 2;
} EthDev_STATUS;


/*----------------------------------------------------------------------------
  Ethernet Device IO Block Structure
 *----------------------------------------------------------------------------*/
typedef struct {

   /* Initialized by the user application before call to Init. */
   EthDev_MODE   Mode;
   unsigned char HwAddr[EthDev_ADDR_SIZE];
   void         *(*RxFrame)      (int size);
   void          (*RxFrameReady) (int size);

   /* Initialized by Ethernet driver. */
   int           (*Init)       (void);
   int           (*UnInit)     (void);
   int           (*SetMCFilter)(int NumHwAddr, unsigned char *pHwAddr);
   int           (*TxFrame)    (void *pData, int size);
   void          (*Lock)       (void);
   void          (*UnLock)     (void);
   EthDev_STATUS (*LinkChk)    (void);
} EthDev_IOB;


/*
 * Look for received data.  If data is found then uip_buf is assigned to the
 * new data and the length of the data is returned.  If no data is found then
 * uip_buf is not updated and 0 is returned.
 */
unsigned long 	ulGetEMACRxData( void );

/*
 * Send usTxDataLen bytes from uip_buf.
 */
void vSendEMACTxData( unsigned short usTxDataLen );

/*
 * Prepare the Ethernet hardware ready for TCP/IP comms.
 */
long lEMACInit(void);

#endif
