1 #ifndef _NETFRONT_H
2 #define _NETFRONT_H
3 
4 /** @file
5  *
6  * Xen netfront driver
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 
12 #include <ipxe/xen.h>
13 #include <xen/io/netif.h>
14 
15 /** Number of transmit ring entries */
16 #define NETFRONT_NUM_TX_DESC 16
17 
18 /** Number of receive ring entries */
19 #define NETFRONT_NUM_RX_DESC 32
20 
21 /** Receive ring fill level
22  *
23  * The xen-netback driver from kernels 3.18 to 4.2 inclusive have a
24  * bug (CA-163395) which prevents packet reception if fewer than 18
25  * receive descriptors are available.  This was fixed in upstream
26  * kernel commit d5d4852 ("xen-netback: require fewer guest Rx slots
27  * when not using GSO").
28  *
29  * We provide 18 receive descriptors to avoid unpleasant silent
30  * failures on these kernel versions.
31  */
32 #define NETFRONT_RX_FILL 18
33 
34 /** Grant reference indices */
35 enum netfront_ref_index {
36 	/** Transmit ring grant reference index */
37 	NETFRONT_REF_TX_RING = 0,
38 	/** Transmit descriptor grant reference base index */
39 	NETFRONT_REF_TX_BASE,
40 	/** Receive ring grant reference index */
41 	NETFRONT_REF_RX_RING = ( NETFRONT_REF_TX_BASE + NETFRONT_NUM_TX_DESC ),
42 	/** Receive descriptor grant reference base index */
43 	NETFRONT_REF_RX_BASE,
44 	/** Total number of grant references required */
45 	NETFRONT_REF_COUNT = ( NETFRONT_REF_RX_BASE + NETFRONT_NUM_RX_DESC )
46 };
47 
48 /** A netfront descriptor ring */
49 struct netfront_ring {
50 	/** Shared ring */
51 	union {
52 		/** Transmit shared ring */
53 		netif_tx_sring_t *tx;
54 		/** Receive shared ring */
55 		netif_rx_sring_t *rx;
56 		/** Raw pointer */
57 		void *raw;
58 	} sring;
59 	/** Shared ring grant reference key */
60 	const char *ref_key;
61 	/** Shared ring grant reference */
62 	grant_ref_t ref;
63 
64 	/** Maximum number of used descriptors */
65 	size_t count;
66 	/** I/O buffers, indexed by buffer ID */
67 	struct io_buffer **iobufs;
68 	/** I/O buffer grant references, indexed by buffer ID */
69 	grant_ref_t *refs;
70 
71 	/** Buffer ID ring */
72 	uint8_t *ids;
73 	/** Buffer ID ring producer counter */
74 	unsigned int id_prod;
75 	/** Buffer ID ring consumer counter */
76 	unsigned int id_cons;
77 };
78 
79 /**
80  * Initialise descriptor ring
81  *
82  * @v ring		Descriptor ring
83  * @v ref_key		Shared ring grant reference key
84  * @v ref		Shared ring grant reference
85  * @v count		Maxium number of used descriptors
86  * @v iobufs		I/O buffers
87  * @v refs		I/O buffer grant references
88  * @v ids		Buffer IDs
89  */
90 static inline __attribute__ (( always_inline )) void
netfront_init_ring(struct netfront_ring * ring,const char * ref_key,grant_ref_t ref,unsigned int count,struct io_buffer ** iobufs,grant_ref_t * refs,uint8_t * ids)91 netfront_init_ring ( struct netfront_ring *ring, const char *ref_key,
92 		     grant_ref_t ref, unsigned int count,
93 		     struct io_buffer **iobufs, grant_ref_t *refs,
94 		     uint8_t *ids ) {
95 
96 	ring->ref_key = ref_key;
97 	ring->ref = ref;
98 	ring->count = count;
99 	ring->iobufs = iobufs;
100 	ring->refs = refs;
101 	ring->ids = ids;
102 }
103 
104 /**
105  * Calculate descriptor ring fill level
106  *
107  * @v ring		Descriptor ring
108  * @v fill		Fill level
109  */
110 static inline __attribute__ (( always_inline )) unsigned int
netfront_ring_fill(struct netfront_ring * ring)111 netfront_ring_fill ( struct netfront_ring *ring ) {
112 	unsigned int fill_level;
113 
114 	fill_level = ( ring->id_prod - ring->id_cons );
115 	assert ( fill_level <= ring->count );
116 	return fill_level;
117 }
118 
119 /**
120  * Check whether or not descriptor ring is full
121  *
122  * @v ring		Descriptor ring
123  * @v is_full		Ring is full
124  */
125 static inline __attribute__ (( always_inline )) int
netfront_ring_is_full(struct netfront_ring * ring)126 netfront_ring_is_full ( struct netfront_ring *ring ) {
127 
128 	return ( netfront_ring_fill ( ring ) >= ring->count );
129 }
130 
131 /**
132  * Check whether or not descriptor ring is empty
133  *
134  * @v ring		Descriptor ring
135  * @v is_empty		Ring is empty
136  */
137 static inline __attribute__ (( always_inline )) int
netfront_ring_is_empty(struct netfront_ring * ring)138 netfront_ring_is_empty ( struct netfront_ring *ring ) {
139 
140 	return ( netfront_ring_fill ( ring ) == 0 );
141 }
142 
143 /** A netfront NIC */
144 struct netfront_nic {
145 	/** Xen device */
146 	struct xen_device *xendev;
147 	/** Grant references */
148 	grant_ref_t refs[NETFRONT_REF_COUNT];
149 
150 	/** Transmit ring */
151 	struct netfront_ring tx;
152 	/** Transmit front ring */
153 	netif_tx_front_ring_t tx_fring;
154 	/** Transmit I/O buffers */
155 	struct io_buffer *tx_iobufs[NETFRONT_NUM_TX_DESC];
156 	/** Transmit I/O buffer IDs */
157 	uint8_t tx_ids[NETFRONT_NUM_TX_DESC];
158 
159 	/** Receive ring */
160 	struct netfront_ring rx;
161 	/** Receive front ring */
162 	netif_rx_front_ring_t rx_fring;
163 	/** Receive I/O buffers */
164 	struct io_buffer *rx_iobufs[NETFRONT_NUM_RX_DESC];
165 	/** Receive I/O buffer IDs */
166 	uint8_t rx_ids[NETFRONT_NUM_RX_DESC];
167 
168 	/** Event channel */
169 	struct evtchn_send event;
170 };
171 
172 /** Transmit shared ring field */
173 #define tx_sring tx.sring.tx
174 
175 /** Receive shared ring field */
176 #define rx_sring rx.sring.rx
177 
178 #endif /* _NETFRONT_H */
179