wireguard: add async mode for encryption packets
[vpp.git] / src / vnet / devices / virtio / virtio_pci_modern.c
index 0d86ff2..8e090ff 100644 (file)
@@ -208,7 +208,8 @@ virtio_pci_modern_set_queue_enable (virtio_if_t * vif, u16 queue_id,
 }
 
 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);
@@ -267,24 +268,39 @@ static u8
 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;
@@ -311,19 +327,17 @@ virtio_pci_modern_del_queue (vlib_main_t * vm, virtio_if_t * vif,
 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
@@ -389,14 +403,11 @@ virtio_pci_modern_get_isr (vlib_main_t * vm, virtio_if_t * vif)
 
 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
@@ -420,6 +431,7 @@ const virtio_pci_func_t virtio_pci_modern_func = {
   .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,