You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

netfront.h 4.4KB

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