/*
 * 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 <autoconf.h>
#include <ethdrivers/gen_config.h>
#include <lwip/gen_config.h>

#ifdef CONFIG_LIB_LWIP

#include <platsupport/io.h>
#include <ethdrivers/raw.h>
#include <ethdrivers/helpers.h>
#include <lwip/netif.h>
#include <stdint.h>

/* Structure describing an LWIP interface to an ethernet driver.
 * This structure is defined publicly for performance reasons
 * but should not be used directly */
typedef struct lwip_iface {
    struct eth_driver driver;
    netif_init_fn ethif_init;
    ps_dma_man_t dma_man;
    struct netif *netif;

    int num_free_bufs;
    dma_addr_t **bufs;
} lwip_iface_t;

/**
 * Initialize an ethernet driver and hook it up to LWIP. This is
 * will create an LWIP compatible interface to the driver, and
 * also fullfills the driver requirements for allocating
 * receive buffers. This interface will either use preallocated
 * dma buffers, and performing copying to and from them, or
 * attempt to dma directly from the lwip pbufs.
 * The returned lwip_iface should be passed to netif_add along
 * with the init function from ethif_get_ethif_init
 *
 * @param[in] io_ops    Structure for OS specific data and functions
 *                      If pbuf_dma is NULL this will be used for
 *                      allocating the DMA buffers
 * @param[in] pbuf_dma  Optional reference to a DMA allocator for
 *                      DMA'ing from pbufs. This interface will only
 *                      be used to pin/upin memory, never allocate or
 *                      free. If specified pbufs will be allocated for
 *                      receive buffers. If pbufs fail to pin there is
 *                      no fallback and receive/transmit will fail.
 *                      This data structure will be copied and no
 *                      no reference to this pointer will be retained
 * @param[in] driver    Function to use to initialize a driver
 *                      see description of ethif_driver_init in raw.h
 * @param[in] driver_config Pointer to driver specific config struct
 *                      that will be passed to the driver init function
 * @return              Pointer to initialized lwip_iface struct, or
 *                      NULL on error
 */
lwip_iface_t *ethif_new_lwip_driver(ps_io_ops_t io_ops, ps_dma_man_t *pbuf_dma, ethif_driver_init driver, void *driver_config);

/**
 * Same as ethif_new_lwip_driver except if an allocated iface
 * and pbuf_dma is passed then malloc will not get called
 */
lwip_iface_t *ethif_new_lwip_driver_no_malloc(ps_io_ops_t io_ops, ps_dma_man_t *pbuf_dma, ethif_driver_init driver, void *driver_config, lwip_iface_t *iface);

/* Wrapper function for an LWIP driver for asking the underlying
 * eth driver to handle an IRQ */
static inline void ethif_lwip_handle_irq(lwip_iface_t *iface, int irq) {
    iface->driver.i_fn.raw_handleIRQ(&iface->driver, irq);
}

/* Wrapper function for an LWIP driver for asking the underlying
 * eth driver to manual check its state in the absence of interrupts */
static inline void ethif_lwip_poll(lwip_iface_t *iface) {
    iface->driver.i_fn.raw_poll(&iface->driver);
}

/* Retrieve the netif_init_fn for this iface for passing to netif_add */
static inline netif_init_fn ethif_get_ethif_init(lwip_iface_t *iface) {
    return iface->ethif_init;
}

#endif
