| /* |
| * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) |
| * Copyright 2020, HENSOLDT Cyber GmbH |
| * |
| * SPDX-License-Identifier: GPL-2.0-only |
| */ |
| |
| #pragma once |
| |
| #include <stdint.h> |
| #include <stdlib.h> |
| #include <platsupport/io.h> |
| |
| struct eth_driver; |
| |
| #define ETHIF_TX_ENQUEUED 0 |
| #define ETHIF_TX_FAILED -1 |
| #define ETHIF_TX_COMPLETE 1 |
| |
| /** |
| * Transmit a packet. |
| * |
| * @param driver Pointer to ethernet driver |
| * @param num Number of memory regions making up the packet |
| * @param phys Array of length 'num' detailing physical addresses |
| * of each memory region |
| * @param len Array of length 'num' detailing the length of each |
| * memory region |
| * @param cookie Cookie to be passed to receive complete function |
| * |
| * @return ETHIF_TX_ENQUEUED if buffer request is enqueued, ethif_raw_tx_complete |
| will be called when completed. ETHIF_TX_COMPLETE if transmit completed |
| inline and buffer can be freed. ETHIF_TX_FAILED if transmit could not |
| be done |
| */ |
| typedef int (*ethif_raw_tx)(struct eth_driver *driver, unsigned int num, uintptr_t *phys, unsigned int *len, |
| void *cookie); |
| |
| /** |
| * Handle an IRQ event |
| * |
| * @param driver Pointer to ethernet driver |
| * @param irq If driver has multiple IRQs this is a driver |
| * specific encoding of which one |
| */ |
| typedef void (*ethif_raw_handleIRQ_t)(struct eth_driver *driver, int irq); |
| |
| /** |
| * Get low level device from the driver |
| * |
| * @param driver Pointer to ethernet driver |
| * @param mac Pointer to 6 byte array to fill in HW mac address |
| * @param mtu Pointer to int that should be filled in with devices MTU |
| */ |
| typedef void (*ethif_low_level_init_t)(struct eth_driver *driver, uint8_t *mac, int *mtu); |
| |
| /* Debug method for printing internal driver state */ |
| typedef void (*ethif_print_state_t)(struct eth_driver *driver); |
| |
| /** |
| * Request the driver to poll for any changes. This can |
| * be used if you want to run without interrupts |
| * |
| * @param driver Pointer to ethernet driver |
| */ |
| typedef void (*ethif_raw_poll)(struct eth_driver *driver); |
| |
| /** |
| * Function called by the driver to allocate receive buffers. |
| * Must respect the dma_alignment specified by the driver in |
| * the eth_driver struct |
| * |
| * @param cb_cookie Cookie given in eth_driver struct |
| * @param buf_size Size of buffer to allocate |
| * @param cookie Pointer to location to store a buffer |
| * specific cookie that will be passed |
| * to the ethif_raw_rx_complete function |
| * |
| * @return Physical address of buffer, or 0 on error |
| */ |
| typedef uintptr_t (*ethif_raw_allocate_rx_buf)(void *cb_cookie, size_t buf_size, void **cookie); |
| |
| /** |
| * Function called by the driver upon successful RX |
| * |
| * @param cb_cookie Cookie given in the eth_driver struct |
| * @param num_bufs Number of buffers that were used in the receive |
| * @param cookies Array of size 'num_bufs' containing all the |
| * cookies as given by ethif_raw_allocate_rx_buf |
| * This array will be freed upon completion of the callback |
| * @param lens Array of size 'num_bufs' containing how much |
| * data was placed in each receive buffer |
| * This array will be freed upon completion of the callback |
| */ |
| typedef void (*ethif_raw_rx_complete)(void *cb_cookie, unsigned int num_bufs, void **cookies, unsigned int *lens); |
| |
| /** |
| * Function called by the driver upon successful TX |
| * |
| * @param cb_cookie Cookie given in eth_driver struct |
| * @param cookie Buffer specific cookie passed to ethif_raw_tx |
| */ |
| typedef void (*ethif_raw_tx_complete)(void *cb_cookie, void *cookie); |
| |
| /** |
| * Defining of generic function for initializing an ethernet |
| * driver. Takes an allocated and partially filled out |
| * eth_driver struct that it will finish filling out. |
| * |
| * @param driver Partially filled out eth_driver struct. Expects |
| i_cb and cb_cookie to already be filled out |
| * @param io_ops Interface containing OS specific functions |
| * @param config Pointer to driver specific config struct. The |
| * caller is responsible for freeing this |
| * |
| * @return 0 on success |
| */ |
| typedef int (*ethif_driver_init)(struct eth_driver *driver, ps_io_ops_t io_ops, void *config); |
| |
| /** |
| * Get the device MAC address |
| * |
| * @param driver Pointer to ethernet driver |
| * @param mac Pointer to 6 byte array to be filled in device MAC address |
| */ |
| typedef void (*ethif_get_mac)(struct eth_driver *driver, uint8_t *mac); |
| |
| /* Structure defining the set of functions an ethernet driver |
| * must implement and expose */ |
| struct raw_iface_funcs { |
| ethif_raw_tx raw_tx; |
| ethif_raw_handleIRQ_t raw_handleIRQ; |
| ethif_raw_poll raw_poll; |
| ethif_print_state_t print_state; |
| ethif_low_level_init_t low_level_init; |
| ethif_get_mac get_mac; |
| }; |
| |
| /* Structure defining the set of functions an ethernet driver |
| * expects to be given to it for handling memory allocation |
| * and receive/transmit completions */ |
| struct raw_iface_callbacks { |
| ethif_raw_tx_complete tx_complete; |
| ethif_raw_rx_complete rx_complete; |
| ethif_raw_allocate_rx_buf allocate_rx_buf; |
| }; |
| |
| /* Structure to hold the interface for an ethernet driver */ |
| struct eth_driver { |
| void *eth_data; |
| struct raw_iface_funcs i_fn; |
| struct raw_iface_callbacks i_cb; |
| void *cb_cookie; |
| ps_io_ops_t io_ops; |
| int dma_alignment; |
| }; |
| |
| struct dma_buf_cookie { |
| void *vbuf; |
| void *pbuf; |
| }; |
| |
| /* Structure for Zynq7000 and Tx2 Drivers |
| * TODO: Move to ARCH Specific Folder |
| */ |
| struct arm_eth_plat_config { |
| void *buffer_addr; |
| uint8_t prom_mode; |
| }; |
| |