diff options
Diffstat (limited to 'drivers/virtio/virtio_net.c')
-rw-r--r-- | drivers/virtio/virtio_net.c | 9 |
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; } |