aboutsummaryrefslogtreecommitdiff
path: root/drivers/virtio/virtio_net.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/virtio/virtio_net.c')
-rw-r--r--drivers/virtio/virtio_net.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/virtio/virtio_net.c b/drivers/virtio/virtio_net.c
index 1794f73a8d..69c7d5abb9 100644
--- a/drivers/virtio/virtio_net.c
+++ b/drivers/virtio/virtio_net.c
@@ -127,9 +127,18 @@ static int virtio_net_free_pkt(struct udevice *dev, uchar *packet, int length)
struct virtio_sg sg = { buf, VIRTIO_NET_RX_BUF_SIZE };
struct virtio_sg *sgs[] = { &sg };
+ // virtio_net stops receiving frames once it completely runs out of rx ring
+ // buffers. Adding back buffers does not resume it. An explicit
+ // notification is necessary to kick it off again.
+ bool need_notify = priv->rx_vq->free_head == 0;
+
/* Put the buffer back to the rx ring */
virtqueue_add(priv->rx_vq, sgs, 0, 1);
+ if (need_notify) {
+ virtqueue_kick(priv->rx_vq);
+ }
+
return 0;
}