@@ -43,9 +43,8 @@ __attribute__((__section__(".net_driver_config"))) net_driver_config_t config;
4343uintptr_t hw_ring_buffer_vaddr ;
4444uintptr_t hw_ring_buffer_paddr ;
4545
46- #define RX_COUNT 512
47- #define TX_COUNT 512
48- #define MAX_COUNT MAX(RX_COUNT, TX_COUNT)
46+ #define RX_COUNT_MAX 512
47+ #define TX_COUNT_MAX 512
4948
5049#define HW_RING_SIZE (0x10000)
5150
@@ -69,9 +68,9 @@ virtio_net_hdr_t *virtio_net_tx_headers;
6968virtio_device_handle_t dev ;
7069
7170ialloc_t rx_ialloc_desc ;
72- uint32_t rx_descriptors [RX_COUNT ];
71+ uint32_t rx_descriptors [RX_COUNT_MAX ];
7372ialloc_t tx_ialloc_desc ;
74- uint32_t tx_descriptors [TX_COUNT ];
73+ uint32_t tx_descriptors [TX_COUNT_MAX ];
7574
7675static inline bool virtio_avail_full (struct virtq * virtq , ialloc_t * ialloc )
7776{
@@ -330,16 +329,21 @@ static void eth_setup(void)
330329#endif
331330
332331 // Setup the virtqueues
332+ uint16_t rx_q_host_capacity = virtio_transport_queue_get_capacity (& dev , VIRTIO_NET_RX_QUEUE );
333+ uint16_t tx_q_host_capacity = virtio_transport_queue_get_capacity (& dev , VIRTIO_NET_TX_QUEUE );
334+
335+ uint16_t rx_q_driver_capacity = MIN (rx_q_host_capacity , RX_COUNT_MAX );
336+ uint16_t tx_q_driver_capacity = MIN (tx_q_host_capacity , TX_COUNT_MAX );
333337
334338 size_t rx_desc_off = 0 ;
335- size_t rx_avail_off = ALIGN (rx_desc_off + (16 * RX_COUNT ), 2 );
336- size_t rx_used_off = ALIGN (rx_avail_off + (6 + 2 * RX_COUNT ), 4 );
337- size_t tx_desc_off = ALIGN (rx_used_off + (6 + 8 * RX_COUNT ), 16 );
338- size_t tx_avail_off = ALIGN (tx_desc_off + (16 * TX_COUNT ), 2 );
339- size_t tx_used_off = ALIGN (tx_avail_off + (6 + 2 * TX_COUNT ), 4 );
340- size_t virtq_size = tx_used_off + (6 + 8 * TX_COUNT );
341-
342- rx_virtq .num = RX_COUNT ;
339+ size_t rx_avail_off = ALIGN (rx_desc_off + (16 * rx_q_driver_capacity ), 2 );
340+ size_t rx_used_off = ALIGN (rx_avail_off + (6 + 2 * rx_q_driver_capacity ), 4 );
341+ size_t tx_desc_off = ALIGN (rx_used_off + (6 + 8 * rx_q_driver_capacity ), 16 );
342+ size_t tx_avail_off = ALIGN (tx_desc_off + (16 * tx_q_driver_capacity ), 2 );
343+ size_t tx_used_off = ALIGN (tx_avail_off + (6 + 2 * tx_q_driver_capacity ), 4 );
344+ size_t virtq_size = tx_used_off + (6 + 8 * tx_q_driver_capacity );
345+
346+ rx_virtq .num = rx_q_driver_capacity ;
343347 rx_virtq .desc = (struct virtq_desc * )(hw_ring_buffer_vaddr + rx_desc_off );
344348 rx_virtq .avail = (struct virtq_avail * )(hw_ring_buffer_vaddr + rx_avail_off );
345349 rx_virtq .used = (struct virtq_used * )(hw_ring_buffer_vaddr + rx_used_off );
@@ -348,7 +352,7 @@ static void eth_setup(void)
348352 assert ((uintptr_t )rx_virtq .avail % 2 == 0 );
349353 assert ((uintptr_t )rx_virtq .used % 4 == 0 );
350354
351- tx_virtq .num = TX_COUNT ;
355+ tx_virtq .num = tx_q_driver_capacity ;
352356 tx_virtq .desc = (struct virtq_desc * )(hw_ring_buffer_vaddr + tx_desc_off );
353357 tx_virtq .avail = (struct virtq_avail * )(hw_ring_buffer_vaddr + tx_avail_off );
354358 tx_virtq .used = (struct virtq_used * )(hw_ring_buffer_vaddr + tx_used_off );
@@ -361,22 +365,27 @@ static void eth_setup(void)
361365 virtio_net_tx_headers_vaddr = hw_ring_buffer_vaddr + virtq_size ;
362366 virtio_net_tx_headers_paddr = hw_ring_buffer_paddr + virtq_size ;
363367 virtio_net_tx_headers = (virtio_net_hdr_t * )virtio_net_tx_headers_vaddr ;
364- size_t tx_headers_size = ((TX_COUNT / 2 ) * sizeof (virtio_net_hdr_t ));
368+ size_t tx_headers_size = ((tx_q_driver_capacity / 2 ) * sizeof (virtio_net_hdr_t ));
365369 virtio_net_rx_headers_paddr = virtio_net_tx_headers_paddr + tx_headers_size ;
366- size_t rx_headers_size = ((RX_COUNT / 2 ) * sizeof (virtio_net_hdr_t ));
370+ size_t rx_headers_size = ((rx_q_driver_capacity / 2 ) * sizeof (virtio_net_hdr_t ));
367371
368372 assert (virtq_size + tx_headers_size + rx_headers_size <= HW_RING_SIZE );
369373
374+ ialloc_init (& rx_ialloc_desc , rx_descriptors , rx_q_driver_capacity );
375+ ialloc_init (& tx_ialloc_desc , tx_descriptors , tx_q_driver_capacity );
376+
370377 rx_provide ();
371378 tx_provide ();
372379
373380 // Setup RX queue first
374- assert (virtio_transport_queue_setup (& dev , VIRTIO_NET_RX_QUEUE , RX_COUNT , hw_ring_buffer_paddr + rx_desc_off ,
375- hw_ring_buffer_paddr + rx_avail_off , hw_ring_buffer_paddr + rx_used_off ));
381+ assert (virtio_transport_queue_setup (& dev , VIRTIO_NET_RX_QUEUE , rx_q_driver_capacity ,
382+ hw_ring_buffer_paddr + rx_desc_off , hw_ring_buffer_paddr + rx_avail_off ,
383+ hw_ring_buffer_paddr + rx_used_off ));
376384
377385 // Setup TX queue
378- assert (virtio_transport_queue_setup (& dev , VIRTIO_NET_TX_QUEUE , TX_COUNT , hw_ring_buffer_paddr + tx_desc_off ,
379- hw_ring_buffer_paddr + tx_avail_off , hw_ring_buffer_paddr + tx_used_off ));
386+ assert (virtio_transport_queue_setup (& dev , VIRTIO_NET_TX_QUEUE , tx_q_driver_capacity ,
387+ hw_ring_buffer_paddr + tx_desc_off , hw_ring_buffer_paddr + tx_avail_off ,
388+ hw_ring_buffer_paddr + tx_used_off ));
380389
381390 // Set the MAC address
382391 config -> mac [0 ] = 0x52 ;
@@ -411,9 +420,6 @@ void init(void)
411420 hw_ring_buffer_paddr = device_resources .regions [1 ].io_addr ;
412421#endif
413422
414- ialloc_init (& rx_ialloc_desc , rx_descriptors , RX_COUNT );
415- ialloc_init (& tx_ialloc_desc , tx_descriptors , TX_COUNT );
416-
417423 net_queue_init (& rx_queue , config .virt_rx .free_queue .vaddr , config .virt_rx .active_queue .vaddr ,
418424 config .virt_rx .num_buffers );
419425 net_queue_init (& tx_queue , config .virt_tx .free_queue .vaddr , config .virt_tx .active_queue .vaddr ,
0 commit comments