| /************************************************************************** |
| * |
| * Etherboot driver for Level 5 Etherfabric network cards |
| * |
| * Written by Michael Brown <mbrown@fensystems.co.uk> |
| * |
| * Copyright Fen Systems Ltd. 2005 |
| * Copyright Level 5 Networks Inc. 2005 |
| * |
| * This software may be used and distributed according to the terms of |
| * the GNU General Public License (GPL), incorporated herein by |
| * reference. Drivers based on or derived from this code fall under |
| * the GPL and must retain the authorship, copyright and license |
| * notice. |
| * |
| ************************************************************************** |
| */ |
| |
| FILE_LICENCE ( GPL_ANY ); |
| |
| #ifndef EFAB_NIC_H |
| #define EFAB_NIC_H |
| #include <ipxe/bitbash.h> |
| #include <ipxe/i2c.h> |
| #include <ipxe/spi.h> |
| #include <ipxe/nvo.h> |
| #include <ipxe/if_ether.h> |
| /************************************************************************** |
| * |
| * Constants and macros |
| * |
| ************************************************************************** |
| */ |
| /* Board IDs. Early boards have no board_type, (e.g. EF1002 and 401/403) |
| * But newer boards are getting bigger... |
| */ |
| typedef enum { |
| EFAB_BOARD_INVALID = 0, /* Early boards do not have board rev. info. */ |
| EFAB_BOARD_SFE4001 = 1, |
| EFAB_BOARD_SFE4002 = 2, |
| EFAB_BOARD_SFE4003 = 3, |
| /* Insert new types before here */ |
| EFAB_BOARD_MAX |
| } efab_board_type; |
| |
| /* PHY types. */ |
| typedef enum { |
| PHY_TYPE_AUTO = 0, /* on development board detect between CX4 & alaska */ |
| PHY_TYPE_CX4_RTMR = 1, |
| PHY_TYPE_1GIG_ALASKA = 2, |
| PHY_TYPE_10XPRESS = 3, |
| PHY_TYPE_XFP = 4, |
| PHY_TYPE_CX4 = 5, |
| PHY_TYPE_PM8358 = 6, |
| } phy_type_t; |
| |
| /************************************************************************** |
| * |
| * Hardware data structures and sizing |
| * |
| ************************************************************************** |
| */ |
| |
| #define dma_addr_t unsigned long |
| typedef efab_qword_t falcon_rx_desc_t; |
| typedef efab_qword_t falcon_tx_desc_t; |
| typedef efab_qword_t falcon_event_t; |
| |
| #define EFAB_BUF_ALIGN 4096 |
| #define EFAB_RXD_SIZE 512 |
| #define EFAB_TXD_SIZE 512 |
| #define EFAB_EVQ_SIZE 512 |
| |
| #define EFAB_NUM_RX_DESC 16 |
| #define EFAB_RX_BUF_SIZE 1600 |
| |
| /************************************************************************** |
| * |
| * Data structures |
| * |
| ************************************************************************** |
| */ |
| |
| struct efab_nic; |
| |
| /* A buffer table allocation backing a tx dma, rx dma or eventq */ |
| struct efab_special_buffer { |
| dma_addr_t dma_addr; |
| int id; |
| }; |
| |
| /* A TX queue */ |
| struct efab_tx_queue { |
| /* The hardware ring */ |
| falcon_tx_desc_t *ring; |
| |
| /* The software ring storing io_buffers. */ |
| struct io_buffer *buf[EFAB_TXD_SIZE]; |
| |
| /* The buffer table reservation pushed to hardware */ |
| struct efab_special_buffer entry; |
| |
| /* Software descriptor write ptr */ |
| unsigned int write_ptr; |
| |
| /* Hardware descriptor read ptr */ |
| unsigned int read_ptr; |
| }; |
| |
| /* An RX queue */ |
| struct efab_rx_queue { |
| /* The hardware ring */ |
| falcon_rx_desc_t *ring; |
| |
| /* The software ring storing io_buffers */ |
| struct io_buffer *buf[EFAB_NUM_RX_DESC]; |
| |
| /* The buffer table reservation pushed to hardware */ |
| struct efab_special_buffer entry; |
| |
| /* Descriptor write ptr, into both the hardware and software rings */ |
| unsigned int write_ptr; |
| |
| /* Hardware completion ptr */ |
| unsigned int read_ptr; |
| }; |
| |
| /* An event queue */ |
| struct efab_ev_queue { |
| /* The hardware ring to push to hardware. |
| * Must be the first entry in the structure */ |
| falcon_event_t *ring; |
| |
| /* The buffer table reservation pushed to hardware */ |
| struct efab_special_buffer entry; |
| |
| /* Pointers into the ring */ |
| unsigned int read_ptr; |
| }; |
| |
| struct efab_mac_operations { |
| int ( * init ) ( struct efab_nic *efab ); |
| }; |
| |
| struct efab_phy_operations { |
| int ( * init ) ( struct efab_nic *efab ); |
| unsigned int mmds; |
| }; |
| |
| struct efab_board_operations { |
| int ( * init ) ( struct efab_nic *efab ); |
| void ( * fini ) ( struct efab_nic *efab ); |
| }; |
| |
| struct efab_nic { |
| struct net_device *netdev; |
| int pci_revision; |
| int is_asic; |
| |
| /* I2C bit-bashed interface */ |
| struct i2c_bit_basher i2c_bb; |
| |
| /** SPI bus and devices, and the user visible NVO area */ |
| struct spi_bus spi_bus; |
| struct spi_device spi_flash; |
| struct spi_device spi_eeprom; |
| struct spi_device *spi; |
| struct nvo_block nvo; |
| |
| /** Board, MAC, and PHY operations tables */ |
| struct efab_board_operations *board_op; |
| struct efab_mac_operations *mac_op; |
| struct efab_phy_operations *phy_op; |
| |
| /* PHY and board types */ |
| int phy_addr; |
| int phy_type; |
| int phy_10g; |
| int board_type; |
| |
| /** Memory and IO base */ |
| void *membase; |
| unsigned int iobase; |
| |
| /* Buffer table allocation head */ |
| int buffer_head; |
| |
| /* Queues */ |
| struct efab_rx_queue rx_queue; |
| struct efab_tx_queue tx_queue; |
| struct efab_ev_queue ev_queue; |
| |
| /** MAC address */ |
| uint8_t mac_addr[ETH_ALEN]; |
| /** GMII link options */ |
| unsigned int link_options; |
| /** Link status */ |
| int link_up; |
| |
| /** INT_REG_KER */ |
| efab_oword_t int_ker __attribute__ (( aligned ( 16 ) )); |
| }; |
| #endif /* EFAB_NIC_H */ |
| |