virtio: fix device specific header offset when MSI-X is disabled
authorAlan Carew <alan.carew@intel.com>
Mon, 16 Jun 2014 11:10:26 +0000 (12:10 +0100)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Tue, 22 Jul 2014 13:00:00 +0000 (15:00 +0200)
Suggested-by: Neil Horman <nhorman@tuxdriver.com>
Suggested-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Alan Carew <alan.carew@intel.com>
config/common_bsdapp
lib/librte_pmd_virtio/virtio_ethdev.c
lib/librte_pmd_virtio/virtio_pci.h

index 3fbba87..23d3ddd 100644 (file)
@@ -191,7 +191,7 @@ CONFIG_RTE_LIBRTE_I40E_ITR_INTERVAL=-1
 #
 # Compile burst-oriented VIRTIO PMD driver
 #
-CONFIG_RTE_LIBRTE_VIRTIO_PMD=n
+CONFIG_RTE_LIBRTE_VIRTIO_PMD=y
 CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_INIT=n
 CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_RX=n
 CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_TX=n
index d4730f9..afc903c 100644 (file)
@@ -647,6 +647,30 @@ static int get_uio_dev(struct rte_pci_addr *loc, char *buf, unsigned int buflen)
 
        return 0;
 }
+
+static int
+virtio_has_msix(const struct rte_pci_addr *loc)
+{
+       DIR *d;
+       char dirname[PATH_MAX];
+
+       snprintf(dirname, sizeof(dirname),
+                    SYSFS_PCI_DEVICES "/" PCI_PRI_FMT "/msi_irqs",
+                    loc->domain, loc->bus, loc->devid, loc->function);
+
+       d = opendir(dirname);
+       if (d)
+               closedir(d);
+
+       return (d != NULL);
+}
+#else
+static int
+virtio_has_msix(const struct rte_pci_addr *loc __rte_unused)
+{
+       /* nic_uio does not enable interrupts, return 0 (false). */
+       return 0;
+}
 #endif
 
 /*
@@ -720,6 +744,7 @@ eth_virtio_dev_init(__rte_unused struct eth_driver *eth_drv,
                             start, size);
        }
 #endif
+       hw->use_msix = virtio_has_msix(&pci_dev->addr);
        hw->io_base = (uint32_t)(uintptr_t)pci_dev->mem_resource[0].addr;
 
        /* Reset the device although not necessary at startup */
index 864b084..d27b734 100644 (file)
@@ -177,6 +177,7 @@ struct virtio_hw {
        uint16_t    subsystem_device_id;
        uint16_t    subsystem_vendor_id;
        uint8_t     revision_id;
+       uint8_t     use_msix;
        uint8_t     mac_addr[ETHER_ADDR_LEN];
        int         adapter_stopped;
        struct      rte_eth_stats eth_stats;
@@ -195,13 +196,11 @@ struct virtio_net_config {
        uint16_t   max_virtqueue_pairs;
 } __attribute__((packed));
 
-/* Value indicated in device config */
-#define VIRTIO_PCI_FLAG_MSIX  0x0020
 /*
  * The remaining space is defined by each driver as the per-driver
  * configuration space.
  */
-#define VIRTIO_PCI_CONFIG(hw) (((hw)->guest_features & VIRTIO_PCI_FLAG_MSIX) ? 24 : 20)
+#define VIRTIO_PCI_CONFIG(hw) (((hw)->use_msix) ? 24 : 20)
 
 /*
  * How many bits to shift physical queue address written to QUEUE_PFN.