source: bootcd/isolinux/syslinux-6.03/gpxe/src/drivers/net/etherfabric_nic.h

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 4.9 KB
Line 
1/**************************************************************************
2 *
3 * Etherboot driver for Level 5 Etherfabric network cards
4 *
5 * Written by Michael Brown <mbrown@fensystems.co.uk>
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
19FILE_LICENCE ( GPL_ANY );
20
21#ifndef EFAB_NIC_H
22#define  EFAB_NIC_H
23#include <gpxe/bitbash.h>
24#include <gpxe/i2c.h>
25#include <gpxe/spi.h>
26#include <gpxe/nvo.h>
27#include <gpxe/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 */
37typedef 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. */
47typedef 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
65typedef efab_qword_t falcon_rx_desc_t;
66typedef efab_qword_t falcon_tx_desc_t;
67typedef 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
84struct efab_nic;
85
86/* A buffer table allocation backing a tx dma, rx dma or eventq */
87struct efab_special_buffer {
88        dma_addr_t dma_addr;
89        int id;
90};
91
92/* A TX queue */
93struct 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 */
111struct 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 */
129struct 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
141struct efab_mac_operations {
142        int ( * init ) ( struct efab_nic *efab );
143};
144
145struct efab_phy_operations {
146        int ( * init ) ( struct efab_nic *efab );
147        unsigned int mmds;
148};
149
150struct efab_board_operations {
151        int ( * init ) ( struct efab_nic *efab );
152        void ( * fini ) ( struct efab_nic *efab );
153};
154
155struct 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
Note: See TracBrowser for help on using the repository browser.