diff options
author | Ruslan Bukin <br@FreeBSD.org> | 2018-06-15 16:19:10 +0000 |
---|---|---|
committer | Ruslan Bukin <br@FreeBSD.org> | 2018-06-15 16:19:10 +0000 |
commit | 1147facec3d41f24f54d8f1017bcd3cba604c330 (patch) | |
tree | 78d127402c8081e632c8bea36065e2a94fd78c20 /sys | |
parent | d87ef77d0f369751ddb3c04fcc23fca69806a6d3 (diff) | |
download | src-1147facec3d41f24f54d8f1017bcd3cba604c330.tar.gz src-1147facec3d41f24f54d8f1017bcd3cba604c330.zip |
Make virtio queue re-initialization steps to be similar to
original initialization, so we don't miss few registers to
configure.
This fixes vtnet(4) operation with QEMU's virtio-net-device.
Tested in QEMU with FreeBSD/RISC-V.
Reviewed by: bryanv
Sponsored by: DARPA, AFRL
Differential Revision: https://reviews.freebsd.org/D15821
Notes
Notes:
svn path=/head/; revision=335211
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/virtio/mmio/virtio_mmio.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/sys/dev/virtio/mmio/virtio_mmio.c b/sys/dev/virtio/mmio/virtio_mmio.c index d9c17f5e8421..6a09b628e85c 100644 --- a/sys/dev/virtio/mmio/virtio_mmio.c +++ b/sys/dev/virtio/mmio/virtio_mmio.c @@ -512,7 +512,8 @@ vtmmio_alloc_virtqueues(device_t dev, int flags, int nvqs, if (sc->vtmmio_vqs == NULL) return (ENOMEM); - vtmmio_write_config_4(sc, VIRTIO_MMIO_GUEST_PAGE_SIZE, 1 << PAGE_SHIFT); + vtmmio_write_config_4(sc, VIRTIO_MMIO_GUEST_PAGE_SIZE, + (1 << PAGE_SHIFT)); for (idx = 0; idx < nvqs; idx++) { vqx = &sc->vtmmio_vqs[idx]; @@ -537,10 +538,10 @@ vtmmio_alloc_virtqueues(device_t dev, int flags, int nvqs, VIRTIO_MMIO_VRING_ALIGN); #if 0 device_printf(dev, "virtqueue paddr 0x%08lx\n", - (uint64_t)virtqueue_paddr(vq)); + (uint64_t)virtqueue_paddr(vq)); #endif vtmmio_write_config_4(sc, VIRTIO_MMIO_QUEUE_PFN, - virtqueue_paddr(vq) >> PAGE_SHIFT); + virtqueue_paddr(vq) >> PAGE_SHIFT); vqx->vtv_vq = *info->vqai_vq = vq; vqx->vtv_no_intr = info->vqai_intr == NULL; @@ -592,6 +593,9 @@ vtmmio_reinit(device_t dev, uint64_t features) vtmmio_negotiate_features(dev, features); + vtmmio_write_config_4(sc, VIRTIO_MMIO_GUEST_PAGE_SIZE, + (1 << PAGE_SHIFT)); + for (idx = 0; idx < sc->vtmmio_nvqs; idx++) { error = vtmmio_reinit_virtqueue(sc, idx); if (error) @@ -766,6 +770,13 @@ vtmmio_reinit_virtqueue(struct vtmmio_softc *sc, int idx) if (error) return (error); + vtmmio_write_config_4(sc, VIRTIO_MMIO_QUEUE_NUM, size); + vtmmio_write_config_4(sc, VIRTIO_MMIO_QUEUE_ALIGN, + VIRTIO_MMIO_VRING_ALIGN); +#if 0 + device_printf(sc->dev, "virtqueue paddr 0x%08lx\n", + (uint64_t)virtqueue_paddr(vq)); +#endif vtmmio_write_config_4(sc, VIRTIO_MMIO_QUEUE_PFN, virtqueue_paddr(vq) >> PAGE_SHIFT); |