/*
 * Copyright 2017, Data61
 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
 * ABN 41 687 119 230.
 *
 * This software may be distributed and modified according to the terms of
 * the GNU General Public License version 2. Note that NO WARRANTY is provided.
 * See "LICENSE_GPLv2.txt" for details.
 *
 * @TAG(DATA61_GPL)
 */

#pragma once

#include <stdint.h>
#include <platsupport/io.h>

#define NETIRQ_BABR     (1UL << 30) /* Babbling Receive Error          */
#define NETIRQ_BABT     (1UL << 29) /* Babbling Transmit Error         */
#define NETIRQ_GRA      (1UL << 28) /* Graceful Stop Complete          */
#define NETIRQ_TXF      (1UL << 27) /* Transmit Frame Interrupt        */
#define NETIRQ_TXB      (1UL << 26) /* Transmit Buffer Interrupt       */
#define NETIRQ_RXF      (1UL << 25) /* Receive Frame Interrupt         */
#define NETIRQ_RXB      (1UL << 24) /* Receive Buffer Interrupt        */
#define NETIRQ_MII      (1UL << 23) /* MII Interrupt                   */
#define NETIRQ_EBERR    (1UL << 22) /* Ethernet bus error              */
#define NETIRQ_LC       (1UL << 21) /* Late Collision                  */
#define NETIRQ_RL       (1UL << 20) /* Collision Retry Limit           */
#define NETIRQ_UN       (1UL << 19) /* Transmit FIFO Underrun          */
#define NETIRQ_PLR      (1UL << 18) /* Payload Receive Error           */
#define NETIRQ_WAKEUP   (1UL << 17) /* Node Wakeup Request Indication  */
#define NETIRQ_TS_AVAIL (1UL << 16) /* Transmit Timestamp Available    */
#define NETIRQ_TS_TIMER (1UL << 15) /* Timestamp Timer                 */

struct enet;

/* Debug */
void enet_dump_regs(struct enet* enet);
void enet_clear_mib(struct enet* enet);
void enet_print_mib(struct enet* enet);

struct desc_data {
    uint32_t tx_phys;
    uint32_t rx_phys;
    uint32_t rx_bufsize;
};

struct enet * enet_init(struct desc_data desc_data, ps_io_ops_t *io_ops);

/* Read and write to the phy over the mdio interface */
int enet_mdio_read(struct enet * enet, uint16_t phy, uint16_t reg);
int enet_mdio_write(struct enet * enet, uint16_t phy, uint16_t reg, uint16_t data);

void enet_enable(struct enet* enet);
int enet_enabled(struct enet* enet);
void enet_disable(struct enet* enet);

void enet_set_mac(struct enet* enet, unsigned char* mac);
void enet_get_mac(struct enet* enet, unsigned char* mac);

void enet_set_speed(struct enet* enet, int speed, int full_duplex);
/* Clears ievents and returns the original value - before the clear */
uint32_t enet_clr_events(struct enet* enet, uint32_t clr_bits);
/* Sets the event mask */
void enet_enable_events(struct enet* enet, uint32_t mask_bits);
/* Returns the value of ievents */
uint32_t enet_get_events(struct enet* enet);

void enet_tx_enable(struct enet* enet);
int enet_tx_enabled(struct enet* enet);
void enet_rx_enable(struct enet* enet);
int enet_rx_enabled(struct enet* enet);

void enet_set_mdcclk(struct enet * enet, uint32_t fout);
uint32_t enet_get_mdcclk(struct enet *imx_eth);

void enet_print_state(struct enet * enet);

void enet_prom_enable(struct enet * enet);
void enet_prom_disable(struct enet * enet);

