}
static u16
-virtio_pci_modern_get_queue_notify_off (virtio_if_t * vif, u16 queue_id)
+virtio_pci_modern_get_queue_notify_off (vlib_main_t * vm, virtio_if_t * vif,
+ u16 queue_id)
{
u16 queue_notify_off = 0;
virtio_pci_modern_set_queue_select (vif, queue_id);
virtio_pci_modern_setup_queue (vlib_main_t * vm, virtio_if_t * vif,
u16 queue_id, void *p)
{
- vring_t vr;
+ u64 desc, avail, used;
u16 queue_size = 0;
virtio_pci_modern_set_queue_select (vif, queue_id);
queue_size = virtio_pci_modern_get_queue_size (vm, vif, queue_id);
- vring_init (&vr, queue_size, p, VIRTIO_PCI_VRING_ALIGN);
- u64 desc = vlib_physmem_get_pa (vm, vr.desc);
+ if (vif->is_packed)
+ {
+ virtio_vring_t *vring = (virtio_vring_t *) p;
+
+ desc = vlib_physmem_get_pa (vm, vring->packed_desc);
+ avail = vlib_physmem_get_pa (vm, vring->driver_event);
+ used = vlib_physmem_get_pa (vm, vring->device_event);
+ }
+ else
+ {
+ vring_t vr;
+
+ vring_init (&vr, queue_size, p, VIRTIO_PCI_VRING_ALIGN);
+
+ desc = vlib_physmem_get_pa (vm, vr.desc);
+ avail = vlib_physmem_get_pa (vm, vr.avail);
+ used = vlib_physmem_get_pa (vm, vr.used);
+ }
+
virtio_pci_modern_set_queue_desc (vif, desc);
if (desc != virtio_pci_modern_get_queue_desc (vif))
return 1;
- u64 avail = vlib_physmem_get_pa (vm, vr.avail);
virtio_pci_modern_set_queue_driver (vif, avail);
if (avail != virtio_pci_modern_get_queue_driver (vif))
return 1;
- u64 used = vlib_physmem_get_pa (vm, vr.used);
virtio_pci_modern_set_queue_device (vif, used);
if (used != virtio_pci_modern_get_queue_device (vif))
return 1;
static void
virtio_pci_modern_get_device_mac (vlib_main_t * vm, virtio_if_t * vif)
{
- *((u32 *) vif->mac_addr) =
- virtio_pci_reg_read_u32 (vif, VIRTIO_MAC_OFFSET (vif));
- *((u16 *) (vif->mac_addr + 4)) =
+ vif->mac_addr32 = virtio_pci_reg_read_u32 (vif, VIRTIO_MAC_OFFSET (vif));
+ vif->mac_addr16 =
virtio_pci_reg_read_u16 (vif, VIRTIO_MAC_OFFSET (vif) + 4);
}
static void
virtio_pci_modern_set_device_mac (vlib_main_t * vm, virtio_if_t * vif)
{
- virtio_pci_reg_write_u32 (vif, VIRTIO_MAC_OFFSET (vif),
- *((u32 *) vif->mac_addr));
+ virtio_pci_reg_write_u32 (vif, VIRTIO_MAC_OFFSET (vif), vif->mac_addr32);
virtio_pci_reg_write_u16 (vif, VIRTIO_MAC_OFFSET (vif) + 4,
- *((u16 *) (vif->mac_addr + 4)));
+ vif->mac_addr16);
}
static u16
inline void
virtio_pci_modern_notify_queue (vlib_main_t * vm, virtio_if_t * vif,
- u16 queue_id)
+ u16 queue_id, u16 queue_notify_off)
{
- u16 queue_notify_off =
- virtio_pci_modern_get_queue_notify_off (vif, queue_id);
virtio_pci_reg_write_u16 (vif,
VIRTIO_NOTIFICATION_OFFSET (vif) +
- vif->notify_off_multiplier * queue_notify_off,
- queue_id);
+ queue_notify_off, queue_id);
}
static void
.set_queue_size = virtio_pci_modern_set_queue_size,
.setup_queue = virtio_pci_modern_setup_queue,
.del_queue = virtio_pci_modern_del_queue,
+ .get_queue_notify_off = virtio_pci_modern_get_queue_notify_off,
.notify_queue = virtio_pci_modern_notify_queue,
.set_config_irq = virtio_pci_modern_set_msix_config,
.set_queue_irq = virtio_pci_modern_set_queue_msix_vector,