|
|
1.1 ! root 1: /************************************************************************** ! 2: * ! 3: * Etherboot driver for Level 5 Etherfabric network cards ! 4: * ! 5: * Written by Michael Brown <[email protected]> ! 6: * ! 7: * Copyright Fen Systems Ltd. 2005 ! 8: * Copyright Level 5 Networks Inc. 2005 ! 9: * ! 10: * This software may be used and distributed according to the terms of ! 11: * the GNU General Public License (GPL), incorporated herein by ! 12: * reference. Drivers based on or derived from this code fall under ! 13: * the GPL and must retain the authorship, copyright and license ! 14: * notice. ! 15: * ! 16: ************************************************************************** ! 17: */ ! 18: ! 19: FILE_LICENCE ( GPL_ANY ); ! 20: ! 21: #ifndef EFAB_NIC_H ! 22: #define EFAB_NIC_H ! 23: #include <ipxe/bitbash.h> ! 24: #include <ipxe/i2c.h> ! 25: #include <ipxe/spi.h> ! 26: #include <ipxe/nvo.h> ! 27: #include <ipxe/if_ether.h> ! 28: /************************************************************************** ! 29: * ! 30: * Constants and macros ! 31: * ! 32: ************************************************************************** ! 33: */ ! 34: /* Board IDs. Early boards have no board_type, (e.g. EF1002 and 401/403) ! 35: * But newer boards are getting bigger... ! 36: */ ! 37: typedef enum { ! 38: EFAB_BOARD_INVALID = 0, /* Early boards do not have board rev. info. */ ! 39: EFAB_BOARD_SFE4001 = 1, ! 40: EFAB_BOARD_SFE4002 = 2, ! 41: EFAB_BOARD_SFE4003 = 3, ! 42: /* Insert new types before here */ ! 43: EFAB_BOARD_MAX ! 44: } efab_board_type; ! 45: ! 46: /* PHY types. */ ! 47: typedef enum { ! 48: PHY_TYPE_AUTO = 0, /* on development board detect between CX4 & alaska */ ! 49: PHY_TYPE_CX4_RTMR = 1, ! 50: PHY_TYPE_1GIG_ALASKA = 2, ! 51: PHY_TYPE_10XPRESS = 3, ! 52: PHY_TYPE_XFP = 4, ! 53: PHY_TYPE_CX4 = 5, ! 54: PHY_TYPE_PM8358 = 6, ! 55: } phy_type_t; ! 56: ! 57: /************************************************************************** ! 58: * ! 59: * Hardware data structures and sizing ! 60: * ! 61: ************************************************************************** ! 62: */ ! 63: ! 64: #define dma_addr_t unsigned long ! 65: typedef efab_qword_t falcon_rx_desc_t; ! 66: typedef efab_qword_t falcon_tx_desc_t; ! 67: typedef efab_qword_t falcon_event_t; ! 68: ! 69: #define EFAB_BUF_ALIGN 4096 ! 70: #define EFAB_RXD_SIZE 512 ! 71: #define EFAB_TXD_SIZE 512 ! 72: #define EFAB_EVQ_SIZE 512 ! 73: ! 74: #define EFAB_NUM_RX_DESC 16 ! 75: #define EFAB_RX_BUF_SIZE 1600 ! 76: ! 77: /************************************************************************** ! 78: * ! 79: * Data structures ! 80: * ! 81: ************************************************************************** ! 82: */ ! 83: ! 84: struct efab_nic; ! 85: ! 86: /* A buffer table allocation backing a tx dma, rx dma or eventq */ ! 87: struct efab_special_buffer { ! 88: dma_addr_t dma_addr; ! 89: int id; ! 90: }; ! 91: ! 92: /* A TX queue */ ! 93: struct efab_tx_queue { ! 94: /* The hardware ring */ ! 95: falcon_tx_desc_t *ring; ! 96: ! 97: /* The software ring storing io_buffers. */ ! 98: struct io_buffer *buf[EFAB_TXD_SIZE]; ! 99: ! 100: /* The buffer table reservation pushed to hardware */ ! 101: struct efab_special_buffer entry; ! 102: ! 103: /* Software descriptor write ptr */ ! 104: unsigned int write_ptr; ! 105: ! 106: /* Hardware descriptor read ptr */ ! 107: unsigned int read_ptr; ! 108: }; ! 109: ! 110: /* An RX queue */ ! 111: struct efab_rx_queue { ! 112: /* The hardware ring */ ! 113: falcon_rx_desc_t *ring; ! 114: ! 115: /* The software ring storing io_buffers */ ! 116: struct io_buffer *buf[EFAB_NUM_RX_DESC]; ! 117: ! 118: /* The buffer table reservation pushed to hardware */ ! 119: struct efab_special_buffer entry; ! 120: ! 121: /* Descriptor write ptr, into both the hardware and software rings */ ! 122: unsigned int write_ptr; ! 123: ! 124: /* Hardware completion ptr */ ! 125: unsigned int read_ptr; ! 126: }; ! 127: ! 128: /* An event queue */ ! 129: struct efab_ev_queue { ! 130: /* The hardware ring to push to hardware. ! 131: * Must be the first entry in the structure */ ! 132: falcon_event_t *ring; ! 133: ! 134: /* The buffer table reservation pushed to hardware */ ! 135: struct efab_special_buffer entry; ! 136: ! 137: /* Pointers into the ring */ ! 138: unsigned int read_ptr; ! 139: }; ! 140: ! 141: struct efab_mac_operations { ! 142: int ( * init ) ( struct efab_nic *efab ); ! 143: }; ! 144: ! 145: struct efab_phy_operations { ! 146: int ( * init ) ( struct efab_nic *efab ); ! 147: unsigned int mmds; ! 148: }; ! 149: ! 150: struct efab_board_operations { ! 151: int ( * init ) ( struct efab_nic *efab ); ! 152: void ( * fini ) ( struct efab_nic *efab ); ! 153: }; ! 154: ! 155: struct efab_nic { ! 156: struct net_device *netdev; ! 157: int pci_revision; ! 158: int is_asic; ! 159: ! 160: /* I2C bit-bashed interface */ ! 161: struct i2c_bit_basher i2c_bb; ! 162: ! 163: /** SPI bus and devices, and the user visible NVO area */ ! 164: struct spi_bus spi_bus; ! 165: struct spi_device spi_flash; ! 166: struct spi_device spi_eeprom; ! 167: struct spi_device *spi; ! 168: struct nvo_block nvo; ! 169: ! 170: /** Board, MAC, and PHY operations tables */ ! 171: struct efab_board_operations *board_op; ! 172: struct efab_mac_operations *mac_op; ! 173: struct efab_phy_operations *phy_op; ! 174: ! 175: /* PHY and board types */ ! 176: int phy_addr; ! 177: int phy_type; ! 178: int phy_10g; ! 179: int board_type; ! 180: ! 181: /** Memory and IO base */ ! 182: void *membase; ! 183: unsigned int iobase; ! 184: ! 185: /* Buffer table allocation head */ ! 186: int buffer_head; ! 187: ! 188: /* Queues */ ! 189: struct efab_rx_queue rx_queue; ! 190: struct efab_tx_queue tx_queue; ! 191: struct efab_ev_queue ev_queue; ! 192: ! 193: /** MAC address */ ! 194: uint8_t mac_addr[ETH_ALEN]; ! 195: /** GMII link options */ ! 196: unsigned int link_options; ! 197: /** Link status */ ! 198: int link_up; ! 199: ! 200: /** INT_REG_KER */ ! 201: efab_oword_t int_ker __attribute__ (( aligned ( 16 ) )); ! 202: }; ! 203: #endif /* EFAB_NIC_H */ ! 204:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.