net/virtio: fix incorrect cast of void *
[dpdk.git] / drivers / net / i40e / i40e_ethdev_vf.c
index 6957f52..91b5bb0 100644 (file)
 #include <rte_log.h>
 #include <rte_debug.h>
 #include <rte_pci.h>
+#include <rte_bus_pci.h>
 #include <rte_atomic.h>
 #include <rte_branch_prediction.h>
 #include <rte_memory.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_alarm.h>
 #include <rte_ether.h>
@@ -67,8 +67,6 @@
 #include "i40e_rxtx.h"
 #include "i40e_ethdev.h"
 #include "i40e_pf.h"
-#define I40EVF_VSI_DEFAULT_MSIX_INTR     1
-#define I40EVF_VSI_DEFAULT_MSIX_INTR_LNX 0
 
 /* busy wait delay in msec */
 #define I40EVF_BUSY_WAIT_DELAY 10
@@ -652,8 +650,9 @@ i40evf_config_irq_map(struct rte_eth_dev *dev)
        uint32_t vector_id;
        int i, err;
 
-       if (rte_intr_allow_others(intr_handle))
-               vector_id = I40EVF_VSI_DEFAULT_MSIX_INTR_LNX;
+       if (dev->data->dev_conf.intr_conf.rxq != 0 &&
+           rte_intr_allow_others(intr_handle))
+               vector_id = I40E_RX_VEC_START;
        else
                vector_id = I40E_MISC_VEC_ID;
 
@@ -1432,7 +1431,6 @@ i40evf_dev_interrupt_handler(void *param)
 
 done:
        i40evf_enable_irq0(hw);
-       rte_intr_enable(dev->intr_handle);
 }
 
 static int
@@ -2040,7 +2038,20 @@ i40evf_dev_start(struct rte_eth_dev *dev)
                goto err_mac;
        }
 
+       /* When a VF port is bound to VFIO-PCI, only miscellaneous interrupt
+        * is mapped to VFIO vector 0 in i40evf_dev_init( ).
+        * If previous VFIO interrupt mapping set in i40evf_dev_init( ) is
+        * not cleared, it will fail when rte_intr_enable( ) tries to map Rx
+        * queue interrupt to other VFIO vectors.
+        * So clear uio/vfio intr/evevnfd first to avoid failure.
+        */
+       if (dev->data->dev_conf.intr_conf.rxq != 0) {
+               rte_intr_disable(intr_handle);
+               rte_intr_enable(intr_handle);
+       }
+
        i40evf_enable_queues_intr(dev);
+
        return 0;
 
 err_mac: