Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / drivers / net / netfront.h
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 );
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 8
20
21 /** Grant reference indices */
22 enum netfront_ref_index {
23         /** Transmit ring grant reference index */
24         NETFRONT_REF_TX_RING = 0,
25         /** Transmit descriptor grant reference base index */
26         NETFRONT_REF_TX_BASE,
27         /** Receive ring grant reference index */
28         NETFRONT_REF_RX_RING = ( NETFRONT_REF_TX_BASE + NETFRONT_NUM_TX_DESC ),
29         /** Receive descriptor grant reference base index */
30         NETFRONT_REF_RX_BASE,
31         /** Total number of grant references required */
32         NETFRONT_REF_COUNT = ( NETFRONT_REF_RX_BASE + NETFRONT_NUM_RX_DESC )
33 };
34
35 /** A netfront descriptor ring */
36 struct netfront_ring {
37         /** Shared ring */
38         union {
39                 /** Transmit shared ring */
40                 netif_tx_sring_t *tx;
41                 /** Receive shared ring */
42                 netif_rx_sring_t *rx;
43                 /** Raw pointer */
44                 void *raw;
45         } sring;
46         /** Shared ring grant reference key */
47         const char *ref_key;
48         /** Shared ring grant reference */
49         grant_ref_t ref;
50
51         /** Maximum number of used descriptors */
52         size_t count;
53         /** I/O buffers, indexed by buffer ID */
54         struct io_buffer **iobufs;
55         /** I/O buffer grant references, indexed by buffer ID */
56         grant_ref_t *refs;
57
58         /** Buffer ID ring */
59         uint8_t *ids;
60         /** Buffer ID ring producer counter */
61         unsigned int id_prod;
62         /** Buffer ID ring consumer counter */
63         unsigned int id_cons;
64 };
65
66 /**
67  * Initialise descriptor ring
68  *
69  * @v ring              Descriptor ring
70  * @v ref_key           Shared ring grant reference key
71  * @v ref               Shared ring grant reference
72  * @v count             Maxium number of used descriptors
73  * @v iobufs            I/O buffers
74  * @v refs              I/O buffer grant references
75  * @v ids               Buffer IDs
76  */
77 static inline __attribute__ (( always_inline )) void
78 netfront_init_ring ( struct netfront_ring *ring, const char *ref_key,
79                      grant_ref_t ref, unsigned int count,
80                      struct io_buffer **iobufs, grant_ref_t *refs,
81                      uint8_t *ids ) {
82
83         ring->ref_key = ref_key;
84         ring->ref = ref;
85         ring->count = count;
86         ring->iobufs = iobufs;
87         ring->refs = refs;
88         ring->ids = ids;
89 }
90
91 /**
92  * Check whether or not descriptor ring is full
93  *
94  * @v ring              Descriptor ring
95  * @v is_full           Ring is full
96  */
97 static inline __attribute__ (( always_inline )) int
98 netfront_ring_is_full ( struct netfront_ring *ring ) {
99         unsigned int fill_level;
100
101         fill_level = ( ring->id_prod - ring->id_cons );
102         assert ( fill_level <= ring->count );
103         return ( fill_level >= ring->count );
104 }
105
106 /**
107  * Check whether or not descriptor ring is empty
108  *
109  * @v ring              Descriptor ring
110  * @v is_empty          Ring is empty
111  */
112 static inline __attribute__ (( always_inline )) int
113 netfront_ring_is_empty ( struct netfront_ring *ring ) {
114
115         return ( ring->id_prod == ring->id_cons );
116 }
117
118 /** A netfront NIC */
119 struct netfront_nic {
120         /** Xen device */
121         struct xen_device *xendev;
122         /** Grant references */
123         grant_ref_t refs[NETFRONT_REF_COUNT];
124
125         /** Transmit ring */
126         struct netfront_ring tx;
127         /** Transmit front ring */
128         netif_tx_front_ring_t tx_fring;
129         /** Transmit I/O buffers */
130         struct io_buffer *tx_iobufs[NETFRONT_NUM_TX_DESC];
131         /** Transmit I/O buffer IDs */
132         uint8_t tx_ids[NETFRONT_NUM_TX_DESC];
133
134         /** Receive ring */
135         struct netfront_ring rx;
136         /** Receive front ring */
137         netif_rx_front_ring_t rx_fring;
138         /** Receive I/O buffers */
139         struct io_buffer *rx_iobufs[NETFRONT_NUM_RX_DESC];
140         /** Receive I/O buffer IDs */
141         uint8_t rx_ids[NETFRONT_NUM_RX_DESC];
142
143         /** Event channel */
144         struct evtchn_send event;
145 };
146
147 /** Transmit shared ring field */
148 #define tx_sring tx.sring.tx
149
150 /** Receive shared ring field */
151 #define rx_sring rx.sring.rx
152
153 #endif /* _NETFRONT_H */