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.

netvsc.h 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. #ifndef _NETVSC_H
  2. #define _NETVSC_H
  3. /** @file
  4. *
  5. * Hyper-V network virtual service client
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. /** Maximum supported NetVSC message length */
  10. #define NETVSC_MTU 512
  11. /** Maximum time to wait for a transaction to complete
  12. *
  13. * This is a policy decision.
  14. */
  15. #define NETVSC_MAX_WAIT_MS 1000
  16. /** Number of transmit ring entries
  17. *
  18. * Must be a power of two. This is a policy decision. This value
  19. * must be sufficiently small to guarantee that we never run out of
  20. * space in the VMBus outbound ring buffer.
  21. */
  22. #define NETVSC_TX_NUM_DESC 32
  23. /** RX data buffer page set ID
  24. *
  25. * This is a policy decision.
  26. */
  27. #define NETVSC_RX_BUF_PAGESET 0xbead
  28. /** RX data buffer length
  29. *
  30. * This is a policy decision.
  31. */
  32. #define NETVSC_RX_BUF_LEN ( 16 * PAGE_SIZE )
  33. /** Base transaction ID
  34. *
  35. * This is a policy decision.
  36. */
  37. #define NETVSC_BASE_XID 0x18ae0000UL
  38. /** Relative transaction IDs */
  39. enum netvsc_xrid {
  40. /** Transmit descriptors (one per transmit buffer ID) */
  41. NETVSC_TX_BASE_XRID = 0,
  42. /** Initialisation */
  43. NETVSC_INIT_XRID = ( NETVSC_TX_BASE_XRID + NETVSC_TX_NUM_DESC ),
  44. /** NDIS version */
  45. NETVSC_NDIS_VERSION_XRID,
  46. /** Establish receive buffer */
  47. NETVSC_RX_ESTABLISH_XRID,
  48. /** Revoke receive buffer */
  49. NETVSC_RX_REVOKE_XRID,
  50. };
  51. /** NetVSC status codes */
  52. enum netvsc_status {
  53. NETVSC_NONE = 0,
  54. NETVSC_OK = 1,
  55. NETVSC_FAIL = 2,
  56. NETVSC_TOO_NEW = 3,
  57. NETVSC_TOO_OLD = 4,
  58. NETVSC_BAD_PACKET = 5,
  59. NETVSC_BUSY = 6,
  60. NETVSC_UNSUPPORTED = 7,
  61. };
  62. /** NetVSC message header */
  63. struct netvsc_header {
  64. /** Type */
  65. uint32_t type;
  66. } __attribute__ (( packed ));
  67. /** NetVSC initialisation message */
  68. #define NETVSC_INIT_MSG 1
  69. /** NetVSC initialisation message */
  70. struct netvsc_init_message {
  71. /** Message header */
  72. struct netvsc_header header;
  73. /** Minimum supported protocol version */
  74. uint32_t min;
  75. /** Maximum supported protocol version */
  76. uint32_t max;
  77. /** Reserved */
  78. uint8_t reserved[20];
  79. } __attribute__ (( packed ));
  80. /** Oldest known NetVSC protocol version */
  81. #define NETVSC_VERSION_1 2 /* sic */
  82. /** NetVSC initialisation completion */
  83. #define NETVSC_INIT_CMPLT 2
  84. /** NetVSC initialisation completion */
  85. struct netvsc_init_completion {
  86. /** Message header */
  87. struct netvsc_header header;
  88. /** Protocol version */
  89. uint32_t version;
  90. /** Maximum memory descriptor list length */
  91. uint32_t max_mdl_len;
  92. /** Status */
  93. uint32_t status;
  94. /** Reserved */
  95. uint8_t reserved[16];
  96. } __attribute__ (( packed ));
  97. /** NetVSC NDIS version message */
  98. #define NETVSC_NDIS_VERSION_MSG 100
  99. /** NetVSC NDIS version message */
  100. struct netvsc_ndis_version_message {
  101. /** Message header */
  102. struct netvsc_header header;
  103. /** Major version */
  104. uint32_t major;
  105. /** Minor version */
  106. uint32_t minor;
  107. /** Reserved */
  108. uint8_t reserved[20];
  109. } __attribute__ (( packed ));
  110. /** NetVSC NDIS major version */
  111. #define NETVSC_NDIS_MAJOR 6
  112. /** NetVSC NDIS minor version */
  113. #define NETVSC_NDIS_MINOR 1
  114. /** NetVSC establish receive data buffer message */
  115. #define NETVSC_RX_ESTABLISH_MSG 101
  116. /** NetVSC establish receive data buffer completion */
  117. #define NETVSC_RX_ESTABLISH_CMPLT 102
  118. /** NetVSC revoke receive data buffer message */
  119. #define NETVSC_RX_REVOKE_MSG 103
  120. /** NetVSC establish transmit data buffer message */
  121. #define NETVSC_TX_ESTABLISH_MSG 104
  122. /** NetVSC establish transmit data buffer completion */
  123. #define NETVSC_TX_ESTABLISH_CMPLT 105
  124. /** NetVSC revoke transmit data buffer message */
  125. #define NETVSC_TX_REVOKE_MSG 106
  126. /** NetVSC establish data buffer message */
  127. struct netvsc_establish_buffer_message {
  128. /** Message header */
  129. struct netvsc_header header;
  130. /** GPADL ID */
  131. uint32_t gpadl;
  132. /** Page set ID */
  133. uint16_t pageset;
  134. /** Reserved */
  135. uint8_t reserved[22];
  136. } __attribute__ (( packed ));
  137. /** NetVSC receive data buffer section */
  138. struct netvsc_rx_buffer_section {
  139. /** Starting offset */
  140. uint32_t start;
  141. /** Subsection length */
  142. uint32_t len;
  143. /** Number of subsections */
  144. uint32_t count;
  145. /** Ending offset */
  146. uint32_t end;
  147. } __attribute__ (( packed ));
  148. /** NetVSC establish receive data buffer completion */
  149. struct netvsc_rx_establish_buffer_completion {
  150. /** Message header */
  151. struct netvsc_header header;
  152. /** Status */
  153. uint32_t status;
  154. /** Number of sections (must be 1) */
  155. uint32_t count;
  156. /** Section descriptors */
  157. struct netvsc_rx_buffer_section section[1];
  158. } __attribute__ (( packed ));
  159. /** NetVSC establish transmit data buffer completion */
  160. struct netvsc_tx_establish_buffer_completion {
  161. /** Message header */
  162. struct netvsc_header header;
  163. /** Status */
  164. uint32_t status;
  165. /** Section length */
  166. uint32_t len;
  167. } __attribute__ (( packed ));
  168. /** NetVSC revoke data buffer message */
  169. struct netvsc_revoke_buffer_message {
  170. /** Message header */
  171. struct netvsc_header header;
  172. /** Page set ID */
  173. uint16_t pageset;
  174. /** Reserved */
  175. uint8_t reserved[26];
  176. } __attribute__ (( packed ));
  177. /** NetVSC RNDIS message */
  178. #define NETVSC_RNDIS_MSG 107
  179. /** NetVSC RNDIS message */
  180. struct netvsc_rndis_message {
  181. /** Message header */
  182. struct netvsc_header header;
  183. /** RNDIS channel */
  184. uint32_t channel;
  185. /** Buffer index (or NETVSC_RNDIS_NO_BUFFER) */
  186. uint32_t buffer;
  187. /** Buffer length */
  188. uint32_t len;
  189. /** Reserved */
  190. uint8_t reserved[16];
  191. } __attribute__ (( packed ));
  192. /** RNDIS data channel (for RNDIS_PACKET_MSG only) */
  193. #define NETVSC_RNDIS_DATA 0
  194. /** RNDIS control channel (for all other RNDIS messages) */
  195. #define NETVSC_RNDIS_CONTROL 1
  196. /** "No buffer used" index */
  197. #define NETVSC_RNDIS_NO_BUFFER 0xffffffffUL
  198. /** A NetVSC descriptor ring */
  199. struct netvsc_ring {
  200. /** Number of descriptors */
  201. unsigned int count;
  202. /** I/O buffers, indexed by buffer ID */
  203. struct io_buffer **iobufs;
  204. /** Buffer ID ring */
  205. uint8_t *ids;
  206. /** Buffer ID producer counter */
  207. unsigned int id_prod;
  208. /** Buffer ID consumer counter */
  209. unsigned int id_cons;
  210. };
  211. /**
  212. * Initialise descriptor ring
  213. *
  214. * @v ring Descriptor ring
  215. * @v count Maximum number of used descriptors
  216. * @v iobufs I/O buffers
  217. * @v ids Buffer IDs
  218. */
  219. static inline __attribute__ (( always_inline )) void
  220. netvsc_init_ring ( struct netvsc_ring *ring, unsigned int count,
  221. struct io_buffer **iobufs, uint8_t *ids ) {
  222. ring->count = count;
  223. ring->iobufs = iobufs;
  224. ring->ids = ids;
  225. }
  226. /**
  227. * Check whether or not descriptor ring is full
  228. *
  229. * @v ring Descriptor ring
  230. * @v is_full Ring is full
  231. */
  232. static inline __attribute__ (( always_inline )) int
  233. netvsc_ring_is_full ( struct netvsc_ring *ring ) {
  234. unsigned int fill_level;
  235. fill_level = ( ring->id_prod - ring->id_cons );
  236. assert ( fill_level <= ring->count );
  237. return ( fill_level >= ring->count );
  238. }
  239. /**
  240. * Check whether or not descriptor ring is empty
  241. *
  242. * @v ring Descriptor ring
  243. * @v is_empty Ring is empty
  244. */
  245. static inline __attribute__ (( always_inline )) int
  246. netvsc_ring_is_empty ( struct netvsc_ring *ring ) {
  247. return ( ring->id_prod == ring->id_cons );
  248. }
  249. /** A NetVSC data buffer */
  250. struct netvsc_buffer {
  251. /** Transfer page set */
  252. struct vmbus_xfer_pages pages;
  253. /** Establish data buffer message type */
  254. uint8_t establish_type;
  255. /** Establish data buffer relative transaction ID */
  256. uint8_t establish_xrid;
  257. /** Revoke data buffer message type */
  258. uint8_t revoke_type;
  259. /** Revoke data buffer relative transaction ID */
  260. uint8_t revoke_xrid;
  261. /** Buffer length */
  262. size_t len;
  263. /** Buffer */
  264. userptr_t data;
  265. /** GPADL ID */
  266. unsigned int gpadl;
  267. };
  268. /**
  269. * Initialise data buffer
  270. *
  271. * @v buffer Data buffer
  272. * @v pageset Page set ID
  273. * @v op Page set operations
  274. * @v establish_type Establish data buffer message type
  275. * @v establish_xrid Establish data buffer relative transaction ID
  276. * @v revoke_type Revoke data buffer message type
  277. * @v revoke_type Revoke data buffer relative transaction ID
  278. * @v len Required length
  279. */
  280. static inline __attribute__ (( always_inline )) void
  281. netvsc_init_buffer ( struct netvsc_buffer *buffer, uint16_t pageset,
  282. struct vmbus_xfer_pages_operations *op,
  283. uint8_t establish_type, uint8_t establish_xrid,
  284. uint8_t revoke_type, uint8_t revoke_xrid, size_t len ) {
  285. buffer->pages.pageset = cpu_to_le16 ( pageset );
  286. buffer->pages.op = op;
  287. buffer->establish_type = establish_type;
  288. buffer->establish_xrid = establish_xrid;
  289. buffer->revoke_type = revoke_type;
  290. buffer->revoke_xrid = revoke_xrid;
  291. buffer->len = len;
  292. }
  293. /** A NetVSC device */
  294. struct netvsc_device {
  295. /** VMBus device */
  296. struct vmbus_device *vmdev;
  297. /** RNDIS device */
  298. struct rndis_device *rndis;
  299. /** Name */
  300. const char *name;
  301. /** Transmit ring */
  302. struct netvsc_ring tx;
  303. /** Transmit buffer IDs */
  304. uint8_t tx_ids[NETVSC_TX_NUM_DESC];
  305. /** Transmit I/O buffers */
  306. struct io_buffer *tx_iobufs[NETVSC_TX_NUM_DESC];
  307. /** Receive buffer */
  308. struct netvsc_buffer rx;
  309. /** Relative transaction ID for current blocking transaction */
  310. unsigned int wait_xrid;
  311. /** Return status code for current blocking transaction */
  312. int wait_rc;
  313. };
  314. /**
  315. * Check if NetVSC device is obsolete
  316. *
  317. * @v netvsc NetVSC device
  318. * @v is_obsolete NetVSC device is obsolete
  319. *
  320. * Check if NetVSC device is obsolete (i.e. was opened before the most
  321. * recent Hyper-V reset).
  322. */
  323. static inline __attribute__ (( always_inline )) int
  324. netvsc_is_obsolete ( struct netvsc_device *netvsc ) {
  325. return vmbus_gpadl_is_obsolete ( netvsc->rx.gpadl );
  326. }
  327. #endif /* _NETVSC_H */