10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
13 #include <xen/io/netif.h>
15 /** Number of transmit ring entries */
16 #define NETFRONT_NUM_TX_DESC 16
18 /** Number of receive ring entries */
19 #define NETFRONT_NUM_RX_DESC 8
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 */
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 */
31 /** Total number of grant references required */
32 NETFRONT_REF_COUNT = ( NETFRONT_REF_RX_BASE + NETFRONT_NUM_RX_DESC )
35 /** A netfront descriptor ring */
36 struct netfront_ring {
39 /** Transmit shared ring */
41 /** Receive shared ring */
46 /** Shared ring grant reference key */
48 /** Shared ring grant reference */
51 /** Maximum number of used descriptors */
53 /** I/O buffers, indexed by buffer ID */
54 struct io_buffer **iobufs;
55 /** I/O buffer grant references, indexed by buffer ID */
60 /** Buffer ID ring producer counter */
62 /** Buffer ID ring consumer counter */
67 * Initialise descriptor ring
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
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,
83 ring->ref_key = ref_key;
86 ring->iobufs = iobufs;
92 * Check whether or not descriptor ring is full
94 * @v ring Descriptor ring
95 * @v is_full Ring is full
97 static inline __attribute__ (( always_inline )) int
98 netfront_ring_is_full ( struct netfront_ring *ring ) {
99 unsigned int fill_level;
101 fill_level = ( ring->id_prod - ring->id_cons );
102 assert ( fill_level <= ring->count );
103 return ( fill_level >= ring->count );
107 * Check whether or not descriptor ring is empty
109 * @v ring Descriptor ring
110 * @v is_empty Ring is empty
112 static inline __attribute__ (( always_inline )) int
113 netfront_ring_is_empty ( struct netfront_ring *ring ) {
115 return ( ring->id_prod == ring->id_cons );
118 /** A netfront NIC */
119 struct netfront_nic {
121 struct xen_device *xendev;
122 /** Grant references */
123 grant_ref_t refs[NETFRONT_REF_COUNT];
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];
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];
144 struct evtchn_send event;
147 /** Transmit shared ring field */
148 #define tx_sring tx.sring.tx
150 /** Receive shared ring field */
151 #define rx_sring rx.sring.rx
153 #endif /* _NETFRONT_H */