net/bnxt: fix Thor SVIF size for generic tables
[dpdk.git] / drivers / net / ixgbe / ixgbe_ethdev.c
index dbcb20e..fe61dba 100644 (file)
@@ -1,34 +1,5 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2017 Intel Corporation
  */
 
 #include <sys/queue.h>
@@ -39,7 +10,7 @@
 #include <unistd.h>
 #include <stdarg.h>
 #include <inttypes.h>
-#include <netinet/in.h>
+#include <rte_string_fns.h>
 #include <rte_byteorder.h>
 #include <rte_common.h>
 #include <rte_cycles.h>
 #include <rte_log.h>
 #include <rte_debug.h>
 #include <rte_pci.h>
-#include <rte_atomic.h>
+#include <rte_bus_pci.h>
 #include <rte_branch_prediction.h>
 #include <rte_memory.h>
-#include <rte_memzone.h>
+#include <rte_kvargs.h>
 #include <rte_eal.h>
 #include <rte_alarm.h>
 #include <rte_ether.h>
-#include <rte_ethdev.h>
-#include <rte_ethdev_pci.h>
-#include <rte_atomic.h>
+#include <ethdev_driver.h>
+#include <ethdev_pci.h>
 #include <rte_malloc.h>
 #include <rte_random.h>
 #include <rte_dev.h>
 #include <rte_hash_crc.h>
+#ifdef RTE_LIB_SECURITY
+#include <rte_security_driver.h>
+#endif
 
 #include "ixgbe_logs.h"
 #include "base/ixgbe_api.h"
@@ -72,6 +45,7 @@
 #include "ixgbe_rxtx.h"
 #include "base/ixgbe_type.h"
 #include "base/ixgbe_phy.h"
+#include "base/ixgbe_osdep.h"
 #include "ixgbe_regs.h"
 
 /*
  */
 #define IXGBE_FC_LO    0x40
 
-/* Default minimum inter-interrupt interval for EITR configuration */
-#define IXGBE_MIN_INTER_INTERRUPT_INTERVAL_DEFAULT    0x79E
-
 /* Timer value included in XOFF frames. */
 #define IXGBE_FC_PAUSE 0x680
 
+/*Default value of Max Rx Queue*/
+#define IXGBE_MAX_RX_QUEUE_NUM 128
+
 #define IXGBE_LINK_DOWN_CHECK_TIMEOUT 4000 /* ms */
 #define IXGBE_LINK_UP_CHECK_TIMEOUT   1000 /* ms */
 #define IXGBE_VMDQ_NUM_UC_MAC         4096 /* Maximum nb. of UC MAC addr. */
 
 #define IXGBE_QUEUE_STAT_COUNTERS (sizeof(hw_stats->qprc) / sizeof(hw_stats->qprc[0]))
 
-#define IXGBE_HKEY_MAX_INDEX 10
-
 /* Additional timesync values. */
 #define NSEC_PER_SEC             1000000000L
 #define IXGBE_INCVAL_10GB        0x66666666
 
 #define IXGBE_VT_CTL_POOLING_MODE_MASK         0x00030000
 #define IXGBE_VT_CTL_POOLING_MODE_ETAG         0x00010000
-#define DEFAULT_ETAG_ETYPE                     0x893f
 #define IXGBE_ETAG_ETYPE                       0x00005084
 #define IXGBE_ETAG_ETYPE_MASK                  0x0000ffff
 #define IXGBE_ETAG_ETYPE_VALID                 0x80000000
 #define IXGBE_EXVET_VET_EXT_SHIFT              16
 #define IXGBE_DMATXCTL_VT_MASK                 0xFFFF0000
 
-static int eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev);
+#define IXGBEVF_DEVARG_PFLINK_FULLCHK          "pflink_fullchk"
+
+static const char * const ixgbevf_valid_arguments[] = {
+       IXGBEVF_DEVARG_PFLINK_FULLCHK,
+       NULL
+};
+
+static int eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params);
 static int eth_ixgbe_dev_uninit(struct rte_eth_dev *eth_dev);
 static int ixgbe_fdir_filter_init(struct rte_eth_dev *eth_dev);
 static int ixgbe_fdir_filter_uninit(struct rte_eth_dev *eth_dev);
 static int ixgbe_l2_tn_filter_init(struct rte_eth_dev *eth_dev);
 static int ixgbe_l2_tn_filter_uninit(struct rte_eth_dev *eth_dev);
 static int ixgbe_ntuple_filter_uninit(struct rte_eth_dev *eth_dev);
-static int  ixgbe_dev_configure(struct rte_eth_dev *dev);
-static int  ixgbe_dev_start(struct rte_eth_dev *dev);
-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 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_configure(struct rte_eth_dev *dev);
+static int ixgbe_dev_start(struct rte_eth_dev *dev);
+static int 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 int ixgbe_dev_close(struct rte_eth_dev *dev);
+static int ixgbe_dev_reset(struct rte_eth_dev *dev);
+static int ixgbe_dev_promiscuous_enable(struct rte_eth_dev *dev);
+static int ixgbe_dev_promiscuous_disable(struct rte_eth_dev *dev);
+static int ixgbe_dev_allmulticast_enable(struct rte_eth_dev *dev);
+static int 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);
@@ -185,8 +164,8 @@ static int ixgbevf_dev_xstats_get(struct rte_eth_dev *dev,
 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_stats_reset(struct rte_eth_dev *dev);
+static int ixgbe_dev_xstats_reset(struct rte_eth_dev *dev);
 static int ixgbe_dev_xstats_get_names(struct rte_eth_dev *dev,
        struct rte_eth_xstat_name *xstats_names,
        unsigned int size);
@@ -194,8 +173,8 @@ 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,
+       struct rte_eth_xstat_name *xstats_names,
        unsigned int limit);
 static int ixgbe_dev_queue_stats_mapping_set(struct rte_eth_dev *eth_dev,
                                             uint16_t queue_id,
@@ -203,11 +182,11 @@ static int ixgbe_dev_queue_stats_mapping_set(struct rte_eth_dev *eth_dev,
                                             uint8_t is_rx);
 static int 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);
+static int ixgbe_dev_info_get(struct rte_eth_dev *dev,
+                             struct rte_eth_dev_info *dev_info);
 static const uint32_t *ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev);
-static void ixgbevf_dev_info_get(struct rte_eth_dev *dev,
-                                struct rte_eth_dev_info *dev_info);
+static int ixgbevf_dev_info_get(struct rte_eth_dev *dev,
+                               struct rte_eth_dev_info *dev_info);
 static int ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
 
 static int ixgbe_vlan_filter_set(struct rte_eth_dev *dev,
@@ -219,7 +198,10 @@ static void ixgbe_vlan_hw_strip_bitmap_set(struct rte_eth_dev *dev,
                uint16_t queue, bool on);
 static void ixgbe_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue,
                int on);
-static void ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask);
+static void ixgbe_config_vlan_strip_on_all_queues(struct rte_eth_dev *dev,
+                                                 int mask);
+static int ixgbe_vlan_offload_config(struct rte_eth_dev *dev, int mask);
+static int ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void ixgbe_vlan_hw_strip_enable(struct rte_eth_dev *dev, uint16_t queue);
 static void ixgbe_vlan_hw_strip_disable(struct rte_eth_dev *dev, uint16_t queue);
 static void ixgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev);
@@ -240,19 +222,23 @@ 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 int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev);
 static void ixgbe_dev_interrupt_handler(void *param);
 static void ixgbe_dev_interrupt_delayed_handler(void *param);
-static int ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
-                        uint32_t index, uint32_t pool);
+static void *ixgbe_dev_setup_link_thread_handler(void *param);
+static int ixgbe_dev_wait_setup_link_complete(struct rte_eth_dev *dev,
+                                             uint32_t timeout_ms);
+
+static int ixgbe_add_rar(struct rte_eth_dev *dev,
+                       struct rte_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 int ixgbe_set_default_mac_addr(struct rte_eth_dev *dev,
+                                          struct rte_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 rte_pci_driver *drv);
@@ -264,18 +250,20 @@ 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 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_stop(struct rte_eth_dev *dev);
+static int ixgbevf_dev_close(struct rte_eth_dev *dev);
+static int  ixgbevf_dev_reset(struct rte_eth_dev *dev);
+static void ixgbevf_intr_disable(struct rte_eth_dev *dev);
+static void ixgbevf_intr_enable(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_dev_stats_reset(struct rte_eth_dev *dev);
 static int ixgbevf_vlan_filter_set(struct rte_eth_dev *dev,
                uint16_t vlan_id, int on);
 static void ixgbevf_vlan_strip_queue_set(struct rte_eth_dev *dev,
                uint16_t queue, int on);
-static void ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
+static int ixgbevf_vlan_offload_config(struct rte_eth_dev *dev, int mask);
+static int ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on);
 static int ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
                                            uint16_t queue_id);
@@ -284,18 +272,15 @@ static int ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
 static void ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
                                 uint8_t queue, uint8_t msix_vector);
 static void ixgbevf_configure_msix(struct rte_eth_dev *dev);
-static void ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev);
-static void ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev);
+static int ixgbevf_dev_promiscuous_enable(struct rte_eth_dev *dev);
+static int ixgbevf_dev_promiscuous_disable(struct rte_eth_dev *dev);
+static int ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev);
+static int ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev);
 
 /* For Eth VMDQ APIs support */
 static int ixgbe_uc_hash_table_set(struct rte_eth_dev *dev, struct
-               ether_addr * mac_addr, uint8_t on);
+               rte_ether_addr * mac_addr, uint8_t on);
 static int ixgbe_uc_all_hash_table_set(struct rte_eth_dev *dev, uint8_t on);
-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);
-static int ixgbe_mirror_rule_reset(struct rte_eth_dev *dev,
-               uint8_t rule_id);
 static int ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
                                          uint16_t queue_id);
 static int ixgbe_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
@@ -304,42 +289,22 @@ 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 int ixgbevf_add_mac_addr(struct rte_eth_dev *dev,
-                               struct ether_addr *mac_addr,
+                               struct rte_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);
-static int ixgbe_syn_filter_get(struct rte_eth_dev *dev,
-                       struct rte_eth_syn_filter *filter);
-static int ixgbe_syn_filter_handle(struct rte_eth_dev *dev,
-                       enum rte_filter_op filter_op,
-                       void *arg);
+static int ixgbevf_set_default_mac_addr(struct rte_eth_dev *dev,
+                                            struct rte_ether_addr *mac_addr);
 static int ixgbe_add_5tuple_filter(struct rte_eth_dev *dev,
                        struct ixgbe_5tuple_filter *filter);
 static void ixgbe_remove_5tuple_filter(struct rte_eth_dev *dev,
                        struct ixgbe_5tuple_filter *filter);
-static int ixgbe_ntuple_filter_handle(struct rte_eth_dev *dev,
-                               enum rte_filter_op filter_op,
-                               void *arg);
-static int ixgbe_get_ntuple_filter(struct rte_eth_dev *dev,
-                       struct rte_eth_ntuple_filter *filter);
-static int ixgbe_ethertype_filter_handle(struct rte_eth_dev *dev,
-                               enum rte_filter_op filter_op,
-                               void *arg);
-static int ixgbe_get_ethertype_filter(struct rte_eth_dev *dev,
-                       struct rte_eth_ethertype_filter *filter);
-static int ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-                    enum rte_filter_type filter_type,
-                    enum rte_filter_op filter_op,
-                    void *arg);
+static int ixgbe_dev_flow_ops_get(struct rte_eth_dev *dev,
+                                 const struct rte_flow_ops **ops);
 static int ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu);
 
 static int ixgbe_dev_set_mc_addr_list(struct rte_eth_dev *dev,
-                                     struct ether_addr *mc_addr_set,
+                                     struct rte_ether_addr *mc_addr_set,
                                      uint32_t nb_mc_addr);
 static int ixgbe_dev_get_dcb_info(struct rte_eth_dev *dev,
                                   struct rte_eth_dcb_info *dcb_info);
@@ -353,6 +318,11 @@ static int ixgbe_get_eeprom(struct rte_eth_dev *dev,
 static int ixgbe_set_eeprom(struct rte_eth_dev *dev,
                                struct rte_dev_eeprom_info *eeprom);
 
+static int ixgbe_get_module_info(struct rte_eth_dev *dev,
+                                struct rte_eth_dev_module_info *modinfo);
+static int ixgbe_get_module_eeprom(struct rte_eth_dev *dev,
+                                  struct rte_dev_eeprom_info *info);
+
 static int ixgbevf_get_reg_length(struct rte_eth_dev *dev);
 static int ixgbevf_get_regs(struct rte_eth_dev *dev,
                                struct rte_dev_reg_info *regs);
@@ -371,23 +341,13 @@ static int ixgbe_timesync_write_time(struct rte_eth_dev *dev,
                                   const struct timespec *timestamp);
 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);
-static int ixgbe_dev_l2_tunnel_offload_set
-       (struct rte_eth_dev *dev,
-        struct rte_eth_l2_tunnel_conf *l2_tunnel,
-        uint32_t mask,
-        uint8_t en);
-static int ixgbe_dev_l2_tunnel_filter_handle(struct rte_eth_dev *dev,
-                                            enum rte_filter_op filter_op,
-                                            void *arg);
-
 static int ixgbe_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
                                         struct rte_eth_udp_tunnel *udp_tunnel);
 static int ixgbe_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
                                         struct rte_eth_udp_tunnel *udp_tunnel);
 static int ixgbe_filter_restore(struct rte_eth_dev *dev);
 static void ixgbe_l2_tunnel_conf(struct rte_eth_dev *dev);
+static int ixgbe_wait_for_link_up(struct ixgbe_hw *hw);
 
 /*
  * Define VF Stats MACRO for Non "cleared on read" register
@@ -446,13 +406,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) },
@@ -462,7 +417,6 @@ static const struct rte_pci_id pci_id_ixgbe_map[] = {
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599EN_SFP) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_XAUI_LOM) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_T3_LOM) },
-       { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_LS) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T1) },
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_SFP) },
@@ -483,6 +437,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) },
+       { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_XFI) },
 #ifdef RTE_LIBRTE_IXGBE_BYPASS
        { RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BYPASS) },
 #endif
@@ -527,6 +482,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,
@@ -556,10 +512,6 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
        .rx_queue_intr_enable = ixgbe_dev_rx_queue_intr_enable,
        .rx_queue_intr_disable = ixgbe_dev_rx_queue_intr_disable,
        .rx_queue_release     = ixgbe_dev_rx_queue_release,
-       .rx_queue_count       = ixgbe_dev_rx_queue_count,
-       .rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
-       .rx_descriptor_status = ixgbe_dev_rx_descriptor_status,
-       .tx_descriptor_status = ixgbe_dev_tx_descriptor_status,
        .tx_queue_setup       = ixgbe_dev_tx_queue_setup,
        .tx_queue_release     = ixgbe_dev_tx_queue_release,
        .dev_led_on           = ixgbe_dev_led_on,
@@ -572,14 +524,12 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
        .mac_addr_set         = ixgbe_set_default_mac_addr,
        .uc_hash_table_set    = ixgbe_uc_hash_table_set,
        .uc_all_hash_table_set  = ixgbe_uc_all_hash_table_set,
-       .mirror_rule_set      = ixgbe_mirror_rule_set,
-       .mirror_rule_reset    = ixgbe_mirror_rule_reset,
        .set_queue_rate_limit = ixgbe_set_queue_rate_limit,
        .reta_update          = ixgbe_dev_rss_reta_update,
        .reta_query           = ixgbe_dev_rss_reta_query,
        .rss_hash_update      = ixgbe_dev_rss_hash_update,
        .rss_hash_conf_get    = ixgbe_dev_rss_hash_conf_get,
-       .filter_ctrl          = ixgbe_dev_filter_ctrl,
+       .flow_ops_get         = ixgbe_dev_flow_ops_get,
        .set_mc_addr_list     = ixgbe_dev_set_mc_addr_list,
        .rxq_info_get         = ixgbe_rxq_info_get,
        .txq_info_get         = ixgbe_txq_info_get,
@@ -591,15 +541,17 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
        .get_eeprom_length    = ixgbe_get_eeprom_length,
        .get_eeprom           = ixgbe_get_eeprom,
        .set_eeprom           = ixgbe_set_eeprom,
+       .get_module_info      = ixgbe_get_module_info,
+       .get_module_eeprom    = ixgbe_get_module_eeprom,
        .get_dcb_info         = ixgbe_dev_get_dcb_info,
        .timesync_adjust_time = ixgbe_timesync_adjust_time,
        .timesync_read_time   = ixgbe_timesync_read_time,
        .timesync_write_time  = ixgbe_timesync_write_time,
-       .l2_tunnel_eth_type_conf = ixgbe_dev_l2_tunnel_eth_type_conf,
-       .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,
+       .tx_done_cleanup      = ixgbe_dev_tx_done_cleanup,
+       .get_monitor_addr     = ixgbe_get_monitor_addr,
 };
 
 /*
@@ -617,6 +569,9 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
        .xstats_reset         = ixgbevf_dev_stats_reset,
        .xstats_get_names     = ixgbevf_dev_xstats_get_names,
        .dev_close            = ixgbevf_dev_close,
+       .dev_reset            = ixgbevf_dev_reset,
+       .promiscuous_enable   = ixgbevf_dev_promiscuous_enable,
+       .promiscuous_disable  = ixgbevf_dev_promiscuous_disable,
        .allmulticast_enable  = ixgbevf_dev_allmulticast_enable,
        .allmulticast_disable = ixgbevf_dev_allmulticast_disable,
        .dev_infos_get        = ixgbevf_dev_info_get,
@@ -627,9 +582,6 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
        .vlan_offload_set     = ixgbevf_vlan_offload_set,
        .rx_queue_setup       = ixgbe_dev_rx_queue_setup,
        .rx_queue_release     = ixgbe_dev_rx_queue_release,
-       .rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
-       .rx_descriptor_status = ixgbe_dev_rx_descriptor_status,
-       .tx_descriptor_status = ixgbe_dev_tx_descriptor_status,
        .tx_queue_setup       = ixgbe_dev_tx_queue_setup,
        .tx_queue_release     = ixgbe_dev_tx_queue_release,
        .rx_queue_intr_enable = ixgbevf_dev_rx_queue_intr_enable,
@@ -645,6 +597,8 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
        .reta_query           = ixgbe_dev_rss_reta_query,
        .rss_hash_update      = ixgbe_dev_rss_hash_update,
        .rss_hash_conf_get    = ixgbe_dev_rss_hash_conf_get,
+       .tx_done_cleanup      = ixgbe_dev_tx_done_cleanup,
+       .get_monitor_addr     = ixgbe_get_monitor_addr,
 };
 
 /* store statistics names and its offset in stats structure */
@@ -812,58 +766,6 @@ static const struct rte_ixgbe_xstats_name_off rte_ixgbevf_stats_strings[] = {
 #define IXGBEVF_NB_XSTATS (sizeof(rte_ixgbevf_stats_strings) / \
                sizeof(rte_ixgbevf_stats_strings[0]))
 
-/**
- * Atomically reads the link status information from global
- * structure rte_eth_dev.
- *
- * @param dev
- *   - Pointer to the structure rte_eth_dev to read from.
- *   - Pointer to the buffer to be saved with the link status.
- *
- * @return
- *   - On success, zero.
- *   - On failure, negative value.
- */
-static inline int
-rte_ixgbe_dev_atomic_read_link_status(struct rte_eth_dev *dev,
-                               struct rte_eth_link *link)
-{
-       struct rte_eth_link *dst = link;
-       struct rte_eth_link *src = &(dev->data->dev_link);
-
-       if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
-                                       *(uint64_t *)src) == 0)
-               return -1;
-
-       return 0;
-}
-
-/**
- * Atomically writes the link status information into global
- * structure rte_eth_dev.
- *
- * @param dev
- *   - Pointer to the structure rte_eth_dev to read from.
- *   - Pointer to the buffer to be saved with the link status.
- *
- * @return
- *   - On success, zero.
- *   - On failure, negative value.
- */
-static inline int
-rte_ixgbe_dev_atomic_write_link_status(struct rte_eth_dev *dev,
-                               struct rte_eth_link *link)
-{
-       struct rte_eth_link *dst = &(dev->data->dev_link);
-       struct rte_eth_link *src = link;
-
-       if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
-                                       *(uint64_t *)src) == 0)
-               return -1;
-
-       return 0;
-}
-
 /*
  * This function is the same as ixgbe_is_sfp() in base/ixgbe.h.
  */
@@ -1121,10 +1023,11 @@ ixgbe_swfw_lock_reset(struct ixgbe_hw *hw)
  * It returns 0 on success.
  */
 static int
-eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
+eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)
 {
+       struct ixgbe_adapter *ad = eth_dev->data->dev_private;
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+       struct rte_intr_handle *intr_handle = pci_dev->intr_handle;
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
        struct ixgbe_vfta *shadow_vfta =
@@ -1139,11 +1042,16 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
                IXGBE_DEV_PRIVATE_TO_BW_CONF(eth_dev->data->dev_private);
        uint32_t ctrl_ext;
        uint16_t csum;
-       int diag, i;
+       int diag, i, ret;
 
        PMD_INIT_FUNC_TRACE();
 
+       ixgbe_dev_macsec_setting_reset(eth_dev);
+
        eth_dev->dev_ops = &ixgbe_eth_dev_ops;
+       eth_dev->rx_queue_count       = ixgbe_dev_rx_queue_count;
+       eth_dev->rx_descriptor_status = ixgbe_dev_rx_descriptor_status;
+       eth_dev->tx_descriptor_status = ixgbe_dev_tx_descriptor_status;
        eth_dev->rx_pkt_burst = &ixgbe_recv_pkts;
        eth_dev->tx_pkt_burst = &ixgbe_xmit_pkts;
        eth_dev->tx_pkt_prepare = &ixgbe_prep_pkts;
@@ -1172,8 +1080,9 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
                return 0;
        }
 
+       rte_atomic32_clear(&ad->link_thread_running);
        rte_eth_copy_pci_info(eth_dev, pci_dev);
-       eth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
        /* Vendor and Device ID need to be set before init of shared code */
        hw->device_id = pci_dev->id.device_id;
@@ -1193,18 +1102,32 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
                return -EIO;
        }
 
+       if (hw->mac.ops.fw_recovery_mode && hw->mac.ops.fw_recovery_mode(hw)) {
+               PMD_INIT_LOG(ERR, "\nERROR: "
+                       "Firmware recovery mode detected. Limiting functionality.\n"
+                       "Refer to the Intel(R) Ethernet Adapters and Devices "
+                       "User Guide for details on firmware recovery mode.");
+               return -EIO;
+       }
+
        /* pick up the PCI bus settings for reporting later */
        ixgbe_get_bus_info(hw);
 
        /* Unlock any pending hardware semaphore */
        ixgbe_swfw_lock_reset(hw);
 
+#ifdef RTE_LIB_SECURITY
+       /* Initialize security_ctx only for primary process*/
+       if (ixgbe_ipsec_ctx_create(eth_dev))
+               return -ENOMEM;
+#endif
+
        /* Initialize DCB configuration*/
        memset(dcb_config, 0, sizeof(struct ixgbe_dcb_config));
        ixgbe_dcb_init(hw, dcb_config);
        /* Get Hardware Flow Control setting */
-       hw->fc.requested_mode = ixgbe_fc_full;
-       hw->fc.current_mode = ixgbe_fc_full;
+       hw->fc.requested_mode = ixgbe_fc_none;
+       hw->fc.current_mode = ixgbe_fc_none;
        hw->fc.pause_time = IXGBE_FC_PAUSE;
        for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
                hw->fc.low_water[i] = IXGBE_FC_LO;
@@ -1267,26 +1190,28 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
        ixgbe_reset_qstat_mappings(hw);
 
        /* Allocate memory for storing MAC addresses */
-       eth_dev->data->mac_addrs = rte_zmalloc("ixgbe", ETHER_ADDR_LEN *
+       eth_dev->data->mac_addrs = rte_zmalloc("ixgbe", RTE_ETHER_ADDR_LEN *
                                               hw->mac.num_rar_entries, 0);
        if (eth_dev->data->mac_addrs == NULL) {
                PMD_INIT_LOG(ERR,
                             "Failed to allocate %u bytes needed to store "
                             "MAC addresses",
-                            ETHER_ADDR_LEN * hw->mac.num_rar_entries);
+                            RTE_ETHER_ADDR_LEN * hw->mac.num_rar_entries);
                return -ENOMEM;
        }
        /* Copy the permanent MAC address */
-       ether_addr_copy((struct ether_addr *) hw->mac.perm_addr,
+       rte_ether_addr_copy((struct rte_ether_addr *)hw->mac.perm_addr,
                        &eth_dev->data->mac_addrs[0]);
 
        /* Allocate memory for storing hash filter MAC addresses */
-       eth_dev->data->hash_mac_addrs = rte_zmalloc("ixgbe", ETHER_ADDR_LEN *
-                                                   IXGBE_VMDQ_NUM_UC_MAC, 0);
+       eth_dev->data->hash_mac_addrs = rte_zmalloc(
+               "ixgbe", RTE_ETHER_ADDR_LEN * IXGBE_VMDQ_NUM_UC_MAC, 0);
        if (eth_dev->data->hash_mac_addrs == NULL) {
                PMD_INIT_LOG(ERR,
                             "Failed to allocate %d bytes needed to store MAC addresses",
-                            ETHER_ADDR_LEN * IXGBE_VMDQ_NUM_UC_MAC);
+                            RTE_ETHER_ADDR_LEN * IXGBE_VMDQ_NUM_UC_MAC);
+               rte_free(eth_dev->data->mac_addrs);
+               eth_dev->data->mac_addrs = NULL;
                return -ENOMEM;
        }
 
@@ -1297,7 +1222,14 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
        memset(hwstrip, 0, sizeof(*hwstrip));
 
        /* initialize PF if max_vfs not zero */
-       ixgbe_pf_host_init(eth_dev);
+       ret = ixgbe_pf_host_init(eth_dev);
+       if (ret) {
+               rte_free(eth_dev->data->mac_addrs);
+               eth_dev->data->mac_addrs = NULL;
+               rte_free(eth_dev->data->hash_mac_addrs);
+               eth_dev->data->hash_mac_addrs = NULL;
+               return ret;
+       }
 
        ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
        /* let hardware know driver is loaded */
@@ -1341,68 +1273,27 @@ 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;
 }
 
 static int
 eth_ixgbe_dev_uninit(struct rte_eth_dev *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;
-
        PMD_INIT_FUNC_TRACE();
 
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
-               return -EPERM;
-
-       hw = IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
-
-       if (hw->adapter_stopped == 0)
-               ixgbe_dev_close(eth_dev);
-
-       eth_dev->dev_ops = NULL;
-       eth_dev->rx_pkt_burst = NULL;
-       eth_dev->tx_pkt_burst = NULL;
-
-       /* Unlock any pending hardware semaphore */
-       ixgbe_swfw_lock_reset(hw);
-
-       /* disable uio intr before callback unregister */
-       rte_intr_disable(intr_handle);
-       rte_intr_callback_unregister(intr_handle,
-                                    ixgbe_dev_interrupt_handler, eth_dev);
-
-       /* uninitialize PF if max_vfs not zero */
-       ixgbe_pf_host_uninit(eth_dev);
-
-       rte_free(eth_dev->data->mac_addrs);
-       eth_dev->data->mac_addrs = NULL;
-
-       rte_free(eth_dev->data->hash_mac_addrs);
-       eth_dev->data->hash_mac_addrs = NULL;
-
-       /* remove all the fdir filters & hash */
-       ixgbe_fdir_filter_uninit(eth_dev);
-
-       /* remove all the L2 tunnel filters & hash */
-       ixgbe_l2_tn_filter_uninit(eth_dev);
-
-       /* Remove all ntuple filters of the device */
-       ixgbe_ntuple_filter_uninit(eth_dev);
+               return 0;
 
-       /* clear all the filters list */
-       ixgbe_filterlist_flush();
+       ixgbe_dev_close(eth_dev);
 
        return 0;
 }
@@ -1496,6 +1387,7 @@ static int ixgbe_fdir_filter_init(struct rte_eth_dev *eth_dev)
        if (!fdir_info->hash_map) {
                PMD_INIT_LOG(ERR,
                             "Failed to allocate memory for fdir hash map!");
+               rte_hash_free(fdir_info->hash_handle);
                return -ENOMEM;
        }
        fdir_info->mask_added = FALSE;
@@ -1532,11 +1424,12 @@ static int ixgbe_l2_tn_filter_init(struct rte_eth_dev *eth_dev)
        if (!l2_tn_info->hash_map) {
                PMD_INIT_LOG(ERR,
                        "Failed to allocate memory for L2 TN hash map!");
+               rte_hash_free(l2_tn_info->hash_handle);
                return -ENOMEM;
        }
        l2_tn_info->e_tag_en = FALSE;
        l2_tn_info->e_tag_fwd_en = FALSE;
-       l2_tn_info->e_tag_ether_type = DEFAULT_ETAG_ETYPE;
+       l2_tn_info->e_tag_ether_type = RTE_ETHER_TYPE_ETAG;
 
        return 0;
 }
@@ -1554,6 +1447,7 @@ ixgbevf_negotiate_api(struct ixgbe_hw *hw)
 
        /* start with highest supported, proceed down */
        static const enum ixgbe_pfvf_api_rev sup_ver[] = {
+               ixgbe_mbox_api_13,
                ixgbe_mbox_api_12,
                ixgbe_mbox_api_11,
                ixgbe_mbox_api_10,
@@ -1567,7 +1461,7 @@ ixgbevf_negotiate_api(struct ixgbe_hw *hw)
 }
 
 static void
-generate_random_mac_addr(struct ether_addr *mac_addr)
+generate_random_mac_addr(struct rte_ether_addr *mac_addr)
 {
        uint64_t random;
 
@@ -1576,12 +1470,51 @@ generate_random_mac_addr(struct ether_addr *mac_addr)
        mac_addr->addr_bytes[1] = 0x09;
        mac_addr->addr_bytes[2] = 0xC0;
        /* Force indication of locally assigned MAC address. */
-       mac_addr->addr_bytes[0] |= ETHER_LOCAL_ADMIN_ADDR;
+       mac_addr->addr_bytes[0] |= RTE_ETHER_LOCAL_ADMIN_ADDR;
        /* Generate the last 3 bytes of the MAC address with a random number. */
        random = rte_rand();
        memcpy(&mac_addr->addr_bytes[3], &random, 3);
 }
 
+static int
+devarg_handle_int(__rte_unused const char *key, const char *value,
+                 void *extra_args)
+{
+       uint16_t *n = extra_args;
+
+       if (value == NULL || extra_args == NULL)
+               return -EINVAL;
+
+       *n = (uint16_t)strtoul(value, NULL, 0);
+       if (*n == USHRT_MAX && errno == ERANGE)
+               return -1;
+
+       return 0;
+}
+
+static void
+ixgbevf_parse_devargs(struct ixgbe_adapter *adapter,
+                     struct rte_devargs *devargs)
+{
+       struct rte_kvargs *kvlist;
+       uint16_t pflink_fullchk;
+
+       if (devargs == NULL)
+               return;
+
+       kvlist = rte_kvargs_parse(devargs->args, ixgbevf_valid_arguments);
+       if (kvlist == NULL)
+               return;
+
+       if (rte_kvargs_count(kvlist, IXGBEVF_DEVARG_PFLINK_FULLCHK) == 1 &&
+           rte_kvargs_process(kvlist, IXGBEVF_DEVARG_PFLINK_FULLCHK,
+                              devarg_handle_int, &pflink_fullchk) == 0 &&
+           pflink_fullchk == 1)
+               adapter->pflink_fullchk = 1;
+
+       rte_kvargs_free(kvlist);
+}
+
 /*
  * Virtual Function device init
  */
@@ -1590,19 +1523,23 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
 {
        int diag;
        uint32_t tc, tcs;
+       struct ixgbe_adapter *ad = eth_dev->data->dev_private;
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+       struct rte_intr_handle *intr_handle = pci_dev->intr_handle;
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
        struct ixgbe_vfta *shadow_vfta =
                IXGBE_DEV_PRIVATE_TO_VFTA(eth_dev->data->dev_private);
        struct ixgbe_hwstrip *hwstrip =
                IXGBE_DEV_PRIVATE_TO_HWSTRIP_BITMAP(eth_dev->data->dev_private);
-       struct ether_addr *perm_addr = (struct ether_addr *) hw->mac.perm_addr;
+       struct rte_ether_addr *perm_addr =
+               (struct rte_ether_addr *)hw->mac.perm_addr;
 
        PMD_INIT_FUNC_TRACE();
 
        eth_dev->dev_ops = &ixgbevf_eth_dev_ops;
+       eth_dev->rx_descriptor_status = ixgbe_dev_rx_descriptor_status;
+       eth_dev->tx_descriptor_status = ixgbe_dev_tx_descriptor_status;
        eth_dev->rx_pkt_burst = &ixgbe_recv_pkts;
        eth_dev->tx_pkt_burst = &ixgbe_xmit_pkts;
 
@@ -1629,8 +1566,12 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
                return 0;
        }
 
+       rte_atomic32_clear(&ad->link_thread_running);
+       ixgbevf_parse_devargs(eth_dev->data->dev_private,
+                             pci_dev->device.devargs);
+
        rte_eth_copy_pci_info(eth_dev, pci_dev);
-       eth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
        hw->device_id = pci_dev->id.device_id;
        hw->vendor_id = pci_dev->id.vendor_id;
@@ -1656,7 +1597,7 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
        ixgbevf_dev_stats_reset(eth_dev);
 
        /* Disable the interrupts for VF */
-       ixgbevf_intr_disable(hw);
+       ixgbevf_intr_disable(eth_dev);
 
        hw->mac.num_rar_entries = 128; /* The MAX of the underlying PF */
        diag = hw->mac.ops.reset_hw(hw);
@@ -1668,7 +1609,12 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
         */
        if ((diag != IXGBE_SUCCESS) && (diag != IXGBE_ERR_INVALID_MAC_ADDR)) {
                PMD_INIT_LOG(ERR, "VF Initialization Failure: %d", diag);
-               return diag;
+               /*
+                * This error code will be propagated to the app by
+                * rte_eth_dev_reset, so use a public error code rather than
+                * the internal-only IXGBE_ERR_RESET_FAILED
+                */
+               return -EAGAIN;
        }
 
        /* negotiate mailbox API version to use with the PF. */
@@ -1678,18 +1624,18 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
        ixgbevf_get_queues(hw, &tcs, &tc);
 
        /* Allocate memory for storing MAC addresses */
-       eth_dev->data->mac_addrs = rte_zmalloc("ixgbevf", ETHER_ADDR_LEN *
+       eth_dev->data->mac_addrs = rte_zmalloc("ixgbevf", RTE_ETHER_ADDR_LEN *
                                               hw->mac.num_rar_entries, 0);
        if (eth_dev->data->mac_addrs == NULL) {
                PMD_INIT_LOG(ERR,
                             "Failed to allocate %u bytes needed to store "
                             "MAC addresses",
-                            ETHER_ADDR_LEN * hw->mac.num_rar_entries);
+                            RTE_ETHER_ADDR_LEN * hw->mac.num_rar_entries);
                return -ENOMEM;
        }
 
        /* Generate a random MAC address, if none was assigned by PF. */
-       if (is_zero_ether_addr(perm_addr)) {
+       if (rte_is_zero_ether_addr(perm_addr)) {
                generate_random_mac_addr(perm_addr);
                diag = ixgbe_set_rar_vf(hw, 1, perm_addr->addr_bytes, 0, 1);
                if (diag) {
@@ -1699,17 +1645,12 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
                }
                PMD_INIT_LOG(INFO, "\tVF MAC address not assigned by Host PF");
                PMD_INIT_LOG(INFO, "\tAssign randomly generated MAC address "
-                            "%02x:%02x:%02x:%02x:%02x:%02x",
-                            perm_addr->addr_bytes[0],
-                            perm_addr->addr_bytes[1],
-                            perm_addr->addr_bytes[2],
-                            perm_addr->addr_bytes[3],
-                            perm_addr->addr_bytes[4],
-                            perm_addr->addr_bytes[5]);
+                            RTE_ETHER_ADDR_PRT_FMT,
+                                RTE_ETHER_ADDR_BYTES(perm_addr));
        }
 
        /* Copy the permanent MAC address */
-       ether_addr_copy(perm_addr, &eth_dev->data->mac_addrs[0]);
+       rte_ether_addr_copy(perm_addr, &eth_dev->data->mac_addrs[0]);
 
        /* reset the hardware with the new settings */
        diag = hw->mac.ops.start_hw(hw);
@@ -1719,13 +1660,15 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev)
 
        default:
                PMD_INIT_LOG(ERR, "VF Initialization Failure: %d", diag);
+               rte_free(eth_dev->data->mac_addrs);
+               eth_dev->data->mac_addrs = NULL;
                return -EIO;
        }
 
        rte_intr_callback_register(intr_handle,
                                   ixgbevf_dev_interrupt_handler, eth_dev);
        rte_intr_enable(intr_handle);
-       ixgbevf_intr_enable(hw);
+       ixgbevf_intr_enable(eth_dev);
 
        PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x mac.type=%s",
                     eth_dev->data->port_id, pci_dev->id.vendor_id,
@@ -1739,47 +1682,100 @@ 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 = RTE_ETH_DEV_TO_PCI(eth_dev);
-       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
-       struct ixgbe_hw *hw;
-
        PMD_INIT_FUNC_TRACE();
 
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
-               return -EPERM;
+               return 0;
+
+       ixgbevf_dev_close(eth_dev);
 
-       hw = IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+       return 0;
+}
 
-       if (hw->adapter_stopped == 0)
-               ixgbevf_dev_close(eth_dev);
+static int
+eth_ixgbe_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
+               struct rte_pci_device *pci_dev)
+{
+       char name[RTE_ETH_NAME_MAX_LEN];
+       struct rte_eth_dev *pf_ethdev;
+       struct rte_eth_devargs eth_da;
+       int i, retval;
+
+       if (pci_dev->device.devargs) {
+               retval = rte_eth_devargs_parse(pci_dev->device.devargs->args,
+                               &eth_da);
+               if (retval)
+                       return retval;
+       } else
+               memset(&eth_da, 0, sizeof(eth_da));
 
-       eth_dev->dev_ops = NULL;
-       eth_dev->rx_pkt_burst = NULL;
-       eth_dev->tx_pkt_burst = NULL;
+       if (eth_da.nb_representor_ports > 0 &&
+           eth_da.type != RTE_ETH_REPRESENTOR_VF) {
+               PMD_DRV_LOG(ERR, "unsupported representor type: %s\n",
+                           pci_dev->device.devargs->args);
+               return -ENOTSUP;
+       }
 
-       /* Disable the interrupts for VF */
-       ixgbevf_intr_disable(hw);
+       retval = rte_eth_dev_create(&pci_dev->device, pci_dev->device.name,
+               sizeof(struct ixgbe_adapter),
+               eth_dev_pci_specific_init, pci_dev,
+               eth_ixgbe_dev_init, NULL);
 
-       rte_free(eth_dev->data->mac_addrs);
-       eth_dev->data->mac_addrs = NULL;
+       if (retval || eth_da.nb_representor_ports < 1)
+               return retval;
 
-       rte_intr_disable(intr_handle);
-       rte_intr_callback_unregister(intr_handle,
-                                    ixgbevf_dev_interrupt_handler, eth_dev);
+       pf_ethdev = rte_eth_dev_allocated(pci_dev->device.name);
+       if (pf_ethdev == NULL)
+               return -ENODEV;
 
-       return 0;
-}
+       /* probe VF representor ports */
+       for (i = 0; i < eth_da.nb_representor_ports; i++) {
+               struct ixgbe_vf_info *vfinfo;
+               struct ixgbe_vf_representor representor;
 
-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);
+               vfinfo = *IXGBE_DEV_PRIVATE_TO_P_VFDATA(
+                       pf_ethdev->data->dev_private);
+               if (vfinfo == NULL) {
+                       PMD_DRV_LOG(ERR,
+                               "no virtual functions supported by PF");
+                       break;
+               }
+
+               representor.vf_id = eth_da.representor_ports[i];
+               representor.switch_domain_id = vfinfo->switch_domain_id;
+               representor.pf_ethdev = pf_ethdev;
+
+               /* representor port net_bdf_port */
+               snprintf(name, sizeof(name), "net_%s_representor_%d",
+                       pci_dev->device.name,
+                       eth_da.representor_ports[i]);
+
+               retval = rte_eth_dev_create(&pci_dev->device, name,
+                       sizeof(struct ixgbe_vf_representor), NULL, NULL,
+                       ixgbe_vf_representor_init, &representor);
+
+               if (retval)
+                       PMD_DRV_LOG(ERR, "failed to create ixgbe vf "
+                               "representor %s.", name);
+       }
+
+       return 0;
 }
 
 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);
+       struct rte_eth_dev *ethdev;
+
+       ethdev = rte_eth_dev_allocated(pci_dev->device.name);
+       if (!ethdev)
+               return 0;
+
+       if (ethdev->data->dev_flags & RTE_ETH_DEV_REPRESENTOR)
+               return rte_eth_dev_pci_generic_remove(pci_dev,
+                                       ixgbe_vf_representor_uninit);
+       else
+               return rte_eth_dev_pci_generic_remove(pci_dev,
+                                               eth_ixgbe_dev_uninit);
 }
 
 static struct rte_pci_driver rte_ixgbe_pmd = {
@@ -1861,7 +1857,7 @@ ixgbe_vlan_tpid_set(struct rte_eth_dev *dev,
        qinq &= IXGBE_DMATXCTL_GDV;
 
        switch (vlan_type) {
-       case ETH_VLAN_TYPE_INNER:
+       case RTE_ETH_VLAN_TYPE_INNER:
                if (qinq) {
                        reg = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
                        reg = (reg & (~IXGBE_VLNCTRL_VET)) | (uint32_t)tpid;
@@ -1876,7 +1872,7 @@ ixgbe_vlan_tpid_set(struct rte_eth_dev *dev,
                                    " by single VLAN");
                }
                break;
-       case ETH_VLAN_TYPE_OUTER:
+       case RTE_ETH_VLAN_TYPE_OUTER:
                if (qinq) {
                        /* Only the high 16-bits is valid */
                        IXGBE_WRITE_REG(hw, IXGBE_EXVET, (uint32_t)tpid <<
@@ -1961,10 +1957,13 @@ 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;
-       else
-               rxq->vlan_flags = PKT_RX_VLAN_PKT;
+       if (on) {
+               rxq->vlan_flags = RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;
+               rxq->offloads |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
+       } else {
+               rxq->vlan_flags = RTE_MBUF_F_RX_VLAN;
+               rxq->offloads &= ~RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
+       }
 }
 
 static void
@@ -2015,64 +2014,6 @@ ixgbe_vlan_hw_strip_enable(struct rte_eth_dev *dev, uint16_t queue)
        ixgbe_vlan_hw_strip_bitmap_set(dev, queue, 1);
 }
 
-void
-ixgbe_vlan_hw_strip_disable_all(struct rte_eth_dev *dev)
-{
-       struct ixgbe_hw *hw =
-               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       uint32_t ctrl;
-       uint16_t i;
-       struct ixgbe_rx_queue *rxq;
-
-       PMD_INIT_FUNC_TRACE();
-
-       if (hw->mac.type == ixgbe_mac_82598EB) {
-               ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
-               ctrl &= ~IXGBE_VLNCTRL_VME;
-               IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
-       } else {
-               /* Other 10G NIC, the VLAN strip can be setup per queue in RXDCTL */
-               for (i = 0; i < dev->data->nb_rx_queues; i++) {
-                       rxq = dev->data->rx_queues[i];
-                       ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxq->reg_idx));
-                       ctrl &= ~IXGBE_RXDCTL_VME;
-                       IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxq->reg_idx), ctrl);
-
-                       /* record those setting for HW strip per queue */
-                       ixgbe_vlan_hw_strip_bitmap_set(dev, i, 0);
-               }
-       }
-}
-
-void
-ixgbe_vlan_hw_strip_enable_all(struct rte_eth_dev *dev)
-{
-       struct ixgbe_hw *hw =
-               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       uint32_t ctrl;
-       uint16_t i;
-       struct ixgbe_rx_queue *rxq;
-
-       PMD_INIT_FUNC_TRACE();
-
-       if (hw->mac.type == ixgbe_mac_82598EB) {
-               ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
-               ctrl |= IXGBE_VLNCTRL_VME;
-               IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
-       } else {
-               /* Other 10G NIC, the VLAN strip can be setup per queue in RXDCTL */
-               for (i = 0; i < dev->data->nb_rx_queues; i++) {
-                       rxq = dev->data->rx_queues[i];
-                       ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxq->reg_idx));
-                       ctrl |= IXGBE_RXDCTL_VME;
-                       IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxq->reg_idx), ctrl);
-
-                       /* record those setting for HW strip per queue */
-                       ixgbe_vlan_hw_strip_bitmap_set(dev, i, 1);
-               }
-       }
-}
-
 static void
 ixgbe_vlan_hw_extend_disable(struct rte_eth_dev *dev)
 {
@@ -2128,29 +2069,108 @@ ixgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev)
         */
 }
 
+void
+ixgbe_vlan_hw_strip_config(struct rte_eth_dev *dev)
+{
+       struct ixgbe_hw *hw =
+               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
+       uint32_t ctrl;
+       uint16_t i;
+       struct ixgbe_rx_queue *rxq;
+       bool on;
+
+       PMD_INIT_FUNC_TRACE();
+
+       if (hw->mac.type == ixgbe_mac_82598EB) {
+               if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) {
+                       ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
+                       ctrl |= IXGBE_VLNCTRL_VME;
+                       IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
+               } else {
+                       ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
+                       ctrl &= ~IXGBE_VLNCTRL_VME;
+                       IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
+               }
+       } else {
+               /*
+                * Other 10G NIC, the VLAN strip can be setup
+                * per queue in RXDCTL
+                */
+               for (i = 0; i < dev->data->nb_rx_queues; i++) {
+                       rxq = dev->data->rx_queues[i];
+                       ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxq->reg_idx));
+                       if (rxq->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) {
+                               ctrl |= IXGBE_RXDCTL_VME;
+                               on = TRUE;
+                       } else {
+                               ctrl &= ~IXGBE_RXDCTL_VME;
+                               on = FALSE;
+                       }
+                       IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxq->reg_idx), ctrl);
+
+                       /* record those setting for HW strip per queue */
+                       ixgbe_vlan_hw_strip_bitmap_set(dev, i, on);
+               }
+       }
+}
+
 static void
-ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask)
+ixgbe_config_vlan_strip_on_all_queues(struct rte_eth_dev *dev, int mask)
 {
-       if (mask & ETH_VLAN_STRIP_MASK) {
-               if (dev->data->dev_conf.rxmode.hw_vlan_strip)
-                       ixgbe_vlan_hw_strip_enable_all(dev);
+       uint16_t i;
+       struct rte_eth_rxmode *rxmode;
+       struct ixgbe_rx_queue *rxq;
+
+       if (mask & RTE_ETH_VLAN_STRIP_MASK) {
+               rxmode = &dev->data->dev_conf.rxmode;
+               if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP)
+                       for (i = 0; i < dev->data->nb_rx_queues; i++) {
+                               rxq = dev->data->rx_queues[i];
+                               rxq->offloads |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
+                       }
                else
-                       ixgbe_vlan_hw_strip_disable_all(dev);
+                       for (i = 0; i < dev->data->nb_rx_queues; i++) {
+                               rxq = dev->data->rx_queues[i];
+                               rxq->offloads &= ~RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
+                       }
        }
+}
+
+static int
+ixgbe_vlan_offload_config(struct rte_eth_dev *dev, int mask)
+{
+       struct rte_eth_rxmode *rxmode;
+       rxmode = &dev->data->dev_conf.rxmode;
 
-       if (mask & ETH_VLAN_FILTER_MASK) {
-               if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+       if (mask & RTE_ETH_VLAN_STRIP_MASK)
+               ixgbe_vlan_hw_strip_config(dev);
+
+       if (mask & RTE_ETH_VLAN_FILTER_MASK) {
+               if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_FILTER)
                        ixgbe_vlan_hw_filter_enable(dev);
                else
                        ixgbe_vlan_hw_filter_disable(dev);
        }
 
-       if (mask & ETH_VLAN_EXTEND_MASK) {
-               if (dev->data->dev_conf.rxmode.hw_vlan_extend)
+       if (mask & RTE_ETH_VLAN_EXTEND_MASK) {
+               if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_EXTEND)
                        ixgbe_vlan_hw_extend_enable(dev);
                else
                        ixgbe_vlan_hw_extend_disable(dev);
        }
+
+       return 0;
+}
+
+static int
+ixgbe_vlan_offload_set(struct rte_eth_dev *dev, int mask)
+{
+       ixgbe_config_vlan_strip_on_all_queues(dev, mask);
+
+       ixgbe_vlan_offload_config(dev, mask);
+
+       return 0;
 }
 
 static void
@@ -2173,18 +2193,19 @@ ixgbe_check_vf_rss_rxq_num(struct rte_eth_dev *dev, uint16_t nb_rx_q)
        switch (nb_rx_q) {
        case 1:
        case 2:
-               RTE_ETH_DEV_SRIOV(dev).active = ETH_64_POOLS;
+               RTE_ETH_DEV_SRIOV(dev).active = RTE_ETH_64_POOLS;
                break;
        case 4:
-               RTE_ETH_DEV_SRIOV(dev).active = ETH_32_POOLS;
+               RTE_ETH_DEV_SRIOV(dev).active = RTE_ETH_32_POOLS;
                break;
        default:
                return -EINVAL;
        }
 
-       RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = nb_rx_q;
-       RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx = pci_dev->max_vfs * nb_rx_q;
-
+       RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool =
+               IXGBE_MAX_RX_QUEUE_NUM / RTE_ETH_DEV_SRIOV(dev).active;
+       RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx =
+               pci_dev->max_vfs * RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool;
        return 0;
 }
 
@@ -2199,18 +2220,18 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
        if (RTE_ETH_DEV_SRIOV(dev).active != 0) {
                /* check multi-queue mode */
                switch (dev_conf->rxmode.mq_mode) {
-               case ETH_MQ_RX_VMDQ_DCB:
-                       PMD_INIT_LOG(INFO, "ETH_MQ_RX_VMDQ_DCB mode supported in SRIOV");
+               case RTE_ETH_MQ_RX_VMDQ_DCB:
+                       PMD_INIT_LOG(INFO, "RTE_ETH_MQ_RX_VMDQ_DCB mode supported in SRIOV");
                        break;
-               case ETH_MQ_RX_VMDQ_DCB_RSS:
+               case RTE_ETH_MQ_RX_VMDQ_DCB_RSS:
                        /* DCB/RSS VMDQ in SRIOV mode, not implement yet */
                        PMD_INIT_LOG(ERR, "SRIOV active,"
                                        " unsupported mq_mode rx %d.",
                                        dev_conf->rxmode.mq_mode);
                        return -EINVAL;
-               case ETH_MQ_RX_RSS:
-               case ETH_MQ_RX_VMDQ_RSS:
-                       dev->data->dev_conf.rxmode.mq_mode = ETH_MQ_RX_VMDQ_RSS;
+               case RTE_ETH_MQ_RX_RSS:
+               case RTE_ETH_MQ_RX_VMDQ_RSS:
+                       dev->data->dev_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_VMDQ_RSS;
                        if (nb_rx_q <= RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool)
                                if (ixgbe_check_vf_rss_rxq_num(dev, nb_rx_q)) {
                                        PMD_INIT_LOG(ERR, "SRIOV is active,"
@@ -2220,14 +2241,12 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
                                        return -EINVAL;
                                }
                        break;
-               case ETH_MQ_RX_VMDQ_ONLY:
-               case ETH_MQ_RX_NONE:
+               case RTE_ETH_MQ_RX_VMDQ_ONLY:
+               case RTE_ETH_MQ_RX_NONE:
                        /* if nothing mq mode configure, use default scheme */
-                       dev->data->dev_conf.rxmode.mq_mode = ETH_MQ_RX_VMDQ_ONLY;
-                       if (RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool > 1)
-                               RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = 1;
+                       dev->data->dev_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_VMDQ_ONLY;
                        break;
-               default: /* ETH_MQ_RX_DCB, ETH_MQ_RX_DCB_RSS or ETH_MQ_TX_DCB*/
+               default: /* RTE_ETH_MQ_RX_DCB, RTE_ETH_MQ_RX_DCB_RSS or RTE_ETH_MQ_TX_DCB*/
                        /* SRIOV only works in VMDq enable mode */
                        PMD_INIT_LOG(ERR, "SRIOV is active,"
                                        " wrong mq_mode rx %d.",
@@ -2236,12 +2255,12 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
                }
 
                switch (dev_conf->txmode.mq_mode) {
-               case ETH_MQ_TX_VMDQ_DCB:
-                       PMD_INIT_LOG(INFO, "ETH_MQ_TX_VMDQ_DCB mode supported in SRIOV");
-                       dev->data->dev_conf.txmode.mq_mode = ETH_MQ_TX_VMDQ_DCB;
+               case RTE_ETH_MQ_TX_VMDQ_DCB:
+                       PMD_INIT_LOG(INFO, "RTE_ETH_MQ_TX_VMDQ_DCB mode supported in SRIOV");
+                       dev->data->dev_conf.txmode.mq_mode = RTE_ETH_MQ_TX_VMDQ_DCB;
                        break;
-               default: /* ETH_MQ_TX_VMDQ_ONLY or ETH_MQ_TX_NONE */
-                       dev->data->dev_conf.txmode.mq_mode = ETH_MQ_TX_VMDQ_ONLY;
+               default: /* RTE_ETH_MQ_TX_VMDQ_ONLY or RTE_ETH_MQ_TX_NONE */
+                       dev->data->dev_conf.txmode.mq_mode = RTE_ETH_MQ_TX_VMDQ_ONLY;
                        break;
                }
 
@@ -2256,13 +2275,13 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
                        return -EINVAL;
                }
        } else {
-               if (dev_conf->rxmode.mq_mode == ETH_MQ_RX_VMDQ_DCB_RSS) {
+               if (dev_conf->rxmode.mq_mode == RTE_ETH_MQ_RX_VMDQ_DCB_RSS) {
                        PMD_INIT_LOG(ERR, "VMDQ+DCB+RSS mq_mode is"
                                          " not supported.");
                        return -EINVAL;
                }
                /* check configuration for vmdb+dcb mode */
-               if (dev_conf->rxmode.mq_mode == ETH_MQ_RX_VMDQ_DCB) {
+               if (dev_conf->rxmode.mq_mode == RTE_ETH_MQ_RX_VMDQ_DCB) {
                        const struct rte_eth_vmdq_dcb_conf *conf;
 
                        if (nb_rx_q != IXGBE_VMDQ_DCB_NB_QUEUES) {
@@ -2271,15 +2290,15 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
                                return -EINVAL;
                        }
                        conf = &dev_conf->rx_adv_conf.vmdq_dcb_conf;
-                       if (!(conf->nb_queue_pools == ETH_16_POOLS ||
-                              conf->nb_queue_pools == ETH_32_POOLS)) {
+                       if (!(conf->nb_queue_pools == RTE_ETH_16_POOLS ||
+                              conf->nb_queue_pools == RTE_ETH_32_POOLS)) {
                                PMD_INIT_LOG(ERR, "VMDQ+DCB selected,"
                                                " nb_queue_pools must be %d or %d.",
-                                               ETH_16_POOLS, ETH_32_POOLS);
+                                               RTE_ETH_16_POOLS, RTE_ETH_32_POOLS);
                                return -EINVAL;
                        }
                }
-               if (dev_conf->txmode.mq_mode == ETH_MQ_TX_VMDQ_DCB) {
+               if (dev_conf->txmode.mq_mode == RTE_ETH_MQ_TX_VMDQ_DCB) {
                        const struct rte_eth_vmdq_dcb_tx_conf *conf;
 
                        if (nb_tx_q != IXGBE_VMDQ_DCB_NB_QUEUES) {
@@ -2288,49 +2307,39 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
                                return -EINVAL;
                        }
                        conf = &dev_conf->tx_adv_conf.vmdq_dcb_tx_conf;
-                       if (!(conf->nb_queue_pools == ETH_16_POOLS ||
-                              conf->nb_queue_pools == ETH_32_POOLS)) {
+                       if (!(conf->nb_queue_pools == RTE_ETH_16_POOLS ||
+                              conf->nb_queue_pools == RTE_ETH_32_POOLS)) {
                                PMD_INIT_LOG(ERR, "VMDQ+DCB selected,"
                                                " nb_queue_pools != %d and"
                                                " nb_queue_pools != %d.",
-                                               ETH_16_POOLS, ETH_32_POOLS);
+                                               RTE_ETH_16_POOLS, RTE_ETH_32_POOLS);
                                return -EINVAL;
                        }
                }
 
                /* For DCB mode check our configuration before we go further */
-               if (dev_conf->rxmode.mq_mode == ETH_MQ_RX_DCB) {
+               if (dev_conf->rxmode.mq_mode == RTE_ETH_MQ_RX_DCB) {
                        const struct rte_eth_dcb_rx_conf *conf;
 
-                       if (nb_rx_q != IXGBE_DCB_NB_QUEUES) {
-                               PMD_INIT_LOG(ERR, "DCB selected, nb_rx_q != %d.",
-                                                IXGBE_DCB_NB_QUEUES);
-                               return -EINVAL;
-                       }
                        conf = &dev_conf->rx_adv_conf.dcb_rx_conf;
-                       if (!(conf->nb_tcs == ETH_4_TCS ||
-                              conf->nb_tcs == ETH_8_TCS)) {
+                       if (!(conf->nb_tcs == RTE_ETH_4_TCS ||
+                              conf->nb_tcs == RTE_ETH_8_TCS)) {
                                PMD_INIT_LOG(ERR, "DCB selected, nb_tcs != %d"
                                                " and nb_tcs != %d.",
-                                               ETH_4_TCS, ETH_8_TCS);
+                                               RTE_ETH_4_TCS, RTE_ETH_8_TCS);
                                return -EINVAL;
                        }
                }
 
-               if (dev_conf->txmode.mq_mode == ETH_MQ_TX_DCB) {
+               if (dev_conf->txmode.mq_mode == RTE_ETH_MQ_TX_DCB) {
                        const struct rte_eth_dcb_tx_conf *conf;
 
-                       if (nb_tx_q != IXGBE_DCB_NB_QUEUES) {
-                               PMD_INIT_LOG(ERR, "DCB, nb_tx_q != %d.",
-                                                IXGBE_DCB_NB_QUEUES);
-                               return -EINVAL;
-                       }
                        conf = &dev_conf->tx_adv_conf.dcb_tx_conf;
-                       if (!(conf->nb_tcs == ETH_4_TCS ||
-                              conf->nb_tcs == ETH_8_TCS)) {
+                       if (!(conf->nb_tcs == RTE_ETH_4_TCS ||
+                              conf->nb_tcs == RTE_ETH_8_TCS)) {
                                PMD_INIT_LOG(ERR, "DCB selected, nb_tcs != %d"
                                                " and nb_tcs != %d.",
-                                               ETH_4_TCS, ETH_8_TCS);
+                                               RTE_ETH_4_TCS, RTE_ETH_8_TCS);
                                return -EINVAL;
                        }
                }
@@ -2339,7 +2348,7 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
                 * When DCB/VT is off, maximum number of queues changes,
                 * except for 82598EB, which remains constant.
                 */
-               if (dev_conf->txmode.mq_mode == ETH_MQ_TX_NONE &&
+               if (dev_conf->txmode.mq_mode == RTE_ETH_MQ_TX_NONE &&
                                hw->mac.type != ixgbe_mac_82598EB) {
                        if (nb_tx_q > IXGBE_NONE_MODE_TX_NB_QUEUES) {
                                PMD_INIT_LOG(ERR,
@@ -2358,11 +2367,14 @@ ixgbe_dev_configure(struct rte_eth_dev *dev)
 {
        struct ixgbe_interrupt *intr =
                IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
-       struct ixgbe_adapter *adapter =
-               (struct ixgbe_adapter *)dev->data->dev_private;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
        int ret;
 
        PMD_INIT_FUNC_TRACE();
+
+       if (dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG)
+               dev->data->dev_conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_RSS_HASH;
+
        /* multipe queue mode checking */
        ret  = ixgbe_check_mq_mode(dev);
        if (ret != 0) {
@@ -2416,9 +2428,12 @@ ixgbe_set_vf_rate_limit(struct rte_eth_dev *dev, uint16_t vf,
        uint32_t queue_end;
        uint16_t total_rate = 0;
        struct rte_pci_device *pci_dev;
+       int ret;
 
        pci_dev = RTE_ETH_DEV_TO_PCI(dev);
-       rte_eth_link_get_nowait(dev->data->port_id, &link);
+       ret = rte_eth_link_get_nowait(dev->data->port_id, &link);
+       if (ret < 0)
+               return ret;
 
        if (vf >= pci_dev->max_vfs)
                return -EINVAL;
@@ -2477,38 +2492,72 @@ ixgbe_set_vf_rate_limit(struct rte_eth_dev *dev, uint16_t vf,
        return 0;
 }
 
-/*
- * Configure device link speed and setup link.
- * It returns 0 on success.
- */
 static int
-ixgbe_dev_start(struct rte_eth_dev *dev)
+ixgbe_flow_ctrl_enable(struct rte_eth_dev *dev, struct ixgbe_hw *hw)
 {
-       struct ixgbe_hw *hw =
-               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 ixgbe_adapter *adapter = dev->data->dev_private;
+       int err;
+       uint32_t mflcn;
+
+       ixgbe_setup_fc(hw);
+
+       err = ixgbe_fc_enable(hw);
+
+       /* Not negotiated is not an error case */
+       if (err == IXGBE_SUCCESS || err == IXGBE_ERR_FC_NOT_NEGOTIATED) {
+               /*
+                *check if we want to forward MAC frames - driver doesn't
+                *have native capability to do that,
+                *so we'll write the registers ourselves
+                */
+
+               mflcn = IXGBE_READ_REG(hw, IXGBE_MFLCN);
+
+               /* set or clear MFLCN.PMCF bit depending on configuration */
+               if (adapter->mac_ctrl_frame_fwd != 0)
+                       mflcn |= IXGBE_MFLCN_PMCF;
+               else
+                       mflcn &= ~IXGBE_MFLCN_PMCF;
+
+               IXGBE_WRITE_REG(hw, IXGBE_MFLCN, mflcn);
+               IXGBE_WRITE_FLUSH(hw);
+
+               return 0;
+       }
+       return err;
+}
+
+/*
+ * Configure device link speed and setup link.
+ * It returns 0 on success.
+ */
+static int
+ixgbe_dev_start(struct rte_eth_dev *dev)
+{
+       struct ixgbe_hw *hw =
+               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 = RTE_ETH_DEV_TO_PCI(dev);
-       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+       struct rte_intr_handle *intr_handle = pci_dev->intr_handle;
        uint32_t intr_vector = 0;
-       int err, link_up = 0, negotiate = 0;
+       int err;
+       bool link_up = false, negotiate = 0;
        uint32_t speed = 0;
+       uint32_t allowed_speeds = 0;
        int mask = 0;
        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);
+       struct ixgbe_macsec_setting *macsec_setting =
+               IXGBE_DEV_PRIVATE_TO_MACSEC_SETTING(dev->data->dev_private);
 
        PMD_INIT_FUNC_TRACE();
 
-       /* IXGBE devices don't support:
-       *    - half duplex (checked afterwards for valid speeds)
-       *    - 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);
-               return -EINVAL;
-       }
+       /* Stop the link setup handler before resetting the HW. */
+       ixgbe_dev_wait_setup_link_complete(dev, 0);
 
        /* disable uio/vfio intr/eventfd mapping */
        rte_intr_disable(intr_handle);
@@ -2545,11 +2594,9 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
                        return -1;
        }
 
-       if (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {
-               intr_handle->intr_vec =
-                       rte_zmalloc("intr_vec",
-                                   dev->data->nb_rx_queues * sizeof(int), 0);
-               if (intr_handle->intr_vec == NULL) {
+       if (rte_intr_dp_is_en(intr_handle)) {
+               if (rte_intr_vec_list_alloc(intr_handle, "intr_vec",
+                                                  dev->data->nb_rx_queues)) {
                        PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
                                     " intr_vec", dev->data->nb_rx_queues);
                        return -ENOMEM;
@@ -2569,11 +2616,15 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
                goto error;
        }
 
-    mask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK |
-               ETH_VLAN_EXTEND_MASK;
-       ixgbe_vlan_offload_set(dev, mask);
+       mask = RTE_ETH_VLAN_STRIP_MASK | RTE_ETH_VLAN_FILTER_MASK |
+               RTE_ETH_VLAN_EXTEND_MASK;
+       err = ixgbe_vlan_offload_config(dev, mask);
+       if (err) {
+               PMD_INIT_LOG(ERR, "Unable to set VLAN offload");
+               goto error;
+       }
 
-       if (dev->data->dev_conf.rxmode.mq_mode == ETH_MQ_RX_VMDQ_ONLY) {
+       if (dev->data->dev_conf.rxmode.mq_mode == RTE_ETH_MQ_RX_VMDQ_ONLY) {
                /* Enable vlan filtering for VMDq */
                ixgbe_vmdq_vlan_hw_filter_enable(dev);
        }
@@ -2600,16 +2651,28 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 
        ixgbe_restore_statistics_mapping(dev);
 
+       err = ixgbe_flow_ctrl_enable(dev, hw);
+       if (err < 0) {
+               PMD_INIT_LOG(ERR, "enable flow ctrl err");
+               goto error;
+       }
+
        err = ixgbe_dev_rxtx_start(dev);
        if (err < 0) {
                PMD_INIT_LOG(ERR, "Unable to start rxtx queues");
                goto error;
        }
 
-       /* Skip link setup if loopback mode is enabled for 82599. */
-       if (hw->mac.type == ixgbe_mac_82599EB &&
-                       dev->data->dev_conf.lpbk_mode == IXGBE_LPBK_82599_TX_RX)
-               goto skip_link_setup;
+       /* Skip link setup if loopback mode is enabled. */
+       if (dev->data->dev_conf.lpbk_mode != 0) {
+               err = ixgbe_check_supported_loopback_mode(dev);
+               if (err < 0) {
+                       PMD_INIT_LOG(ERR, "Unsupported loopback mode");
+                       goto error;
+               } else {
+                       goto skip_link_setup;
+               }
+       }
 
        if (ixgbe_is_sfp(hw) && hw->phy.multispeed_fiber) {
                err = hw->mac.ops.setup_sfp(hw);
@@ -2634,25 +2697,64 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
        if (err)
                goto error;
 
+       switch (hw->mac.type) {
+       case ixgbe_mac_X550:
+       case ixgbe_mac_X550EM_x:
+       case ixgbe_mac_X550EM_a:
+               allowed_speeds = RTE_ETH_LINK_SPEED_100M | RTE_ETH_LINK_SPEED_1G |
+                       RTE_ETH_LINK_SPEED_2_5G |  RTE_ETH_LINK_SPEED_5G |
+                       RTE_ETH_LINK_SPEED_10G;
+               if (hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T ||
+                               hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)
+                       allowed_speeds = RTE_ETH_LINK_SPEED_10M |
+                               RTE_ETH_LINK_SPEED_100M | RTE_ETH_LINK_SPEED_1G;
+               break;
+       default:
+               allowed_speeds = RTE_ETH_LINK_SPEED_100M | RTE_ETH_LINK_SPEED_1G |
+                       RTE_ETH_LINK_SPEED_10G;
+       }
+
        link_speeds = &dev->data->dev_conf.link_speeds;
-       if (*link_speeds & ~(ETH_LINK_SPEED_100M | ETH_LINK_SPEED_1G |
-                       ETH_LINK_SPEED_10G)) {
+
+       /* Ignore autoneg flag bit and check the validity of 
+        * link_speed 
+        */
+       if (((*link_speeds) >> 1) & ~(allowed_speeds >> 1)) {
                PMD_INIT_LOG(ERR, "Invalid link setting");
                goto error;
        }
 
        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;
+       if (*link_speeds == RTE_ETH_LINK_SPEED_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)
+               if (*link_speeds & RTE_ETH_LINK_SPEED_10G)
                        speed |= IXGBE_LINK_SPEED_10GB_FULL;
-               if (*link_speeds & ETH_LINK_SPEED_1G)
+               if (*link_speeds & RTE_ETH_LINK_SPEED_5G)
+                       speed |= IXGBE_LINK_SPEED_5GB_FULL;
+               if (*link_speeds & RTE_ETH_LINK_SPEED_2_5G)
+                       speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
+               if (*link_speeds & RTE_ETH_LINK_SPEED_1G)
                        speed |= IXGBE_LINK_SPEED_1GB_FULL;
-               if (*link_speeds & ETH_LINK_SPEED_100M)
+               if (*link_speeds & RTE_ETH_LINK_SPEED_100M)
                        speed |= IXGBE_LINK_SPEED_100_FULL;
+               if (*link_speeds & RTE_ETH_LINK_SPEED_10M)
+                       speed |= IXGBE_LINK_SPEED_10_FULL;
        }
 
        err = ixgbe_setup_link(hw, speed, link_up);
@@ -2664,7 +2766,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,
@@ -2687,6 +2791,26 @@ 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");
+
+       /* wait for the controller to acquire link */
+       err = ixgbe_wait_for_link_up(hw);
+       if (err)
+               goto error;
+
+       /*
+        * Update link status right before return, because it may
+        * start link configuration process in a separate thread.
+        */
+       ixgbe_dev_link_update(dev, 0);
+
+       /* setup the macsec setting register */
+       if (macsec_setting->offload_en)
+               ixgbe_dev_macsec_register_enable(dev, macsec_setting);
+
        return 0;
 
 error:
@@ -2698,20 +2822,28 @@ error:
 /*
  * Stop device: disable rx and tx functions to allow for reconfiguring.
  */
-static void
+static int
 ixgbe_dev_stop(struct rte_eth_dev *dev)
 {
        struct rte_eth_link link;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
        struct ixgbe_hw *hw =
                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 = RTE_ETH_DEV_TO_PCI(dev);
-       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+       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);
+
+       if (hw->adapter_stopped)
+               return 0;
 
        PMD_INIT_FUNC_TRACE();
 
+       ixgbe_dev_wait_setup_link_complete(dev, 0);
+
        /* disable interrupts */
        ixgbe_disable_intr(hw);
 
@@ -2741,7 +2873,7 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 
        /* Clear recorded link status */
        memset(&link, 0, sizeof(link));
-       rte_ixgbe_dev_atomic_write_link_status(dev, &link);
+       rte_eth_linkstatus_set(dev, &link);
 
        if (!rte_intr_allow_others(intr_handle))
                /* resume to the default handler */
@@ -2751,10 +2883,17 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 
        /* Clean datapath event and queue/vec mapping */
        rte_intr_efd_disable(intr_handle);
-       if (intr_handle->intr_vec != NULL) {
-               rte_free(intr_handle->intr_vec);
-               intr_handle->intr_vec = NULL;
-       }
+       rte_intr_vec_list_free(intr_handle);
+
+       /* reset hierarchy commit */
+       tm_conf->committed = false;
+
+       adapter->rss_reta_updated = 0;
+
+       hw->adapter_stopped = true;
+       dev->data->dev_started = 0;
+
+       return 0;
 }
 
 /*
@@ -2782,6 +2921,7 @@ ixgbe_dev_set_link_up(struct rte_eth_dev *dev)
        } else {
                /* Turn on the laser */
                ixgbe_enable_tx_laser(hw);
+               ixgbe_dev_link_update(dev, 0);
        }
 
        return 0;
@@ -2812,26 +2952,32 @@ ixgbe_dev_set_link_down(struct rte_eth_dev *dev)
        } else {
                /* Turn off the laser */
                ixgbe_disable_tx_laser(hw);
+               ixgbe_dev_link_update(dev, 0);
        }
 
        return 0;
 }
 
 /*
- * Reest and stop device.
+ * Reset and stop device.
  */
-static void
+static int
 ixgbe_dev_close(struct rte_eth_dev *dev)
 {
        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;
+       int retries = 0;
+       int ret;
 
        PMD_INIT_FUNC_TRACE();
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return 0;
 
        ixgbe_pf_reset_hw(hw);
 
-       ixgbe_dev_stop(dev);
-       hw->adapter_stopped = 1;
+       ret = ixgbe_dev_stop(dev);
 
        ixgbe_dev_free_queues(dev);
 
@@ -2839,6 +2985,78 @@ ixgbe_dev_close(struct rte_eth_dev *dev)
 
        /* reprogram the RAR[0] in case user changed it. */
        ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
+
+       /* Unlock any pending hardware semaphore */
+       ixgbe_swfw_lock_reset(hw);
+
+       /* disable uio intr before callback unregister */
+       rte_intr_disable(intr_handle);
+
+       do {
+               ret = rte_intr_callback_unregister(intr_handle,
+                               ixgbe_dev_interrupt_handler, dev);
+               if (ret >= 0 || ret == -ENOENT) {
+                       break;
+               } else if (ret != -EAGAIN) {
+                       PMD_INIT_LOG(ERR,
+                               "intr callback unregister failed: %d",
+                               ret);
+               }
+               rte_delay_ms(100);
+       } while (retries++ < (10 + IXGBE_LINK_UP_TIME));
+
+       /* cancel the delay handler before remove dev */
+       rte_eal_alarm_cancel(ixgbe_dev_interrupt_delayed_handler, dev);
+
+       /* uninitialize PF if max_vfs not zero */
+       ixgbe_pf_host_uninit(dev);
+
+       /* remove all the fdir filters & hash */
+       ixgbe_fdir_filter_uninit(dev);
+
+       /* remove all the L2 tunnel filters & hash */
+       ixgbe_l2_tn_filter_uninit(dev);
+
+       /* Remove all ntuple filters of the device */
+       ixgbe_ntuple_filter_uninit(dev);
+
+       /* clear all the filters list */
+       ixgbe_filterlist_flush();
+
+       /* Remove all Traffic Manager configuration */
+       ixgbe_tm_conf_uninit(dev);
+
+#ifdef RTE_LIB_SECURITY
+       rte_free(dev->security_ctx);
+#endif
+
+       return ret;
+}
+
+/*
+ * 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, NULL);
+
+       return ret;
 }
 
 static void
@@ -2904,7 +3122,7 @@ ixgbe_read_stats_registers(struct ixgbe_hw *hw,
                hw_stats->qbrc[i] +=
                    ((uint64_t)IXGBE_READ_REG(hw, IXGBE_QBRC_H(i)) << 32);
                if (crc_strip == 0)
-                       hw_stats->qbrc[i] -= delta_qprc * ETHER_CRC_LEN;
+                       hw_stats->qbrc[i] -= delta_qprc * RTE_ETHER_CRC_LEN;
 
                hw_stats->qbtc[i] += IXGBE_READ_REG(hw, IXGBE_QBTC_L(i));
                hw_stats->qbtc[i] +=
@@ -2949,12 +3167,12 @@ ixgbe_read_stats_registers(struct ixgbe_hw *hw,
        hw_stats->tpt += IXGBE_READ_REG(hw, IXGBE_TPT);
 
        if (crc_strip == 0)
-               hw_stats->gorc -= delta_gprc * ETHER_CRC_LEN;
+               hw_stats->gorc -= delta_gprc * RTE_ETHER_CRC_LEN;
 
        uint64_t delta_gptc = IXGBE_READ_REG(hw, IXGBE_GPTC);
        hw_stats->gptc += delta_gptc;
-       hw_stats->gotc -= delta_gptc * ETHER_CRC_LEN;
-       hw_stats->tor -= (hw_stats->tpr - old_tpr) * ETHER_CRC_LEN;
+       hw_stats->gotc -= delta_gptc * RTE_ETHER_CRC_LEN;
+       hw_stats->tor -= (hw_stats->tpr - old_tpr) * RTE_ETHER_CRC_LEN;
 
        /*
         * Workaround: mprc hardware is incorrectly counting
@@ -2984,7 +3202,7 @@ ixgbe_read_stats_registers(struct ixgbe_hw *hw,
        hw_stats->gptc -= total;
        hw_stats->mptc -= total;
        hw_stats->ptc64 -= total;
-       hw_stats->gotc -= total * ETHER_MIN_LEN;
+       hw_stats->gotc -= total * RTE_ETHER_MIN_LEN;
 
        hw_stats->ruc += IXGBE_READ_REG(hw, IXGBE_RUC);
        hw_stats->rfc += IXGBE_READ_REG(hw, IXGBE_RFC);
@@ -3012,9 +3230,18 @@ ixgbe_read_stats_registers(struct ixgbe_hw *hw,
        }
 
        /* Flow Director Stats registers */
-       hw_stats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH);
-       hw_stats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS);
-
+       if (hw->mac.type != ixgbe_mac_82598EB) {
+               hw_stats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH);
+               hw_stats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS);
+               hw_stats->fdirustat_add += IXGBE_READ_REG(hw,
+                                       IXGBE_FDIRUSTAT) & 0xFFFF;
+               hw_stats->fdirustat_remove += (IXGBE_READ_REG(hw,
+                                       IXGBE_FDIRUSTAT) >> 16) & 0xFFFF;
+               hw_stats->fdirfstat_fadd += IXGBE_READ_REG(hw,
+                                       IXGBE_FDIRFSTAT) & 0xFFFF;
+               hw_stats->fdirfstat_fremove += (IXGBE_READ_REG(hw,
+                                       IXGBE_FDIRFSTAT) >> 16) & 0xFFFF;
+       }
        /* MACsec Stats registers */
        macsec_stats->out_pkts_untagged += IXGBE_READ_REG(hw, IXGBE_LSECTXUT);
        macsec_stats->out_pkts_encrypted +=
@@ -3053,7 +3280,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 =
@@ -3075,7 +3302,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;
@@ -3104,11 +3331,19 @@ ixgbe_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
                          hw_stats->fccrc +
                          hw_stats->fclast;
 
+       /*
+        * 82599 errata, UDP frames with a 0 checksum can be marked as checksum
+        * errors.
+        */
+       if (hw->mac.type != ixgbe_mac_82599EB)
+               stats->ierrors += hw_stats->xec;
+
        /* Tx Errors */
        stats->oerrors  = 0;
+       return 0;
 }
 
-static void
+static int
 ixgbe_dev_stats_reset(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw_stats *stats =
@@ -3119,6 +3354,8 @@ ixgbe_dev_stats_reset(struct rte_eth_dev *dev)
 
        /* Reset software totals */
        memset(stats, 0, sizeof(*stats));
+
+       return 0;
 }
 
 /* This function calculates the number of xstats based on the current config */
@@ -3144,19 +3381,17 @@ static int ixgbe_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 
                /* 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);
+                       strlcpy(xstats_names[count].name,
+                               rte_ixgbe_stats_strings[i].name,
+                               sizeof(xstats_names[count].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);
+                       strlcpy(xstats_names[count].name,
+                               rte_ixgbe_macsec_strings[i].name,
+                               sizeof(xstats_names[count].name));
                        count++;
                }
 
@@ -3187,8 +3422,8 @@ static int ixgbe_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 
 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,
+       struct rte_eth_xstat_name *xstats_names,
        unsigned int limit)
 {
        if (!ids) {
@@ -3204,19 +3439,17 @@ static int ixgbe_dev_xstats_get_names_by_id(
 
                        /* 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);
+                               strlcpy(xstats_names[count].name,
+                                       rte_ixgbe_stats_strings[i].name,
+                                       sizeof(xstats_names[count].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);
+                               strlcpy(xstats_names[count].name,
+                                       rte_ixgbe_macsec_strings[i].name,
+                                       sizeof(xstats_names[count].name));
                                count++;
                        }
 
@@ -3249,7 +3482,7 @@ static int ixgbe_dev_xstats_get_names_by_id(
        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,
+       ixgbe_dev_xstats_get_names_by_id(dev, NULL, xstats_names_copy,
                        size);
 
        for (i = 0; i < limit; i++) {
@@ -3273,9 +3506,9 @@ static int ixgbevf_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 
        if (xstats_names != NULL)
                for (i = 0; i < IXGBEVF_NB_XSTATS; i++)
-                       snprintf(xstats_names[i].name,
-                               sizeof(xstats_names[i].name),
-                               "%s", rte_ixgbevf_stats_strings[i].name);
+                       strlcpy(xstats_names[i].name,
+                               rte_ixgbevf_stats_strings[i].name,
+                               sizeof(xstats_names[i].name));
        return IXGBEVF_NB_XSTATS;
 }
 
@@ -3444,7 +3677,7 @@ ixgbe_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
        return n;
 }
 
-static void
+static int
 ixgbe_dev_xstats_reset(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw_stats *stats =
@@ -3461,6 +3694,8 @@ ixgbe_dev_xstats_reset(struct rte_eth_dev *dev)
        /* Reset software totals */
        memset(stats, 0, sizeof(*stats));
        memset(macsec_stats, 0, sizeof(*macsec_stats));
+
+       return 0;
 }
 
 static void
@@ -3517,7 +3752,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 *)
@@ -3526,15 +3761,16 @@ 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
+static int
 ixgbevf_dev_stats_reset(struct rte_eth_dev *dev)
 {
        struct ixgbevf_hw_stats *hw_stats = (struct ixgbevf_hw_stats *)
@@ -3548,6 +3784,9 @@ ixgbevf_dev_stats_reset(struct rte_eth_dev *dev)
        hw_stats->vfgorc = 0;
        hw_stats->vfgptc = 0;
        hw_stats->vfgotc = 0;
+       hw_stats->vfmprc = 0;
+
+       return 0;
 }
 
 static int
@@ -3563,22 +3802,23 @@ ixgbe_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
 
        etrack_id = (eeprom_verh << 16) | eeprom_verl;
        ret = snprintf(fw_version, fw_size, "0x%08x", etrack_id);
+       if (ret < 0)
+               return -EINVAL;
 
        ret += 1; /* add the size of '\0' */
-       if (fw_size < (u32)ret)
+       if (fw_size < (size_t)ret)
                return ret;
        else
                return 0;
 }
 
-static void
+static int
 ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
        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;
 
-       dev_info->pci_dev = pci_dev;
        dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
        dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
        if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
@@ -3586,7 +3826,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                 * When DCB/VT is off, maximum number of queues changes,
                 * except for 82598EB, which remains constant.
                 */
-               if (dev_conf->txmode.mq_mode == ETH_MQ_TX_NONE &&
+               if (dev_conf->txmode.mq_mode == RTE_ETH_MQ_TX_NONE &&
                                hw->mac.type != ixgbe_mac_82598EB)
                        dev_info->max_tx_queues = IXGBE_NONE_MODE_TX_NB_QUEUES;
        }
@@ -3596,50 +3836,17 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
        dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
        dev_info->max_vfs = pci_dev->max_vfs;
        if (hw->mac.type == ixgbe_mac_82598EB)
-               dev_info->max_vmdq_pools = ETH_16_POOLS;
+               dev_info->max_vmdq_pools = RTE_ETH_16_POOLS;
        else
-               dev_info->max_vmdq_pools = ETH_64_POOLS;
+               dev_info->max_vmdq_pools = RTE_ETH_64_POOLS;
+       dev_info->max_mtu =  dev_info->max_rx_pktlen - IXGBE_ETH_OVERHEAD;
+       dev_info->min_mtu = RTE_ETHER_MIN_MTU;
        dev_info->vmdq_queue_num = dev_info->max_rx_queues;
-       dev_info->rx_offload_capa =
-               DEV_RX_OFFLOAD_VLAN_STRIP |
-               DEV_RX_OFFLOAD_IPV4_CKSUM |
-               DEV_RX_OFFLOAD_UDP_CKSUM  |
-               DEV_RX_OFFLOAD_TCP_CKSUM;
-
-       /*
-        * RSC is only supported by 82599 and x540 PF devices in a non-SR-IOV
-        * mode.
-        */
-       if ((hw->mac.type == ixgbe_mac_82599EB ||
-            hw->mac.type == ixgbe_mac_X540) &&
-           !RTE_ETH_DEV_SRIOV(dev).active)
-               dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_TCP_LRO;
-
-       if (hw->mac.type == ixgbe_mac_82599EB ||
-           hw->mac.type == ixgbe_mac_X540)
-               dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_MACSEC_STRIP;
-
-       if (hw->mac.type == ixgbe_mac_X550 ||
-           hw->mac.type == ixgbe_mac_X550EM_x ||
-           hw->mac.type == ixgbe_mac_X550EM_a)
-               dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
-
-       dev_info->tx_offload_capa =
-               DEV_TX_OFFLOAD_VLAN_INSERT |
-               DEV_TX_OFFLOAD_IPV4_CKSUM  |
-               DEV_TX_OFFLOAD_UDP_CKSUM   |
-               DEV_TX_OFFLOAD_TCP_CKSUM   |
-               DEV_TX_OFFLOAD_SCTP_CKSUM  |
-               DEV_TX_OFFLOAD_TCP_TSO;
-
-       if (hw->mac.type == ixgbe_mac_82599EB ||
-           hw->mac.type == ixgbe_mac_X540)
-               dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_MACSEC_INSERT;
-
-       if (hw->mac.type == ixgbe_mac_X550 ||
-           hw->mac.type == ixgbe_mac_X550EM_x ||
-           hw->mac.type == ixgbe_mac_X550EM_a)
-               dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+       dev_info->rx_queue_offload_capa = ixgbe_get_rx_queue_offloads(dev);
+       dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads(dev) |
+                                    dev_info->rx_queue_offload_capa);
+       dev_info->tx_queue_offload_capa = ixgbe_get_tx_queue_offloads(dev);
+       dev_info->tx_offload_capa = ixgbe_get_tx_port_offloads(dev);
 
        dev_info->default_rxconf = (struct rte_eth_rxconf) {
                .rx_thresh = {
@@ -3649,6 +3856,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                },
                .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH,
                .rx_drop_en = 0,
+               .offloads = 0,
        };
 
        dev_info->default_txconf = (struct rte_eth_txconf) {
@@ -3659,8 +3867,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                },
                .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH,
                .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH,
-               .txq_flags = ETH_TXQ_FLAGS_NOMULTSEGS |
-                               ETH_TXQ_FLAGS_NOOFFLOADS,
+               .offloads = 0,
        };
 
        dev_info->rx_desc_lim = rx_desc_lim;
@@ -3670,13 +3877,32 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
        dev_info->reta_size = ixgbe_reta_size_get(hw->mac.type);
        dev_info->flow_type_rss_offloads = IXGBE_RSS_OFFLOAD_ALL;
 
-       dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G;
+       dev_info->speed_capa = RTE_ETH_LINK_SPEED_1G | RTE_ETH_LINK_SPEED_10G;
+       if (hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T ||
+                       hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)
+               dev_info->speed_capa = RTE_ETH_LINK_SPEED_10M |
+                       RTE_ETH_LINK_SPEED_100M | RTE_ETH_LINK_SPEED_1G;
+
        if (hw->mac.type == ixgbe_mac_X540 ||
            hw->mac.type == ixgbe_mac_X540_vf ||
            hw->mac.type == ixgbe_mac_X550 ||
            hw->mac.type == ixgbe_mac_X550_vf) {
-               dev_info->speed_capa |= ETH_LINK_SPEED_100M;
+               dev_info->speed_capa |= RTE_ETH_LINK_SPEED_100M;
        }
+       if (hw->mac.type == ixgbe_mac_X550) {
+               dev_info->speed_capa |= RTE_ETH_LINK_SPEED_2_5G;
+               dev_info->speed_capa |= RTE_ETH_LINK_SPEED_5G;
+       }
+
+       /* Driver-preferred Rx/Tx parameters */
+       dev_info->default_rxportconf.burst_size = 32;
+       dev_info->default_txportconf.burst_size = 32;
+       dev_info->default_rxportconf.nb_queues = 1;
+       dev_info->default_txportconf.nb_queues = 1;
+       dev_info->default_rxportconf.ring_size = 256;
+       dev_info->default_txportconf.ring_size = 256;
+
+       return 0;
 }
 
 static const uint32_t *
@@ -3710,7 +3936,7 @@ ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)
            dev->rx_pkt_burst == ixgbe_recv_pkts_bulk_alloc)
                return ptypes;
 
-#if defined(RTE_ARCH_X86)
+#if defined(RTE_ARCH_X86) || defined(__ARM_NEON)
        if (dev->rx_pkt_burst == ixgbe_recv_pkts_vec ||
            dev->rx_pkt_burst == ixgbe_recv_scattered_pkts_vec)
                return ptypes;
@@ -3718,35 +3944,33 @@ ixgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)
        return NULL;
 }
 
-static void
+static int
 ixgbevf_dev_info_get(struct rte_eth_dev *dev,
                     struct rte_eth_dev_info *dev_info)
 {
        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;
        dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
        dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
        dev_info->min_rx_bufsize = 1024; /* cf BSIZEPACKET in SRRCTL reg */
        dev_info->max_rx_pktlen = 9728; /* includes CRC, cf MAXFRS reg */
+       dev_info->max_mtu = dev_info->max_rx_pktlen - IXGBE_ETH_OVERHEAD;
        dev_info->max_mac_addrs = hw->mac.num_rar_entries;
        dev_info->max_hash_mac_addrs = IXGBE_VMDQ_NUM_UC_MAC;
        dev_info->max_vfs = pci_dev->max_vfs;
        if (hw->mac.type == ixgbe_mac_82598EB)
-               dev_info->max_vmdq_pools = ETH_16_POOLS;
+               dev_info->max_vmdq_pools = RTE_ETH_16_POOLS;
        else
-               dev_info->max_vmdq_pools = ETH_64_POOLS;
-       dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP |
-                               DEV_RX_OFFLOAD_IPV4_CKSUM |
-                               DEV_RX_OFFLOAD_UDP_CKSUM  |
-                               DEV_RX_OFFLOAD_TCP_CKSUM;
-       dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT |
-                               DEV_TX_OFFLOAD_IPV4_CKSUM  |
-                               DEV_TX_OFFLOAD_UDP_CKSUM   |
-                               DEV_TX_OFFLOAD_TCP_CKSUM   |
-                               DEV_TX_OFFLOAD_SCTP_CKSUM  |
-                               DEV_TX_OFFLOAD_TCP_TSO;
+               dev_info->max_vmdq_pools = RTE_ETH_64_POOLS;
+       dev_info->rx_queue_offload_capa = ixgbe_get_rx_queue_offloads(dev);
+       dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads(dev) |
+                                    dev_info->rx_queue_offload_capa);
+       dev_info->tx_queue_offload_capa = ixgbe_get_tx_queue_offloads(dev);
+       dev_info->tx_offload_capa = ixgbe_get_tx_port_offloads(dev);
+       dev_info->hash_key_size = IXGBE_HKEY_MAX_INDEX * sizeof(uint32_t);
+       dev_info->reta_size = ixgbe_reta_size_get(hw->mac.type);
+       dev_info->flow_type_rss_offloads = IXGBE_RSS_OFFLOAD_ALL;
 
        dev_info->default_rxconf = (struct rte_eth_rxconf) {
                .rx_thresh = {
@@ -3756,6 +3980,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
                },
                .rx_free_thresh = IXGBE_DEFAULT_RX_FREE_THRESH,
                .rx_drop_en = 0,
+               .offloads = 0,
        };
 
        dev_info->default_txconf = (struct rte_eth_txconf) {
@@ -3766,23 +3991,21 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
                },
                .tx_free_thresh = IXGBE_DEFAULT_TX_FREE_THRESH,
                .tx_rs_thresh = IXGBE_DEFAULT_TX_RSBIT_THRESH,
-               .txq_flags = ETH_TXQ_FLAGS_NOMULTSEGS |
-                               ETH_TXQ_FLAGS_NOOFFLOADS,
+               .offloads = 0,
        };
 
        dev_info->rx_desc_lim = rx_desc_lim;
        dev_info->tx_desc_lim = tx_desc_lim;
+
+       return 0;
 }
 
 static int
 ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
-                  int *link_up, int wait_to_complete)
+                  bool *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_adapter *adapter = container_of(hw,
+                                                    struct ixgbe_adapter, hw);
        struct ixgbe_mbx_info *mbx = &hw->mbx;
        struct ixgbe_mac_info *mac = &hw->mac;
        uint32_t links_reg, in_msg;
@@ -3803,7 +4026,7 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
        /* 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) {
+       if (mac->type == ixgbe_mac_82599_vf && wait_to_complete) {
                int i;
 
                for (i = 0; i < 5; i++) {
@@ -3843,7 +4066,7 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
                *speed = IXGBE_LINK_SPEED_UNKNOWN;
        }
 
-       if (no_pflink_check) {
+       if (wait_to_complete == 0 && adapter->pflink_fullchk == 0) {
                if (*speed == IXGBE_LINK_SPEED_UNKNOWN)
                        mac->get_link_status = true;
                else
@@ -3851,6 +4074,7 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
 
                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
         */
@@ -3860,7 +4084,7 @@ ixgbevf_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
        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;
+                       mac->get_link_status = false;
                goto out;
        }
 
@@ -3880,92 +4104,205 @@ out:
        return ret_val;
 }
 
-/* return 0 means link status changed, -1 means not changed */
+/*
+ * If @timeout_ms was 0, it means that it will not return until link complete.
+ * It returns 1 on complete, return 0 on timeout.
+ */
+static int
+ixgbe_dev_wait_setup_link_complete(struct rte_eth_dev *dev, uint32_t timeout_ms)
+{
+#define WARNING_TIMEOUT    9000 /* 9s  in total */
+       struct ixgbe_adapter *ad = dev->data->dev_private;
+       uint32_t timeout = timeout_ms ? timeout_ms : WARNING_TIMEOUT;
+
+       while (rte_atomic32_read(&ad->link_thread_running)) {
+               msec_delay(1);
+               timeout--;
+
+               if (timeout_ms) {
+                       if (!timeout)
+                               return 0;
+               } else if (!timeout) {
+                       /* It will not return until link complete */
+                       timeout = WARNING_TIMEOUT;
+                       PMD_DRV_LOG(ERR, "IXGBE link thread not complete too long time!");
+               }
+       }
+
+       return 1;
+}
+
+static void *
+ixgbe_dev_setup_link_thread_handler(void *param)
+{
+       struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
+       struct ixgbe_adapter *ad = dev->data->dev_private;
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct ixgbe_interrupt *intr =
+               IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+       u32 speed;
+       bool autoneg = false;
+
+       pthread_detach(pthread_self());
+       speed = hw->phy.autoneg_advertised;
+       if (!speed)
+               ixgbe_get_link_capabilities(hw, &speed, &autoneg);
+
+       ixgbe_setup_link(hw, speed, true);
+
+       intr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG;
+       rte_atomic32_clear(&ad->link_thread_running);
+       return NULL;
+}
+
+/*
+ * In freebsd environment, nic_uio drivers do not support interrupts,
+ * rte_intr_callback_register() will fail to register interrupts.
+ * We can not make link status to change from down to up by interrupt
+ * callback. So we need to wait for the controller to acquire link
+ * when ports start.
+ * It returns 0 on link up.
+ */
 static int
+ixgbe_wait_for_link_up(struct ixgbe_hw *hw)
+{
+#ifdef RTE_EXEC_ENV_FREEBSD
+       int err, i;
+       bool link_up = false;
+       uint32_t speed = 0;
+       const int nb_iter = 25;
+
+       for (i = 0; i < nb_iter; i++) {
+               err = ixgbe_check_link(hw, &speed, &link_up, 0);
+               if (err)
+                       return err;
+               if (link_up)
+                       return 0;
+               msec_delay(200);
+       }
+
+       return 0;
+#else
+       RTE_SET_USED(hw);
+       return 0;
+#endif
+}
+
+/* return 0 means link status changed, -1 means not changed */
+int
 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;
+       struct ixgbe_adapter *ad = dev->data->dev_private;
+       struct rte_eth_link link;
        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;
+       bool link_up;
        int diag;
-       u32 speed = 0;
        int wait = 1;
-       bool autoneg = false;
+       u32 esdp_reg;
 
-       link.link_status = ETH_LINK_DOWN;
-       link.link_speed = 0;
-       link.link_duplex = ETH_LINK_HALF_DUPLEX;
-       memset(&old, 0, sizeof(old));
-       rte_ixgbe_dev_atomic_read_link_status(dev, &old);
+       memset(&link, 0, sizeof(link));
+       link.link_status = RTE_ETH_LINK_DOWN;
+       link.link_speed = RTE_ETH_SPEED_NUM_NONE;
+       link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
+       link.link_autoneg = !(dev->data->dev_conf.link_speeds &
+                       RTE_ETH_LINK_SPEED_FIXED);
 
        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);
-       }
+       if (intr->flags & IXGBE_FLAG_NEED_LINK_CONFIG)
+               return rte_eth_linkstatus_set(dev, &link);
 
        /* 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)
                wait = 0;
 
+/* BSD has no interrupt mechanism, so force NIC status synchronization. */
+#ifdef RTE_EXEC_ENV_FREEBSD
+       wait = 1;
+#endif
+
        if (vf)
                diag = ixgbevf_check_link(hw, &link_speed, &link_up, wait);
        else
                diag = ixgbe_check_link(hw, &link_speed, &link_up, wait);
 
        if (diag != 0) {
-               link.link_speed = ETH_SPEED_NUM_100M;
-               link.link_duplex = ETH_LINK_FULL_DUPLEX;
-               rte_ixgbe_dev_atomic_write_link_status(dev, &link);
-               if (link.link_status == old.link_status)
-                       return -1;
-               return 0;
+               link.link_speed = RTE_ETH_SPEED_NUM_100M;
+               link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
+               return rte_eth_linkstatus_set(dev, &link);
+       }
+
+       if (ixgbe_get_media_type(hw) == ixgbe_media_type_fiber) {
+               esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP);
+               if ((esdp_reg & IXGBE_ESDP_SDP3))
+                       link_up = 0;
        }
 
        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;
+               if (ixgbe_get_media_type(hw) == ixgbe_media_type_fiber) {
+                       ixgbe_dev_wait_setup_link_complete(dev, 0);
+                       if (rte_atomic32_test_and_set(&ad->link_thread_running)) {
+                               /* To avoid race condition between threads, set
+                                * the IXGBE_FLAG_NEED_LINK_CONFIG flag only
+                                * when there is no link thread running.
+                                */
+                               intr->flags |= IXGBE_FLAG_NEED_LINK_CONFIG;
+                               if (rte_ctrl_thread_create(&ad->link_thread_tid,
+                                       "ixgbe-link-handler",
+                                       NULL,
+                                       ixgbe_dev_setup_link_thread_handler,
+                                       dev) < 0) {
+                                       PMD_DRV_LOG(ERR,
+                                               "Create link thread failed!");
+                                       rte_atomic32_clear(&ad->link_thread_running);
+                               }
+                       } else {
+                               PMD_DRV_LOG(ERR,
+                                       "Other link thread is running now!");
+                       }
+               }
+               return rte_eth_linkstatus_set(dev, &link);
        }
-       intr->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG;
-       link.link_status = ETH_LINK_UP;
-       link.link_duplex = ETH_LINK_FULL_DUPLEX;
+
+       link.link_status = RTE_ETH_LINK_UP;
+       link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
 
        switch (link_speed) {
        default:
        case IXGBE_LINK_SPEED_UNKNOWN:
-               link.link_duplex = ETH_LINK_FULL_DUPLEX;
-               link.link_speed = ETH_SPEED_NUM_100M;
+               link.link_speed = RTE_ETH_SPEED_NUM_UNKNOWN;
+               break;
+
+       case IXGBE_LINK_SPEED_10_FULL:
+               link.link_speed = RTE_ETH_SPEED_NUM_10M;
                break;
 
        case IXGBE_LINK_SPEED_100_FULL:
-               link.link_speed = ETH_SPEED_NUM_100M;
+               link.link_speed = RTE_ETH_SPEED_NUM_100M;
                break;
 
        case IXGBE_LINK_SPEED_1GB_FULL:
-               link.link_speed = ETH_SPEED_NUM_1G;
+               link.link_speed = RTE_ETH_SPEED_NUM_1G;
+               break;
+
+       case IXGBE_LINK_SPEED_2_5GB_FULL:
+               link.link_speed = RTE_ETH_SPEED_NUM_2_5G;
+               break;
+
+       case IXGBE_LINK_SPEED_5GB_FULL:
+               link.link_speed = RTE_ETH_SPEED_NUM_5G;
                break;
 
        case IXGBE_LINK_SPEED_10GB_FULL:
-               link.link_speed = ETH_SPEED_NUM_10G;
+               link.link_speed = RTE_ETH_SPEED_NUM_10G;
                break;
        }
-       rte_ixgbe_dev_atomic_write_link_status(dev, &link);
-
-       if (link.link_status == old.link_status)
-               return -1;
 
-       return 0;
+       return rte_eth_linkstatus_set(dev, &link);
 }
 
 static int
@@ -3980,7 +4317,7 @@ 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
+static int
 ixgbe_dev_promiscuous_enable(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -3989,9 +4326,11 @@ ixgbe_dev_promiscuous_enable(struct rte_eth_dev *dev)
        fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
        fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
        IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
+
+       return 0;
 }
 
-static void
+static int
 ixgbe_dev_promiscuous_disable(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -4004,9 +4343,11 @@ ixgbe_dev_promiscuous_disable(struct rte_eth_dev *dev)
        else
                fctrl &= (~IXGBE_FCTRL_MPE);
        IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
+
+       return 0;
 }
 
-static void
+static int
 ixgbe_dev_allmulticast_enable(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -4015,20 +4356,24 @@ ixgbe_dev_allmulticast_enable(struct rte_eth_dev *dev)
        fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
        fctrl |= IXGBE_FCTRL_MPE;
        IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
+
+       return 0;
 }
 
-static void
+static int
 ixgbe_dev_allmulticast_disable(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        uint32_t fctrl;
 
        if (dev->data->promiscuous == 1)
-               return; /* must remain in all_multicast mode */
+               return 0; /* must remain in all_multicast mode */
 
        fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
        fctrl &= (~IXGBE_FCTRL_MPE);
        IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
+
+       return 0;
 }
 
 /**
@@ -4037,19 +4382,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;
 }
@@ -4159,13 +4509,13 @@ ixgbe_dev_link_status_print(struct rte_eth_dev *dev)
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_eth_link link;
 
-       memset(&link, 0, sizeof(link));
-       rte_ixgbe_dev_atomic_read_link_status(dev, &link);
+       rte_eth_linkstatus_get(dev, &link);
+
        if (link.link_status) {
                PMD_INIT_LOG(INFO, "Port %d: Link Up - speed %u Mbps - %s",
                                        (int)(dev->data->port_id),
                                        (unsigned)link.link_speed,
-                       link.link_duplex == ETH_LINK_FULL_DUPLEX ?
+                       link.link_duplex == RTE_ETH_LINK_FULL_DUPLEX ?
                                        "full-duplex" : "half-duplex");
        } else {
                PMD_INIT_LOG(INFO, " Port %d: Link Down",
@@ -4189,13 +4539,11 @@ ixgbe_dev_link_status_print(struct rte_eth_dev *dev)
  *  - On failure, a negative value.
  */
 static int
-ixgbe_dev_interrupt_action(struct rte_eth_dev *dev,
-                          struct rte_intr_handle *intr_handle)
+ixgbe_dev_interrupt_action(struct rte_eth_dev *dev)
 {
        struct ixgbe_interrupt *intr =
                IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
        int64_t timeout;
-       struct rte_eth_link link;
        struct ixgbe_hw *hw =
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
@@ -4212,9 +4560,10 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev,
        }
 
        if (intr->flags & IXGBE_FLAG_NEED_LINK_UPDATE) {
+               struct rte_eth_link link;
+
                /* get the link status before link update, for predicting later */
-               memset(&link, 0, sizeof(link));
-               rte_ixgbe_dev_atomic_read_link_status(dev, &link);
+               rte_eth_linkstatus_get(dev, &link);
 
                ixgbe_dev_link_update(dev, 0);
 
@@ -4241,7 +4590,6 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev,
 
        PMD_DRV_LOG(DEBUG, "enable intr immediately");
        ixgbe_enable_intr(dev);
-       rte_intr_enable(intr_handle);
 
        return 0;
 }
@@ -4265,7 +4613,7 @@ ixgbe_dev_interrupt_delayed_handler(void *param)
 {
        struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
-       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+       struct rte_intr_handle *intr_handle = pci_dev->intr_handle;
        struct ixgbe_interrupt *intr =
                IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
        struct ixgbe_hw *hw =
@@ -4287,13 +4635,11 @@ 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, NULL);
+               rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
        }
 
        if (intr->flags & IXGBE_FLAG_MACSEC) {
-               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_MACSEC,
-                                             NULL, NULL);
+               rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_MACSEC, NULL);
                intr->flags &= ~IXGBE_FLAG_MACSEC;
        }
 
@@ -4303,7 +4649,7 @@ ixgbe_dev_interrupt_delayed_handler(void *param)
 
        PMD_DRV_LOG(DEBUG, "enable intr in delayed handler S[%08x]", eicr);
        ixgbe_enable_intr(dev);
-       rte_intr_enable(intr_handle);
+       rte_intr_ack(intr_handle);
 }
 
 /**
@@ -4324,7 +4670,7 @@ 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, dev->intr_handle);
+       ixgbe_dev_interrupt_action(dev);
 }
 
 static int
@@ -4367,6 +4713,11 @@ ixgbe_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
         * MFLCN register.
         */
        mflcn_reg = IXGBE_READ_REG(hw, IXGBE_MFLCN);
+       if (mflcn_reg & IXGBE_MFLCN_PMCF)
+               fc_conf->mac_ctrl_frame_fwd = 1;
+       else
+               fc_conf->mac_ctrl_frame_fwd = 0;
+
        if (mflcn_reg & (IXGBE_MFLCN_RPFCE | IXGBE_MFLCN_RFCE))
                rx_pause = 1;
        else
@@ -4383,13 +4734,13 @@ ixgbe_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
                tx_pause = 0;
 
        if (rx_pause && tx_pause)
-               fc_conf->mode = RTE_FC_FULL;
+               fc_conf->mode = RTE_ETH_FC_FULL;
        else if (rx_pause)
-               fc_conf->mode = RTE_FC_RX_PAUSE;
+               fc_conf->mode = RTE_ETH_FC_RX_PAUSE;
        else if (tx_pause)
-               fc_conf->mode = RTE_FC_TX_PAUSE;
+               fc_conf->mode = RTE_ETH_FC_TX_PAUSE;
        else
-               fc_conf->mode = RTE_FC_NONE;
+               fc_conf->mode = RTE_ETH_FC_NONE;
 
        return 0;
 }
@@ -4398,10 +4749,10 @@ static int
 ixgbe_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
 {
        struct ixgbe_hw *hw;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
        int err;
        uint32_t rx_buf_size;
        uint32_t max_high_water;
-       uint32_t mflcn;
        enum ixgbe_fc_mode rte_fcmode_2_ixgbe_fcmode[] = {
                ixgbe_fc_none,
                ixgbe_fc_rx_pause,
@@ -4419,7 +4770,8 @@ ixgbe_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
         * At least reserve one Ethernet frame for watermark
         * high_water/low_water in kilo bytes for ixgbe
         */
-       max_high_water = (rx_buf_size - ETHER_MAX_LEN) >> IXGBE_RXPBSIZE_SHIFT;
+       max_high_water = (rx_buf_size -
+                       RTE_ETHER_MAX_LEN) >> IXGBE_RXPBSIZE_SHIFT;
        if ((fc_conf->high_water > max_high_water) ||
                (fc_conf->high_water < fc_conf->low_water)) {
                PMD_INIT_LOG(ERR, "Invalid high/low water setup value in KB");
@@ -4433,31 +4785,14 @@ ixgbe_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
        hw->fc.low_water[0]   = fc_conf->low_water;
        hw->fc.send_xon       = fc_conf->send_xon;
        hw->fc.disable_fc_autoneg = !fc_conf->autoneg;
+       adapter->mac_ctrl_frame_fwd = fc_conf->mac_ctrl_frame_fwd;
 
-       err = ixgbe_fc_enable(hw);
-
-       /* Not negotiated is not an error case */
-       if ((err == IXGBE_SUCCESS) || (err == IXGBE_ERR_FC_NOT_NEGOTIATED)) {
-
-               /* check if we want to forward MAC frames - driver doesn't have native
-                * capability to do that, so we'll write the registers ourselves */
-
-               mflcn = IXGBE_READ_REG(hw, IXGBE_MFLCN);
-
-               /* set or clear MFLCN.PMCF bit depending on configuration */
-               if (fc_conf->mac_ctrl_frame_fwd != 0)
-                       mflcn |= IXGBE_MFLCN_PMCF;
-               else
-                       mflcn &= ~IXGBE_MFLCN_PMCF;
-
-               IXGBE_WRITE_REG(hw, IXGBE_MFLCN, mflcn);
-               IXGBE_WRITE_FLUSH(hw);
-
-               return 0;
+       err = ixgbe_flow_ctrl_enable(dev, hw);
+       if (err < 0) {
+               PMD_INIT_LOG(ERR, "ixgbe_flow_ctrl_enable = 0x%x", err);
+               return -EIO;
        }
-
-       PMD_INIT_LOG(ERR, "ixgbe_fc_enable = 0x%x", err);
-       return -EIO;
+       return err;
 }
 
 /**
@@ -4640,7 +4975,8 @@ ixgbe_priority_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_pfc_conf *p
         * At least reserve one Ethernet frame for watermark
         * high_water/low_water in kilo bytes for ixgbe
         */
-       max_high_water = (rx_buf_size - ETHER_MAX_LEN) >> IXGBE_RXPBSIZE_SHIFT;
+       max_high_water = (rx_buf_size -
+                       RTE_ETHER_MAX_LEN) >> IXGBE_RXPBSIZE_SHIFT;
        if ((pfc_conf->fc.high_water > max_high_water) ||
            (pfc_conf->fc.high_water <= pfc_conf->fc.low_water)) {
                PMD_INIT_LOG(ERR, "Invalid high/low water setup value in KB");
@@ -4673,11 +5009,20 @@ ixgbe_dev_rss_reta_update(struct rte_eth_dev *dev,
        uint8_t j, mask;
        uint32_t reta, r;
        uint16_t idx, shift;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
+       struct rte_eth_dev_data *dev_data = dev->data;
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        uint32_t reta_reg;
 
        PMD_INIT_FUNC_TRACE();
 
+       if (!dev_data->dev_started) {
+               PMD_DRV_LOG(ERR,
+                       "port %d must be started before rss reta update",
+                        dev_data->port_id);
+               return -EIO;
+       }
+
        if (!ixgbe_rss_update_sp(hw->mac.type)) {
                PMD_DRV_LOG(ERR, "RSS reta update is not supported on this "
                        "NIC.");
@@ -4693,8 +5038,8 @@ ixgbe_dev_rss_reta_update(struct rte_eth_dev *dev,
        }
 
        for (i = 0; i < reta_size; i += IXGBE_4_BIT_WIDTH) {
-               idx = i / RTE_RETA_GROUP_SIZE;
-               shift = i % RTE_RETA_GROUP_SIZE;
+               idx = i / RTE_ETH_RETA_GROUP_SIZE;
+               shift = i % RTE_ETH_RETA_GROUP_SIZE;
                mask = (uint8_t)((reta_conf[idx].mask >> shift) &
                                                IXGBE_4_BIT_MASK);
                if (!mask)
@@ -4714,6 +5059,7 @@ ixgbe_dev_rss_reta_update(struct rte_eth_dev *dev,
                }
                IXGBE_WRITE_REG(hw, reta_reg, reta);
        }
+       adapter->rss_reta_updated = 1;
 
        return 0;
 }
@@ -4740,8 +5086,8 @@ ixgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
        }
 
        for (i = 0; i < reta_size; i += IXGBE_4_BIT_WIDTH) {
-               idx = i / RTE_RETA_GROUP_SIZE;
-               shift = i % RTE_RETA_GROUP_SIZE;
+               idx = i / RTE_ETH_RETA_GROUP_SIZE;
+               shift = i % RTE_ETH_RETA_GROUP_SIZE;
                mask = (uint8_t)((reta_conf[idx].mask >> shift) &
                                                IXGBE_4_BIT_MASK);
                if (!mask)
@@ -4761,7 +5107,7 @@ ixgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
 }
 
 static int
-ixgbe_add_rar(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
+ixgbe_add_rar(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,
                                uint32_t index, uint32_t pool)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -4779,14 +5125,15 @@ ixgbe_remove_rar(struct rte_eth_dev *dev, uint32_t index)
        ixgbe_clear_rar(hw, index);
 }
 
-static void
-ixgbe_set_default_mac_addr(struct rte_eth_dev *dev, struct ether_addr *addr)
+static int
+ixgbe_set_default_mac_addr(struct rte_eth_dev *dev, struct rte_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, pci_dev->max_vfs);
+
+       return 0;
 }
 
 static bool
@@ -4811,21 +5158,23 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        uint32_t maxfrs;
        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;
+       uint32_t frame_size = mtu + IXGBE_ETH_OVERHEAD;
+       int ret;
 
-       ixgbe_dev_info_get(dev, &dev_info);
+       ret = ixgbe_dev_info_get(dev, &dev_info);
+       if (ret != 0)
+               return ret;
 
        /* check that mtu is within the allowed range */
-       if ((mtu < ETHER_MIN_MTU) || (frame_size > dev_info.max_rx_pktlen))
+       if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen)
                return -EINVAL;
 
        /* If device is started, refuse mtu that requires the support of
         * scattered packets when this feature has not been enabled before.
         */
-       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)) {
+       if (dev->data->dev_started && !dev->data->scattered_rx &&
+           frame_size + 2 * RTE_VLAN_HLEN >
+                       dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) {
                PMD_INIT_LOG(ERR, "Stop port first.");
                return -EINVAL;
        }
@@ -4834,21 +5183,15 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
 
        /* switch to jumbo mode if needed */
-       if (frame_size > ETHER_MAX_LEN) {
-               dev->data->dev_conf.rxmode.jumbo_frame = 1;
+       if (mtu > RTE_ETHER_MTU)
                hlreg0 |= IXGBE_HLREG0_JUMBOEN;
-       } else {
-               dev->data->dev_conf.rxmode.jumbo_frame = 0;
+       else
                hlreg0 &= ~IXGBE_HLREG0_JUMBOEN;
-       }
        IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
 
-       /* update max frame size */
-       dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
-
        maxfrs = IXGBE_READ_REG(hw, IXGBE_MAXFRS);
        maxfrs &= 0x0000FFFF;
-       maxfrs |= (dev->data->dev_conf.rxmode.max_rx_pkt_len << 16);
+       maxfrs |= (frame_size << 16);
        IXGBE_WRITE_REG(hw, IXGBE_MAXFRS, maxfrs);
 
        return 0;
@@ -4858,19 +5201,32 @@ ixgbe_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
  * Virtual Function operations
  */
 static void
-ixgbevf_intr_disable(struct ixgbe_hw *hw)
+ixgbevf_intr_disable(struct rte_eth_dev *dev)
 {
+       struct ixgbe_interrupt *intr =
+               IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+       struct ixgbe_hw *hw =
+               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
        PMD_INIT_FUNC_TRACE();
 
        /* Clear interrupt mask to stop from interrupts being generated */
        IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, IXGBE_VF_IRQ_CLEAR_MASK);
 
        IXGBE_WRITE_FLUSH(hw);
+
+       /* Clear mask value. */
+       intr->mask = 0;
 }
 
 static void
-ixgbevf_intr_enable(struct ixgbe_hw *hw)
+ixgbevf_intr_enable(struct rte_eth_dev *dev)
 {
+       struct ixgbe_interrupt *intr =
+               IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+       struct ixgbe_hw *hw =
+               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
        PMD_INIT_FUNC_TRACE();
 
        /* VF enable interrupt autoclean */
@@ -4879,31 +5235,36 @@ ixgbevf_intr_enable(struct ixgbe_hw *hw)
        IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, IXGBE_VF_IRQ_ENABLE_MASK);
 
        IXGBE_WRITE_FLUSH(hw);
+
+       /* Save IXGBE_VTEIMS value to mask. */
+       intr->mask = IXGBE_VF_IRQ_ENABLE_MASK;
 }
 
 static int
 ixgbevf_dev_configure(struct rte_eth_dev *dev)
 {
        struct rte_eth_conf *conf = &dev->data->dev_conf;
-       struct ixgbe_adapter *adapter =
-                       (struct ixgbe_adapter *)dev->data->dev_private;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
 
        PMD_INIT_LOG(DEBUG, "Configured Virtual Function port id: %d",
                     dev->data->port_id);
 
+       if (dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG)
+               dev->data->dev_conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_RSS_HASH;
+
        /*
         * VF has no ability to enable/disable HW CRC
         * Keep the persistent behavior the same as Host PF
         */
 #ifndef RTE_LIBRTE_IXGBE_PF_DISABLE_STRIP_CRC
-       if (!conf->rxmode.hw_strip_crc) {
+       if (conf->rxmode.offloads & RTE_ETH_RX_OFFLOAD_KEEP_CRC) {
                PMD_INIT_LOG(NOTICE, "VF can't disable HW CRC Strip");
-               conf->rxmode.hw_strip_crc = 1;
+               conf->rxmode.offloads &= ~RTE_ETH_RX_OFFLOAD_KEEP_CRC;
        }
 #else
-       if (conf->rxmode.hw_strip_crc) {
+       if (!(conf->rxmode.offloads & RTE_ETH_RX_OFFLOAD_KEEP_CRC)) {
                PMD_INIT_LOG(NOTICE, "VF can't enable HW CRC Strip");
-               conf->rxmode.hw_strip_crc = 0;
+               conf->rxmode.offloads |= RTE_ETH_RX_OFFLOAD_KEEP_CRC;
        }
 #endif
 
@@ -4924,13 +5285,26 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
                IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        uint32_t intr_vector = 0;
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
-       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+       struct rte_intr_handle *intr_handle = pci_dev->intr_handle;
 
        int err, mask = 0;
 
        PMD_INIT_FUNC_TRACE();
 
-       hw->mac.ops.reset_hw(hw);
+       /* Stop the link setup handler before resetting the HW. */
+       ixgbe_dev_wait_setup_link_complete(dev, 0);
+
+       err = hw->mac.ops.reset_hw(hw);
+
+       /**
+        * In this case, reuses the MAC address assigned by VF
+        * initialization.
+        */
+       if (err != IXGBE_SUCCESS && err != IXGBE_ERR_INVALID_MAC_ADDR) {
+               PMD_INIT_LOG(ERR, "Unable to reset vf hardware (%d)", err);
+               return err;
+       }
+
        hw->mac.get_link_status = true;
 
        /* negotiate mailbox API version to use with the PF. */
@@ -4950,50 +5324,84 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
        ixgbevf_set_vfta_all(dev, 1);
 
        /* Set HW strip */
-       mask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK |
-               ETH_VLAN_EXTEND_MASK;
-       ixgbevf_vlan_offload_set(dev, mask);
+       mask = RTE_ETH_VLAN_STRIP_MASK | RTE_ETH_VLAN_FILTER_MASK |
+               RTE_ETH_VLAN_EXTEND_MASK;
+       err = ixgbevf_vlan_offload_config(dev, mask);
+       if (err) {
+               PMD_INIT_LOG(ERR, "Unable to set VLAN offload (%d)", err);
+               ixgbe_dev_clear_queues(dev);
+               return err;
+       }
 
        ixgbevf_dev_rxtx_start(dev);
 
        /* check and configure queue intr-vector mapping */
-       if (dev->data->dev_conf.intr_conf.rxq != 0) {
-               intr_vector = dev->data->nb_rx_queues;
-               if (rte_intr_efd_enable(intr_handle, intr_vector))
+       if (rte_intr_cap_multiple(intr_handle) &&
+           dev->data->dev_conf.intr_conf.rxq) {
+               /* 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)) {
+                       ixgbe_dev_clear_queues(dev);
                        return -1;
+               }
        }
 
-       if (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {
-               intr_handle->intr_vec =
-                       rte_zmalloc("intr_vec",
-                                   dev->data->nb_rx_queues * sizeof(int), 0);
-               if (intr_handle->intr_vec == NULL) {
+       if (rte_intr_dp_is_en(intr_handle)) {
+               if (rte_intr_vec_list_alloc(intr_handle, "intr_vec",
+                                                  dev->data->nb_rx_queues)) {
                        PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
                                     " intr_vec", dev->data->nb_rx_queues);
+                       ixgbe_dev_clear_queues(dev);
                        return -ENOMEM;
                }
        }
        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 */
-       ixgbevf_intr_enable(hw);
+       ixgbevf_intr_enable(dev);
+
+       /*
+        * Update link status right before return, because it may
+        * start link configuration process in a separate thread.
+        */
+       ixgbevf_dev_link_update(dev, 0);
+
+       hw->adapter_stopped = false;
 
        return 0;
 }
 
-static void
+static int
 ixgbevf_dev_stop(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct ixgbe_adapter *adapter = 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;
+       struct rte_intr_handle *intr_handle = pci_dev->intr_handle;
+
+       if (hw->adapter_stopped)
+               return 0;
 
        PMD_INIT_FUNC_TRACE();
 
-       ixgbevf_intr_disable(hw);
+       ixgbe_dev_wait_setup_link_complete(dev, 0);
+
+       ixgbevf_intr_disable(dev);
 
+       dev->data->dev_started = 0;
        hw->adapter_stopped = 1;
        ixgbe_stop_adapter(hw);
 
@@ -5010,22 +5418,28 @@ ixgbevf_dev_stop(struct rte_eth_dev *dev)
 
        /* Clean datapath event and queue/vec mapping */
        rte_intr_efd_disable(intr_handle);
-       if (intr_handle->intr_vec != NULL) {
-               rte_free(intr_handle->intr_vec);
-               intr_handle->intr_vec = NULL;
-       }
+       rte_intr_vec_list_free(intr_handle);
+
+       adapter->rss_reta_updated = 0;
+
+       return 0;
 }
 
-static void
+static int
 ixgbevf_dev_close(struct rte_eth_dev *dev)
 {
        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;
+       int ret;
 
        PMD_INIT_FUNC_TRACE();
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return 0;
 
        ixgbe_reset_hw(hw);
 
-       ixgbevf_dev_stop(dev);
+       ret = ixgbevf_dev_stop(dev);
 
        ixgbe_dev_free_queues(dev);
 
@@ -5035,6 +5449,29 @@ ixgbevf_dev_close(struct rte_eth_dev *dev)
         * after stop, close and detach of the VF
         **/
        ixgbevf_remove_mac_addr(dev, 0);
+
+       rte_intr_disable(intr_handle);
+       rte_intr_callback_unregister(intr_handle,
+                                    ixgbevf_dev_interrupt_handler, dev);
+
+       return ret;
+}
+
+/*
+ * 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)
@@ -5112,21 +5549,33 @@ ixgbevf_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue, int on)
        ixgbe_vlan_hw_strip_bitmap_set(dev, queue, on);
 }
 
-static void
-ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask)
+static int
+ixgbevf_vlan_offload_config(struct rte_eth_dev *dev, int mask)
 {
-       struct ixgbe_hw *hw =
-               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct ixgbe_rx_queue *rxq;
        uint16_t i;
        int on = 0;
 
        /* VF function only support hw strip feature, others are not support */
-       if (mask & ETH_VLAN_STRIP_MASK) {
-               on = !!(dev->data->dev_conf.rxmode.hw_vlan_strip);
-
-               for (i = 0; i < hw->mac.max_rx_queues; i++)
+       if (mask & RTE_ETH_VLAN_STRIP_MASK) {
+               for (i = 0; i < dev->data->nb_rx_queues; i++) {
+                       rxq = dev->data->rx_queues[i];
+                       on = !!(rxq->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP);
                        ixgbevf_vlan_strip_queue_set(dev, i, on);
+               }
        }
+
+       return 0;
+}
+
+static int
+ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask)
+{
+       ixgbe_config_vlan_strip_on_all_queues(dev, mask);
+
+       ixgbevf_vlan_offload_config(dev, mask);
+
+       return 0;
 }
 
 int
@@ -5145,7 +5594,7 @@ ixgbe_vt_check(struct ixgbe_hw *hw)
 }
 
 static uint32_t
-ixgbe_uta_vector(struct ixgbe_hw *hw, struct ether_addr *uc_addr)
+ixgbe_uta_vector(struct ixgbe_hw *hw, struct rte_ether_addr *uc_addr)
 {
        uint32_t vector = 0;
 
@@ -5176,8 +5625,8 @@ ixgbe_uta_vector(struct ixgbe_hw *hw, struct ether_addr *uc_addr)
 }
 
 static int
-ixgbe_uc_hash_table_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
-                       uint8_t on)
+ixgbe_uc_hash_table_set(struct rte_eth_dev *dev,
+                       struct rte_ether_addr *mac_addr, uint8_t on)
 {
        uint32_t vector;
        uint32_t uta_idx;
@@ -5242,12 +5691,12 @@ ixgbe_uc_all_hash_table_set(struct rte_eth_dev *dev, uint8_t on)
                return -ENOTSUP;
 
        if (on) {
-               for (i = 0; i < ETH_VMDQ_NUM_UC_HASH_ARRAY; i++) {
+               for (i = 0; i < RTE_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++) {
+               for (i = 0; i < RTE_ETH_VMDQ_NUM_UC_HASH_ARRAY; i++) {
                        uta_info->uta_shadow[i] = 0;
                        IXGBE_WRITE_REG(hw, IXGBE_UTA(i), 0);
                }
@@ -5261,217 +5710,38 @@ 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)
+       if (rx_mask & RTE_ETH_VMDQ_ACCEPT_UNTAG)
                new_val |= IXGBE_VMOLR_AUPE;
-       if (rx_mask & ETH_VMDQ_ACCEPT_HASH_MC)
+       if (rx_mask & RTE_ETH_VMDQ_ACCEPT_HASH_MC)
                new_val |= IXGBE_VMOLR_ROMPE;
-       if (rx_mask & ETH_VMDQ_ACCEPT_HASH_UC)
+       if (rx_mask & RTE_ETH_VMDQ_ACCEPT_HASH_UC)
                new_val |= IXGBE_VMOLR_ROPE;
-       if (rx_mask & ETH_VMDQ_ACCEPT_BROADCAST)
+       if (rx_mask & RTE_ETH_VMDQ_ACCEPT_BROADCAST)
                new_val |= IXGBE_VMOLR_BAM;
-       if (rx_mask & ETH_VMDQ_ACCEPT_MULTICAST)
+       if (rx_mask & RTE_ETH_VMDQ_ACCEPT_MULTICAST)
                new_val |= IXGBE_VMOLR_MPE;
 
        return new_val;
 }
 
-#define IXGBE_MRCTL_VPME  0x01 /* Virtual Pool Mirroring. */
-#define IXGBE_MRCTL_UPME  0x02 /* Uplink Port Mirroring. */
-#define IXGBE_MRCTL_DPME  0x04 /* Downlink Port Mirroring. */
-#define IXGBE_MRCTL_VLME  0x08 /* VLAN Mirroring. */
-#define IXGBE_INVALID_MIRROR_TYPE(mirror_type) \
-       ((mirror_type) & ~(uint8_t)(ETH_MIRROR_VIRTUAL_POOL_UP | \
-       ETH_MIRROR_UPLINK_PORT | ETH_MIRROR_DOWNLINK_PORT | ETH_MIRROR_VLAN))
-
-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)
-{
-       uint32_t mr_ctl, vlvf;
-       uint32_t mp_lsb = 0;
-       uint32_t mv_msb = 0;
-       uint32_t mv_lsb = 0;
-       uint32_t mp_msb = 0;
-       uint8_t i = 0;
-       int reg_index = 0;
-       uint64_t vlan_mask = 0;
-
-       const uint8_t pool_mask_offset = 32;
-       const uint8_t vlan_mask_offset = 32;
-       const uint8_t dst_pool_offset = 8;
-       const uint8_t rule_mr_offset  = 4;
-       const uint8_t mirror_rule_mask = 0x0F;
-
-       struct ixgbe_mirror_info *mr_info =
-                       (IXGBE_DEV_PRIVATE_TO_PFDATA(dev->data->dev_private));
-       struct ixgbe_hw *hw =
-               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       uint8_t mirror_type = 0;
-
-       if (ixgbe_vt_check(hw) < 0)
-               return -ENOTSUP;
-
-       if (rule_id >= IXGBE_MAX_MIRROR_RULES)
-               return -EINVAL;
-
-       if (IXGBE_INVALID_MIRROR_TYPE(mirror_conf->rule_type)) {
-               PMD_DRV_LOG(ERR, "unsupported mirror type 0x%x.",
-                           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
-                */
-               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);
-                               if (reg_index < 0)
-                                       return -EINVAL;
-                               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]))
-                                       vlan_mask |= (1ULL << reg_index);
-                               else
-                                       return -EINVAL;
-                       }
-               }
-
-               if (on) {
-                       mv_lsb = vlan_mask & 0xFFFFFFFF;
-                       mv_msb = vlan_mask >> vlan_mask_offset;
-
-                       mr_info->mr_conf[rule_id].vlan.vlan_mask =
-                                               mirror_conf->vlan.vlan_mask;
-                       for (i = 0; i < ETH_VMDQ_MAX_VLAN_FILTERS; i++) {
-                               if (mirror_conf->vlan.vlan_mask & (1ULL << i))
-                                       mr_info->mr_conf[rule_id].vlan.vlan_id[i] =
-                                               mirror_conf->vlan.vlan_id[i];
-                       }
-               } else {
-                       mv_lsb = 0;
-                       mv_msb = 0;
-                       mr_info->mr_conf[rule_id].vlan.vlan_mask = 0;
-                       for (i = 0; i < ETH_VMDQ_MAX_VLAN_FILTERS; i++)
-                               mr_info->mr_conf[rule_id].vlan.vlan_id[i] = 0;
-               }
-       }
-
-       /**
-        * if enable pool mirror, write related pool mask register,if disable
-        * pool mirror, clear PFMRVM register
-        */
-       if (mirror_conf->rule_type & ETH_MIRROR_VIRTUAL_POOL_UP) {
-               mirror_type |= IXGBE_MRCTL_VPME;
-               if (on) {
-                       mp_lsb = mirror_conf->pool_mask & 0xFFFFFFFF;
-                       mp_msb = mirror_conf->pool_mask >> pool_mask_offset;
-                       mr_info->mr_conf[rule_id].pool_mask =
-                                       mirror_conf->pool_mask;
-
-               } else {
-                       mp_lsb = 0;
-                       mp_msb = 0;
-                       mr_info->mr_conf[rule_id].pool_mask = 0;
-               }
-       }
-       if (mirror_conf->rule_type & ETH_MIRROR_UPLINK_PORT)
-               mirror_type |= IXGBE_MRCTL_UPME;
-       if (mirror_conf->rule_type & ETH_MIRROR_DOWNLINK_PORT)
-               mirror_type |= IXGBE_MRCTL_DPME;
-
-       /* read  mirror control register and recalculate it */
-       mr_ctl = IXGBE_READ_REG(hw, IXGBE_MRCTL(rule_id));
-
-       if (on) {
-               mr_ctl |= mirror_type;
-               mr_ctl &= mirror_rule_mask;
-               mr_ctl |= mirror_conf->dst_pool << dst_pool_offset;
-       } 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;
-
-       /* write mirrror control  register */
-       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) {
-               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) {
-               IXGBE_WRITE_REG(hw, IXGBE_VMRVLAN(rule_id), mv_lsb);
-               IXGBE_WRITE_REG(hw, IXGBE_VMRVLAN(rule_id + rule_mr_offset),
-                               mv_msb);
-       }
-
-       return 0;
-}
-
-static int
-ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
-{
-       int mr_ctl = 0;
-       uint32_t lsb_val = 0;
-       uint32_t msb_val = 0;
-       const uint8_t rule_mr_offset = 4;
-
-       struct ixgbe_hw *hw =
-               IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ixgbe_mirror_info *mr_info =
-               (IXGBE_DEV_PRIVATE_TO_PFDATA(dev->data->dev_private));
-
-       if (ixgbe_vt_check(hw) < 0)
-               return -ENOTSUP;
-
-       memset(&mr_info->mr_conf[rule_id], 0,
-              sizeof(struct rte_eth_mirror_conf));
-
-       /* clear PFVMCTL register */
-       IXGBE_WRITE_REG(hw, IXGBE_MRCTL(rule_id), mr_ctl);
-
-       /* clear pool mask register */
-       IXGBE_WRITE_REG(hw, IXGBE_VMRVM(rule_id), lsb_val);
-       IXGBE_WRITE_REG(hw, IXGBE_VMRVM(rule_id + rule_mr_offset), msb_val);
-
-       /* clear vlan mask register */
-       IXGBE_WRITE_REG(hw, IXGBE_VMRVLAN(rule_id), lsb_val);
-       IXGBE_WRITE_REG(hw, IXGBE_VMRVLAN(rule_id + rule_mr_offset), msb_val);
-
-       return 0;
-}
-
 static int
 ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
        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 rte_intr_handle *intr_handle = pci_dev->intr_handle;
+       struct ixgbe_interrupt *intr =
+               IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
        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;
+       intr->mask |= (1 << vec);
        RTE_SET_USED(queue_id);
-       IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
+       IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, intr->mask);
 
-       rte_intr_enable(intr_handle);
+       rte_intr_ack(intr_handle);
 
        return 0;
 }
@@ -5479,14 +5749,19 @@ ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 static int
 ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
-       uint32_t mask;
+       struct ixgbe_interrupt *intr =
+               IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
        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;
+       intr->mask &= ~(1 << vec);
        RTE_SET_USED(queue_id);
-       IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
+       IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, intr->mask);
 
        return 0;
 }
@@ -5495,7 +5770,7 @@ static int
 ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
-       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+       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);
@@ -5515,7 +5790,7 @@ ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
                mask &= (1 << (queue_id - 32));
                IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
        }
-       rte_intr_enable(intr_handle);
+       rte_intr_ack(intr_handle);
 
        return 0;
 }
@@ -5597,7 +5872,9 @@ 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) ||
+                       (hw->mac.type == ixgbe_mac_X550EM_x)) {
                if (direction == -1) {
                        /* other causes */
                        idx = ((queue & 1) * 8);
@@ -5620,11 +5897,12 @@ static void
 ixgbevf_configure_msix(struct rte_eth_dev *dev)
 {
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
-       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+       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);
@@ -5635,14 +5913,30 @@ 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,
                 * as IXGBE_VF_MAXMSIVECOTR = 1
                 */
                ixgbevf_set_ivar_map(hw, 0, q_idx, vector_idx);
-               intr_handle->intr_vec[q_idx] = vector_idx;
+               rte_intr_vec_list_index_set(intr_handle, q_idx,
+                                                  vector_idx);
+               if (vector_idx < base + rte_intr_nb_efd_get(intr_handle)
+                   - 1)
+                       vector_idx++;
        }
+
+       /* As RX queue setting above show, all queues use the vector 0.
+        * Set only the ITR value of IXGBE_MISC_VEC_ID.
+        */
+       IXGBE_WRITE_REG(hw, IXGBE_VTEITR(IXGBE_MISC_VEC_ID),
+                       IXGBE_EITR_INTERVAL_US(IXGBE_QUEUE_ITR_INTERVAL_DEFAULT)
+                       | IXGBE_EITR_CNT_WDIS);
 }
 
 /**
@@ -5654,7 +5948,7 @@ static void
 ixgbe_configure_msix(struct rte_eth_dev *dev)
 {
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
-       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+       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 queue_id, base = IXGBE_MISC_VEC_ID;
@@ -5664,8 +5958,12 @@ ixgbe_configure_msix(struct rte_eth_dev *dev)
 
        /* won't configure msix register if no mapping is done
         * between intr vector and event fd
+        * but if misx has been enabled already, need to configure
+        * auto clean, auto mask and throttling.
         */
-       if (!rte_intr_dp_is_en(intr_handle))
+       gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
+       if (!rte_intr_dp_is_en(intr_handle) &&
+           !(gpie & (IXGBE_GPIE_MSIX_MODE | IXGBE_GPIE_PBA_SUPPORT)))
                return;
 
        if (rte_intr_allow_others(intr_handle))
@@ -5689,29 +5987,37 @@ ixgbe_configure_msix(struct rte_eth_dev *dev)
        /* Populate the IVAR table and set the ITR values to the
         * corresponding register.
         */
-       for (queue_id = 0; queue_id < dev->data->nb_rx_queues;
-            queue_id++) {
-               /* by default, 1:1 mapping */
-               ixgbe_set_ivar_map(hw, 0, queue_id, vec);
-               intr_handle->intr_vec[queue_id] = vec;
-               if (vec < base + intr_handle->nb_efd - 1)
-                       vec++;
-       }
+       if (rte_intr_dp_is_en(intr_handle)) {
+               for (queue_id = 0; queue_id < dev->data->nb_rx_queues;
+                       queue_id++) {
+                       /* by default, 1:1 mapping */
+                       ixgbe_set_ivar_map(hw, 0, queue_id, vec);
+                       rte_intr_vec_list_index_set(intr_handle,
+                                                          queue_id, vec);
+                       if (vec < base + rte_intr_nb_efd_get(intr_handle)
+                           - 1)
+                               vec++;
+               }
 
-       switch (hw->mac.type) {
-       case ixgbe_mac_82598EB:
-               ixgbe_set_ivar_map(hw, -1, IXGBE_IVAR_OTHER_CAUSES_INDEX,
-                                  IXGBE_MISC_VEC_ID);
-               break;
-       case ixgbe_mac_82599EB:
-       case ixgbe_mac_X540:
-               ixgbe_set_ivar_map(hw, -1, 1, IXGBE_MISC_VEC_ID);
-               break;
-       default:
-               break;
+               switch (hw->mac.type) {
+               case ixgbe_mac_82598EB:
+                       ixgbe_set_ivar_map(hw, -1,
+                                          IXGBE_IVAR_OTHER_CAUSES_INDEX,
+                                          IXGBE_MISC_VEC_ID);
+                       break;
+               case ixgbe_mac_82599EB:
+               case ixgbe_mac_X540:
+               case ixgbe_mac_X550:
+               case ixgbe_mac_X550EM_x:
+                       ixgbe_set_ivar_map(hw, -1, 1, IXGBE_MISC_VEC_ID);
+                       break;
+               default:
+                       break;
+               }
        }
        IXGBE_WRITE_REG(hw, IXGBE_EITR(IXGBE_MISC_VEC_ID),
-                       IXGBE_MIN_INTER_INTERRUPT_INTERVAL_DEFAULT & 0xFFF);
+                       IXGBE_EITR_INTERVAL_US(IXGBE_QUEUE_ITR_INTERVAL_DEFAULT)
+                       | IXGBE_EITR_CNT_WDIS);
 
        /* set up to autoclear timer, and the vectors */
        mask = IXGBE_EIMS_ENABLE_MASK;
@@ -5722,8 +6028,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;
@@ -5752,14 +6059,10 @@ static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
         * register. MMW_SIZE=0x014 if 9728-byte jumbo is supported, otherwise
         * set as 0x4.
         */
-       if ((dev->data->dev_conf.rxmode.jumbo_frame == 1) &&
-               (dev->data->dev_conf.rxmode.max_rx_pkt_len >=
-                               IXGBE_MAX_JUMBO_FRAME_SIZE))
-               IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRM,
-                       IXGBE_MMW_SIZE_JUMBO_FRAME);
+       if (dev->data->mtu + IXGBE_ETH_OVERHEAD >= IXGBE_MAX_JUMBO_FRAME_SIZE)
+               IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRM, IXGBE_MMW_SIZE_JUMBO_FRAME);
        else
-               IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRM,
-                       IXGBE_MMW_SIZE_DEFAULT);
+               IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRM, IXGBE_MMW_SIZE_DEFAULT);
 
        /* Set RTTBCNRC of queue X */
        IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, queue_idx);
@@ -5770,9 +6073,9 @@ static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
 }
 
 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)
+ixgbevf_add_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,
+                    __rte_unused uint32_t index,
+                    __rte_unused uint32_t pool)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        int diag;
@@ -5782,19 +6085,14 @@ ixgbevf_add_mac_addr(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
         * operation. Trap this case to avoid exhausting the [very limited]
         * set of PF resources used to store VF MAC addresses.
         */
-       if (memcmp(hw->mac.perm_addr, mac_addr, sizeof(struct ether_addr)) == 0)
+       if (memcmp(hw->mac.perm_addr, mac_addr,
+                       sizeof(struct rte_ether_addr)) == 0)
                return -1;
        diag = ixgbevf_set_uc_addr_vf(hw, 2, mac_addr->addr_bytes);
        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);
+                           RTE_ETHER_ADDR_PRT_FMT " - diag=%d",
+                           RTE_ETHER_ADDR_BYTES(mac_addr), diag);
        return diag;
 }
 
@@ -5802,8 +6100,9 @@ static void
 ixgbevf_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ether_addr *perm_addr = (struct ether_addr *) hw->mac.perm_addr;
-       struct ether_addr *mac_addr;
+       struct rte_ether_addr *perm_addr =
+               (struct rte_ether_addr *)hw->mac.perm_addr;
+       struct rte_ether_addr *mac_addr;
        uint32_t i;
        int diag;
 
@@ -5825,33 +6124,31 @@ ixgbevf_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index)
                if (i == index)
                        continue;
                /* Skip NULL MAC addresses */
-               if (is_zero_ether_addr(mac_addr))
+               if (rte_is_zero_ether_addr(mac_addr))
                        continue;
                /* Skip the permanent MAC address */
-               if (memcmp(perm_addr, mac_addr, sizeof(struct ether_addr)) == 0)
+               if (memcmp(perm_addr, mac_addr,
+                               sizeof(struct rte_ether_addr)) == 0)
                        continue;
                diag = ixgbevf_set_uc_addr_vf(hw, 2, mac_addr->addr_bytes);
                if (diag != 0)
                        PMD_DRV_LOG(ERR,
                                    "Adding again MAC address "
-                                   "%02x:%02x:%02x:%02x:%02x:%02x failed "
-                                   "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],
+                                    RTE_ETHER_ADDR_PRT_FMT " failed "
+                                   "diag=%d", RTE_ETHER_ADDR_BYTES(mac_addr),
                                    diag);
        }
 }
 
-static void
-ixgbevf_set_default_mac_addr(struct rte_eth_dev *dev, struct ether_addr *addr)
+static int
+ixgbevf_set_default_mac_addr(struct rte_eth_dev *dev,
+                       struct rte_ether_addr *addr)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
        hw->mac.ops.set_rar(hw, 0, (void *)addr, 0, 0);
+
+       return 0;
 }
 
 int
@@ -5893,64 +6190,6 @@ ixgbe_syn_filter_set(struct rte_eth_dev *dev,
        return 0;
 }
 
-static int
-ixgbe_syn_filter_get(struct rte_eth_dev *dev,
-                       struct rte_eth_syn_filter *filter)
-{
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       uint32_t synqf = IXGBE_READ_REG(hw, IXGBE_SYNQF);
-
-       if (synqf & IXGBE_SYN_FILTER_ENABLE) {
-               filter->hig_pri = (synqf & IXGBE_SYN_FILTER_SYNQFP) ? 1 : 0;
-               filter->queue = (uint16_t)((synqf & IXGBE_SYN_FILTER_QUEUE) >> 1);
-               return 0;
-       }
-       return -ENOENT;
-}
-
-static int
-ixgbe_syn_filter_handle(struct rte_eth_dev *dev,
-                       enum rte_filter_op filter_op,
-                       void *arg)
-{
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       int ret;
-
-       MAC_TYPE_FILTER_SUP(hw->mac.type);
-
-       if (filter_op == RTE_ETH_FILTER_NOP)
-               return 0;
-
-       if (arg == NULL) {
-               PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u",
-                           filter_op);
-               return -EINVAL;
-       }
-
-       switch (filter_op) {
-       case RTE_ETH_FILTER_ADD:
-               ret = ixgbe_syn_filter_set(dev,
-                               (struct rte_eth_syn_filter *)arg,
-                               TRUE);
-               break;
-       case RTE_ETH_FILTER_DELETE:
-               ret = ixgbe_syn_filter_set(dev,
-                               (struct rte_eth_syn_filter *)arg,
-                               FALSE);
-               break;
-       case RTE_ETH_FILTER_GET:
-               ret = ixgbe_syn_filter_get(dev,
-                               (struct rte_eth_syn_filter *)arg);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "unsupported operation %u", filter_op);
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
 
 static inline enum ixgbe_5tuple_protocol
 convert_protocol_type(uint8_t protocol_value)
@@ -6090,21 +6329,23 @@ static int
 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;
+       uint32_t max_frame = mtu + IXGBE_ETH_OVERHEAD;
+       struct rte_eth_dev_data *dev_data = dev->data;
 
        hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
-       if ((mtu < ETHER_MIN_MTU) || (max_frame > ETHER_MAX_JUMBO_FRAME_LEN))
+       if (mtu < RTE_ETHER_MIN_MTU || max_frame > RTE_ETHER_MAX_JUMBO_FRAME_LEN)
                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 (!rx_conf->enable_scatter &&
-           (max_frame + 2 * IXGBE_VLAN_TAG_SIZE >
-            dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM))
+       if (dev_data->dev_started && !dev_data->scattered_rx &&
+           (max_frame + 2 * RTE_VLAN_HLEN >
+                       dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM)) {
+               PMD_INIT_LOG(ERR, "Stop port first.");
                return -EINVAL;
+       }
 
        /*
         * When supported by the underlying PF driver, use the IXGBE_VF_SET_MTU
@@ -6115,10 +6356,9 @@ ixgbevf_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
         * prior to 3.11.33 which contains the following change:
         * "ixgbe: Enable jumbo frames support w/ SR-IOV"
         */
-       ixgbevf_rlpml_set_vf(hw, max_frame);
+       if (ixgbevf_rlpml_set_vf(hw, max_frame))
+               return -EINVAL;
 
-       /* update max frame size */
-       dev->data->dev_conf.rxmode.max_rx_pkt_len = max_frame;
        return 0;
 }
 
@@ -6266,7 +6506,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;
@@ -6281,99 +6521,6 @@ ixgbe_add_del_ntuple_filter(struct rte_eth_dev *dev,
        return 0;
 }
 
-/*
- * get a ntuple filter
- *
- * @param
- * dev: Pointer to struct rte_eth_dev.
- * ntuple_filter: Pointer to struct rte_eth_ntuple_filter
- *
- * @return
- *    - On success, zero.
- *    - On failure, a negative value.
- */
-static int
-ixgbe_get_ntuple_filter(struct rte_eth_dev *dev,
-                       struct rte_eth_ntuple_filter *ntuple_filter)
-{
-       struct ixgbe_filter_info *filter_info =
-               IXGBE_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);
-       struct ixgbe_5tuple_filter_info filter_5tuple;
-       struct ixgbe_5tuple_filter *filter;
-       int ret;
-
-       if (ntuple_filter->flags != RTE_5TUPLE_FLAGS) {
-               PMD_DRV_LOG(ERR, "only 5tuple is supported.");
-               return -EINVAL;
-       }
-
-       memset(&filter_5tuple, 0, sizeof(struct ixgbe_5tuple_filter_info));
-       ret = ntuple_filter_to_5tuple(ntuple_filter, &filter_5tuple);
-       if (ret < 0)
-               return ret;
-
-       filter = ixgbe_5tuple_filter_lookup(&filter_info->fivetuple_list,
-                                        &filter_5tuple);
-       if (filter == NULL) {
-               PMD_DRV_LOG(ERR, "filter doesn't exist.");
-               return -ENOENT;
-       }
-       ntuple_filter->queue = filter->queue;
-       return 0;
-}
-
-/*
- * ixgbe_ntuple_filter_handle - Handle operations for ntuple filter.
- * @dev: pointer to rte_eth_dev structure
- * @filter_op:operation will be taken.
- * @arg: a pointer to specific structure corresponding to the filter_op
- *
- * @return
- *    - On success, zero.
- *    - On failure, a negative value.
- */
-static int
-ixgbe_ntuple_filter_handle(struct rte_eth_dev *dev,
-                               enum rte_filter_op filter_op,
-                               void *arg)
-{
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       int ret;
-
-       MAC_TYPE_FILTER_SUP_EXT(hw->mac.type);
-
-       if (filter_op == RTE_ETH_FILTER_NOP)
-               return 0;
-
-       if (arg == NULL) {
-               PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u.",
-                           filter_op);
-               return -EINVAL;
-       }
-
-       switch (filter_op) {
-       case RTE_ETH_FILTER_ADD:
-               ret = ixgbe_add_del_ntuple_filter(dev,
-                       (struct rte_eth_ntuple_filter *)arg,
-                       TRUE);
-               break;
-       case RTE_ETH_FILTER_DELETE:
-               ret = ixgbe_add_del_ntuple_filter(dev,
-                       (struct rte_eth_ntuple_filter *)arg,
-                       FALSE);
-               break;
-       case RTE_ETH_FILTER_GET:
-               ret = ixgbe_get_ntuple_filter(dev,
-                       (struct rte_eth_ntuple_filter *)arg);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "unsupported operation %u.", filter_op);
-               ret = -EINVAL;
-               break;
-       }
-       return ret;
-}
-
 int
 ixgbe_add_del_ethertype_filter(struct rte_eth_dev *dev,
                        struct rte_eth_ethertype_filter *filter,
@@ -6390,8 +6537,8 @@ ixgbe_add_del_ethertype_filter(struct rte_eth_dev *dev,
        if (filter->queue >= IXGBE_MAX_RX_QUEUE_NUM)
                return -EINVAL;
 
-       if (filter->ether_type == ETHER_TYPE_IPv4 ||
-               filter->ether_type == ETHER_TYPE_IPv6) {
+       if (filter->ether_type == RTE_ETHER_TYPE_IPV4 ||
+               filter->ether_type == RTE_ETHER_TYPE_IPV6) {
                PMD_DRV_LOG(ERR, "unsupported ether_type(0x%04x) in"
                        " ethertype filter.", filter->ether_type);
                return -EINVAL;
@@ -6449,136 +6596,28 @@ ixgbe_add_del_ethertype_filter(struct rte_eth_dev *dev,
 }
 
 static int
-ixgbe_get_ethertype_filter(struct rte_eth_dev *dev,
-                       struct rte_eth_ethertype_filter *filter)
-{
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ixgbe_filter_info *filter_info =
-               IXGBE_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);
-       uint32_t etqf, etqs;
-       int ret;
-
-       ret = ixgbe_ethertype_filter_lookup(filter_info, filter->ether_type);
-       if (ret < 0) {
-               PMD_DRV_LOG(ERR, "ethertype (0x%04x) filter doesn't exist.",
-                           filter->ether_type);
-               return -ENOENT;
-       }
-
-       etqf = IXGBE_READ_REG(hw, IXGBE_ETQF(ret));
-       if (etqf & IXGBE_ETQF_FILTER_EN) {
-               etqs = IXGBE_READ_REG(hw, IXGBE_ETQS(ret));
-               filter->ether_type = etqf & IXGBE_ETQF_ETHERTYPE;
-               filter->flags = 0;
-               filter->queue = (etqs & IXGBE_ETQS_RX_QUEUE) >>
-                              IXGBE_ETQS_RX_QUEUE_SHIFT;
-               return 0;
-       }
-       return -ENOENT;
-}
-
-/*
- * ixgbe_ethertype_filter_handle - Handle operations for ethertype filter.
- * @dev: pointer to rte_eth_dev structure
- * @filter_op:operation will be taken.
- * @arg: a pointer to specific structure corresponding to the filter_op
- */
-static int
-ixgbe_ethertype_filter_handle(struct rte_eth_dev *dev,
-                               enum rte_filter_op filter_op,
-                               void *arg)
-{
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       int ret;
-
-       MAC_TYPE_FILTER_SUP(hw->mac.type);
-
-       if (filter_op == RTE_ETH_FILTER_NOP)
-               return 0;
-
-       if (arg == NULL) {
-               PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u.",
-                           filter_op);
-               return -EINVAL;
-       }
-
-       switch (filter_op) {
-       case RTE_ETH_FILTER_ADD:
-               ret = ixgbe_add_del_ethertype_filter(dev,
-                       (struct rte_eth_ethertype_filter *)arg,
-                       TRUE);
-               break;
-       case RTE_ETH_FILTER_DELETE:
-               ret = ixgbe_add_del_ethertype_filter(dev,
-                       (struct rte_eth_ethertype_filter *)arg,
-                       FALSE);
-               break;
-       case RTE_ETH_FILTER_GET:
-               ret = ixgbe_get_ethertype_filter(dev,
-                       (struct rte_eth_ethertype_filter *)arg);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "unsupported operation %u.", filter_op);
-               ret = -EINVAL;
-               break;
-       }
-       return ret;
-}
-
-static int
-ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev,
-                    enum rte_filter_type filter_type,
-                    enum rte_filter_op filter_op,
-                    void *arg)
+ixgbe_dev_flow_ops_get(__rte_unused struct rte_eth_dev *dev,
+                      const struct rte_flow_ops **ops)
 {
-       int ret = 0;
-
-       switch (filter_type) {
-       case RTE_ETH_FILTER_NTUPLE:
-               ret = ixgbe_ntuple_filter_handle(dev, filter_op, arg);
-               break;
-       case RTE_ETH_FILTER_ETHERTYPE:
-               ret = ixgbe_ethertype_filter_handle(dev, filter_op, arg);
-               break;
-       case RTE_ETH_FILTER_SYN:
-               ret = ixgbe_syn_filter_handle(dev, filter_op, arg);
-               break;
-       case RTE_ETH_FILTER_FDIR:
-               ret = ixgbe_fdir_ctrl_func(dev, filter_op, arg);
-               break;
-       case RTE_ETH_FILTER_L2_TUNNEL:
-               ret = ixgbe_dev_l2_tunnel_filter_handle(dev, filter_op, arg);
-               break;
-       case RTE_ETH_FILTER_GENERIC:
-               if (filter_op != RTE_ETH_FILTER_GET)
-                       return -EINVAL;
-               *(const void **)arg = &ixgbe_flow_ops;
-               break;
-       default:
-               PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
-                                                       filter_type);
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
+       *ops = &ixgbe_flow_ops;
+       return 0;
 }
 
 static u8 *
-ixgbe_dev_addr_list_itr(__attribute__((unused)) struct ixgbe_hw *hw,
+ixgbe_dev_addr_list_itr(__rte_unused struct ixgbe_hw *hw,
                        u8 **mc_addr_ptr, u32 *vmdq)
 {
        u8 *mc_addr;
 
        *vmdq = 0;
        mc_addr = *mc_addr_ptr;
-       *mc_addr_ptr = (mc_addr + sizeof(struct ether_addr));
+       *mc_addr_ptr = (mc_addr + sizeof(struct rte_ether_addr));
        return mc_addr;
 }
 
 static int
 ixgbe_dev_set_mc_addr_list(struct rte_eth_dev *dev,
-                         struct ether_addr *mc_addr_set,
+                         struct rte_ether_addr *mc_addr_set,
                          uint32_t nb_mc_addr)
 {
        struct ixgbe_hw *hw;
@@ -6668,27 +6707,25 @@ static void
 ixgbe_start_timecounters(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ixgbe_adapter *adapter =
-               (struct ixgbe_adapter *)dev->data->dev_private;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
        struct rte_eth_link link;
        uint32_t incval = 0;
        uint32_t shift = 0;
 
        /* Get current link speed. */
-       memset(&link, 0, sizeof(link));
        ixgbe_dev_link_update(dev, 1);
-       rte_ixgbe_dev_atomic_read_link_status(dev, &link);
+       rte_eth_linkstatus_get(dev, &link);
 
        switch (link.link_speed) {
-       case ETH_SPEED_NUM_100M:
+       case RTE_ETH_SPEED_NUM_100M:
                incval = IXGBE_INCVAL_100;
                shift = IXGBE_INCVAL_SHIFT_100;
                break;
-       case ETH_SPEED_NUM_1G:
+       case RTE_ETH_SPEED_NUM_1G:
                incval = IXGBE_INCVAL_1GB;
                shift = IXGBE_INCVAL_SHIFT_1GB;
                break;
-       case ETH_SPEED_NUM_10G:
+       case RTE_ETH_SPEED_NUM_10G:
        default:
                incval = IXGBE_INCVAL_10GB;
                shift = IXGBE_INCVAL_SHIFT_10GB;
@@ -6738,8 +6775,7 @@ ixgbe_start_timecounters(struct rte_eth_dev *dev)
 static int
 ixgbe_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta)
 {
-       struct ixgbe_adapter *adapter =
-                       (struct ixgbe_adapter *)dev->data->dev_private;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
 
        adapter->systime_tc.nsec += delta;
        adapter->rx_tstamp_tc.nsec += delta;
@@ -6752,8 +6788,7 @@ static int
 ixgbe_timesync_write_time(struct rte_eth_dev *dev, const struct timespec *ts)
 {
        uint64_t ns;
-       struct ixgbe_adapter *adapter =
-                       (struct ixgbe_adapter *)dev->data->dev_private;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
 
        ns = rte_timespec_to_ns(ts);
        /* Set the timecounters to a new value. */
@@ -6768,8 +6803,7 @@ static int
 ixgbe_timesync_read_time(struct rte_eth_dev *dev, struct timespec *ts)
 {
        uint64_t ns, systime_cycles;
-       struct ixgbe_adapter *adapter =
-                       (struct ixgbe_adapter *)dev->data->dev_private;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
 
        systime_cycles = ixgbe_read_systime_cyclecounter(dev);
        ns = rte_timecounter_update(&adapter->systime_tc, systime_cycles);
@@ -6800,7 +6834,7 @@ ixgbe_timesync_enable(struct rte_eth_dev *dev)
 
        /* Enable L2 filtering of IEEE1588/802.1AS Ethernet frame types. */
        IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_1588),
-                       (ETHER_TYPE_1588 |
+                       (RTE_ETHER_TYPE_1588 |
                         IXGBE_ETQF_FILTER_EN |
                         IXGBE_ETQF_1588));
 
@@ -6850,8 +6884,7 @@ ixgbe_timesync_read_rx_timestamp(struct rte_eth_dev *dev,
                                 uint32_t flags __rte_unused)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ixgbe_adapter *adapter =
-               (struct ixgbe_adapter *)dev->data->dev_private;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
        uint32_t tsync_rxctl;
        uint64_t rx_tstamp_cycles;
        uint64_t ns;
@@ -6872,8 +6905,7 @@ ixgbe_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
                                 struct timespec *timestamp)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ixgbe_adapter *adapter =
-               (struct ixgbe_adapter *)dev->data->dev_private;
+       struct ixgbe_adapter *adapter = dev->data->dev_private;
        uint32_t tsync_txctl;
        uint64_t tx_tstamp_cycles;
        uint64_t ns;
@@ -7029,19 +7061,91 @@ ixgbe_set_eeprom(struct rte_eth_dev *dev,
        return eeprom->ops.write_buffer(hw,  first, length, data);
 }
 
+static int
+ixgbe_get_module_info(struct rte_eth_dev *dev,
+                     struct rte_eth_dev_module_info *modinfo)
+{
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       uint32_t status;
+       uint8_t sff8472_rev, addr_mode;
+       bool page_swap = false;
+
+       /* Check whether we support SFF-8472 or not */
+       status = hw->phy.ops.read_i2c_eeprom(hw,
+                                            IXGBE_SFF_SFF_8472_COMP,
+                                            &sff8472_rev);
+       if (status != 0)
+               return -EIO;
+
+       /* addressing mode is not supported */
+       status = hw->phy.ops.read_i2c_eeprom(hw,
+                                            IXGBE_SFF_SFF_8472_SWAP,
+                                            &addr_mode);
+       if (status != 0)
+               return -EIO;
+
+       if (addr_mode & IXGBE_SFF_ADDRESSING_MODE) {
+               PMD_DRV_LOG(ERR,
+                           "Address change required to access page 0xA2, "
+                           "but not supported. Please report the module "
+                           "type to the driver maintainers.");
+               page_swap = true;
+       }
+
+       if (sff8472_rev == IXGBE_SFF_SFF_8472_UNSUP || page_swap) {
+               /* We have a SFP, but it does not support SFF-8472 */
+               modinfo->type = RTE_ETH_MODULE_SFF_8079;
+               modinfo->eeprom_len = RTE_ETH_MODULE_SFF_8079_LEN;
+       } else {
+               /* We have a SFP which supports a revision of SFF-8472. */
+               modinfo->type = RTE_ETH_MODULE_SFF_8472;
+               modinfo->eeprom_len = RTE_ETH_MODULE_SFF_8472_LEN;
+       }
+
+       return 0;
+}
+
+static int
+ixgbe_get_module_eeprom(struct rte_eth_dev *dev,
+                       struct rte_dev_eeprom_info *info)
+{
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       uint32_t status = IXGBE_ERR_PHY_ADDR_INVALID;
+       uint8_t databyte = 0xFF;
+       uint8_t *data = info->data;
+       uint32_t i = 0;
+
+       for (i = info->offset; i < info->offset + info->length; i++) {
+               if (i < RTE_ETH_MODULE_SFF_8079_LEN)
+                       status = hw->phy.ops.read_i2c_eeprom(hw, i, &databyte);
+               else
+                       status = hw->phy.ops.read_i2c_sff8472(hw, i, &databyte);
+
+               if (status != 0)
+                       return -EIO;
+
+               data[i - info->offset] = databyte;
+       }
+
+       return 0;
+}
+
 uint16_t
 ixgbe_reta_size_get(enum ixgbe_mac_type mac_type) {
        switch (mac_type) {
        case ixgbe_mac_X550:
        case ixgbe_mac_X550EM_x:
        case ixgbe_mac_X550EM_a:
-               return ETH_RSS_RETA_SIZE_512;
+               return RTE_ETH_RSS_RETA_SIZE_512;
        case ixgbe_mac_X550_vf:
        case ixgbe_mac_X550EM_x_vf:
        case ixgbe_mac_X550EM_a_vf:
-               return ETH_RSS_RETA_SIZE_64;
+               return RTE_ETH_RSS_RETA_SIZE_64;
+       case ixgbe_mac_X540_vf:
+       case ixgbe_mac_82599_vf:
+               return 0;
        default:
-               return ETH_RSS_RETA_SIZE_128;
+               return RTE_ETH_RSS_RETA_SIZE_128;
        }
 }
 
@@ -7051,10 +7155,10 @@ ixgbe_reta_reg_get(enum ixgbe_mac_type mac_type, uint16_t reta_idx) {
        case ixgbe_mac_X550:
        case ixgbe_mac_X550EM_x:
        case ixgbe_mac_X550EM_a:
-               if (reta_idx < ETH_RSS_RETA_SIZE_128)
+               if (reta_idx < RTE_ETH_RSS_RETA_SIZE_128)
                        return IXGBE_RETA(reta_idx >> 2);
                else
-                       return IXGBE_ERETA((reta_idx - ETH_RSS_RETA_SIZE_128) >> 2);
+                       return IXGBE_ERETA((reta_idx - RTE_ETH_RSS_RETA_SIZE_128) >> 2);
        case ixgbe_mac_X550_vf:
        case ixgbe_mac_X550EM_x_vf:
        case ixgbe_mac_X550EM_a_vf:
@@ -7106,34 +7210,48 @@ 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)
+       if (dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_DCB_FLAG)
                dcb_info->nb_tcs = dcb_config->num_tcs.pg_tcs;
        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++)
+               for (i = 0; i < RTE_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*/
                struct rte_eth_dcb_rx_conf *rx_conf =
                                &dev->data->dev_conf.rx_adv_conf.dcb_rx_conf;
-               for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++)
+               for (i = 0; i < RTE_ETH_DCB_NUM_USER_PRIORITIES; i++)
                        dcb_info->prio_tc[i] = rx_conf->dcb_tc[i];
-               if (dcb_info->nb_tcs == ETH_4_TCS) {
+               if (dcb_info->nb_tcs == RTE_ETH_4_TCS) {
                        for (i = 0; i < dcb_info->nb_tcs; i++) {
                                dcb_info->tc_queue.tc_rxq[0][i].base = i * 32;
                                dcb_info->tc_queue.tc_rxq[0][i].nb_queue = 16;
@@ -7146,7 +7264,7 @@ ixgbe_dev_get_dcb_info(struct rte_eth_dev *dev,
                        dcb_info->tc_queue.tc_txq[0][1].nb_queue = 32;
                        dcb_info->tc_queue.tc_txq[0][2].nb_queue = 16;
                        dcb_info->tc_queue.tc_txq[0][3].nb_queue = 16;
-               } else if (dcb_info->nb_tcs == ETH_8_TCS) {
+               } else if (dcb_info->nb_tcs == RTE_ETH_8_TCS) {
                        for (i = 0; i < dcb_info->nb_tcs; i++) {
                                dcb_info->tc_queue.tc_rxq[0][i].base = i * 16;
                                dcb_info->tc_queue.tc_rxq[0][i].nb_queue = 16;
@@ -7198,33 +7316,6 @@ ixgbe_update_e_tag_eth_type(struct ixgbe_hw *hw,
        return 0;
 }
 
-/* Config l2 tunnel ether type */
-static int
-ixgbe_dev_l2_tunnel_eth_type_conf(struct rte_eth_dev *dev,
-                                 struct rte_eth_l2_tunnel_conf *l2_tunnel)
-{
-       int ret = 0;
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ixgbe_l2_tn_info *l2_tn_info =
-               IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(dev->data->dev_private);
-
-       if (l2_tunnel == NULL)
-               return -EINVAL;
-
-       switch (l2_tunnel->l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
-               l2_tn_info->e_tag_ether_type = l2_tunnel->ether_type;
-               ret = ixgbe_update_e_tag_eth_type(hw, l2_tunnel->ether_type);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "Invalid tunnel type");
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
 /* Enable e-tag tunnel */
 static int
 ixgbe_e_tag_enable(struct ixgbe_hw *hw)
@@ -7245,118 +7336,50 @@ ixgbe_e_tag_enable(struct ixgbe_hw *hw)
        return 0;
 }
 
-/* Enable l2 tunnel */
 static int
-ixgbe_dev_l2_tunnel_enable(struct rte_eth_dev *dev,
-                          enum rte_eth_tunnel_type l2_tunnel_type)
+ixgbe_e_tag_filter_del(struct rte_eth_dev *dev,
+                      struct ixgbe_l2_tunnel_conf *l2_tunnel)
 {
        int ret = 0;
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ixgbe_l2_tn_info *l2_tn_info =
-               IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(dev->data->dev_private);
+       uint32_t i, rar_entries;
+       uint32_t rar_low, rar_high;
 
-       switch (l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
-               l2_tn_info->e_tag_en = TRUE;
-               ret = ixgbe_e_tag_enable(hw);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "Invalid tunnel type");
-               ret = -EINVAL;
-               break;
+       if (hw->mac.type != ixgbe_mac_X550 &&
+           hw->mac.type != ixgbe_mac_X550EM_x &&
+           hw->mac.type != ixgbe_mac_X550EM_a) {
+               return -ENOTSUP;
+       }
+
+       rar_entries = ixgbe_get_num_rx_addrs(hw);
+
+       for (i = 1; i < rar_entries; i++) {
+               rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(i));
+               rar_low  = IXGBE_READ_REG(hw, IXGBE_RAL(i));
+               if ((rar_high & IXGBE_RAH_AV) &&
+                   (rar_high & IXGBE_RAH_ADTYPE) &&
+                   ((rar_low & IXGBE_RAL_ETAG_FILTER_MASK) ==
+                    l2_tunnel->tunnel_id)) {
+                       IXGBE_WRITE_REG(hw, IXGBE_RAL(i), 0);
+                       IXGBE_WRITE_REG(hw, IXGBE_RAH(i), 0);
+
+                       ixgbe_clear_vmdq(hw, i, IXGBE_CLEAR_VMDQ_ALL);
+
+                       return ret;
+               }
        }
 
        return ret;
 }
 
-/* Disable e-tag tunnel */
 static int
-ixgbe_e_tag_disable(struct ixgbe_hw *hw)
+ixgbe_e_tag_filter_add(struct rte_eth_dev *dev,
+                      struct ixgbe_l2_tunnel_conf *l2_tunnel)
 {
-       uint32_t etag_etype;
-
-       if (hw->mac.type != ixgbe_mac_X550 &&
-           hw->mac.type != ixgbe_mac_X550EM_x &&
-           hw->mac.type != ixgbe_mac_X550EM_a) {
-               return -ENOTSUP;
-       }
-
-       etag_etype = IXGBE_READ_REG(hw, IXGBE_ETAG_ETYPE);
-       etag_etype &= ~IXGBE_ETAG_ETYPE_VALID;
-       IXGBE_WRITE_REG(hw, IXGBE_ETAG_ETYPE, etag_etype);
-       IXGBE_WRITE_FLUSH(hw);
-
-       return 0;
-}
-
-/* Disable l2 tunnel */
-static int
-ixgbe_dev_l2_tunnel_disable(struct rte_eth_dev *dev,
-                           enum rte_eth_tunnel_type l2_tunnel_type)
-{
-       int ret = 0;
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ixgbe_l2_tn_info *l2_tn_info =
-               IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(dev->data->dev_private);
-
-       switch (l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
-               l2_tn_info->e_tag_en = FALSE;
-               ret = ixgbe_e_tag_disable(hw);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "Invalid tunnel type");
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
-static int
-ixgbe_e_tag_filter_del(struct rte_eth_dev *dev,
-                      struct rte_eth_l2_tunnel_conf *l2_tunnel)
-{
-       int ret = 0;
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       uint32_t i, rar_entries;
-       uint32_t rar_low, rar_high;
-
-       if (hw->mac.type != ixgbe_mac_X550 &&
-           hw->mac.type != ixgbe_mac_X550EM_x &&
-           hw->mac.type != ixgbe_mac_X550EM_a) {
-               return -ENOTSUP;
-       }
-
-       rar_entries = ixgbe_get_num_rx_addrs(hw);
-
-       for (i = 1; i < rar_entries; i++) {
-               rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(i));
-               rar_low  = IXGBE_READ_REG(hw, IXGBE_RAL(i));
-               if ((rar_high & IXGBE_RAH_AV) &&
-                   (rar_high & IXGBE_RAH_ADTYPE) &&
-                   ((rar_low & IXGBE_RAL_ETAG_FILTER_MASK) ==
-                    l2_tunnel->tunnel_id)) {
-                       IXGBE_WRITE_REG(hw, IXGBE_RAL(i), 0);
-                       IXGBE_WRITE_REG(hw, IXGBE_RAH(i), 0);
-
-                       ixgbe_clear_vmdq(hw, i, IXGBE_CLEAR_VMDQ_ALL);
-
-                       return ret;
-               }
-       }
-
-       return ret;
-}
-
-static int
-ixgbe_e_tag_filter_add(struct rte_eth_dev *dev,
-                      struct rte_eth_l2_tunnel_conf *l2_tunnel)
-{
-       int ret = 0;
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       uint32_t i, rar_entries;
-       uint32_t rar_low, rar_high;
+       int ret = 0;
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       uint32_t i, rar_entries;
+       uint32_t rar_low, rar_high;
 
        if (hw->mac.type != ixgbe_mac_X550 &&
            hw->mac.type != ixgbe_mac_X550EM_x &&
@@ -7455,7 +7478,7 @@ ixgbe_remove_l2_tn_filter(struct ixgbe_l2_tn_info *l2_tn_info,
 /* Add l2 tunnel filter */
 int
 ixgbe_dev_l2_tunnel_filter_add(struct rte_eth_dev *dev,
-                              struct rte_eth_l2_tunnel_conf *l2_tunnel,
+                              struct ixgbe_l2_tunnel_conf *l2_tunnel,
                               bool restore)
 {
        int ret;
@@ -7482,7 +7505,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;
@@ -7494,7 +7517,7 @@ ixgbe_dev_l2_tunnel_filter_add(struct rte_eth_dev *dev,
        }
 
        switch (l2_tunnel->l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
+       case RTE_ETH_L2_TUNNEL_TYPE_E_TAG:
                ret = ixgbe_e_tag_filter_add(dev, l2_tunnel);
                break;
        default:
@@ -7512,7 +7535,7 @@ ixgbe_dev_l2_tunnel_filter_add(struct rte_eth_dev *dev,
 /* Delete l2 tunnel filter */
 int
 ixgbe_dev_l2_tunnel_filter_del(struct rte_eth_dev *dev,
-                              struct rte_eth_l2_tunnel_conf *l2_tunnel)
+                              struct ixgbe_l2_tunnel_conf *l2_tunnel)
 {
        int ret;
        struct ixgbe_l2_tn_info *l2_tn_info =
@@ -7526,7 +7549,7 @@ ixgbe_dev_l2_tunnel_filter_del(struct rte_eth_dev *dev,
                return ret;
 
        switch (l2_tunnel->l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
+       case RTE_ETH_L2_TUNNEL_TYPE_E_TAG:
                ret = ixgbe_e_tag_filter_del(dev, l2_tunnel);
                break;
        default:
@@ -7538,48 +7561,6 @@ ixgbe_dev_l2_tunnel_filter_del(struct rte_eth_dev *dev,
        return ret;
 }
 
-/**
- * ixgbe_dev_l2_tunnel_filter_handle - Handle operations for l2 tunnel filter.
- * @dev: pointer to rte_eth_dev structure
- * @filter_op:operation will be taken.
- * @arg: a pointer to specific structure corresponding to the filter_op
- */
-static int
-ixgbe_dev_l2_tunnel_filter_handle(struct rte_eth_dev *dev,
-                                 enum rte_filter_op filter_op,
-                                 void *arg)
-{
-       int ret;
-
-       if (filter_op == RTE_ETH_FILTER_NOP)
-               return 0;
-
-       if (arg == NULL) {
-               PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u.",
-                           filter_op);
-               return -EINVAL;
-       }
-
-       switch (filter_op) {
-       case RTE_ETH_FILTER_ADD:
-               ret = ixgbe_dev_l2_tunnel_filter_add
-                       (dev,
-                        (struct rte_eth_l2_tunnel_conf *)arg,
-                        FALSE);
-               break;
-       case RTE_ETH_FILTER_DELETE:
-               ret = ixgbe_dev_l2_tunnel_filter_del
-                       (dev,
-                        (struct rte_eth_l2_tunnel_conf *)arg);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "unsupported operation %u.", filter_op);
-               ret = -EINVAL;
-               break;
-       }
-       return ret;
-}
-
 static int
 ixgbe_e_tag_forwarding_en_dis(struct rte_eth_dev *dev, bool en)
 {
@@ -7602,264 +7583,6 @@ ixgbe_e_tag_forwarding_en_dis(struct rte_eth_dev *dev, bool en)
        return ret;
 }
 
-/* Enable l2 tunnel forwarding */
-static int
-ixgbe_dev_l2_tunnel_forwarding_enable
-       (struct rte_eth_dev *dev,
-        enum rte_eth_tunnel_type l2_tunnel_type)
-{
-       struct ixgbe_l2_tn_info *l2_tn_info =
-               IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(dev->data->dev_private);
-       int ret = 0;
-
-       switch (l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
-               l2_tn_info->e_tag_fwd_en = TRUE;
-               ret = ixgbe_e_tag_forwarding_en_dis(dev, 1);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "Invalid tunnel type");
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
-/* Disable l2 tunnel forwarding */
-static int
-ixgbe_dev_l2_tunnel_forwarding_disable
-       (struct rte_eth_dev *dev,
-        enum rte_eth_tunnel_type l2_tunnel_type)
-{
-       struct ixgbe_l2_tn_info *l2_tn_info =
-               IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(dev->data->dev_private);
-       int ret = 0;
-
-       switch (l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
-               l2_tn_info->e_tag_fwd_en = FALSE;
-               ret = ixgbe_e_tag_forwarding_en_dis(dev, 0);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "Invalid tunnel type");
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
-static int
-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 = 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);
-
-       if (l2_tunnel->vf_id >= pci_dev->max_vfs) {
-               PMD_DRV_LOG(ERR,
-                           "VF id %u should be less than %u",
-                           l2_tunnel->vf_id,
-                           pci_dev->max_vfs);
-               return -EINVAL;
-       }
-
-       if (hw->mac.type != ixgbe_mac_X550 &&
-           hw->mac.type != ixgbe_mac_X550EM_x &&
-           hw->mac.type != ixgbe_mac_X550EM_a) {
-               return -ENOTSUP;
-       }
-
-       if (en)
-               vmtir = l2_tunnel->tunnel_id;
-       else
-               vmtir = 0;
-
-       IXGBE_WRITE_REG(hw, IXGBE_VMTIR(l2_tunnel->vf_id), vmtir);
-
-       vmvir = IXGBE_READ_REG(hw, IXGBE_VMVIR(l2_tunnel->vf_id));
-       vmvir &= ~IXGBE_VMVIR_TAGA_MASK;
-       if (en)
-               vmvir |= IXGBE_VMVIR_TAGA_ETAG_INSERT;
-       IXGBE_WRITE_REG(hw, IXGBE_VMVIR(l2_tunnel->vf_id), vmvir);
-
-       return ret;
-}
-
-/* Enable l2 tunnel tag insertion */
-static int
-ixgbe_dev_l2_tunnel_insertion_enable(struct rte_eth_dev *dev,
-                                    struct rte_eth_l2_tunnel_conf *l2_tunnel)
-{
-       int ret = 0;
-
-       switch (l2_tunnel->l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
-               ret = ixgbe_e_tag_insertion_en_dis(dev, l2_tunnel, 1);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "Invalid tunnel type");
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
-/* Disable l2 tunnel tag insertion */
-static int
-ixgbe_dev_l2_tunnel_insertion_disable
-       (struct rte_eth_dev *dev,
-        struct rte_eth_l2_tunnel_conf *l2_tunnel)
-{
-       int ret = 0;
-
-       switch (l2_tunnel->l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
-               ret = ixgbe_e_tag_insertion_en_dis(dev, l2_tunnel, 0);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "Invalid tunnel type");
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
-static int
-ixgbe_e_tag_stripping_en_dis(struct rte_eth_dev *dev,
-                            bool en)
-{
-       int ret = 0;
-       uint32_t qde;
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-
-       if (hw->mac.type != ixgbe_mac_X550 &&
-           hw->mac.type != ixgbe_mac_X550EM_x &&
-           hw->mac.type != ixgbe_mac_X550EM_a) {
-               return -ENOTSUP;
-       }
-
-       qde = IXGBE_READ_REG(hw, IXGBE_QDE);
-       if (en)
-               qde |= IXGBE_QDE_STRIP_TAG;
-       else
-               qde &= ~IXGBE_QDE_STRIP_TAG;
-       qde &= ~IXGBE_QDE_READ;
-       qde |= IXGBE_QDE_WRITE;
-       IXGBE_WRITE_REG(hw, IXGBE_QDE, qde);
-
-       return ret;
-}
-
-/* Enable l2 tunnel tag stripping */
-static int
-ixgbe_dev_l2_tunnel_stripping_enable
-       (struct rte_eth_dev *dev,
-        enum rte_eth_tunnel_type l2_tunnel_type)
-{
-       int ret = 0;
-
-       switch (l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
-               ret = ixgbe_e_tag_stripping_en_dis(dev, 1);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "Invalid tunnel type");
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
-/* Disable l2 tunnel tag stripping */
-static int
-ixgbe_dev_l2_tunnel_stripping_disable
-       (struct rte_eth_dev *dev,
-        enum rte_eth_tunnel_type l2_tunnel_type)
-{
-       int ret = 0;
-
-       switch (l2_tunnel_type) {
-       case RTE_L2_TUNNEL_TYPE_E_TAG:
-               ret = ixgbe_e_tag_stripping_en_dis(dev, 0);
-               break;
-       default:
-               PMD_DRV_LOG(ERR, "Invalid tunnel type");
-               ret = -EINVAL;
-               break;
-       }
-
-       return ret;
-}
-
-/* Enable/disable l2 tunnel offload functions */
-static int
-ixgbe_dev_l2_tunnel_offload_set
-       (struct rte_eth_dev *dev,
-        struct rte_eth_l2_tunnel_conf *l2_tunnel,
-        uint32_t mask,
-        uint8_t en)
-{
-       int ret = 0;
-
-       if (l2_tunnel == NULL)
-               return -EINVAL;
-
-       ret = -EINVAL;
-       if (mask & ETH_L2_TUNNEL_ENABLE_MASK) {
-               if (en)
-                       ret = ixgbe_dev_l2_tunnel_enable(
-                               dev,
-                               l2_tunnel->l2_tunnel_type);
-               else
-                       ret = ixgbe_dev_l2_tunnel_disable(
-                               dev,
-                               l2_tunnel->l2_tunnel_type);
-       }
-
-       if (mask & ETH_L2_TUNNEL_INSERTION_MASK) {
-               if (en)
-                       ret = ixgbe_dev_l2_tunnel_insertion_enable(
-                               dev,
-                               l2_tunnel);
-               else
-                       ret = ixgbe_dev_l2_tunnel_insertion_disable(
-                               dev,
-                               l2_tunnel);
-       }
-
-       if (mask & ETH_L2_TUNNEL_STRIPPING_MASK) {
-               if (en)
-                       ret = ixgbe_dev_l2_tunnel_stripping_enable(
-                               dev,
-                               l2_tunnel->l2_tunnel_type);
-               else
-                       ret = ixgbe_dev_l2_tunnel_stripping_disable(
-                               dev,
-                               l2_tunnel->l2_tunnel_type);
-       }
-
-       if (mask & ETH_L2_TUNNEL_FORWARDING_MASK) {
-               if (en)
-                       ret = ixgbe_dev_l2_tunnel_forwarding_enable(
-                               dev,
-                               l2_tunnel->l2_tunnel_type);
-               else
-                       ret = ixgbe_dev_l2_tunnel_forwarding_disable(
-                               dev,
-                               l2_tunnel->l2_tunnel_type);
-       }
-
-       return ret;
-}
-
 static int
 ixgbe_update_vxlan_port(struct ixgbe_hw *hw,
                        uint16_t port)
@@ -7923,12 +7646,12 @@ ixgbe_dev_udp_tunnel_port_add(struct rte_eth_dev *dev,
                return -EINVAL;
 
        switch (udp_tunnel->prot_type) {
-       case RTE_TUNNEL_TYPE_VXLAN:
+       case RTE_ETH_TUNNEL_TYPE_VXLAN:
                ret = ixgbe_add_vxlan_port(hw, udp_tunnel->udp_port);
                break;
 
-       case RTE_TUNNEL_TYPE_GENEVE:
-       case RTE_TUNNEL_TYPE_TEREDO:
+       case RTE_ETH_TUNNEL_TYPE_GENEVE:
+       case RTE_ETH_TUNNEL_TYPE_TEREDO:
                PMD_DRV_LOG(ERR, "Tunnel type is not supported now.");
                ret = -EINVAL;
                break;
@@ -7960,11 +7683,11 @@ ixgbe_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
                return -EINVAL;
 
        switch (udp_tunnel->prot_type) {
-       case RTE_TUNNEL_TYPE_VXLAN:
+       case RTE_ETH_TUNNEL_TYPE_VXLAN:
                ret = ixgbe_del_vxlan_port(hw, udp_tunnel->udp_port);
                break;
-       case RTE_TUNNEL_TYPE_GENEVE:
-       case RTE_TUNNEL_TYPE_TEREDO:
+       case RTE_ETH_TUNNEL_TYPE_GENEVE:
+       case RTE_ETH_TUNNEL_TYPE_TEREDO:
                PMD_DRV_LOG(ERR, "Tunnel type is not supported now.");
                ret = -EINVAL;
                break;
@@ -7977,20 +7700,89 @@ ixgbe_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
        return ret;
 }
 
-static void
+static int
+ixgbevf_dev_promiscuous_enable(struct rte_eth_dev *dev)
+{
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       int ret;
+
+       switch (hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_PROMISC)) {
+       case IXGBE_SUCCESS:
+               ret = 0;
+               break;
+       case IXGBE_ERR_FEATURE_NOT_SUPPORTED:
+               ret = -ENOTSUP;
+               break;
+       default:
+               ret = -EAGAIN;
+               break;
+       }
+
+       return ret;
+}
+
+static int
+ixgbevf_dev_promiscuous_disable(struct rte_eth_dev *dev)
+{
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       int ret;
+
+       switch (hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_NONE)) {
+       case IXGBE_SUCCESS:
+               ret = 0;
+               break;
+       case IXGBE_ERR_FEATURE_NOT_SUPPORTED:
+               ret = -ENOTSUP;
+               break;
+       default:
+               ret = -EAGAIN;
+               break;
+       }
+
+       return ret;
+}
+
+static int
 ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       int ret;
+       int mode = IXGBEVF_XCAST_MODE_ALLMULTI;
 
-       hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_ALLMULTI);
+       switch (hw->mac.ops.update_xcast_mode(hw, mode)) {
+       case IXGBE_SUCCESS:
+               ret = 0;
+               break;
+       case IXGBE_ERR_FEATURE_NOT_SUPPORTED:
+               ret = -ENOTSUP;
+               break;
+       default:
+               ret = -EAGAIN;
+               break;
+       }
+
+       return ret;
 }
 
-static void
+static int
 ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev)
 {
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       int ret;
 
-       hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_MULTI);
+       switch (hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_MULTI)) {
+       case IXGBE_SUCCESS:
+               ret = 0;
+               break;
+       case IXGBE_ERR_FEATURE_NOT_SUPPORTED:
+               ret = -ENOTSUP;
+               break;
+       default:
+               ret = -EAGAIN;
+               break;
+       }
+
+       return ret;
 }
 
 static void ixgbevf_mbx_process(struct rte_eth_dev *dev)
@@ -7998,13 +7790,17 @@ static void ixgbevf_mbx_process(struct rte_eth_dev *dev)
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        u32 in_msg = 0;
 
-       if (ixgbe_read_mbx(hw, &in_msg, 1, 0))
-               return;
+       /* peek the message first */
+       in_msg = IXGBE_READ_REG(hw, IXGBE_VFMBMEM);
 
        /* PF reset VF event */
-       if (in_msg == IXGBE_PF_CONTROL_MSG)
-               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RESET,
-                                             NULL, NULL);
+       if (in_msg == IXGBE_PF_CONTROL_MSG) {
+               /* dummy mbx read to ack pf */
+               if (ixgbe_read_mbx(hw, &in_msg, 1, 0))
+                       return;
+               rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RESET,
+                                            NULL);
+       }
 }
 
 static int
@@ -8014,7 +7810,7 @@ ixgbevf_dev_interrupt_get_status(struct rte_eth_dev *dev)
        struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct ixgbe_interrupt *intr =
                IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
-       ixgbevf_intr_disable(hw);
+       ixgbevf_intr_disable(dev);
 
        /* read-on-clear nic registers here */
        eicr = IXGBE_READ_REG(hw, IXGBE_VTEICR);
@@ -8031,7 +7827,6 @@ ixgbevf_dev_interrupt_get_status(struct rte_eth_dev *dev)
 static int
 ixgbevf_dev_interrupt_action(struct rte_eth_dev *dev)
 {
-       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct ixgbe_interrupt *intr =
                IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
 
@@ -8040,7 +7835,7 @@ ixgbevf_dev_interrupt_action(struct rte_eth_dev *dev)
                intr->flags &= ~IXGBE_FLAG_MAILBOX;
        }
 
-       ixgbevf_intr_enable(hw);
+       ixgbevf_intr_enable(dev);
 
        return 0;
 }
@@ -8162,7 +7957,7 @@ ixgbe_l2_tn_filter_restore(struct rte_eth_dev *dev)
        struct ixgbe_l2_tn_info *l2_tn_info =
                IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(dev->data->dev_private);
        struct ixgbe_l2_tn_filter *node;
-       struct rte_eth_l2_tunnel_conf l2_tn_conf;
+       struct ixgbe_l2_tunnel_conf l2_tn_conf;
 
        TAILQ_FOREACH(node, &l2_tn_info->l2_tn_list, entries) {
                l2_tn_conf.l2_tunnel_type = node->key.l2_tn_type;
@@ -8172,6 +7967,18 @@ ixgbe_l2_tn_filter_restore(struct rte_eth_dev *dev)
        }
 }
 
+/* restore rss filter */
+static inline void
+ixgbe_rss_filter_restore(struct rte_eth_dev *dev)
+{
+       struct ixgbe_filter_info *filter_info =
+               IXGBE_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);
+
+       if (filter_info->rss_info.conf.queue_num)
+               ixgbe_config_rss_filter(dev,
+                       &filter_info->rss_info, TRUE);
+}
+
 static int
 ixgbe_filter_restore(struct rte_eth_dev *dev)
 {
@@ -8180,6 +7987,7 @@ ixgbe_filter_restore(struct rte_eth_dev *dev)
        ixgbe_syn_filter_restore(dev);
        ixgbe_fdir_filter_restore(dev);
        ixgbe_l2_tn_filter_restore(dev);
+       ixgbe_rss_filter_restore(dev);
 
        return 0;
 }
@@ -8256,7 +8064,7 @@ ixgbe_clear_all_l2_tn_filter(struct rte_eth_dev *dev)
        struct ixgbe_l2_tn_info *l2_tn_info =
                IXGBE_DEV_PRIVATE_TO_L2_TN_INFO(dev->data->dev_private);
        struct ixgbe_l2_tn_filter *l2_tn_filter;
-       struct rte_eth_l2_tunnel_conf l2_tn_conf;
+       struct ixgbe_l2_tunnel_conf l2_tn_conf;
        int ret = 0;
 
        while ((l2_tn_filter = TAILQ_FIRST(&l2_tn_info->l2_tn_list))) {
@@ -8271,9 +8079,164 @@ ixgbe_clear_all_l2_tn_filter(struct rte_eth_dev *dev)
        return 0;
 }
 
+void
+ixgbe_dev_macsec_setting_save(struct rte_eth_dev *dev,
+                               struct ixgbe_macsec_setting *macsec_setting)
+{
+       struct ixgbe_macsec_setting *macsec =
+               IXGBE_DEV_PRIVATE_TO_MACSEC_SETTING(dev->data->dev_private);
+
+       macsec->offload_en = macsec_setting->offload_en;
+       macsec->encrypt_en = macsec_setting->encrypt_en;
+       macsec->replayprotect_en = macsec_setting->replayprotect_en;
+}
+
+void
+ixgbe_dev_macsec_setting_reset(struct rte_eth_dev *dev)
+{
+       struct ixgbe_macsec_setting *macsec =
+               IXGBE_DEV_PRIVATE_TO_MACSEC_SETTING(dev->data->dev_private);
+
+       macsec->offload_en = 0;
+       macsec->encrypt_en = 0;
+       macsec->replayprotect_en = 0;
+}
+
+void
+ixgbe_dev_macsec_register_enable(struct rte_eth_dev *dev,
+                               struct ixgbe_macsec_setting *macsec_setting)
+{
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       uint32_t ctrl;
+       uint8_t en = macsec_setting->encrypt_en;
+       uint8_t rp = macsec_setting->replayprotect_en;
+
+       /**
+        * 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);
+}
+
+void
+ixgbe_dev_macsec_register_disable(struct rte_eth_dev *dev)
+{
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       uint32_t ctrl;
+
+       /**
+        * 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);
+}
+
 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-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-pci");
+RTE_PMD_REGISTER_PARAM_STRING(net_ixgbe_vf,
+                             IXGBEVF_DEVARG_PFLINK_FULLCHK "=<0|1>");
+
+RTE_LOG_REGISTER_SUFFIX(ixgbe_logtype_init, init, NOTICE);
+RTE_LOG_REGISTER_SUFFIX(ixgbe_logtype_driver, driver, NOTICE);
+
+#ifdef RTE_ETHDEV_DEBUG_RX
+RTE_LOG_REGISTER_SUFFIX(ixgbe_logtype_rx, rx, DEBUG);
+#endif
+#ifdef RTE_ETHDEV_DEBUG_TX
+RTE_LOG_REGISTER_SUFFIX(ixgbe_logtype_tx, tx, DEBUG);
+#endif