|
|
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.