iPXE
icplus.h
Go to the documentation of this file.
1#ifndef _ICPLUS_H
2#define _ICPLUS_H
3
4/** @file
5 *
6 * IC+ network driver
7 *
8 */
9
10#include <ipxe/nvs.h>
11#include <ipxe/mii_bit.h>
12
13FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
14
15/** BAR size */
16#define ICP_BAR_SIZE 0x200
17
18/** Alignment requirement */
19#define ICP_ALIGN 0x8
20
21/** Base address low register offset */
22#define ICP_BASE_LO 0x0
23
24/** Base address high register offset */
25#define ICP_BASE_HI 0x4
26
27/** ASIC control register (double word) */
28#define ICP_ASICCTRL 0x30
29#define ICP_ASICCTRL_PHYSPEED1000 0x00000040UL /**< PHY speed 1000 */
30#define ICP_ASICCTRL_GLOBALRESET 0x00010000UL /**< Global reset */
31#define ICP_ASICCTRL_DMA 0x00080000UL /**< DMA */
32#define ICP_ASICCTRL_FIFO 0x00100000UL /**< FIFO */
33#define ICP_ASICCTRL_NETWORK 0x00200000UL /**< Network */
34#define ICP_ASICCTRL_HOST 0x00400000UL /**< Host */
35#define ICP_ASICCTRL_AUTOINIT 0x00800000UL /**< Auto init */
36#define ICP_ASICCTRL_RESETBUSY 0x04000000UL /**< Reset busy */
37
38/** Maximum time to wait for reset */
39#define ICP_RESET_MAX_WAIT_MS 1000
40
41/** DMA control register (word/double word) */
42#define ICP_DMACTRL 0x00
43#define ICP_DMACTRL_RXPOLLNOW 0x0010 /**< Receive poll now */
44#define ICP_DMACTRL_TXPOLLNOW 0x1000 /**< Transmit poll now */
45
46/** EEPROM control register (word) */
47#define ICP_EEPROMCTRL 0x4a
48#define ICP_EEPROMCTRL_ADDRESS( x ) ( (x) << 0 ) /**< Address */
49#define ICP_EEPROMCTRL_OPCODE( x ) ( (x) << 8 ) /**< Opcode */
50#define ICP_EEPROMCTRL_OPCODE_READ \
51 ICP_EEPROMCTRL_OPCODE ( 2 ) /**< Read register */
52#define ICP_EEPROMCTRL_BUSY 0x8000 /**< EEPROM busy */
53
54/** Maximum time to wait for reading EEPROM */
55#define ICP_EEPROM_MAX_WAIT_MS 1000
56
57/** EEPROM word length */
58#define ICP_EEPROM_WORD_LEN_LOG2 1
59
60/** Minimum EEPROM size, in words */
61#define ICP_EEPROM_MIN_SIZE_WORDS 0x20
62
63/** Address of MAC address within EEPROM */
64#define ICP_EEPROM_MAC 0x10
65
66/** EEPROM data register (word) */
67#define ICP_EEPROMDATA 0x48
68
69/** Interupt status register (word) */
70#define ICP_INTSTATUS 0x5e
71#define ICP_INTSTATUS_TXCOMPLETE 0x0004 /**< TX complete */
72#define ICP_INTSTATUS_LINKEVENT 0x0100 /**< Link event */
73#define ICP_INTSTATUS_RXDMACOMPLETE 0x0400 /**< RX DMA complete */
74
75/** MAC control register (double word) */
76#define ICP_MACCTRL 0x6c
77#define ICP_MACCTRL_DUPLEX 0x00000020UL /**< Duplex select */
78#define ICP_MACCTRL_TXENABLE 0x01000000UL /**< TX enable */
79#define ICP_MACCTRL_TXDISABLE 0x02000000UL /**< TX disable */
80#define ICP_MACCTRL_RXENABLE 0x08000000UL /**< RX enable */
81#define ICP_MACCTRL_RXDISABLE 0x10000000UL /**< RX disable */
82
83/** PHY control register (byte) */
84#define ICP_PHYCTRL 0x76
85#define ICP_PHYCTRL_MGMTCLK 0x01 /**< Management clock */
86#define ICP_PHYCTRL_MGMTDATA 0x02 /**< Management data */
87#define ICP_PHYCTRL_MGMTDIR 0x04 /**< Management direction */
88#define ICP_PHYCTRL_LINKSPEED 0xc0 /**< Link speed */
89
90/** Receive mode register (word) */
91#define ICP_RXMODE 0x88
92#define ICP_RXMODE_UNICAST 0x0001 /**< Receive unicast */
93#define ICP_RXMODE_MULTICAST 0x0002 /**< Receice multicast */
94#define ICP_RXMODE_BROADCAST 0x0004 /**< Receive broadcast */
95#define ICP_RXMODE_ALLFRAMES 0x0008 /**< Receive all frames */
96
97/** List pointer receive register */
98#define ICP_RFDLISTPTR 0x1c
99
100/** List pointer transmit register */
101#define ICP_TFDLISTPTR 0x10
102
103/** Transmit status register */
104#define ICP_TXSTATUS 0x60
105#define ICP_TXSTATUS_ERROR 0x00000001UL /**< TX error */
106
107/** Data fragment */
109 /** Address of data */
111 /** Length */
112 struct {
113 /** Reserved */
115 /** Length of data */
117 };
118};
119
120/** Transmit or receive descriptor */
122 /** Address of next descriptor */
124 /** Actual length */
126 /** Flags */
128 /** Control */
130 /** VLAN */
132 /** Reserved */
134 /** Data buffer */
136 /** Reserved */
138};
139
140/** Descriptor complete */
141#define ICP_DONE 0x80
142
143/** Transmit alignment disabled */
144#define ICP_TX_UNALIGN 0x01
145
146/** Request transmit completion */
147#define ICP_TX_INDICATE 0x40
148
149/** Sole transmit fragment */
150#define ICP_TX_SOLE_FRAG 0x01
151
152/** Recieve frame overrun error */
153#define ICP_RX_ERR_OVERRUN 0x01
154
155/** Receive runt frame error */
156#define ICP_RX_ERR_RUNT 0x02
157
158/** Receive alignment error */
159#define ICP_RX_ERR_ALIGN 0x04
160
161/** Receive FCS error */
162#define ICP_RX_ERR_FCS 0x08
163
164/** Receive oversized frame error */
165#define ICP_RX_ERR_OVERSIZED 0x10
166
167/** Recieve length error */
168#define ICP_RX_ERR_LEN 0x20
169
170/** Descriptor ring */
172 /** Producer counter */
173 unsigned int prod;
174 /** Consumer counter */
175 unsigned int cons;
176 /** Ring entries */
178 /* List pointer register */
179 unsigned int listptr;
180};
181
182/** Number of descriptors */
183#define ICP_NUM_DESC 4
184
185/** Maximum receive packet length */
186#define ICP_RX_MAX_LEN ETH_FRAME_LEN
187
188/** An IC+ network card */
190 /** Registers */
191 void *regs;
192 /** EEPROM */
194 /** MII bit bashing interface */
196 /** MII device */
198 /** Transmit descriptor ring */
200 /** Receive descriptor ring */
202 /** Receive I/O buffers */
204};
205
206#endif /* _ICPLUS_H */
unsigned short uint16_t
Definition stdint.h:11
unsigned long long uint64_t
Definition stdint.h:13
unsigned char uint8_t
Definition stdint.h:10
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define ICP_NUM_DESC
Number of descriptors.
Definition icplus.h:183
MII bit-bashing interface.
Non-volatile storage.
Transmit or receive descriptor.
Definition icplus.h:121
uint8_t control
Control.
Definition icplus.h:129
uint8_t flags
Flags.
Definition icplus.h:127
union icplus_fragment data
Data buffer.
Definition icplus.h:135
uint16_t vlan
VLAN.
Definition icplus.h:131
uint16_t reserved_a
Reserved.
Definition icplus.h:133
uint64_t next
Address of next descriptor.
Definition icplus.h:123
uint16_t len
Actual length.
Definition icplus.h:125
uint8_t reserved_b[8]
Reserved.
Definition icplus.h:137
An IC+ network card.
Definition icplus.h:189
void * regs
Registers.
Definition icplus.h:191
struct icplus_ring tx
Transmit descriptor ring.
Definition icplus.h:199
struct icplus_ring rx
Receive descriptor ring.
Definition icplus.h:201
struct mii_bit_basher miibit
MII bit bashing interface.
Definition icplus.h:195
struct io_buffer * rx_iobuf[ICP_NUM_DESC]
Receive I/O buffers.
Definition icplus.h:203
struct mii_device mii
MII device.
Definition icplus.h:197
struct nvs_device eeprom
EEPROM.
Definition icplus.h:193
Descriptor ring.
Definition icplus.h:171
struct icplus_descriptor * entry
Ring entries.
Definition icplus.h:177
unsigned int cons
Consumer counter.
Definition icplus.h:175
unsigned int listptr
Definition icplus.h:179
unsigned int prod
Producer counter.
Definition icplus.h:173
A persistent I/O buffer.
Definition iobuf.h:38
A bit-bashing MII interface.
Definition mii_bit.h:33
An MII device.
Definition mii.h:50
A non-volatile storage device.
Definition nvs.h:16
Data fragment.
Definition icplus.h:108
uint64_t address
Address of data.
Definition icplus.h:110
uint8_t reserved[6]
Reserved.
Definition icplus.h:114
uint16_t len
Length of data.
Definition icplus.h:116