iPXE
rdc.h
Go to the documentation of this file.
1 #ifndef _RDC_H
2 #define _RDC_H
3 
4 /** @file
5  *
6  * RDC R6040 network driver
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 
12 #include <stdint.h>
13 #include <ipxe/if_ether.h>
14 #include <ipxe/mii.h>
15 
16 /** RDC BAR size */
17 #define RDC_BAR_SIZE 256
18 
19 /** An RDC descriptor */
21  /** Flags */
23  /** Length */
25  /** Address */
27  /** Next descriptor */
29  /** Reserved */
31 } __attribute__ (( packed ));
32 
33 /** Descriptor is owned by NIC */
34 #define RDC_FL_OWNED 0x8000
35 
36 /** Packet OK */
37 #define RDC_FL_OK 0x4000
38 
39 /** MAC control register 0 */
40 #define RDC_MCR0 0x00
41 #define RDC_MCR0_FD 0x8000 /**< Full duplex */
42 #define RDC_MCR0_TXEN 0x1000 /**< Transmit enable */
43 #define RDC_MCR0_PROMISC 0x0020 /**< Promiscuous mode */
44 #define RDC_MCR0_RXEN 0x0002 /**< Receive enable */
45 
46 /** MAC control register 1 */
47 #define RDC_MCR1 0x04
48 #define RDC_MCR1_RST 0x0001 /**< MAC reset */
49 
50 /** Maximum time to wait for reset */
51 #define RDC_RESET_MAX_WAIT_MS 10
52 
53 /** MAC transmit poll command register */
54 #define RDC_MTPR 0x14
55 #define RDC_MTPR_TM2TX 0x0001 /**< Trigger MAC to transmit */
56 
57 /** MAC receive buffer size register */
58 #define RDC_MRBSR 0x18
59 
60 /** MAC MDIO control register */
61 #define RDC_MMDIO 0x20
62 #define RDC_MMDIO_MIIWR 0x4000 /**< MDIO write */
63 #define RDC_MMDIO_MIIRD 0x2000 /**< MDIO read */
64 #define RDC_MMDIO_PHYAD(x) ( (x) << 8 ) /**< PHY address */
65 #define RDC_MMDIO_REGAD(x) ( (x) << 0 ) /**< Register address */
66 
67 /** Maximum time to wait for an MII read or write */
68 #define RDC_MII_MAX_WAIT_US 2048
69 
70 /** MAC MDIO read data register */
71 #define RDC_MMRD 0x24
72 
73 /** MAC MDIO write data register */
74 #define RDC_MMWD 0x28
75 
76 /** MAC transmit descriptor start address */
77 #define RDC_MTDSA 0x2c
78 
79 /** MAC receive descriptor start address */
80 #define RDC_MRDSA 0x34
81 
82 /** MAC descriptor start address low half */
83 #define RDC_MxDSA_LO 0x0
84 
85 /** MAC descriptor start address low half */
86 #define RDC_MxDSA_HI 0x4
87 
88 /** MAC interrupt status register */
89 #define RDC_MISR 0x3c
90 #define RDC_MIRQ_LINK 0x0200 /**< Link status changed */
91 #define RDC_MIRQ_TX 0x0010 /**< Transmit complete */
92 #define RDC_MIRQ_RX_EARLY 0x0008 /**< Receive early interrupt */
93 #define RDC_MIRQ_RX_EMPTY 0x0002 /**< Receive descriptor unavailable */
94 #define RDC_MIRQ_RX 0x0001 /**< Receive complete */
95 
96 /** MAC interrupt enable register */
97 #define RDC_MIER 0x40
98 
99 /** MAC address word 0 */
100 #define RDC_MID0 0x68
101 
102 /** MAC address word 1 */
103 #define RDC_MID1 0x6a
104 
105 /** MAC address word 2 */
106 #define RDC_MID2 0x6c
107 
108 /** MAC PHY status change configuration register */
109 #define RDC_MPSCCR 0x88
110 #define RDC_MPSCCR_EN 0x8000 /**< PHY status change enable */
111 #define RDC_MPSCCR_PHYAD(x) ( (x) << 8 ) /**< PHY address */
112 #define RDC_MPSCCR_SLOW 0x0007 /**< Poll slowly */
113 
114 /** MAC state machine register */
115 #define RDC_MACSM 0xac
116 #define RDC_MACSM_RST 0x0002 /**< Reset state machine */
117 
118 /** Time to wait after resetting MAC state machine */
119 #define RDC_MACSM_RESET_DELAY_MS 10
120 
121 /** A MAC address */
122 union rdc_mac {
123  /** Raw bytes */
125  /** MIDx registers */
127 };
128 
129 /** A descriptor ring */
130 struct rdc_ring {
131  /** Descriptors */
133  /** Descriptor ring DMA mapping */
134  struct dma_mapping map;
135  /** Producer index */
136  unsigned int prod;
137  /** Consumer index */
138  unsigned int cons;
139 
140  /** Number of descriptors */
141  unsigned int count;
142  /** Start address register 0 */
143  unsigned int reg;
144 };
145 
146 /**
147  * Initialise descriptor ring
148  *
149  * @v ring Descriptor ring
150  * @v count Number of descriptors
151  * @v reg Start address register 0
152  */
153 static inline __attribute__ (( always_inline )) void
154 rdc_init_ring ( struct rdc_ring *ring, unsigned int count, unsigned int reg ) {
155 
156  ring->count = count;
157  ring->reg = reg;
158 }
159 
160 /** Number of transmit descriptors
161  *
162  * This is a policy decision.
163  */
164 #define RDC_NUM_TX_DESC 16
165 
166 /** Number of receive descriptors
167  *
168  * This is a policy decision.
169  */
170 #define RDC_NUM_RX_DESC 8
171 
172 /** Receive buffer length */
173 #define RDC_RX_MAX_LEN ( ETH_FRAME_LEN + 4 /* VLAN */ + 4 /* CRC */ )
174 
175 /** An RDC network card */
176 struct rdc_nic {
177  /** Registers */
178  void *regs;
179  /** DMA device */
180  struct dma_device *dma;
181  /** MII interface */
183  /** MII device */
184  struct mii_device mii;
185 
186  /** Transmit descriptor ring */
187  struct rdc_ring tx;
188  /** Receive descriptor ring */
189  struct rdc_ring rx;
190  /** Receive I/O buffers */
192 };
193 
194 #endif /* _RDC_H */
#define __attribute__(x)
Definition: compiler.h:10
unsigned short uint16_t
Definition: stdint.h:11
uint16_t flags
Flags.
Definition: rdc.h:22
static unsigned int unsigned int reg
Definition: myson.h:162
static void rdc_init_ring(struct rdc_ring *ring, unsigned int count, unsigned int reg)
Initialise descriptor ring.
Definition: rdc.h:154
An RDC network card.
Definition: rdc.h:176
struct rdc_ring rx
Receive descriptor ring.
Definition: rdc.h:189
An RDC descriptor.
Definition: rdc.h:20
struct dma_mapping map
Descriptor ring DMA mapping.
Definition: rdc.h:134
An MII device.
Definition: mii.h:49
struct rdc_ring tx
Transmit descriptor ring.
Definition: rdc.h:187
uint16_t len
Length.
Definition: rdc.h:24
unsigned int prod
Producer index.
Definition: rdc.h:136
struct io_buffer * rx_iobuf[RDC_NUM_RX_DESC]
Receive I/O buffers.
Definition: rdc.h:191
uint16_t mid[ETH_ALEN/2]
MIDx registers.
Definition: rdc.h:126
unsigned int reg
Start address register 0.
Definition: rdc.h:143
#define RDC_NUM_RX_DESC
Number of receive descriptors.
Definition: rdc.h:170
uint32_t addr
Address.
Definition: rdc.h:26
unsigned int cons
Consumer index.
Definition: rdc.h:138
uint32_t reserved
Reserved.
Definition: rdc.h:30
Media Independent Interface.
unsigned char uint8_t
Definition: stdint.h:10
struct dma_device * dma
DMA device.
Definition: rdc.h:180
struct mii_interface mdio
MII interface.
Definition: rdc.h:182
#define ETH_ALEN
Definition: if_ether.h:8
uint32_t next
Next descriptor.
Definition: rdc.h:28
unsigned int uint32_t
Definition: stdint.h:12
A descriptor ring.
Definition: rdc.h:130
A MAC address.
Definition: rdc.h:122
unsigned int count
Number of descriptors.
Definition: rdc.h:141
uint16_t count
Number of entries.
Definition: ena.h:22
An MII interface.
Definition: mii.h:43
struct rdc_descriptor * desc
Descriptors.
Definition: rdc.h:132
A DMA mapping.
Definition: dma.h:32
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
void * regs
Registers.
Definition: rdc.h:178
struct mii_device mii
MII device.
Definition: rdc.h:184
A DMA-capable device.
Definition: dma.h:47
A persistent I/O buffer.
Definition: iobuf.h:33
uint8_t raw[ETH_ALEN]
Raw bytes.
Definition: rdc.h:124