mbuf: rename deprecated VLAN flags
[dpdk.git] / drivers / net / ixgbe / ixgbe_ethdev.c
index ddcd279..dac6a3a 100644 (file)
 #include <rte_alarm.h>
 #include <rte_ether.h>
 #include <rte_ethdev.h>
-#include <rte_atomic.h>
+#include <rte_ethdev_pci.h>
 #include <rte_malloc.h>
 #include <rte_random.h>
 #include <rte_dev.h>
 #include <rte_hash_crc.h>
+#include <rte_security_driver.h>
 
 #include "ixgbe_logs.h"
 #include "base/ixgbe_api.h"
@@ -73,8 +74,6 @@
 #include "base/ixgbe_phy.h"
 #include "ixgbe_regs.h"
 
-#include "rte_pmd_ixgbe.h"
-
 /*
  * High threshold controlling when to start sending XOFF frames. Must be at
  * least 8 bytes less than receive packet buffer size. This value is in units
@@ -171,24 +170,34 @@ static void ixgbe_dev_stop(struct rte_eth_dev *dev);
 static int  ixgbe_dev_set_link_up(struct rte_eth_dev *dev);
 static int  ixgbe_dev_set_link_down(struct rte_eth_dev *dev);
 static void ixgbe_dev_close(struct rte_eth_dev *dev);
+static int  ixgbe_dev_reset(struct rte_eth_dev *dev);
 static void ixgbe_dev_promiscuous_enable(struct rte_eth_dev *dev);
 static void ixgbe_dev_promiscuous_disable(struct rte_eth_dev *dev);
 static void ixgbe_dev_allmulticast_enable(struct rte_eth_dev *dev);
 static void ixgbe_dev_allmulticast_disable(struct rte_eth_dev *dev);
 static int ixgbe_dev_link_update(struct rte_eth_dev *dev,
                                int wait_to_complete);
-static void ixgbe_dev_stats_get(struct rte_eth_dev *dev,
+static int ixgbe_dev_stats_get(struct rte_eth_dev *dev,
                                struct rte_eth_stats *stats);
 static int ixgbe_dev_xstats_get(struct rte_eth_dev *dev,
                                struct rte_eth_xstat *xstats, unsigned n);
 static int ixgbevf_dev_xstats_get(struct rte_eth_dev *dev,
                                  struct rte_eth_xstat *xstats, unsigned n);
+static int
+ixgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
+               uint64_t *values, unsigned int n);
 static void ixgbe_dev_stats_reset(struct rte_eth_dev *dev);
 static void ixgbe_dev_xstats_reset(struct rte_eth_dev *dev);
-static int ixgbe_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
-       struct rte_eth_xstat_name *xstats_names, __rte_unused unsigned limit);
-static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
-       struct rte_eth_xstat_name *xstats_names, __rte_unused unsigned limit);
+static int ixgbe_dev_xstats_get_names(struct rte_eth_dev *dev,
+       struct rte_eth_xstat_name *xstats_names,
+       unsigned int size);
+static int ixgbevf_dev_xstats_get_names(struct rte_eth_dev *dev,
+       struct rte_eth_xstat_name *xstats_names, unsigned limit);
+static int ixgbe_dev_xstats_get_names_by_id(
+       struct rte_eth_dev *dev,
+       struct rte_eth_xstat_name *xstats_names,
+       const uint64_t *ids,
+       unsigned int limit);
 static int ixgbe_dev_queue_stats_mapping_set(struct rte_eth_dev *eth_dev,
                                             uint16_t queue_id,
                                             uint8_t stat_idx,
@@ -232,34 +241,36 @@ static int ixgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
                        struct rte_eth_rss_reta_entry64 *reta_conf,
                        uint16_t reta_size);
 static void ixgbe_dev_link_status_print(struct rte_eth_dev *dev);
-static int ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev);
+static int ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev, uint8_t on);
 static int ixgbe_dev_macsec_interrupt_setup(struct rte_eth_dev *dev);
 static int ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev);
 static int ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev);
 static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev,
                                      struct rte_intr_handle *handle);
-static void ixgbe_dev_interrupt_handler(struct rte_intr_handle *handle,
-               void *param);
+static void ixgbe_dev_interrupt_handler(void *param);
 static void ixgbe_dev_interrupt_delayed_handler(void *param);
-static void ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
-               uint32_t index, uint32_t pool);
+static int ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
+                        uint32_t index, uint32_t pool);
 static void ixgbe_remove_rar(struct rte_eth_dev *dev, uint32_t index);
 static void ixgbe_set_default_mac_addr(struct rte_eth_dev *dev,
                                           struct ether_addr *mac_addr);
 static void ixgbe_dcb_init(struct ixgbe_hw *hw, struct ixgbe_dcb_config *dcb_config);
 static bool is_device_supported(struct rte_eth_dev *dev,
-                               struct eth_driver *drv);
+                               struct rte_pci_driver *drv);
 
 /* For Virtual Function support */
 static int eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev);
 static int eth_ixgbevf_dev_uninit(struct rte_eth_dev *eth_dev);
 static int  ixgbevf_dev_configure(struct rte_eth_dev *dev);
 static int  ixgbevf_dev_start(struct rte_eth_dev *dev);
+static int ixgbevf_dev_link_update(struct rte_eth_dev *dev,
+                                  int wait_to_complete);
 static void ixgbevf_dev_stop(struct rte_eth_dev *dev);
 static void ixgbevf_dev_close(struct rte_eth_dev *dev);
+static int  ixgbevf_dev_reset(struct rte_eth_dev *dev);
 static void ixgbevf_intr_disable(struct ixgbe_hw *hw);
 static void ixgbevf_intr_enable(struct ixgbe_hw *hw);
-static void ixgbevf_dev_stats_get(struct rte_eth_dev *dev,
+static int ixgbevf_dev_stats_get(struct rte_eth_dev *dev,
                struct rte_eth_stats *stats);
 static void ixgbevf_dev_stats_reset(struct rte_eth_dev *dev);
 static int ixgbevf_vlan_filter_set(struct rte_eth_dev *dev,
@@ -295,12 +306,9 @@ static void ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
                               uint8_t queue, uint8_t msix_vector);
 static void ixgbe_configure_msix(struct rte_eth_dev *dev);
 
-static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
-               uint16_t queue_idx, uint16_t tx_rate);
-
-static void ixgbevf_add_mac_addr(struct rte_eth_dev *dev,
-                                struct ether_addr *mac_addr,
-                                uint32_t index, uint32_t pool);
+static int ixgbevf_add_mac_addr(struct rte_eth_dev *dev,
+                               struct ether_addr *mac_addr,
+                               uint32_t index, uint32_t pool);
 static void ixgbevf_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index);
 static void ixgbevf_set_default_mac_addr(struct rte_eth_dev *dev,
                                             struct ether_addr *mac_addr);
@@ -360,8 +368,7 @@ static int ixgbe_timesync_read_time(struct rte_eth_dev *dev,
                                   struct timespec *timestamp);
 static int ixgbe_timesync_write_time(struct rte_eth_dev *dev,
                                   const struct timespec *timestamp);
-static void ixgbevf_dev_interrupt_handler(struct rte_intr_handle *handle,
-                                         void *param);
+static void ixgbevf_dev_interrupt_handler(void *param);
 
 static int ixgbe_dev_l2_tunnel_eth_type_conf
        (struct rte_eth_dev *dev, struct rte_eth_l2_tunnel_conf *l2_tunnel);
@@ -438,13 +445,8 @@ static const struct rte_pci_id pci_id_ixgbe_map[] = {
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4_MEZZ) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KR) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_COMBO_BACKPLANE) },
-       { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_SUBDEV_ID_82599_KX4_KR_MEZZ) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_CX4) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP) },
-       { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_SUBDEV_ID_82599_SFP) },
-       { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_SUBDEV_ID_82599_RNDC) },
-       { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_SUBDEV_ID_82599_560FLR) },
-       { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_SUBDEV_ID_82599_ECNA_DP) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BACKPLANE_FCOE) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_FCOE) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_EM) },
@@ -475,7 +477,7 @@ static const struct rte_pci_id pci_id_ixgbe_map[] = {
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T_L) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_KX4) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_KR) },
-#ifdef RTE_NIC_BYPASS
+#ifdef RTE_LIBRTE_IXGBE_BYPASS
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BYPASS) },
 #endif
        { .vendor_id = 0, /* sentinel */ },
@@ -519,6 +521,7 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
        .dev_set_link_up    = ixgbe_dev_set_link_up,
        .dev_set_link_down  = ixgbe_dev_set_link_down,
        .dev_close            = ixgbe_dev_close,
+       .dev_reset            = ixgbe_dev_reset,
        .promiscuous_enable   = ixgbe_dev_promiscuous_enable,
        .promiscuous_disable  = ixgbe_dev_promiscuous_disable,
        .allmulticast_enable  = ixgbe_dev_allmulticast_enable,
@@ -526,9 +529,11 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
        .link_update          = ixgbe_dev_link_update,
        .stats_get            = ixgbe_dev_stats_get,
        .xstats_get           = ixgbe_dev_xstats_get,
+       .xstats_get_by_id     = ixgbe_dev_xstats_get_by_id,
        .stats_reset          = ixgbe_dev_stats_reset,
        .xstats_reset         = ixgbe_dev_xstats_reset,
        .xstats_get_names     = ixgbe_dev_xstats_get_names,
+       .xstats_get_names_by_id = ixgbe_dev_xstats_get_names_by_id,
        .queue_stats_mapping_set = ixgbe_dev_queue_stats_mapping_set,
        .fw_version_get       = ixgbe_fw_version_get,
        .dev_infos_get        = ixgbe_dev_info_get,
@@ -567,17 +572,6 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
        .set_queue_rate_limit = ixgbe_set_queue_rate_limit,
        .reta_update          = ixgbe_dev_rss_reta_update,
        .reta_query           = ixgbe_dev_rss_reta_query,
-#ifdef RTE_NIC_BYPASS
-       .bypass_init          = ixgbe_bypass_init,
-       .bypass_state_set     = ixgbe_bypass_state_store,
-       .bypass_state_show    = ixgbe_bypass_state_show,
-       .bypass_event_set     = ixgbe_bypass_event_store,
-       .bypass_event_show    = ixgbe_bypass_event_show,
-       .bypass_wd_timeout_set  = ixgbe_bypass_wd_timeout_store,
-       .bypass_wd_timeout_show = ixgbe_bypass_wd_timeout_show,
-       .bypass_ver_show      = ixgbe_bypass_ver_show,
-       .bypass_wd_reset      = ixgbe_bypass_wd_reset,
-#endif /* RTE_NIC_BYPASS */
        .rss_hash_update      = ixgbe_dev_rss_hash_update,
        .rss_hash_conf_get    = ixgbe_dev_rss_hash_conf_get,
        .filter_ctrl          = ixgbe_dev_filter_ctrl,
@@ -600,6 +594,7 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
        .l2_tunnel_offload_set   = ixgbe_dev_l2_tunnel_offload_set,
        .udp_tunnel_port_add  = ixgbe_dev_udp_tunnel_port_add,
        .udp_tunnel_port_del  = ixgbe_dev_udp_tunnel_port_del,
+       .tm_ops_get           = ixgbe_tm_ops_get,
 };
 
 /*
@@ -610,13 +605,14 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
        .dev_configure        = ixgbevf_dev_configure,
        .dev_start            = ixgbevf_dev_start,
        .dev_stop             = ixgbevf_dev_stop,
-       .link_update          = ixgbe_dev_link_update,
+       .link_update          = ixgbevf_dev_link_update,
        .stats_get            = ixgbevf_dev_stats_get,
        .xstats_get           = ixgbevf_dev_xstats_get,
        .stats_reset          = ixgbevf_dev_stats_reset,
        .xstats_reset         = ixgbevf_dev_stats_reset,
        .xstats_get_names     = ixgbevf_dev_xstats_get_names,
        .dev_close            = ixgbevf_dev_close,
+       .dev_reset            = ixgbevf_dev_reset,
        .allmulticast_enable  = ixgbevf_dev_allmulticast_enable,
        .allmulticast_disable = ixgbevf_dev_allmulticast_disable,
        .dev_infos_get        = ixgbevf_dev_info_get,
@@ -1123,7 +1119,7 @@ ixgbe_swfw_lock_reset(struct ixgbe_hw *hw)
 static int
 eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(eth_dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
@@ -1135,6 +1131,8 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
                IXGBE_DEV_PRIVATE_TO_DCB_CFG(eth_dev->data->dev_private);
        struct ixgbe_filter_info *filter_info =
                IXGBE_DEV_PRIVATE_TO_FILTER_INFO(eth_dev->data->dev_private);
+       struct ixgbe_bw_conf *bw_conf =
+               IXGBE_DEV_PRIVATE_TO_BW_CONF(eth_dev->data->dev_private);
        uint32_t ctrl_ext;
        uint16_t csum;
        int diag, i;
@@ -1170,8 +1168,12 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
                return 0;
        }
 
+       /* Initialize security_ctx only for primary process*/
+       eth_dev->security_ctx = ixgbe_ipsec_ctx_create(eth_dev);
+       if (eth_dev->security_ctx == NULL)
+               return -ENOMEM;
+
        rte_eth_copy_pci_info(eth_dev, pci_dev);
-       eth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;
 
        /* Vendor and Device ID need to be set before init of shared code */
        hw->device_id = pci_dev->id.device_id;
@@ -1180,11 +1182,11 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
        hw->allow_unsupported_sfp = 1;
 
        /* Initialize the shared code (base driver) */
-#ifdef RTE_NIC_BYPASS
+#ifdef RTE_LIBRTE_IXGBE_BYPASS
        diag = ixgbe_bypass_init_shared_code(hw);
 #else
        diag = ixgbe_init_shared_code(hw);
-#endif /* RTE_NIC_BYPASS */
+#endif /* RTE_LIBRTE_IXGBE_BYPASS */
 
        if (diag != IXGBE_SUCCESS) {
                PMD_INIT_LOG(ERR, "Shared code init failed: %d", diag);
@@ -1217,11 +1219,11 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
                return -EIO;
        }
 
-#ifdef RTE_NIC_BYPASS
+#ifdef RTE_LIBRTE_IXGBE_BYPASS
        diag = ixgbe_bypass_init_hw(hw);
 #else
        diag = ixgbe_init_hw(hw);
-#endif /* RTE_NIC_BYPASS */
+#endif /* RTE_LIBRTE_IXGBE_BYPASS */
 
        /*
         * Devices with copper phys will fail to initialise if ixgbe_init_hw()
@@ -1339,12 +1341,14 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
        /* initialize l2 tunnel filter list & hash */
        ixgbe_l2_tn_filter_init(eth_dev);
 
-       TAILQ_INIT(&filter_ntuple_list);
-       TAILQ_INIT(&filter_ethertype_list);
-       TAILQ_INIT(&filter_syn_list);
-       TAILQ_INIT(&filter_fdir_list);
-       TAILQ_INIT(&filter_l2_tunnel_list);
-       TAILQ_INIT(&ixgbe_flow_list);
+       /* initialize flow filter lists */
+       ixgbe_filterlist_init();
+
+       /* initialize bandwidth configuration info */
+       memset(bw_conf, 0, sizeof(struct ixgbe_bw_conf));
+
+       /* initialize Traffic Manager configuration */
+       ixgbe_tm_conf_init(eth_dev);
 
        return 0;
 }
@@ -1352,7 +1356,7 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
 static int
 eth_ixgbe_dev_uninit(struct rte_eth_dev *eth_dev)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(eth_dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct ixgbe_hw *hw;
 
@@ -1399,6 +1403,11 @@ eth_ixgbe_dev_uninit(struct rte_eth_dev *eth_dev)
        /* clear all the filters list */
        ixgbe_filterlist_flush();
 
+       /* Remove all Traffic Manager configuration */
+       ixgbe_tm_conf_uninit(eth_dev);
+
+       rte_free(eth_dev->security_ctx);
+
        return 0;
 }
 
@@ -1478,7 +1487,7 @@ static int ixgbe_fdir_filter_init(struct rte_eth_dev *eth_dev)
 
        TAILQ_INIT(&fdir_info->fdir_list);
        snprintf(fdir_hash_name, RTE_HASH_NAMESIZE,
-                "fdir_%s", eth_dev->data->name);
+                "fdir_%s", eth_dev->device->name);
        fdir_info->hash_handle = rte_hash_create(&fdir_hash_params);
        if (!fdir_info->hash_handle) {
                PMD_INIT_LOG(ERR, "Failed to create fdir hash table!");
@@ -1514,7 +1523,7 @@ static int ixgbe_l2_tn_filter_init(struct rte_eth_dev *eth_dev)
 
        TAILQ_INIT(&l2_tn_info->l2_tn_list);
        snprintf(l2_tn_hash_name, RTE_HASH_NAMESIZE,
-                "l2_tn_%s", eth_dev->data->name);
+                "l2_tn_%s", eth_dev->device->name);
        l2_tn_info->hash_handle = rte_hash_create(&l2_tn_hash_params);
        if (!l2_tn_info->hash_handle) {
                PMD_INIT_LOG(ERR, "Failed to create L2 TN hash table!");
@@ -1585,7 +1594,7 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
 {
        int diag;
        uint32_t tc, tcs;
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(eth_dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
@@ -1625,7 +1634,6 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
        }
 
        rte_eth_copy_pci_info(eth_dev, pci_dev);
-       eth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;
 
        hw->device_id = pci_dev->id.device_id;
        hw->vendor_id = pci_dev->id.vendor_id;
@@ -1734,7 +1742,7 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
 static int
 eth_ixgbevf_dev_uninit(struct rte_eth_dev *eth_dev)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(eth_dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct ixgbe_hw *hw;
 
@@ -1765,31 +1773,46 @@ eth_ixgbevf_dev_uninit(struct rte_eth_dev *eth_dev)
        return 0;
 }
 
-static struct eth_driver rte_ixgbe_pmd = {
-       .pci_drv = {
-               .id_table = pci_id_ixgbe_map,
-               .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
-               .probe = rte_eth_dev_pci_probe,
-               .remove = rte_eth_dev_pci_remove,
-       },
-       .eth_dev_init = eth_ixgbe_dev_init,
-       .eth_dev_uninit = eth_ixgbe_dev_uninit,
-       .dev_private_size = sizeof(struct ixgbe_adapter),
+static int eth_ixgbe_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
+       struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_probe(pci_dev,
+               sizeof(struct ixgbe_adapter), eth_ixgbe_dev_init);
+}
+
+static int eth_ixgbe_pci_remove(struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_remove(pci_dev, eth_ixgbe_dev_uninit);
+}
+
+static struct rte_pci_driver rte_ixgbe_pmd = {
+       .id_table = pci_id_ixgbe_map,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC |
+                    RTE_PCI_DRV_IOVA_AS_VA,
+       .probe = eth_ixgbe_pci_probe,
+       .remove = eth_ixgbe_pci_remove,
 };
 
+static int eth_ixgbevf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
+       struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_probe(pci_dev,
+               sizeof(struct ixgbe_adapter), eth_ixgbevf_dev_init);
+}
+
+static int eth_ixgbevf_pci_remove(struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_remove(pci_dev, eth_ixgbevf_dev_uninit);
+}
+
 /*
  * virtual function driver struct
  */
-static struct eth_driver rte_ixgbevf_pmd = {
-       .pci_drv = {
-               .id_table = pci_id_ixgbevf_map,
-               .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
-               .probe = rte_eth_dev_pci_probe,
-               .remove = rte_eth_dev_pci_remove,
-       },
-       .eth_dev_init = eth_ixgbevf_dev_init,
-       .eth_dev_uninit = eth_ixgbevf_dev_uninit,
-       .dev_private_size = sizeof(struct ixgbe_adapter),
+static struct rte_pci_driver rte_ixgbevf_pmd = {
+       .id_table = pci_id_ixgbevf_map,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA,
+       .probe = eth_ixgbevf_pci_probe,
+       .remove = eth_ixgbevf_pci_remove,
 };
 
 static int
@@ -1943,9 +1966,9 @@ ixgbe_vlan_hw_strip_bitmap_set(struct rte_eth_dev *dev, uint16_t queue, bool on)
        rxq = dev->data->rx_queues[queue];
 
        if (on)
-               rxq->vlan_flags = PKT_RX_VLAN_PKT | PKT_RX_VLAN_STRIPPED;
+               rxq->vlan_flags = PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
        else
-               rxq->vlan_flags = PKT_RX_VLAN_PKT;
+               rxq->vlan_flags = PKT_RX_VLAN;
 }
 
 static void
@@ -2149,7 +2172,7 @@ ixgbe_vmdq_vlan_hw_filter_enable(struct rte_eth_dev *dev)
 static int
 ixgbe_check_vf_rss_rxq_num(struct rte_eth_dev *dev, uint16_t nb_rx_q)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
 
        switch (nb_rx_q) {
        case 1:
@@ -2384,6 +2407,80 @@ ixgbe_dev_phy_intr_setup(struct rte_eth_dev *dev)
        }
 }
 
+int
+ixgbe_set_vf_rate_limit(struct rte_eth_dev *dev, uint16_t vf,
+                       uint16_t tx_rate, uint64_t q_msk)
+{
+       struct ixgbe_hw *hw;
+       struct ixgbe_vf_info *vfinfo;
+       struct rte_eth_link link;
+       uint8_t  nb_q_per_pool;
+       uint32_t queue_stride;
+       uint32_t queue_idx, idx = 0, vf_idx;
+       uint32_t queue_end;
+       uint16_t total_rate = 0;
+       struct rte_pci_device *pci_dev;
+
+       pci_dev = RTE_ETH_DEV_TO_PCI(dev);
+       rte_eth_link_get_nowait(dev->data->port_id, &link);
+
+       if (vf >= pci_dev->max_vfs)
+               return -EINVAL;
+
+       if (tx_rate > link.link_speed)
+               return -EINVAL;
+
+       if (q_msk == 0)
+               return 0;
+
+       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       vfinfo = *(IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private));
+       nb_q_per_pool = RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool;
+       queue_stride = IXGBE_MAX_RX_QUEUE_NUM / RTE_ETH_DEV_SRIOV(dev).active;
+       queue_idx = vf * queue_stride;
+       queue_end = queue_idx + nb_q_per_pool - 1;
+       if (queue_end >= hw->mac.max_tx_queues)
+               return -EINVAL;
+
+       if (vfinfo) {
+               for (vf_idx = 0; vf_idx < pci_dev->max_vfs; vf_idx++) {
+                       if (vf_idx == vf)
+                               continue;
+                       for (idx = 0; idx < RTE_DIM(vfinfo[vf_idx].tx_rate);
+                               idx++)
+                               total_rate += vfinfo[vf_idx].tx_rate[idx];
+               }
+       } else {
+               return -EINVAL;
+       }
+
+       /* Store tx_rate for this vf. */
+       for (idx = 0; idx < nb_q_per_pool; idx++) {
+               if (((uint64_t)0x1 << idx) & q_msk) {
+                       if (vfinfo[vf].tx_rate[idx] != tx_rate)
+                               vfinfo[vf].tx_rate[idx] = tx_rate;
+                       total_rate += tx_rate;
+               }
+       }
+
+       if (total_rate > dev->data->dev_link.link_speed) {
+               /* Reset stored TX rate of the VF if it causes exceed
+                * link speed.
+                */
+               memset(vfinfo[vf].tx_rate, 0, sizeof(vfinfo[vf].tx_rate));
+               return -EINVAL;
+       }
+
+       /* Set RTTBCNRC of each queue/pool for vf X  */
+       for (; queue_idx <= queue_end; queue_idx++) {
+               if (0x1 & q_msk)
+                       ixgbe_set_queue_rate_limit(dev, queue_idx, tx_rate);
+               q_msk = q_msk >> 1;
+       }
+
+       return 0;
+}
+
 /*
  * Configure device link speed and setup link.
  * It returns 0 on success.
@@ -2395,7 +2492,7 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct ixgbe_vf_info *vfinfo =
                *IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private);
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        uint32_t intr_vector = 0;
        int err, link_up = 0, negotiate = 0;
@@ -2404,6 +2501,8 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
        int status;
        uint16_t vf, idx;
        uint32_t *link_speeds;
+       struct ixgbe_tm_conf *tm_conf =
+               IXGBE_DEV_PRIVATE_TO_TM_CONF(dev->data->dev_private);
 
        PMD_INIT_FUNC_TRACE();
 
@@ -2412,8 +2511,9 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
        *    - fixed speed: TODO implement
        */
        if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) {
-               PMD_INIT_LOG(ERR, "Invalid link_speeds for port %hhu; fix speed not supported",
-                            dev->data->port_id);
+               PMD_INIT_LOG(ERR,
+               "Invalid link_speeds for port %u, fix speed not supported",
+                               dev->data->port_id);
                return -EINVAL;
        }
 
@@ -2499,8 +2599,8 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
                for (vf = 0; vf < pci_dev->max_vfs; vf++)
                        for (idx = 0; idx < IXGBE_MAX_QUEUE_NUM_PER_VF; idx++)
                                if (vfinfo[vf].tx_rate[idx] != 0)
-                                       rte_pmd_ixgbe_set_vf_rate_limit(
-                                               dev->data->port_id, vf,
+                                       ixgbe_set_vf_rate_limit(
+                                               dev, vf,
                                                vfinfo[vf].tx_rate[idx],
                                                1 << idx);
        }
@@ -2550,9 +2650,22 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 
        speed = 0x0;
        if (*link_speeds == ETH_LINK_SPEED_AUTONEG) {
-               speed = (hw->mac.type != ixgbe_mac_82598EB) ?
-                               IXGBE_LINK_SPEED_82599_AUTONEG :
-                               IXGBE_LINK_SPEED_82598_AUTONEG;
+               switch (hw->mac.type) {
+               case ixgbe_mac_82598EB:
+                       speed = IXGBE_LINK_SPEED_82598_AUTONEG;
+                       break;
+               case ixgbe_mac_82599EB:
+               case ixgbe_mac_X540:
+                       speed = IXGBE_LINK_SPEED_82599_AUTONEG;
+                       break;
+               case ixgbe_mac_X550:
+               case ixgbe_mac_X550EM_x:
+               case ixgbe_mac_X550EM_a:
+                       speed = IXGBE_LINK_SPEED_X550_AUTONEG;
+                       break;
+               default:
+                       speed = IXGBE_LINK_SPEED_82599_AUTONEG;
+               }
        } else {
                if (*link_speeds & ETH_LINK_SPEED_10G)
                        speed |= IXGBE_LINK_SPEED_10GB_FULL;
@@ -2571,7 +2684,9 @@ skip_link_setup:
        if (rte_intr_allow_others(intr_handle)) {
                /* check if lsc interrupt is enabled */
                if (dev->data->dev_conf.intr_conf.lsc != 0)
-                       ixgbe_dev_lsc_interrupt_setup(dev);
+                       ixgbe_dev_lsc_interrupt_setup(dev, TRUE);
+               else
+                       ixgbe_dev_lsc_interrupt_setup(dev, FALSE);
                ixgbe_dev_macsec_interrupt_setup(dev);
        } else {
                rte_intr_callback_unregister(intr_handle,
@@ -2594,6 +2709,11 @@ skip_link_setup:
        ixgbe_l2_tunnel_conf(dev);
        ixgbe_filter_restore(dev);
 
+       if (tm_conf->root && !tm_conf->committed)
+               PMD_DRV_LOG(WARNING,
+                           "please call hierarchy_commit() "
+                           "before starting the port");
+
        return 0;
 
 error:
@@ -2613,9 +2733,11 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct ixgbe_vf_info *vfinfo =
                *IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private);
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        int vf;
+       struct ixgbe_tm_conf *tm_conf =
+               IXGBE_DEV_PRIVATE_TO_TM_CONF(dev->data->dev_private);
 
        PMD_INIT_FUNC_TRACE();
 
@@ -2662,6 +2784,9 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
                rte_free(intr_handle->intr_vec);
                intr_handle->intr_vec = NULL;
        }
+
+       /* reset hierarchy commit */
+       tm_conf->committed = false;
 }
 
 /*
@@ -2673,7 +2798,7 @@ ixgbe_dev_set_link_up(struct rte_eth_dev *dev)
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        if (hw->mac.type == ixgbe_mac_82599EB) {
-#ifdef RTE_NIC_BYPASS
+#ifdef RTE_LIBRTE_IXGBE_BYPASS
                if (hw->device_id == IXGBE_DEV_ID_82599_BYPASS) {
                        /* Not suported in bypass mode */
                        PMD_INIT_LOG(ERR, "Set link up is not supported "
@@ -2703,7 +2828,7 @@ ixgbe_dev_set_link_down(struct rte_eth_dev *dev)
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        if (hw->mac.type == ixgbe_mac_82599EB) {
-#ifdef RTE_NIC_BYPASS
+#ifdef RTE_LIBRTE_IXGBE_BYPASS
                if (hw->device_id == IXGBE_DEV_ID_82599_BYPASS) {
                        /* Not suported in bypass mode */
                        PMD_INIT_LOG(ERR, "Set link down is not supported "
@@ -2725,7 +2850,7 @@ ixgbe_dev_set_link_down(struct rte_eth_dev *dev)
 }
 
 /*
- * Reest and stop device.
+ * Reset and stop device.
  */
 static void
 ixgbe_dev_close(struct rte_eth_dev *dev)
@@ -2748,6 +2873,32 @@ ixgbe_dev_close(struct rte_eth_dev *dev)
        ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
 }
 
+/*
+ * Reset PF device.
+ */
+static int
+ixgbe_dev_reset(struct rte_eth_dev *dev)
+{
+       int ret;
+
+       /* When a DPDK PMD PF begin to reset PF port, it should notify all
+        * its VF to make them align with it. The detailed notification
+        * mechanism is PMD specific. As to ixgbe PF, it is rather complex.
+        * To avoid unexpected behavior in VF, currently reset of PF with
+        * SR-IOV activation is not supported. It might be supported later.
+        */
+       if (dev->data->sriov.active)
+               return -ENOTSUP;
+
+       ret = eth_ixgbe_dev_uninit(dev);
+       if (ret)
+               return ret;
+
+       ret = eth_ixgbe_dev_init(dev);
+
+       return ret;
+}
+
 static void
 ixgbe_read_stats_registers(struct ixgbe_hw *hw,
                           struct ixgbe_hw_stats *hw_stats,
@@ -2960,7 +3111,7 @@ ixgbe_read_stats_registers(struct ixgbe_hw *hw,
 /*
  * This function is based on ixgbe_update_stats_counters() in ixgbe/ixgbe.c
  */
-static void
+static int
 ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
        struct ixgbe_hw *hw =
@@ -2982,7 +3133,7 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
                        &total_qbrc, &total_qprc, &total_qprdc);
 
        if (stats == NULL)
-               return;
+               return -EINVAL;
 
        /* Fill out the rte_eth_stats statistics structure */
        stats->ipackets = total_qprc;
@@ -3013,6 +3164,7 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 
        /* Tx Errors */
        stats->oerrors  = 0;
+       return 0;
 }
 
 static void
@@ -3037,7 +3189,7 @@ ixgbe_xstats_calc_num(void) {
 }
 
 static int ixgbe_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
-       struct rte_eth_xstat_name *xstats_names, __rte_unused unsigned limit)
+       struct rte_eth_xstat_name *xstats_names, __rte_unused unsigned int size)
 {
        const unsigned cnt_stats = ixgbe_xstats_calc_num();
        unsigned stat, i, count;
@@ -3092,6 +3244,84 @@ static int ixgbe_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
        return cnt_stats;
 }
 
+static int ixgbe_dev_xstats_get_names_by_id(
+       struct rte_eth_dev *dev,
+       struct rte_eth_xstat_name *xstats_names,
+       const uint64_t *ids,
+       unsigned int limit)
+{
+       if (!ids) {
+               const unsigned int cnt_stats = ixgbe_xstats_calc_num();
+               unsigned int stat, i, count;
+
+               if (xstats_names != NULL) {
+                       count = 0;
+
+                       /* Note: limit >= cnt_stats checked upstream
+                        * in rte_eth_xstats_names()
+                        */
+
+                       /* Extended stats from ixgbe_hw_stats */
+                       for (i = 0; i < IXGBE_NB_HW_STATS; i++) {
+                               snprintf(xstats_names[count].name,
+                                       sizeof(xstats_names[count].name),
+                                       "%s",
+                                       rte_ixgbe_stats_strings[i].name);
+                               count++;
+                       }
+
+                       /* MACsec Stats */
+                       for (i = 0; i < IXGBE_NB_MACSEC_STATS; i++) {
+                               snprintf(xstats_names[count].name,
+                                       sizeof(xstats_names[count].name),
+                                       "%s",
+                                       rte_ixgbe_macsec_strings[i].name);
+                               count++;
+                       }
+
+                       /* RX Priority Stats */
+                       for (stat = 0; stat < IXGBE_NB_RXQ_PRIO_STATS; stat++) {
+                               for (i = 0; i < IXGBE_NB_RXQ_PRIO_VALUES; i++) {
+                                       snprintf(xstats_names[count].name,
+                                           sizeof(xstats_names[count].name),
+                                           "rx_priority%u_%s", i,
+                                           rte_ixgbe_rxq_strings[stat].name);
+                                       count++;
+                               }
+                       }
+
+                       /* TX Priority Stats */
+                       for (stat = 0; stat < IXGBE_NB_TXQ_PRIO_STATS; stat++) {
+                               for (i = 0; i < IXGBE_NB_TXQ_PRIO_VALUES; i++) {
+                                       snprintf(xstats_names[count].name,
+                                           sizeof(xstats_names[count].name),
+                                           "tx_priority%u_%s", i,
+                                           rte_ixgbe_txq_strings[stat].name);
+                                       count++;
+                               }
+                       }
+               }
+               return cnt_stats;
+       }
+
+       uint16_t i;
+       uint16_t size = ixgbe_xstats_calc_num();
+       struct rte_eth_xstat_name xstats_names_copy[size];
+
+       ixgbe_dev_xstats_get_names_by_id(dev, xstats_names_copy, NULL,
+                       size);
+
+       for (i = 0; i < limit; i++) {
+               if (ids[i] >= size) {
+                       PMD_INIT_LOG(ERR, "id value isn't valid");
+                       return -1;
+               }
+               strcpy(xstats_names[i].name,
+                               xstats_names_copy[ids[i]].name);
+       }
+       return limit;
+}
+
 static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
        struct rte_eth_xstat_name *xstats_names, unsigned limit)
 {
@@ -3182,6 +3412,97 @@ ixgbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
        return count;
 }
 
+static int
+ixgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
+               uint64_t *values, unsigned int n)
+{
+       if (!ids) {
+               struct ixgbe_hw *hw =
+                               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+               struct ixgbe_hw_stats *hw_stats =
+                               IXGBE_DEV_PRIVATE_TO_STATS(
+                                               dev->data->dev_private);
+               struct ixgbe_macsec_stats *macsec_stats =
+                               IXGBE_DEV_PRIVATE_TO_MACSEC_STATS(
+                                       dev->data->dev_private);
+               uint64_t total_missed_rx, total_qbrc, total_qprc, total_qprdc;
+               unsigned int i, stat, count = 0;
+
+               count = ixgbe_xstats_calc_num();
+
+               if (!ids && n < count)
+                       return count;
+
+               total_missed_rx = 0;
+               total_qbrc = 0;
+               total_qprc = 0;
+               total_qprdc = 0;
+
+               ixgbe_read_stats_registers(hw, hw_stats, macsec_stats,
+                               &total_missed_rx, &total_qbrc, &total_qprc,
+                               &total_qprdc);
+
+               /* If this is a reset xstats is NULL, and we have cleared the
+                * registers by reading them.
+                */
+               if (!ids && !values)
+                       return 0;
+
+               /* Extended stats from ixgbe_hw_stats */
+               count = 0;
+               for (i = 0; i < IXGBE_NB_HW_STATS; i++) {
+                       values[count] = *(uint64_t *)(((char *)hw_stats) +
+                                       rte_ixgbe_stats_strings[i].offset);
+                       count++;
+               }
+
+               /* MACsec Stats */
+               for (i = 0; i < IXGBE_NB_MACSEC_STATS; i++) {
+                       values[count] = *(uint64_t *)(((char *)macsec_stats) +
+                                       rte_ixgbe_macsec_strings[i].offset);
+                       count++;
+               }
+
+               /* RX Priority Stats */
+               for (stat = 0; stat < IXGBE_NB_RXQ_PRIO_STATS; stat++) {
+                       for (i = 0; i < IXGBE_NB_RXQ_PRIO_VALUES; i++) {
+                               values[count] =
+                                       *(uint64_t *)(((char *)hw_stats) +
+                                       rte_ixgbe_rxq_strings[stat].offset +
+                                       (sizeof(uint64_t) * i));
+                               count++;
+                       }
+               }
+
+               /* TX Priority Stats */
+               for (stat = 0; stat < IXGBE_NB_TXQ_PRIO_STATS; stat++) {
+                       for (i = 0; i < IXGBE_NB_TXQ_PRIO_VALUES; i++) {
+                               values[count] =
+                                       *(uint64_t *)(((char *)hw_stats) +
+                                       rte_ixgbe_txq_strings[stat].offset +
+                                       (sizeof(uint64_t) * i));
+                               count++;
+                       }
+               }
+               return count;
+       }
+
+       uint16_t i;
+       uint16_t size = ixgbe_xstats_calc_num();
+       uint64_t values_copy[size];
+
+       ixgbe_dev_xstats_get_by_id(dev, NULL, values_copy, size);
+
+       for (i = 0; i < n; i++) {
+               if (ids[i] >= size) {
+                       PMD_INIT_LOG(ERR, "id value isn't valid");
+                       return -1;
+               }
+               values[i] = values_copy[ids[i]];
+       }
+       return n;
+}
+
 static void
 ixgbe_dev_xstats_reset(struct rte_eth_dev *dev)
 {
@@ -3247,6 +3568,7 @@ ixgbevf_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
 
        /* Extended stats */
        for (i = 0; i < IXGBEVF_NB_XSTATS; i++) {
+               xstats[i].id = i;
                xstats[i].value = *(uint64_t *)(((char *)hw_stats) +
                        rte_ixgbevf_stats_strings[i].offset);
        }
@@ -3254,7 +3576,7 @@ ixgbevf_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
        return IXGBEVF_NB_XSTATS;
 }
 
-static void
+static int
 ixgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
        struct ixgbevf_hw_stats *hw_stats = (struct ixgbevf_hw_stats *)
@@ -3263,12 +3585,13 @@ ixgbevf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
        ixgbevf_update_stats(dev);
 
        if (stats == NULL)
-               return;
+               return -EINVAL;
 
        stats->ipackets = hw_stats->vfgprc;
        stats->ibytes = hw_stats->vfgorc;
        stats->opackets = hw_stats->vfgptc;
        stats->obytes = hw_stats->vfgotc;
+       return 0;
 }
 
 static void
@@ -3311,7 +3634,7 @@ ixgbe_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
 static void
 ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
 
@@ -3378,6 +3701,9 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
            hw->mac.type == ixgbe_mac_X550EM_a)
                dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
 
+       dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_SECURITY;
+       dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_SECURITY;
+
        dev_info->default_rxconf = (struct rte_eth_rxconf) {
                .rx_thresh = {
                        .pthresh = IXGBE_DEFAULT_RX_PTHRESH,
@@ -3414,6 +3740,10 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
            hw->mac.type == ixgbe_mac_X550_vf) {
                dev_info->speed_capa |= ETH_LINK_SPEED_100M;
        }
+       if (hw->mac.type == ixgbe_mac_X550) {
+               dev_info->speed_capa |= ETH_LINK_SPEED_2_5G;
+               dev_info->speed_capa |= ETH_LINK_SPEED_5G;
+       }
 }
 
 static const uint32_t *
@@ -3446,6 +3776,12 @@ ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)
            dev->rx_pkt_burst == ixgbe_recv_pkts_lro_bulk_alloc ||
            dev->rx_pkt_burst == ixgbe_recv_pkts_bulk_alloc)
                return ptypes;
+
+#if defined(RTE_ARCH_X86)
+       if (dev->rx_pkt_burst == ixgbe_recv_pkts_vec ||
+           dev->rx_pkt_burst == ixgbe_recv_scattered_pkts_vec)
+               return ptypes;
+#endif
        return NULL;
 }
 
@@ -3453,7 +3789,7 @@ static void
 ixgbevf_dev_info_get(struct rte_eth_dev *dev,
                     struct rte_eth_dev_info *dev_info)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
        dev_info->pci_dev = pci_dev;
@@ -3505,29 +3841,153 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
        dev_info->tx_desc_lim = tx_desc_lim;
 }
 
+static int
+ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
+                  int *link_up, int wait_to_complete)
+{
+       /**
+        * for a quick link status checking, wait_to_compelet == 0,
+        * skip PF link status checking
+        */
+       bool no_pflink_check = wait_to_complete == 0;
+       struct ixgbe_mbx_info *mbx = &hw->mbx;
+       struct ixgbe_mac_info *mac = &hw->mac;
+       uint32_t links_reg, in_msg;
+       int ret_val = 0;
+
+       /* If we were hit with a reset drop the link */
+       if (!mbx->ops.check_for_rst(hw, 0) || !mbx->timeout)
+               mac->get_link_status = true;
+
+       if (!mac->get_link_status)
+               goto out;
+
+       /* if link status is down no point in checking to see if pf is up */
+       links_reg = IXGBE_READ_REG(hw, IXGBE_VFLINKS);
+       if (!(links_reg & IXGBE_LINKS_UP))
+               goto out;
+
+       /* for SFP+ modules and DA cables on 82599 it can take up to 500usecs
+        * before the link status is correct
+        */
+       if (mac->type == ixgbe_mac_82599_vf) {
+               int i;
+
+               for (i = 0; i < 5; i++) {
+                       rte_delay_us(100);
+                       links_reg = IXGBE_READ_REG(hw, IXGBE_VFLINKS);
+
+                       if (!(links_reg & IXGBE_LINKS_UP))
+                               goto out;
+               }
+       }
+
+       switch (links_reg & IXGBE_LINKS_SPEED_82599) {
+       case IXGBE_LINKS_SPEED_10G_82599:
+               *speed = IXGBE_LINK_SPEED_10GB_FULL;
+               if (hw->mac.type >= ixgbe_mac_X550) {
+                       if (links_reg & IXGBE_LINKS_SPEED_NON_STD)
+                               *speed = IXGBE_LINK_SPEED_2_5GB_FULL;
+               }
+               break;
+       case IXGBE_LINKS_SPEED_1G_82599:
+               *speed = IXGBE_LINK_SPEED_1GB_FULL;
+               break;
+       case IXGBE_LINKS_SPEED_100_82599:
+               *speed = IXGBE_LINK_SPEED_100_FULL;
+               if (hw->mac.type == ixgbe_mac_X550) {
+                       if (links_reg & IXGBE_LINKS_SPEED_NON_STD)
+                               *speed = IXGBE_LINK_SPEED_5GB_FULL;
+               }
+               break;
+       case IXGBE_LINKS_SPEED_10_X550EM_A:
+               *speed = IXGBE_LINK_SPEED_UNKNOWN;
+               /* Since Reserved in older MAC's */
+               if (hw->mac.type >= ixgbe_mac_X550)
+                       *speed = IXGBE_LINK_SPEED_10_FULL;
+               break;
+       default:
+               *speed = IXGBE_LINK_SPEED_UNKNOWN;
+       }
+
+       if (no_pflink_check) {
+               if (*speed == IXGBE_LINK_SPEED_UNKNOWN)
+                       mac->get_link_status = true;
+               else
+                       mac->get_link_status = false;
+
+               goto out;
+       }
+       /* if the read failed it could just be a mailbox collision, best wait
+        * until we are called again and don't report an error
+        */
+       if (mbx->ops.read(hw, &in_msg, 1, 0))
+               goto out;
+
+       if (!(in_msg & IXGBE_VT_MSGTYPE_CTS)) {
+               /* msg is not CTS and is NACK we must have lost CTS status */
+               if (in_msg & IXGBE_VT_MSGTYPE_NACK)
+                       ret_val = -1;
+               goto out;
+       }
+
+       /* the pf is talking, if we timed out in the past we reinit */
+       if (!mbx->timeout) {
+               ret_val = -1;
+               goto out;
+       }
+
+       /* if we passed all the tests above then the link is up and we no
+        * longer need to check for link
+        */
+       mac->get_link_status = false;
+
+out:
+       *link_up = !mac->get_link_status;
+       return ret_val;
+}
+
 /* return 0 means link status changed, -1 means not changed */
 static int
-ixgbe_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete)
+ixgbe_dev_link_update_share(struct rte_eth_dev *dev,
+                           int wait_to_complete, int vf)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct rte_eth_link link, old;
        ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_UNKNOWN;
+       struct ixgbe_interrupt *intr =
+               IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
        int link_up;
        int diag;
+       u32 speed = 0;
+       int wait = 1;
+       bool autoneg = false;
 
        link.link_status = ETH_LINK_DOWN;
        link.link_speed = 0;
        link.link_duplex = ETH_LINK_HALF_DUPLEX;
+       link.link_autoneg = ETH_LINK_AUTONEG;
        memset(&old, 0, sizeof(old));
        rte_ixgbe_dev_atomic_read_link_status(dev, &old);
 
        hw->mac.get_link_status = true;
 
+       if ((intr->flags & IXGBE_FLAG_NEED_LINK_CONFIG) &&
+               ixgbe_get_media_type(hw) == ixgbe_media_type_fiber) {
+               speed = hw->phy.autoneg_advertised;
+               if (!speed)
+                       ixgbe_get_link_capabilities(hw, &speed, &autoneg);
+               ixgbe_setup_link(hw, speed, true);
+       }
+
        /* check if it needs to wait to complete, if lsc interrupt is enabled */
        if (wait_to_complete == 0 || dev->data->dev_conf.intr_conf.lsc != 0)
-               diag = ixgbe_check_link(hw, &link_speed, &link_up, 0);
+               wait = 0;
+
+       if (vf)
+               diag = ixgbevf_check_link(hw, &link_speed, &link_up, wait);
        else
-               diag = ixgbe_check_link(hw, &link_speed, &link_up, 1);
+               diag = ixgbe_check_link(hw, &link_speed, &link_up, wait);
 
        if (diag != 0) {
                link.link_speed = ETH_SPEED_NUM_100M;
@@ -3540,10 +4000,12 @@ ixgbe_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete)
 
        if (link_up == 0) {
                rte_ixgbe_dev_atomic_write_link_status(dev, &link);
+               intr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG;
                if (link.link_status == old.link_status)
                        return -1;
                return 0;
        }
+       intr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG;
        link.link_status = ETH_LINK_UP;
        link.link_duplex = ETH_LINK_FULL_DUPLEX;
 
@@ -3562,6 +4024,14 @@ ixgbe_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete)
                link.link_speed = ETH_SPEED_NUM_1G;
                break;
 
+       case IXGBE_LINK_SPEED_2_5GB_FULL:
+               link.link_speed = ETH_SPEED_NUM_2_5G;
+               break;
+
+       case IXGBE_LINK_SPEED_5GB_FULL:
+               link.link_speed = ETH_SPEED_NUM_5G;
+               break;
+
        case IXGBE_LINK_SPEED_10GB_FULL:
                link.link_speed = ETH_SPEED_NUM_10G;
                break;
@@ -3574,6 +4044,18 @@ ixgbe_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete)
        return 0;
 }
 
+static int
+ixgbe_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete)
+{
+       return ixgbe_dev_link_update_share(dev, wait_to_complete, 0);
+}
+
+static int
+ixgbevf_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete)
+{
+       return ixgbe_dev_link_update_share(dev, wait_to_complete, 1);
+}
+
 static void
 ixgbe_dev_promiscuous_enable(struct rte_eth_dev *dev)
 {
@@ -3631,19 +4113,24 @@ ixgbe_dev_allmulticast_disable(struct rte_eth_dev *dev)
  *
  * @param dev
  *  Pointer to struct rte_eth_dev.
+ * @param on
+ *  Enable or Disable.
  *
  * @return
  *  - On success, zero.
  *  - On failure, a negative value.
  */
 static int
-ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev)
+ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev, uint8_t on)
 {
        struct ixgbe_interrupt *intr =
                IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
 
        ixgbe_dev_link_status_print(dev);
-       intr->mask |= IXGBE_EICR_LSC;
+       if (on)
+               intr->mask |= IXGBE_EICR_LSC;
+       else
+               intr->mask &= ~IXGBE_EICR_LSC;
 
        return 0;
 }
@@ -3750,7 +4237,7 @@ ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev)
 static void
 ixgbe_dev_link_status_print(struct rte_eth_dev *dev)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_eth_link link;
 
        memset(&link, 0, sizeof(link));
@@ -3822,14 +4309,15 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev,
                        timeout = IXGBE_LINK_DOWN_CHECK_TIMEOUT;
 
                ixgbe_dev_link_status_print(dev);
-               intr->mask_original = intr->mask;
-               /* only disable lsc interrupt */
-               intr->mask &= ~IXGBE_EIMS_LSC;
                if (rte_eal_alarm_set(timeout * 1000,
                                      ixgbe_dev_interrupt_delayed_handler, (void *)dev) < 0)
                        PMD_DRV_LOG(ERR, "Error setting alarm");
-               else
-                       intr->mask = intr->mask_original;
+               else {
+                       /* remember original mask */
+                       intr->mask_original = intr->mask;
+                       /* only disable lsc interrupt */
+                       intr->mask &= ~IXGBE_EIMS_LSC;
+               }
        }
 
        PMD_DRV_LOG(DEBUG, "enable intr immediately");
@@ -3857,7 +4345,7 @@ static void
 ixgbe_dev_interrupt_delayed_handler(void *param)
 {
        struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct ixgbe_interrupt *intr =
                IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
@@ -3880,12 +4368,13 @@ ixgbe_dev_interrupt_delayed_handler(void *param)
                ixgbe_dev_link_update(dev, 0);
                intr->flags &= ~IXGBE_FLAG_NEED_LINK_UPDATE;
                ixgbe_dev_link_status_print(dev);
-               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
+               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC,
+                                             NULL, NULL);
        }
 
        if (intr->flags & IXGBE_FLAG_MACSEC) {
                _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_MACSEC,
-                                             NULL);
+                                             NULL, NULL);
                intr->flags &= ~IXGBE_FLAG_MACSEC;
        }
 
@@ -3911,13 +4400,12 @@ ixgbe_dev_interrupt_delayed_handler(void *param)
  *  void
  */
 static void
-ixgbe_dev_interrupt_handler(struct rte_intr_handle *handle,
-                           void *param)
+ixgbe_dev_interrupt_handler(void *param)
 {
        struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
 
        ixgbe_dev_interrupt_get_status(dev);
-       ixgbe_dev_interrupt_action(dev, handle);
+       ixgbe_dev_interrupt_action(dev, dev->intr_handle);
 }
 
 static int
@@ -4353,14 +4841,15 @@ ixgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
        return 0;
 }
 
-static void
+static int
 ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
                                uint32_t index, uint32_t pool)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        uint32_t enable_addr = 1;
 
-       ixgbe_set_rar(hw, index, mac_addr->addr_bytes, pool, enable_addr);
+       return ixgbe_set_rar(hw, index, mac_addr->addr_bytes,
+                            pool, enable_addr);
 }
 
 static void
@@ -4374,54 +4863,26 @@ ixgbe_remove_rar(struct rte_eth_dev *dev, uint32_t index)
 static void
 ixgbe_set_default_mac_addr(struct rte_eth_dev *dev, struct ether_addr *addr)
 {
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
+
        ixgbe_remove_rar(dev, 0);
 
-       ixgbe_add_rar(dev, addr, 0, 0);
+       ixgbe_add_rar(dev, addr, 0, pci_dev->max_vfs);
 }
 
 static bool
-is_device_supported(struct rte_eth_dev *dev, struct eth_driver *drv)
+is_device_supported(struct rte_eth_dev *dev, struct rte_pci_driver *drv)
 {
-       if (strcmp(dev->driver->pci_drv.driver.name,
-                  drv->pci_drv.driver.name))
+       if (strcmp(dev->device->driver->name, drv->driver.name))
                return false;
 
        return true;
 }
 
-int
-rte_pmd_ixgbe_set_vf_mac_addr(uint8_t port, uint16_t vf,
-               struct ether_addr *mac_addr)
+bool
+is_ixgbe_supported(struct rte_eth_dev *dev)
 {
-       struct ixgbe_hw *hw;
-       struct ixgbe_vf_info *vfinfo;
-       int rar_entry;
-       uint8_t *new_mac = (uint8_t *)(mac_addr);
-       struct rte_eth_dev *dev;
-       struct rte_pci_device *pci_dev;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-       pci_dev = IXGBE_DEV_TO_PCI(dev);
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if (vf >= pci_dev->max_vfs)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       vfinfo = *(IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private));
-       rar_entry = hw->mac.num_rar_entries - (vf + 1);
-
-       if (is_valid_assigned_ether_addr((struct ether_addr *)new_mac)) {
-               rte_memcpy(vfinfo[vf].vf_mac_addresses, new_mac,
-                               ETHER_ADDR_LEN);
-               return hw->mac.ops.set_rar(hw, rar_entry, new_mac, vf,
-                               IXGBE_RAH_AV);
-       }
-       return -EINVAL;
+       return is_device_supported(dev, &rte_ixgbe_pmd);
 }
 
 static int
@@ -4432,6 +4893,7 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        struct ixgbe_hw *hw;
        struct rte_eth_dev_info dev_info;
        uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+       struct rte_eth_dev_data *dev_data = dev->data;
 
        ixgbe_dev_info_get(dev, &dev_info);
 
@@ -4439,13 +4901,15 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        if ((mtu < ETHER_MIN_MTU) || (frame_size > dev_info.max_rx_pktlen))
                return -EINVAL;
 
-       /* refuse mtu that requires the support of scattered packets when this
-        * feature has not been enabled before.
+       /* If device is started, refuse mtu that requires the support of
+        * scattered packets when this feature has not been enabled before.
         */
-       if (!dev->data->scattered_rx &&
+       if (dev_data->dev_started && !dev_data->scattered_rx &&
            (frame_size + 2 * IXGBE_VLAN_TAG_SIZE >
-            dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM))
+            dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM)) {
+               PMD_INIT_LOG(ERR, "Stop port first.");
                return -EINVAL;
+       }
 
        hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
@@ -4540,7 +5004,7 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        uint32_t intr_vector = 0;
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 
        int err, mask = 0;
@@ -4575,7 +5039,10 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 
        /* check and configure queue intr-vector mapping */
        if (dev->data->dev_conf.intr_conf.rxq != 0) {
-               intr_vector = dev->data->nb_rx_queues;
+               /* According to datasheet, only vector 0/1/2 can be used,
+                * now only one vector is used for Rx queue
+                */
+               intr_vector = 1;
                if (rte_intr_efd_enable(intr_handle, intr_vector))
                        return -1;
        }
@@ -4592,6 +5059,15 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
        }
        ixgbevf_configure_msix(dev);
 
+       /* When a VF port is bound to VFIO-PCI, only miscellaneous interrupt
+        * is mapped to VFIO vector 0 in eth_ixgbevf_dev_init( ).
+        * If previous VFIO interrupt mapping setting in eth_ixgbevf_dev_init( )
+        * is not cleared, it will fail when following rte_intr_enable( ) tries
+        * to map Rx queue interrupt to other VFIO vectors.
+        * So clear uio/vfio intr/evevnfd first to avoid failure.
+        */
+       rte_intr_disable(intr_handle);
+
        rte_intr_enable(intr_handle);
 
        /* Re-enable interrupt for VF */
@@ -4604,7 +5080,7 @@ static void
 ixgbevf_dev_stop(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 
        PMD_INIT_FUNC_TRACE();
@@ -4654,6 +5130,23 @@ ixgbevf_dev_close(struct rte_eth_dev *dev)
        ixgbevf_remove_mac_addr(dev, 0);
 }
 
+/*
+ * Reset VF device
+ */
+static int
+ixgbevf_dev_reset(struct rte_eth_dev *dev)
+{
+       int ret;
+
+       ret = eth_ixgbevf_dev_uninit(dev);
+       if (ret)
+               return ret;
+
+       ret = eth_ixgbevf_dev_init(dev);
+
+       return ret;
+}
+
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -4746,7 +5239,7 @@ ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask)
        }
 }
 
-static int
+int
 ixgbe_vt_check(struct ixgbe_hw *hw)
 {
        uint32_t reg_val;
@@ -4816,579 +5309,80 @@ ixgbe_uc_hash_table_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
                return -ENOTSUP;
 
        vector = ixgbe_uta_vector(hw, mac_addr);
-       uta_idx = (vector >> ixgbe_uta_bit_shift) & ixgbe_uta_idx_mask;
-       uta_shift = vector & ixgbe_uta_bit_mask;
-
-       rc = ((uta_info->uta_shadow[uta_idx] >> uta_shift & bit1) != 0);
-       if (rc == on)
-               return 0;
-
-       reg_val = IXGBE_READ_REG(hw, IXGBE_UTA(uta_idx));
-       if (on) {
-               uta_info->uta_in_use++;
-               reg_val |= (bit1 << uta_shift);
-               uta_info->uta_shadow[uta_idx] |= (bit1 << uta_shift);
-       } else {
-               uta_info->uta_in_use--;
-               reg_val &= ~(bit1 << uta_shift);
-               uta_info->uta_shadow[uta_idx] &= ~(bit1 << uta_shift);
-       }
-
-       IXGBE_WRITE_REG(hw, IXGBE_UTA(uta_idx), reg_val);
-
-       if (uta_info->uta_in_use > 0)
-               IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL,
-                               IXGBE_MCSTCTRL_MFE | hw->mac.mc_filter_type);
-       else
-               IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, hw->mac.mc_filter_type);
-
-       return 0;
-}
-
-static int
-ixgbe_uc_all_hash_table_set(struct rte_eth_dev *dev, uint8_t on)
-{
-       int i;
-       struct ixgbe_hw *hw =
-               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ixgbe_uta_info *uta_info =
-               IXGBE_DEV_PRIVATE_TO_UTA(dev->data->dev_private);
-
-       /* The UTA table only exists on 82599 hardware and newer */
-       if (hw->mac.type < ixgbe_mac_82599EB)
-               return -ENOTSUP;
-
-       if (on) {
-               for (i = 0; i < ETH_VMDQ_NUM_UC_HASH_ARRAY; i++) {
-                       uta_info->uta_shadow[i] = ~0;
-                       IXGBE_WRITE_REG(hw, IXGBE_UTA(i), ~0);
-               }
-       } else {
-               for (i = 0; i < ETH_VMDQ_NUM_UC_HASH_ARRAY; i++) {
-                       uta_info->uta_shadow[i] = 0;
-                       IXGBE_WRITE_REG(hw, IXGBE_UTA(i), 0);
-               }
-       }
-       return 0;
-
-}
-
-uint32_t
-ixgbe_convert_vm_rx_mask_to_val(uint16_t rx_mask, uint32_t orig_val)
-{
-       uint32_t new_val = orig_val;
-
-       if (rx_mask & ETH_VMDQ_ACCEPT_UNTAG)
-               new_val |= IXGBE_VMOLR_AUPE;
-       if (rx_mask & ETH_VMDQ_ACCEPT_HASH_MC)
-               new_val |= IXGBE_VMOLR_ROMPE;
-       if (rx_mask & ETH_VMDQ_ACCEPT_HASH_UC)
-               new_val |= IXGBE_VMOLR_ROPE;
-       if (rx_mask & ETH_VMDQ_ACCEPT_BROADCAST)
-               new_val |= IXGBE_VMOLR_BAM;
-       if (rx_mask & ETH_VMDQ_ACCEPT_MULTICAST)
-               new_val |= IXGBE_VMOLR_MPE;
-
-       return new_val;
-}
-
-
-int
-rte_pmd_ixgbe_set_vf_vlan_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
-{
-       struct ixgbe_hw *hw;
-       struct ixgbe_mac_info *mac;
-       struct rte_eth_dev *dev;
-       struct rte_pci_device *pci_dev;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-       pci_dev = IXGBE_DEV_TO_PCI(dev);
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if (vf >= pci_dev->max_vfs)
-               return -EINVAL;
-
-       if (on > 1)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       mac = &hw->mac;
-
-       mac->ops.set_vlan_anti_spoofing(hw, on, vf);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_set_vf_mac_anti_spoof(uint8_t port, uint16_t vf, uint8_t on)
-{
-       struct ixgbe_hw *hw;
-       struct ixgbe_mac_info *mac;
-       struct rte_eth_dev *dev;
-       struct rte_pci_device *pci_dev;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-       pci_dev = IXGBE_DEV_TO_PCI(dev);
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if (vf >= pci_dev->max_vfs)
-               return -EINVAL;
-
-       if (on > 1)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       mac = &hw->mac;
-       mac->ops.set_mac_anti_spoofing(hw, on, vf);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_set_vf_vlan_insert(uint8_t port, uint16_t vf, uint16_t vlan_id)
-{
-       struct ixgbe_hw *hw;
-       uint32_t ctrl;
-       struct rte_eth_dev *dev;
-       struct rte_pci_device *pci_dev;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-       pci_dev = IXGBE_DEV_TO_PCI(dev);
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if (vf >= pci_dev->max_vfs)
-               return -EINVAL;
-
-       if (vlan_id > ETHER_MAX_VLAN_ID)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       ctrl = IXGBE_READ_REG(hw, IXGBE_VMVIR(vf));
-       if (vlan_id) {
-               ctrl = vlan_id;
-               ctrl |= IXGBE_VMVIR_VLANA_DEFAULT;
-       } else {
-               ctrl = 0;
-       }
-
-       IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf), ctrl);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_set_tx_loopback(uint8_t port, uint8_t on)
-{
-       struct ixgbe_hw *hw;
-       uint32_t ctrl;
-       struct rte_eth_dev *dev;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if (on > 1)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       ctrl = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
-       /* enable or disable VMDQ loopback */
-       if (on)
-               ctrl |= IXGBE_PFDTXGSWC_VT_LBEN;
-       else
-               ctrl &= ~IXGBE_PFDTXGSWC_VT_LBEN;
-
-       IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, ctrl);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_set_all_queues_drop_en(uint8_t port, uint8_t on)
-{
-       struct ixgbe_hw *hw;
-       uint32_t reg_value;
-       int i;
-       int num_queues = (int)(IXGBE_QDE_IDX_MASK >> IXGBE_QDE_IDX_SHIFT);
-       struct rte_eth_dev *dev;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if (on > 1)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       for (i = 0; i <= num_queues; i++) {
-               reg_value = IXGBE_QDE_WRITE |
-                               (i << IXGBE_QDE_IDX_SHIFT) |
-                               (on & IXGBE_QDE_ENABLE);
-               IXGBE_WRITE_REG(hw, IXGBE_QDE, reg_value);
-       }
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_set_vf_split_drop_en(uint8_t port, uint16_t vf, uint8_t on)
-{
-       struct ixgbe_hw *hw;
-       uint32_t reg_value;
-       struct rte_eth_dev *dev;
-       struct rte_pci_device *pci_dev;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-       pci_dev = IXGBE_DEV_TO_PCI(dev);
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       /* only support VF's 0 to 63 */
-       if ((vf >= pci_dev->max_vfs) || (vf > 63))
-               return -EINVAL;
-
-       if (on > 1)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       reg_value = IXGBE_READ_REG(hw, IXGBE_SRRCTL(vf));
-       if (on)
-               reg_value |= IXGBE_SRRCTL_DROP_EN;
-       else
-               reg_value &= ~IXGBE_SRRCTL_DROP_EN;
-
-       IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(vf), reg_value);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_set_vf_vlan_stripq(uint8_t port, uint16_t vf, uint8_t on)
-{
-       struct rte_eth_dev *dev;
-       struct rte_pci_device *pci_dev;
-       struct ixgbe_hw *hw;
-       uint16_t queues_per_pool;
-       uint32_t q;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-       pci_dev = IXGBE_DEV_TO_PCI(dev);
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if (vf >= pci_dev->max_vfs)
-               return -EINVAL;
-
-       if (on > 1)
-               return -EINVAL;
-
-       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_strip_queue_set, -ENOTSUP);
-
-       /* The PF has 128 queue pairs and in SRIOV configuration
-        * those queues will be assigned to VF's, so RXDCTL
-        * registers will be dealing with queues which will be
-        * assigned to VF's.
-        * Let's say we have SRIOV configured with 31 VF's then the
-        * first 124 queues 0-123 will be allocated to VF's and only
-        * the last 4 queues 123-127 will be assigned to the PF.
-        */
-       if (hw->mac.type == ixgbe_mac_82598EB)
-               queues_per_pool = (uint16_t)hw->mac.max_rx_queues /
-                                 ETH_16_POOLS;
-       else
-               queues_per_pool = (uint16_t)hw->mac.max_rx_queues /
-                                 ETH_64_POOLS;
-
-       for (q = 0; q < queues_per_pool; q++)
-               (*dev->dev_ops->vlan_strip_queue_set)(dev,
-                               q + vf * queues_per_pool, on);
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_set_vf_rxmode(uint8_t port, uint16_t vf, uint16_t rx_mask, uint8_t on)
-{
-       int val = 0;
-       struct rte_eth_dev *dev;
-       struct rte_pci_device *pci_dev;
-       struct ixgbe_hw *hw;
-       uint32_t vmolr;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-       pci_dev = IXGBE_DEV_TO_PCI(dev);
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if (vf >= pci_dev->max_vfs)
-               return -EINVAL;
-
-       if (on > 1)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf));
-
-       if (hw->mac.type == ixgbe_mac_82598EB) {
-               PMD_INIT_LOG(ERR, "setting VF receive mode set should be done"
-                            " on 82599 hardware and newer");
-               return -ENOTSUP;
-       }
-       if (ixgbe_vt_check(hw) < 0)
-               return -ENOTSUP;
-
-       val = ixgbe_convert_vm_rx_mask_to_val(rx_mask, val);
-
-       if (on)
-               vmolr |= val;
-       else
-               vmolr &= ~val;
-
-       IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_set_vf_rx(uint8_t port, uint16_t vf, uint8_t on)
-{
-       struct rte_eth_dev *dev;
-       struct rte_pci_device *pci_dev;
-       uint32_t reg, addr;
-       uint32_t val;
-       const uint8_t bit1 = 0x1;
-       struct ixgbe_hw *hw;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-       pci_dev = IXGBE_DEV_TO_PCI(dev);
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if (vf >= pci_dev->max_vfs)
-               return -EINVAL;
-
-       if (on > 1)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-       if (ixgbe_vt_check(hw) < 0)
-               return -ENOTSUP;
-
-       /* for vf >= 32, set bit in PFVFRE[1], otherwise PFVFRE[0] */
-       if (vf >= 32) {
-               addr = IXGBE_VFRE(1);
-               val = bit1 << (vf - 32);
-       } else {
-               addr = IXGBE_VFRE(0);
-               val = bit1 << vf;
-       }
-
-       reg = IXGBE_READ_REG(hw, addr);
-
-       if (on)
-               reg |= val;
-       else
-               reg &= ~val;
-
-       IXGBE_WRITE_REG(hw, addr, reg);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_set_vf_tx(uint8_t port, uint16_t vf, uint8_t on)
-{
-       struct rte_eth_dev *dev;
-       struct rte_pci_device *pci_dev;
-       uint32_t reg, addr;
-       uint32_t val;
-       const uint8_t bit1 = 0x1;
-
-       struct ixgbe_hw *hw;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-       pci_dev = IXGBE_DEV_TO_PCI(dev);
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if (vf >= pci_dev->max_vfs)
-               return -EINVAL;
-
-       if (on > 1)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       if (ixgbe_vt_check(hw) < 0)
-               return -ENOTSUP;
-
-       /* for vf >= 32, set bit in PFVFTE[1], otherwise PFVFTE[0] */
-       if (vf >= 32) {
-               addr = IXGBE_VFTE(1);
-               val = bit1 << (vf - 32);
-       } else {
-               addr = IXGBE_VFTE(0);
-               val = bit1 << vf;
-       }
-
-       reg = IXGBE_READ_REG(hw, addr);
-
-       if (on)
-               reg |= val;
-       else
-               reg &= ~val;
-
-       IXGBE_WRITE_REG(hw, addr, reg);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_set_vf_vlan_filter(uint8_t port, uint16_t vlan,
-                       uint64_t vf_mask, uint8_t vlan_on)
-{
-       struct rte_eth_dev *dev;
-       int ret = 0;
-       uint16_t vf_idx;
-       struct ixgbe_hw *hw;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       if ((vlan > ETHER_MAX_VLAN_ID) || (vf_mask == 0))
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       if (ixgbe_vt_check(hw) < 0)
-               return -ENOTSUP;
-
-       for (vf_idx = 0; vf_idx < 64; vf_idx++) {
-               if (vf_mask & ((uint64_t)(1ULL << vf_idx))) {
-                       ret = hw->mac.ops.set_vfta(hw, vlan, vf_idx,
-                                                  vlan_on, false);
-                       if (ret < 0)
-                               return ret;
-               }
-       }
-
-       return ret;
-}
-
-int rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf,
-       uint16_t tx_rate, uint64_t q_msk)
-{
-       struct rte_eth_dev *dev;
-       struct ixgbe_hw *hw;
-       struct ixgbe_vf_info *vfinfo;
-       struct rte_eth_link link;
-       uint8_t  nb_q_per_pool;
-       uint32_t queue_stride;
-       uint32_t queue_idx, idx = 0, vf_idx;
-       uint32_t queue_end;
-       uint16_t total_rate = 0;
-       struct rte_pci_device *pci_dev;
+       uta_idx = (vector >> ixgbe_uta_bit_shift) & ixgbe_uta_idx_mask;
+       uta_shift = vector & ixgbe_uta_bit_mask;
 
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+       rc = ((uta_info->uta_shadow[uta_idx] >> uta_shift & bit1) != 0);
+       if (rc == on)
+               return 0;
 
-       dev = &rte_eth_devices[port];
-       pci_dev = IXGBE_DEV_TO_PCI(dev);
-       rte_eth_link_get_nowait(port, &link);
+       reg_val = IXGBE_READ_REG(hw, IXGBE_UTA(uta_idx));
+       if (on) {
+               uta_info->uta_in_use++;
+               reg_val |= (bit1 << uta_shift);
+               uta_info->uta_shadow[uta_idx] |= (bit1 << uta_shift);
+       } else {
+               uta_info->uta_in_use--;
+               reg_val &= ~(bit1 << uta_shift);
+               uta_info->uta_shadow[uta_idx] &= ~(bit1 << uta_shift);
+       }
 
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
+       IXGBE_WRITE_REG(hw, IXGBE_UTA(uta_idx), reg_val);
 
-       if (vf >= pci_dev->max_vfs)
-               return -EINVAL;
+       if (uta_info->uta_in_use > 0)
+               IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL,
+                               IXGBE_MCSTCTRL_MFE | hw->mac.mc_filter_type);
+       else
+               IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, hw->mac.mc_filter_type);
 
-       if (tx_rate > link.link_speed)
-               return -EINVAL;
+       return 0;
+}
 
-       if (q_msk == 0)
-               return 0;
+static int
+ixgbe_uc_all_hash_table_set(struct rte_eth_dev *dev, uint8_t on)
+{
+       int i;
+       struct ixgbe_hw *hw =
+               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct ixgbe_uta_info *uta_info =
+               IXGBE_DEV_PRIVATE_TO_UTA(dev->data->dev_private);
 
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       vfinfo = *(IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private));
-       nb_q_per_pool = RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool;
-       queue_stride = IXGBE_MAX_RX_QUEUE_NUM / RTE_ETH_DEV_SRIOV(dev).active;
-       queue_idx = vf * queue_stride;
-       queue_end = queue_idx + nb_q_per_pool - 1;
-       if (queue_end >= hw->mac.max_tx_queues)
-               return -EINVAL;
+       /* The UTA table only exists on 82599 hardware and newer */
+       if (hw->mac.type < ixgbe_mac_82599EB)
+               return -ENOTSUP;
 
-       if (vfinfo) {
-               for (vf_idx = 0; vf_idx < pci_dev->max_vfs; vf_idx++) {
-                       if (vf_idx == vf)
-                               continue;
-                       for (idx = 0; idx < RTE_DIM(vfinfo[vf_idx].tx_rate);
-                               idx++)
-                               total_rate += vfinfo[vf_idx].tx_rate[idx];
+       if (on) {
+               for (i = 0; i < ETH_VMDQ_NUM_UC_HASH_ARRAY; i++) {
+                       uta_info->uta_shadow[i] = ~0;
+                       IXGBE_WRITE_REG(hw, IXGBE_UTA(i), ~0);
                }
        } else {
-               return -EINVAL;
-       }
-
-       /* Store tx_rate for this vf. */
-       for (idx = 0; idx < nb_q_per_pool; idx++) {
-               if (((uint64_t)0x1 << idx) & q_msk) {
-                       if (vfinfo[vf].tx_rate[idx] != tx_rate)
-                               vfinfo[vf].tx_rate[idx] = tx_rate;
-                       total_rate += tx_rate;
+               for (i = 0; i < ETH_VMDQ_NUM_UC_HASH_ARRAY; i++) {
+                       uta_info->uta_shadow[i] = 0;
+                       IXGBE_WRITE_REG(hw, IXGBE_UTA(i), 0);
                }
        }
+       return 0;
 
-       if (total_rate > dev->data->dev_link.link_speed) {
-               /* Reset stored TX rate of the VF if it causes exceed
-                * link speed.
-                */
-               memset(vfinfo[vf].tx_rate, 0, sizeof(vfinfo[vf].tx_rate));
-               return -EINVAL;
-       }
+}
 
-       /* Set RTTBCNRC of each queue/pool for vf X  */
-       for (; queue_idx <= queue_end; queue_idx++) {
-               if (0x1 & q_msk)
-                       ixgbe_set_queue_rate_limit(dev, queue_idx, tx_rate);
-               q_msk = q_msk >> 1;
-       }
+uint32_t
+ixgbe_convert_vm_rx_mask_to_val(uint16_t rx_mask, uint32_t orig_val)
+{
+       uint32_t new_val = orig_val;
 
-       return 0;
+       if (rx_mask & ETH_VMDQ_ACCEPT_UNTAG)
+               new_val |= IXGBE_VMOLR_AUPE;
+       if (rx_mask & ETH_VMDQ_ACCEPT_HASH_MC)
+               new_val |= IXGBE_VMOLR_ROMPE;
+       if (rx_mask & ETH_VMDQ_ACCEPT_HASH_UC)
+               new_val |= IXGBE_VMOLR_ROPE;
+       if (rx_mask & ETH_VMDQ_ACCEPT_BROADCAST)
+               new_val |= IXGBE_VMOLR_BAM;
+       if (rx_mask & ETH_VMDQ_ACCEPT_MULTICAST)
+               new_val |= IXGBE_VMOLR_MPE;
+
+       return new_val;
 }
 
 #define IXGBE_MRCTL_VPME  0x01 /* Virtual Pool Mirroring. */
@@ -5401,8 +5395,8 @@ int rte_pmd_ixgbe_set_vf_rate_limit(uint8_t port, uint16_t vf,
 
 static int
 ixgbe_mirror_rule_set(struct rte_eth_dev *dev,
-                       struct rte_eth_mirror_conf *mirror_conf,
-                       uint8_t rule_id, uint8_t on)
+                     struct rte_eth_mirror_conf *mirror_conf,
+                     uint8_t rule_id, uint8_t on)
 {
        uint32_t mr_ctl, vlvf;
        uint32_t mp_lsb = 0;
@@ -5433,22 +5427,28 @@ ixgbe_mirror_rule_set(struct rte_eth_dev *dev,
 
        if (IXGBE_INVALID_MIRROR_TYPE(mirror_conf->rule_type)) {
                PMD_DRV_LOG(ERR, "unsupported mirror type 0x%x.",
-                       mirror_conf->rule_type);
+                           mirror_conf->rule_type);
                return -EINVAL;
        }
 
        if (mirror_conf->rule_type & ETH_MIRROR_VLAN) {
                mirror_type |= IXGBE_MRCTL_VLME;
-               /* Check if vlan id is valid and find conresponding VLAN ID index in VLVF */
+               /* Check if vlan id is valid and find conresponding VLAN ID
+                * index in VLVF
+                */
                for (i = 0; i < IXGBE_VLVF_ENTRIES; i++) {
                        if (mirror_conf->vlan.vlan_mask & (1ULL << i)) {
-                               /* search vlan id related pool vlan filter index */
-                               reg_index = ixgbe_find_vlvf_slot(hw,
-                                                mirror_conf->vlan.vlan_id[i],
-                                                false);
+                               /* search vlan id related pool vlan filter
+                                * index
+                                */
+                               reg_index = ixgbe_find_vlvf_slot(
+                                               hw,
+                                               mirror_conf->vlan.vlan_id[i],
+                                               false);
                                if (reg_index < 0)
                                        return -EINVAL;
-                               vlvf = IXGBE_READ_REG(hw, IXGBE_VLVF(reg_index));
+                               vlvf = IXGBE_READ_REG(hw,
+                                                     IXGBE_VLVF(reg_index));
                                if ((vlvf & IXGBE_VLVF_VIEN) &&
                                    ((vlvf & IXGBE_VLVF_VLANID_MASK) ==
                                      mirror_conf->vlan.vlan_id[i]))
@@ -5478,7 +5478,7 @@ ixgbe_mirror_rule_set(struct rte_eth_dev *dev,
                }
        }
 
-       /*
+       /**
         * if enable pool mirror, write related pool mask register,if disable
         * pool mirror, clear PFMRVM register
         */
@@ -5508,8 +5508,9 @@ ixgbe_mirror_rule_set(struct rte_eth_dev *dev,
                mr_ctl |= mirror_type;
                mr_ctl &= mirror_rule_mask;
                mr_ctl |= mirror_conf->dst_pool << dst_pool_offset;
-       } else
+       } else {
                mr_ctl &= ~(mirror_conf->rule_type & mirror_rule_mask);
+       }
 
        mr_info->mr_conf[rule_id].rule_type = mirror_conf->rule_type;
        mr_info->mr_conf[rule_id].dst_pool = mirror_conf->dst_pool;
@@ -5518,13 +5519,13 @@ ixgbe_mirror_rule_set(struct rte_eth_dev *dev,
        IXGBE_WRITE_REG(hw, IXGBE_MRCTL(rule_id), mr_ctl);
 
        /* write pool mirrror control  register */
-       if (mirror_conf->rule_type == ETH_MIRROR_VIRTUAL_POOL_UP) {
+       if (mirror_conf->rule_type & ETH_MIRROR_VIRTUAL_POOL_UP) {
                IXGBE_WRITE_REG(hw, IXGBE_VMRVM(rule_id), mp_lsb);
                IXGBE_WRITE_REG(hw, IXGBE_VMRVM(rule_id + rule_mr_offset),
                                mp_msb);
        }
        /* write VLAN mirrror control  register */
-       if (mirror_conf->rule_type == ETH_MIRROR_VLAN) {
+       if (mirror_conf->rule_type & ETH_MIRROR_VLAN) {
                IXGBE_WRITE_REG(hw, IXGBE_VMRVLAN(rule_id), mv_lsb);
                IXGBE_WRITE_REG(hw, IXGBE_VMRVLAN(rule_id + rule_mr_offset),
                                mv_msb);
@@ -5549,8 +5550,11 @@ ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
        if (ixgbe_vt_check(hw) < 0)
                return -ENOTSUP;
 
+       if (rule_id >= IXGBE_MAX_MIRROR_RULES)
+               return -EINVAL;
+
        memset(&mr_info->mr_conf[rule_id], 0,
-               sizeof(struct rte_eth_mirror_conf));
+              sizeof(struct rte_eth_mirror_conf));
 
        /* clear PFVMCTL register */
        IXGBE_WRITE_REG(hw, IXGBE_MRCTL(rule_id), mr_ctl);
@@ -5569,14 +5573,17 @@ ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
 static int
 ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        uint32_t mask;
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       uint32_t vec = IXGBE_MISC_VEC_ID;
 
        mask = IXGBE_READ_REG(hw, IXGBE_VTEIMS);
-       mask |= (1 << IXGBE_MISC_VEC_ID);
+       if (rte_intr_allow_others(intr_handle))
+               vec = IXGBE_RX_VEC_START;
+       mask |= (1 << vec);
        RTE_SET_USED(queue_id);
        IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
 
@@ -5591,9 +5598,14 @@ ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
        uint32_t mask;
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
+       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+       uint32_t vec = IXGBE_MISC_VEC_ID;
 
        mask = IXGBE_READ_REG(hw, IXGBE_VTEIMS);
-       mask &= ~(1 << IXGBE_MISC_VEC_ID);
+       if (rte_intr_allow_others(intr_handle))
+               vec = IXGBE_RX_VEC_START;
+       mask &= ~(1 << vec);
        RTE_SET_USED(queue_id);
        IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
 
@@ -5603,7 +5615,7 @@ ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
 static int
 ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        uint32_t mask;
        struct ixgbe_hw *hw =
@@ -5706,7 +5718,8 @@ ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
                tmp |= (msix_vector << (8 * (queue & 0x3)));
                IXGBE_WRITE_REG(hw, IXGBE_IVAR(idx), tmp);
        } else if ((hw->mac.type == ixgbe_mac_82599EB) ||
-                       (hw->mac.type == ixgbe_mac_X540)) {
+                       (hw->mac.type == ixgbe_mac_X540) ||
+                       (hw->mac.type == ixgbe_mac_X550)) {
                if (direction == -1) {
                        /* other causes */
                        idx = ((queue & 1) * 8);
@@ -5728,12 +5741,13 @@ ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
 static void
 ixgbevf_configure_msix(struct rte_eth_dev *dev)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        uint32_t q_idx;
        uint32_t vector_idx = IXGBE_MISC_VEC_ID;
+       uint32_t base = IXGBE_MISC_VEC_ID;
 
        /* Configure VF other cause ivar */
        ixgbevf_set_ivar_map(hw, -1, 1, vector_idx);
@@ -5744,6 +5758,11 @@ ixgbevf_configure_msix(struct rte_eth_dev *dev)
        if (!rte_intr_dp_is_en(intr_handle))
                return;
 
+       if (rte_intr_allow_others(intr_handle)) {
+               base = IXGBE_RX_VEC_START;
+               vector_idx = IXGBE_RX_VEC_START;
+       }
+
        /* Configure all RX queues of VF */
        for (q_idx = 0; q_idx < dev->data->nb_rx_queues; q_idx++) {
                /* Force all queue use vector 0,
@@ -5751,6 +5770,8 @@ ixgbevf_configure_msix(struct rte_eth_dev *dev)
                 */
                ixgbevf_set_ivar_map(hw, 0, q_idx, vector_idx);
                intr_handle->intr_vec[q_idx] = vector_idx;
+               if (vector_idx < base + intr_handle->nb_efd - 1)
+                       vector_idx++;
        }
 }
 
@@ -5762,7 +5783,7 @@ ixgbevf_configure_msix(struct rte_eth_dev *dev)
 static void
 ixgbe_configure_msix(struct rte_eth_dev *dev)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -5814,6 +5835,7 @@ ixgbe_configure_msix(struct rte_eth_dev *dev)
                break;
        case ixgbe_mac_82599EB:
        case ixgbe_mac_X540:
+       case ixgbe_mac_X550:
                ixgbe_set_ivar_map(hw, -1, 1, IXGBE_MISC_VEC_ID);
                break;
        default:
@@ -5831,8 +5853,9 @@ ixgbe_configure_msix(struct rte_eth_dev *dev)
        IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
 }
 
-static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
-       uint16_t queue_idx, uint16_t tx_rate)
+int
+ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
+                          uint16_t queue_idx, uint16_t tx_rate)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        uint32_t rf_dec, rf_int;
@@ -5878,7 +5901,7 @@ static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
        return 0;
 }
 
-static void
+static int
 ixgbevf_add_mac_addr(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
                     __attribute__((unused)) uint32_t index,
                     __attribute__((unused)) uint32_t pool)
@@ -5892,11 +5915,19 @@ ixgbevf_add_mac_addr(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
         * set of PF resources used to store VF MAC addresses.
         */
        if (memcmp(hw->mac.perm_addr, mac_addr, sizeof(struct ether_addr)) == 0)
-               return;
+               return -1;
        diag = ixgbevf_set_uc_addr_vf(hw, 2, mac_addr->addr_bytes);
-       if (diag == 0)
-               return;
-       PMD_DRV_LOG(ERR, "Unable to add MAC address - diag=%d", diag);
+       if (diag != 0)
+               PMD_DRV_LOG(ERR, "Unable to add MAC address "
+                           "%02x:%02x:%02x:%02x:%02x:%02x - diag=%d",
+                           mac_addr->addr_bytes[0],
+                           mac_addr->addr_bytes[1],
+                           mac_addr->addr_bytes[2],
+                           mac_addr->addr_bytes[3],
+                           mac_addr->addr_bytes[4],
+                           mac_addr->addr_bytes[5],
+                           diag);
+       return diag;
 }
 
 static void
@@ -5955,13 +5986,6 @@ ixgbevf_set_default_mac_addr(struct rte_eth_dev *dev, struct ether_addr *addr)
        hw->mac.ops.set_rar(hw, 0, (void *)addr, 0, 0);
 }
 
-#define MAC_TYPE_FILTER_SUP(type)    do {\
-       if ((type) != ixgbe_mac_82599EB && (type) != ixgbe_mac_X540 &&\
-               (type) != ixgbe_mac_X550 && (type) != ixgbe_mac_X550EM_x &&\
-               (type) != ixgbe_mac_X550EM_a)\
-               return -ENOTSUP;\
-} while (0)
-
 int
 ixgbe_syn_filter_set(struct rte_eth_dev *dev,
                        struct rte_eth_syn_filter *filter,
@@ -6199,6 +6223,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 {
        struct ixgbe_hw *hw;
        uint32_t max_frame = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+       struct rte_eth_rxmode *rx_conf = &dev->data->dev_conf.rxmode;
 
        hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
@@ -6208,7 +6233,7 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
        /* refuse mtu that requires the support of scattered packets when this
         * feature has not been enabled before.
         */
-       if (!dev->data->scattered_rx &&
+       if (!rx_conf->enable_scatter &&
            (max_frame + 2 * IXGBE_VLAN_TAG_SIZE >
             dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM))
                return -EINVAL;
@@ -6229,11 +6254,6 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
        return 0;
 }
 
-#define MAC_TYPE_FILTER_SUP_EXT(type)    do {\
-       if ((type) != ixgbe_mac_82599EB && (type) != ixgbe_mac_X540)\
-               return -ENOTSUP;\
-} while (0)
-
 static inline struct ixgbe_5tuple_filter *
 ixgbe_5tuple_filter_lookup(struct ixgbe_5tuple_filter_list *filter_list,
                        struct ixgbe_5tuple_filter_info *key)
@@ -6378,7 +6398,7 @@ ixgbe_add_del_ntuple_filter(struct rte_eth_dev *dev,
                                sizeof(struct ixgbe_5tuple_filter), 0);
                if (filter == NULL)
                        return -ENOMEM;
-               (void)rte_memcpy(&filter->filter_info,
+               rte_memcpy(&filter->filter_info,
                                 &filter_5tuple,
                                 sizeof(struct ixgbe_5tuple_filter_info));
                filter->queue = ntuple_filter->queue;
@@ -7218,6 +7238,8 @@ ixgbe_dev_get_dcb_info(struct rte_eth_dev *dev,
        struct ixgbe_dcb_config *dcb_config =
                        IXGBE_DEV_PRIVATE_TO_DCB_CFG(dev->data->dev_private);
        struct ixgbe_dcb_tc_config *tc;
+       struct rte_eth_dcb_tc_queue_mapping *tc_queue;
+       uint8_t nb_tcs;
        uint8_t i, j;
 
        if (dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_DCB_FLAG)
@@ -7225,19 +7247,31 @@ ixgbe_dev_get_dcb_info(struct rte_eth_dev *dev,
        else
                dcb_info->nb_tcs = 1;
 
+       tc_queue = &dcb_info->tc_queue;
+       nb_tcs = dcb_info->nb_tcs;
+
        if (dcb_config->vt_mode) { /* vt is enabled*/
                struct rte_eth_vmdq_dcb_conf *vmdq_rx_conf =
                                &dev->data->dev_conf.rx_adv_conf.vmdq_dcb_conf;
                for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++)
                        dcb_info->prio_tc[i] = vmdq_rx_conf->dcb_tc[i];
-               for (i = 0; i < vmdq_rx_conf->nb_queue_pools; i++) {
-                       for (j = 0; j < dcb_info->nb_tcs; j++) {
-                               dcb_info->tc_queue.tc_rxq[i][j].base =
-                                               i * dcb_info->nb_tcs + j;
-                               dcb_info->tc_queue.tc_rxq[i][j].nb_queue = 1;
-                               dcb_info->tc_queue.tc_txq[i][j].base =
-                                               i * dcb_info->nb_tcs + j;
-                               dcb_info->tc_queue.tc_txq[i][j].nb_queue = 1;
+               if (RTE_ETH_DEV_SRIOV(dev).active > 0) {
+                       for (j = 0; j < nb_tcs; j++) {
+                               tc_queue->tc_rxq[0][j].base = j;
+                               tc_queue->tc_rxq[0][j].nb_queue = 1;
+                               tc_queue->tc_txq[0][j].base = j;
+                               tc_queue->tc_txq[0][j].nb_queue = 1;
+                       }
+               } else {
+                       for (i = 0; i < vmdq_rx_conf->nb_queue_pools; i++) {
+                               for (j = 0; j < nb_tcs; j++) {
+                                       tc_queue->tc_rxq[i][j].base =
+                                               i * nb_tcs + j;
+                                       tc_queue->tc_rxq[i][j].nb_queue = 1;
+                                       tc_queue->tc_txq[i][j].base =
+                                               i * nb_tcs + j;
+                                       tc_queue->tc_txq[i][j].nb_queue = 1;
+                               }
                        }
                }
        } else { /* vt is disabled*/
@@ -7594,7 +7628,7 @@ ixgbe_dev_l2_tunnel_filter_add(struct rte_eth_dev *dev,
                if (!node)
                        return -ENOMEM;
 
-               (void)rte_memcpy(&node->key,
+               rte_memcpy(&node->key,
                                 &key,
                                 sizeof(struct ixgbe_l2_tn_key));
                node->pool = l2_tunnel->pool;
@@ -7767,7 +7801,7 @@ ixgbe_e_tag_insertion_en_dis(struct rte_eth_dev *dev,
                             struct rte_eth_l2_tunnel_conf *l2_tunnel,
                             bool en)
 {
-       struct rte_pci_device *pci_dev = IXGBE_DEV_TO_PCI(dev);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        int ret = 0;
        uint32_t vmtir, vmvir;
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -8102,7 +8136,7 @@ ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
-       hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_NONE);
+       hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_MULTI);
 }
 
 static void ixgbevf_mbx_process(struct rte_eth_dev *dev)
@@ -8115,7 +8149,8 @@ static void ixgbevf_mbx_process(struct rte_eth_dev *dev)
 
        /* PF reset VF event */
        if (in_msg == IXGBE_PF_CONTROL_MSG)
-               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RESET, NULL);
+               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RESET,
+                                             NULL, NULL);
 }
 
 static int
@@ -8157,8 +8192,7 @@ ixgbevf_dev_interrupt_action(struct rte_eth_dev *dev)
 }
 
 static void
-ixgbevf_dev_interrupt_handler(__rte_unused struct rte_intr_handle *handle,
-                             void *param)
+ixgbevf_dev_interrupt_handler(void *param)
 {
        struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
 
@@ -8217,303 +8251,6 @@ int ixgbe_enable_sec_tx_path_generic(struct ixgbe_hw *hw)
        return IXGBE_SUCCESS;
 }
 
-int
-rte_pmd_ixgbe_macsec_enable(uint8_t port, uint8_t en, uint8_t rp)
-{
-       struct ixgbe_hw *hw;
-       struct rte_eth_dev *dev;
-       uint32_t ctrl;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-       /* Stop the data paths */
-       if (ixgbe_disable_sec_rx_path(hw) != IXGBE_SUCCESS)
-               return -ENOTSUP;
-       /*
-        * Workaround:
-        * As no ixgbe_disable_sec_rx_path equivalent is
-        * implemented for tx in the base code, and we are
-        * not allowed to modify the base code in DPDK, so
-        * just call the hand-written one directly for now.
-        * The hardware support has been checked by
-        * ixgbe_disable_sec_rx_path().
-        */
-       ixgbe_disable_sec_tx_path_generic(hw);
-
-       /* Enable Ethernet CRC (required by MACsec offload) */
-       ctrl = IXGBE_READ_REG(hw, IXGBE_HLREG0);
-       ctrl |= IXGBE_HLREG0_TXCRCEN | IXGBE_HLREG0_RXCRCSTRP;
-       IXGBE_WRITE_REG(hw, IXGBE_HLREG0, ctrl);
-
-       /* Enable the TX and RX crypto engines */
-       ctrl = IXGBE_READ_REG(hw, IXGBE_SECTXCTRL);
-       ctrl &= ~IXGBE_SECTXCTRL_SECTX_DIS;
-       IXGBE_WRITE_REG(hw, IXGBE_SECTXCTRL, ctrl);
-
-       ctrl = IXGBE_READ_REG(hw, IXGBE_SECRXCTRL);
-       ctrl &= ~IXGBE_SECRXCTRL_SECRX_DIS;
-       IXGBE_WRITE_REG(hw, IXGBE_SECRXCTRL, ctrl);
-
-       ctrl = IXGBE_READ_REG(hw, IXGBE_SECTXMINIFG);
-       ctrl &= ~IXGBE_SECTX_MINSECIFG_MASK;
-       ctrl |= 0x3;
-       IXGBE_WRITE_REG(hw, IXGBE_SECTXMINIFG, ctrl);
-
-       /* Enable SA lookup */
-       ctrl = IXGBE_READ_REG(hw, IXGBE_LSECTXCTRL);
-       ctrl &= ~IXGBE_LSECTXCTRL_EN_MASK;
-       ctrl |= en ? IXGBE_LSECTXCTRL_AUTH_ENCRYPT :
-                    IXGBE_LSECTXCTRL_AUTH;
-       ctrl |= IXGBE_LSECTXCTRL_AISCI;
-       ctrl &= ~IXGBE_LSECTXCTRL_PNTHRSH_MASK;
-       ctrl |= IXGBE_MACSEC_PNTHRSH & IXGBE_LSECTXCTRL_PNTHRSH_MASK;
-       IXGBE_WRITE_REG(hw, IXGBE_LSECTXCTRL, ctrl);
-
-       ctrl = IXGBE_READ_REG(hw, IXGBE_LSECRXCTRL);
-       ctrl &= ~IXGBE_LSECRXCTRL_EN_MASK;
-       ctrl |= IXGBE_LSECRXCTRL_STRICT << IXGBE_LSECRXCTRL_EN_SHIFT;
-       ctrl &= ~IXGBE_LSECRXCTRL_PLSH;
-       if (rp)
-               ctrl |= IXGBE_LSECRXCTRL_RP;
-       else
-               ctrl &= ~IXGBE_LSECRXCTRL_RP;
-       IXGBE_WRITE_REG(hw, IXGBE_LSECRXCTRL, ctrl);
-
-       /* Start the data paths */
-       ixgbe_enable_sec_rx_path(hw);
-       /*
-        * Workaround:
-        * As no ixgbe_enable_sec_rx_path equivalent is
-        * implemented for tx in the base code, and we are
-        * not allowed to modify the base code in DPDK, so
-        * just call the hand-written one directly for now.
-        */
-       ixgbe_enable_sec_tx_path_generic(hw);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_macsec_disable(uint8_t port)
-{
-       struct ixgbe_hw *hw;
-       struct rte_eth_dev *dev;
-       uint32_t ctrl;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-       /* Stop the data paths */
-       if (ixgbe_disable_sec_rx_path(hw) != IXGBE_SUCCESS)
-               return -ENOTSUP;
-       /*
-        * Workaround:
-        * As no ixgbe_disable_sec_rx_path equivalent is
-        * implemented for tx in the base code, and we are
-        * not allowed to modify the base code in DPDK, so
-        * just call the hand-written one directly for now.
-        * The hardware support has been checked by
-        * ixgbe_disable_sec_rx_path().
-        */
-       ixgbe_disable_sec_tx_path_generic(hw);
-
-       /* Disable the TX and RX crypto engines */
-       ctrl = IXGBE_READ_REG(hw, IXGBE_SECTXCTRL);
-       ctrl |= IXGBE_SECTXCTRL_SECTX_DIS;
-       IXGBE_WRITE_REG(hw, IXGBE_SECTXCTRL, ctrl);
-
-       ctrl = IXGBE_READ_REG(hw, IXGBE_SECRXCTRL);
-       ctrl |= IXGBE_SECRXCTRL_SECRX_DIS;
-       IXGBE_WRITE_REG(hw, IXGBE_SECRXCTRL, ctrl);
-
-       /* Disable SA lookup */
-       ctrl = IXGBE_READ_REG(hw, IXGBE_LSECTXCTRL);
-       ctrl &= ~IXGBE_LSECTXCTRL_EN_MASK;
-       ctrl |= IXGBE_LSECTXCTRL_DISABLE;
-       IXGBE_WRITE_REG(hw, IXGBE_LSECTXCTRL, ctrl);
-
-       ctrl = IXGBE_READ_REG(hw, IXGBE_LSECRXCTRL);
-       ctrl &= ~IXGBE_LSECRXCTRL_EN_MASK;
-       ctrl |= IXGBE_LSECRXCTRL_DISABLE << IXGBE_LSECRXCTRL_EN_SHIFT;
-       IXGBE_WRITE_REG(hw, IXGBE_LSECRXCTRL, ctrl);
-
-       /* Start the data paths */
-       ixgbe_enable_sec_rx_path(hw);
-       /*
-        * Workaround:
-        * As no ixgbe_enable_sec_rx_path equivalent is
-        * implemented for tx in the base code, and we are
-        * not allowed to modify the base code in DPDK, so
-        * just call the hand-written one directly for now.
-        */
-       ixgbe_enable_sec_tx_path_generic(hw);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_macsec_config_txsc(uint8_t port, uint8_t *mac)
-{
-       struct ixgbe_hw *hw;
-       struct rte_eth_dev *dev;
-       uint32_t ctrl;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-       ctrl = mac[0] | (mac[1] << 8) | (mac[2] << 16) | (mac[3] << 24);
-       IXGBE_WRITE_REG(hw, IXGBE_LSECTXSCL, ctrl);
-
-       ctrl = mac[4] | (mac[5] << 8);
-       IXGBE_WRITE_REG(hw, IXGBE_LSECTXSCH, ctrl);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_macsec_config_rxsc(uint8_t port, uint8_t *mac, uint16_t pi)
-{
-       struct ixgbe_hw *hw;
-       struct rte_eth_dev *dev;
-       uint32_t ctrl;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-       ctrl = mac[0] | (mac[1] << 8) | (mac[2] << 16) | (mac[3] << 24);
-       IXGBE_WRITE_REG(hw, IXGBE_LSECRXSCL, ctrl);
-
-       pi = rte_cpu_to_be_16(pi);
-       ctrl = mac[4] | (mac[5] << 8) | (pi << 16);
-       IXGBE_WRITE_REG(hw, IXGBE_LSECRXSCH, ctrl);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_macsec_select_txsa(uint8_t port, uint8_t idx, uint8_t an,
-                                uint32_t pn, uint8_t *key)
-{
-       struct ixgbe_hw *hw;
-       struct rte_eth_dev *dev;
-       uint32_t ctrl, i;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-       if (idx != 0 && idx != 1)
-               return -EINVAL;
-
-       if (an >= 4)
-               return -EINVAL;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-       /* Set the PN and key */
-       pn = rte_cpu_to_be_32(pn);
-       if (idx == 0) {
-               IXGBE_WRITE_REG(hw, IXGBE_LSECTXPN0, pn);
-
-               for (i = 0; i < 4; i++) {
-                       ctrl = (key[i * 4 + 0] <<  0) |
-                              (key[i * 4 + 1] <<  8) |
-                              (key[i * 4 + 2] << 16) |
-                              (key[i * 4 + 3] << 24);
-                       IXGBE_WRITE_REG(hw, IXGBE_LSECTXKEY0(i), ctrl);
-               }
-       } else {
-               IXGBE_WRITE_REG(hw, IXGBE_LSECTXPN1, pn);
-
-               for (i = 0; i < 4; i++) {
-                       ctrl = (key[i * 4 + 0] <<  0) |
-                              (key[i * 4 + 1] <<  8) |
-                              (key[i * 4 + 2] << 16) |
-                              (key[i * 4 + 3] << 24);
-                       IXGBE_WRITE_REG(hw, IXGBE_LSECTXKEY1(i), ctrl);
-               }
-       }
-
-       /* Set AN and select the SA */
-       ctrl = (an << idx * 2) | (idx << 4);
-       IXGBE_WRITE_REG(hw, IXGBE_LSECTXSA, ctrl);
-
-       return 0;
-}
-
-int
-rte_pmd_ixgbe_macsec_select_rxsa(uint8_t port, uint8_t idx, uint8_t an,
-                                uint32_t pn, uint8_t *key)
-{
-       struct ixgbe_hw *hw;
-       struct rte_eth_dev *dev;
-       uint32_t ctrl, i;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
-
-       dev = &rte_eth_devices[port];
-
-       if (!is_device_supported(dev, &rte_ixgbe_pmd))
-               return -ENOTSUP;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-       if (idx != 0 && idx != 1)
-               return -EINVAL;
-
-       if (an >= 4)
-               return -EINVAL;
-
-       /* Set the PN */
-       pn = rte_cpu_to_be_32(pn);
-       IXGBE_WRITE_REG(hw, IXGBE_LSECRXPN(idx), pn);
-
-       /* Set the key */
-       for (i = 0; i < 4; i++) {
-               ctrl = (key[i * 4 + 0] <<  0) |
-                      (key[i * 4 + 1] <<  8) |
-                      (key[i * 4 + 2] << 16) |
-                      (key[i * 4 + 3] << 24);
-               IXGBE_WRITE_REG(hw, IXGBE_LSECRXKEY(idx, i), ctrl);
-       }
-
-       /* Set the AN and validate the SA */
-       ctrl = an | (1 << 2);
-       IXGBE_WRITE_REG(hw, IXGBE_LSECRXSA(idx), ctrl);
-
-       return 0;
-}
-
 /* restore n-tuple filter */
 static inline void
 ixgbe_ntuple_filter_restore(struct rte_eth_dev *dev)
@@ -8680,9 +8417,9 @@ ixgbe_clear_all_l2_tn_filter(struct rte_eth_dev *dev)
        return 0;
 }
 
-RTE_PMD_REGISTER_PCI(net_ixgbe, rte_ixgbe_pmd.pci_drv);
+RTE_PMD_REGISTER_PCI(net_ixgbe, rte_ixgbe_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_ixgbe, pci_id_ixgbe_map);
-RTE_PMD_REGISTER_KMOD_DEP(net_ixgbe, "* igb_uio | uio_pci_generic | vfio");
-RTE_PMD_REGISTER_PCI(net_ixgbe_vf, rte_ixgbevf_pmd.pci_drv);
+RTE_PMD_REGISTER_KMOD_DEP(net_ixgbe, "* igb_uio | uio_pci_generic | vfio-pci");
+RTE_PMD_REGISTER_PCI(net_ixgbe_vf, rte_ixgbevf_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_ixgbe_vf, pci_id_ixgbevf_map);
-RTE_PMD_REGISTER_KMOD_DEP(net_ixgbe_vf, "* igb_uio | vfio");
+RTE_PMD_REGISTER_KMOD_DEP(net_ixgbe_vf, "* igb_uio | vfio-pci");