drivers: advertise kmod dependencies in pmdinfo
[dpdk.git] / drivers / net / fm10k / fm10k_ethdev.c
index 3ae604d..fe74f6d 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2013-2016 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -37,6 +37,7 @@
 #include <rte_string_fns.h>
 #include <rte_dev.h>
 #include <rte_spinlock.h>
+#include <rte_kvargs.h>
 
 #include "fm10k.h"
 #include "base/fm10k_api.h"
@@ -51,6 +52,8 @@
 #define MAX_QUERY_SWITCH_STATE_TIMES 10
 /* Wait interval to get switch status */
 #define WAIT_SWITCH_MSG_US    100000
+/* A period of quiescence for switch */
+#define FM10K_SWITCH_QUIESCE_US 10000
 /* Number of chars per uint32 type */
 #define CHARS_PER_UINT32 (sizeof(uint32_t))
 #define BIT_MASK_PER_UINT32 ((1 << CHARS_PER_UINT32) - 1)
@@ -79,6 +82,7 @@ static void fm10k_tx_queue_release(void *queue);
 static void fm10k_rx_queue_release(void *queue);
 static void fm10k_set_rx_function(struct rte_eth_dev *dev);
 static void fm10k_set_tx_function(struct rte_eth_dev *dev);
+static int fm10k_check_ftag(struct rte_devargs *devargs);
 
 struct fm10k_xstats_name_off {
        char name[RTE_ETH_XSTATS_NAME_SIZE];
@@ -529,8 +533,10 @@ fm10k_dev_rss_configure(struct rte_eth_dev *dev)
 
        if (dev->data->nb_rx_queues == 1 ||
            dev_conf->rxmode.mq_mode != ETH_MQ_RX_RSS ||
-           dev_conf->rx_adv_conf.rss_conf.rss_hf == 0)
+           dev_conf->rx_adv_conf.rss_conf.rss_hf == 0) {
+               FM10K_WRITE_REG(hw, FM10K_MRQC(0), 0);
                return;
+       }
 
        /* random key is rss_intel_key (default) or user provided (rss_key) */
        if (dev_conf->rx_adv_conf.rss_conf.rss_key == NULL)
@@ -668,6 +674,19 @@ fm10k_dev_tx_init(struct rte_eth_dev *dev)
                        PMD_INIT_LOG(ERR, "failed to disable queue %d", i);
                        return -1;
                }
+               /* Enable use of FTAG bit in TX descriptor, PFVTCTL
+                * register is read-only for VF.
+                */
+               if (fm10k_check_ftag(dev->pci_dev->device.devargs)) {
+                       if (hw->mac.type == fm10k_mac_pf) {
+                               FM10K_WRITE_REG(hw, FM10K_PFVTCTL(i),
+                                               FM10K_PFVTCTL_FTAG_DESC_ENABLE);
+                               PMD_INIT_LOG(DEBUG, "FTAG mode is enabled");
+                       } else {
+                               PMD_INIT_LOG(ERR, "VF FTAG is not supported.");
+                               return -ENOTSUP;
+                       }
+               }
 
                /* set location and size for descriptor ring */
                FM10K_WRITE_REG(hw, FM10K_TDBAL(i),
@@ -675,6 +694,10 @@ fm10k_dev_tx_init(struct rte_eth_dev *dev)
                FM10K_WRITE_REG(hw, FM10K_TDBAH(i),
                                base_addr >> (CHAR_BIT * sizeof(uint32_t)));
                FM10K_WRITE_REG(hw, FM10K_TDLEN(i), size);
+
+               /* assign default SGLORT for each TX queue by PF */
+               if (hw->mac.type == fm10k_mac_pf)
+                       FM10K_WRITE_REG(hw, FM10K_TX_SGLORT(i), hw->mac.dglort_map);
        }
 
        /* set up vector or scalar TX function as appropriate */
@@ -927,7 +950,7 @@ fm10k_dev_promiscuous_enable(struct rte_eth_dev *dev)
        PMD_INIT_FUNC_TRACE();
 
        /* Return if it didn't acquire valid glort range */
-       if (!fm10k_glort_valid(hw))
+       if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
                return;
 
        fm10k_mbx_lock(hw);
@@ -949,7 +972,7 @@ fm10k_dev_promiscuous_disable(struct rte_eth_dev *dev)
        PMD_INIT_FUNC_TRACE();
 
        /* Return if it didn't acquire valid glort range */
-       if (!fm10k_glort_valid(hw))
+       if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
                return;
 
        if (dev->data->all_multicast == 1)
@@ -975,7 +998,7 @@ fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev)
        PMD_INIT_FUNC_TRACE();
 
        /* Return if it didn't acquire valid glort range */
-       if (!fm10k_glort_valid(hw))
+       if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
                return;
 
        /* If promiscuous mode is enabled, it doesn't make sense to enable
@@ -1006,7 +1029,7 @@ fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev)
        PMD_INIT_FUNC_TRACE();
 
        /* Return if it didn't acquire valid glort range */
-       if (!fm10k_glort_valid(hw))
+       if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw))
                return;
 
        if (dev->data->promiscuous) {
@@ -1213,6 +1236,9 @@ fm10k_dev_close(struct rte_eth_dev *dev)
                MAX_LPORT_NUM, false);
        fm10k_mbx_unlock(hw);
 
+       /* allow 10ms for device to quiesce */
+       rte_delay_us(FM10K_SWITCH_QUIESCE_US);
+
        /* Stop mailbox service first */
        fm10k_close_mbx_service(hw);
        fm10k_dev_stop(dev);
@@ -1231,13 +1257,51 @@ fm10k_link_update(struct rte_eth_dev *dev,
         * is no 50Gbps Ethernet. */
        dev->data->dev_link.link_speed  = 0;
        dev->data->dev_link.link_duplex = ETH_LINK_FULL_DUPLEX;
-       dev->data->dev_link.link_status = 1;
+       dev->data->dev_link.link_status = ETH_LINK_UP;
 
        return 0;
 }
 
+static int fm10k_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
+       struct rte_eth_xstat_name *xstats_names, __rte_unused unsigned limit)
+{
+       unsigned i, q;
+       unsigned count = 0;
+
+       if (xstats_names != NULL) {
+               /* Note: limit checked in rte_eth_xstats_names() */
+
+               /* Global stats */
+               for (i = 0; i < FM10K_NB_HW_XSTATS; i++) {
+                       snprintf(xstats_names[count].name,
+                               sizeof(xstats_names[count].name),
+                               "%s", fm10k_hw_stats_strings[count].name);
+                       count++;
+               }
+
+               /* PF queue stats */
+               for (q = 0; q < FM10K_MAX_QUEUES_PF; q++) {
+                       for (i = 0; i < FM10K_NB_RX_Q_XSTATS; i++) {
+                               snprintf(xstats_names[count].name,
+                                       sizeof(xstats_names[count].name),
+                                       "rx_q%u_%s", q,
+                                       fm10k_hw_stats_rx_q_strings[i].name);
+                               count++;
+                       }
+                       for (i = 0; i < FM10K_NB_TX_Q_XSTATS; i++) {
+                               snprintf(xstats_names[count].name,
+                                       sizeof(xstats_names[count].name),
+                                       "tx_q%u_%s", q,
+                                       fm10k_hw_stats_tx_q_strings[i].name);
+                               count++;
+                       }
+               }
+       }
+       return FM10K_NB_XSTATS;
+}
+
 static int
-fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstats *xstats,
+fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
                 unsigned n)
 {
        struct fm10k_hw_stats *hw_stats =
@@ -1249,8 +1313,6 @@ fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstats *xstats,
 
        /* Global stats */
        for (i = 0; i < FM10K_NB_HW_XSTATS; i++) {
-               snprintf(xstats[count].name, sizeof(xstats[count].name),
-                        "%s", fm10k_hw_stats_strings[count].name);
                xstats[count].value = *(uint64_t *)(((char *)hw_stats) +
                        fm10k_hw_stats_strings[count].offset);
                count++;
@@ -1259,18 +1321,12 @@ fm10k_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstats *xstats,
        /* PF queue stats */
        for (q = 0; q < FM10K_MAX_QUEUES_PF; q++) {
                for (i = 0; i < FM10K_NB_RX_Q_XSTATS; i++) {
-                       snprintf(xstats[count].name, sizeof(xstats[count].name),
-                                "rx_q%u_%s", q,
-                                fm10k_hw_stats_rx_q_strings[i].name);
                        xstats[count].value =
                                *(uint64_t *)(((char *)&hw_stats->q[q]) +
                                fm10k_hw_stats_rx_q_strings[i].offset);
                        count++;
                }
                for (i = 0; i < FM10K_NB_TX_Q_XSTATS; i++) {
-                       snprintf(xstats[count].name, sizeof(xstats[count].name),
-                                "tx_q%u_%s", q,
-                                fm10k_hw_stats_tx_q_strings[i].name);
                        xstats[count].value =
                                *(uint64_t *)(((char *)&hw_stats->q[q]) +
                                fm10k_hw_stats_tx_q_strings[i].offset);
@@ -1392,7 +1448,60 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev,
                .nb_min = FM10K_MIN_TX_DESC,
                .nb_align = FM10K_MULT_TX_DESC,
        };
+
+       dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_2_5G |
+                       ETH_LINK_SPEED_10G | ETH_LINK_SPEED_25G |
+                       ETH_LINK_SPEED_40G | ETH_LINK_SPEED_100G;
+}
+
+#ifdef RTE_LIBRTE_FM10K_RX_OLFLAGS_ENABLE
+static const uint32_t *
+fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev)
+{
+       if (dev->rx_pkt_burst == fm10k_recv_pkts ||
+           dev->rx_pkt_burst == fm10k_recv_scattered_pkts) {
+               static uint32_t ptypes[] = {
+                       /* refers to rx_desc_to_ol_flags() */
+                       RTE_PTYPE_L2_ETHER,
+                       RTE_PTYPE_L3_IPV4,
+                       RTE_PTYPE_L3_IPV4_EXT,
+                       RTE_PTYPE_L3_IPV6,
+                       RTE_PTYPE_L3_IPV6_EXT,
+                       RTE_PTYPE_L4_TCP,
+                       RTE_PTYPE_L4_UDP,
+                       RTE_PTYPE_UNKNOWN
+               };
+
+               return ptypes;
+       } else if (dev->rx_pkt_burst == fm10k_recv_pkts_vec ||
+                  dev->rx_pkt_burst == fm10k_recv_scattered_pkts_vec) {
+               static uint32_t ptypes_vec[] = {
+                       /* refers to fm10k_desc_to_pktype_v() */
+                       RTE_PTYPE_L3_IPV4,
+                       RTE_PTYPE_L3_IPV4_EXT,
+                       RTE_PTYPE_L3_IPV6,
+                       RTE_PTYPE_L3_IPV6_EXT,
+                       RTE_PTYPE_L4_TCP,
+                       RTE_PTYPE_L4_UDP,
+                       RTE_PTYPE_TUNNEL_GENEVE,
+                       RTE_PTYPE_TUNNEL_NVGRE,
+                       RTE_PTYPE_TUNNEL_VXLAN,
+                       RTE_PTYPE_TUNNEL_GRE,
+                       RTE_PTYPE_UNKNOWN
+               };
+
+               return ptypes_vec;
+       }
+
+       return NULL;
+}
+#else
+static const uint32_t *
+fm10k_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused)
+{
+       return NULL;
 }
+#endif
 
 static int
 fm10k_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
@@ -2056,8 +2165,8 @@ fm10k_rss_hash_update(struct rte_eth_dev *dev,
 
        PMD_INIT_FUNC_TRACE();
 
-       if (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
-               FM10K_RSSRK_ENTRIES_PER_REG)
+       if (key && (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
+                               FM10K_RSSRK_ENTRIES_PER_REG))
                return -EINVAL;
 
        if (hf == 0)
@@ -2099,8 +2208,8 @@ fm10k_rss_hash_conf_get(struct rte_eth_dev *dev,
 
        PMD_INIT_FUNC_TRACE();
 
-       if (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
-                               FM10K_RSSRK_ENTRIES_PER_REG)
+       if (key && (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
+                               FM10K_RSSRK_ENTRIES_PER_REG))
                return -EINVAL;
 
        if (key != NULL)
@@ -2133,12 +2242,12 @@ fm10k_dev_enable_intr_pf(struct rte_eth_dev *dev)
        /* Bind all local non-queue interrupt to vector 0 */
        int_map |= FM10K_MISC_VEC_ID;
 
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_Mailbox), int_map);
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_PCIeFault), int_map);
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SwitchUpDown), int_map);
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SwitchEvent), int_map);
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SRAM), int_map);
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_VFLR), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_mailbox), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_pcie_fault), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_switch_up_down), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_switch_event), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_sram), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_vflr), int_map);
 
        /* Enable misc causes */
        FM10K_WRITE_REG(hw, FM10K_EIMR, FM10K_EIMR_ENABLE(PCA_FAULT) |
@@ -2164,12 +2273,12 @@ fm10k_dev_disable_intr_pf(struct rte_eth_dev *dev)
 
        int_map |= FM10K_MISC_VEC_ID;
 
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_Mailbox), int_map);
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_PCIeFault), int_map);
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SwitchUpDown), int_map);
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SwitchEvent), int_map);
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SRAM), int_map);
-       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_VFLR), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_mailbox), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_pcie_fault), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_switch_up_down), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_switch_event), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_sram), int_map);
+       FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_vflr), int_map);
 
        /* Disable misc causes */
        FM10K_WRITE_REG(hw, FM10K_EIMR, FM10K_EIMR_DISABLE(PCA_FAULT) |
@@ -2517,29 +2626,16 @@ static const struct fm10k_msg_data fm10k_msgdata_vf[] = {
        FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
 };
 
-/* Mailbox message handler in PF */
-static const struct fm10k_msg_data fm10k_msgdata_pf[] = {
-       FM10K_PF_MSG_ERR_HANDLER(XCAST_MODES, fm10k_msg_err_pf),
-       FM10K_PF_MSG_ERR_HANDLER(UPDATE_MAC_FWD_RULE, fm10k_msg_err_pf),
-       FM10K_PF_MSG_LPORT_MAP_HANDLER(fm10k_msg_lport_map_pf),
-       FM10K_PF_MSG_ERR_HANDLER(LPORT_CREATE, fm10k_msg_err_pf),
-       FM10K_PF_MSG_ERR_HANDLER(LPORT_DELETE, fm10k_msg_err_pf),
-       FM10K_PF_MSG_UPDATE_PVID_HANDLER(fm10k_msg_update_pvid_pf),
-       FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
-};
-
 static int
 fm10k_setup_mbx_service(struct fm10k_hw *hw)
 {
-       int err;
+       int err = 0;
 
        /* Initialize mailbox lock */
        fm10k_mbx_initlock(hw);
 
        /* Replace default message handler with new ones */
-       if (hw->mac.type == fm10k_mac_pf)
-               err = hw->mbx.ops.register_handlers(&hw->mbx, fm10k_msgdata_pf);
-       else
+       if (hw->mac.type == fm10k_mac_vf)
                err = hw->mbx.ops.register_handlers(&hw->mbx, fm10k_msgdata_vf);
 
        if (err) {
@@ -2569,10 +2665,12 @@ static const struct eth_dev_ops fm10k_eth_dev_ops = {
        .allmulticast_disable   = fm10k_dev_allmulticast_disable,
        .stats_get              = fm10k_stats_get,
        .xstats_get             = fm10k_xstats_get,
+       .xstats_get_names       = fm10k_xstats_get_names,
        .stats_reset            = fm10k_stats_reset,
        .xstats_reset           = fm10k_stats_reset,
        .link_update            = fm10k_link_update,
        .dev_infos_get          = fm10k_dev_infos_get,
+       .dev_supported_ptypes_get = fm10k_dev_supported_ptypes_get,
        .vlan_filter_set        = fm10k_vlan_filter_set,
        .vlan_offload_set       = fm10k_vlan_offload_set,
        .mac_addr_add           = fm10k_macaddr_add,
@@ -2594,20 +2692,60 @@ static const struct eth_dev_ops fm10k_eth_dev_ops = {
        .rss_hash_conf_get      = fm10k_rss_hash_conf_get,
 };
 
+static int ftag_check_handler(__rte_unused const char *key,
+               const char *value, __rte_unused void *opaque)
+{
+       if (strcmp(value, "1"))
+               return -1;
+
+       return 0;
+}
+
+static int
+fm10k_check_ftag(struct rte_devargs *devargs)
+{
+       struct rte_kvargs *kvlist;
+       const char *ftag_key = "enable_ftag";
+
+       if (devargs == NULL)
+               return 0;
+
+       kvlist = rte_kvargs_parse(devargs->args, NULL);
+       if (kvlist == NULL)
+               return 0;
+
+       if (!rte_kvargs_count(kvlist, ftag_key)) {
+               rte_kvargs_free(kvlist);
+               return 0;
+       }
+       /* FTAG is enabled when there's key-value pair: enable_ftag=1 */
+       if (rte_kvargs_process(kvlist, ftag_key,
+                               ftag_check_handler, NULL) < 0) {
+               rte_kvargs_free(kvlist);
+               return 0;
+       }
+       rte_kvargs_free(kvlist);
+
+       return 1;
+}
+
 static void __attribute__((cold))
 fm10k_set_tx_function(struct rte_eth_dev *dev)
 {
        struct fm10k_tx_queue *txq;
        int i;
        int use_sse = 1;
+       uint16_t tx_ftag_en = 0;
+
+       if (fm10k_check_ftag(dev->pci_dev->device.devargs))
+               tx_ftag_en = 1;
 
        for (i = 0; i < dev->data->nb_tx_queues; i++) {
                txq = dev->data->tx_queues[i];
+               txq->tx_ftag_en = tx_ftag_en;
                /* Check if Vector Tx is satisfied */
-               if (fm10k_tx_vec_condition_check(txq)) {
+               if (fm10k_tx_vec_condition_check(txq))
                        use_sse = 0;
-                       break;
-               }
        }
 
        if (use_sse) {
@@ -2628,11 +2766,16 @@ fm10k_set_rx_function(struct rte_eth_dev *dev)
 {
        struct fm10k_dev_info *dev_info = FM10K_DEV_PRIVATE_TO_INFO(dev);
        uint16_t i, rx_using_sse;
+       uint16_t rx_ftag_en = 0;
+
+       if (fm10k_check_ftag(dev->pci_dev->device.devargs))
+               rx_ftag_en = 1;
 
        /* In order to allow Vector Rx there are a few configuration
         * conditions to be met.
         */
-       if (!fm10k_rx_vec_condition_check(dev) && dev_info->rx_vec_allowed) {
+       if (!fm10k_rx_vec_condition_check(dev) &&
+                       dev_info->rx_vec_allowed && !rx_ftag_en) {
                if (dev->data->scattered_rx)
                        dev->rx_pkt_burst = fm10k_recv_scattered_pkts_vec;
                else
@@ -2655,6 +2798,7 @@ fm10k_set_rx_function(struct rte_eth_dev *dev)
                struct fm10k_rx_queue *rxq = dev->data->rx_queues[i];
 
                rxq->rx_using_sse = rx_using_sse;
+               rxq->rx_ftag_en = rx_ftag_en;
        }
 }
 
@@ -2909,41 +3053,25 @@ eth_fm10k_dev_uninit(struct rte_eth_dev *dev)
  * and SRIOV-VF devices.
  */
 static const struct rte_pci_id pci_id_fm10k_map[] = {
-#define RTE_PCI_DEV_ID_DECL_FM10K(vend, dev) { RTE_PCI_DEVICE(vend, dev) },
-#define RTE_PCI_DEV_ID_DECL_FM10KVF(vend, dev) { RTE_PCI_DEVICE(vend, dev) },
-#include "rte_pci_dev_ids.h"
+       { RTE_PCI_DEVICE(FM10K_INTEL_VENDOR_ID, FM10K_DEV_ID_PF) },
+       { RTE_PCI_DEVICE(FM10K_INTEL_VENDOR_ID, FM10K_DEV_ID_SDI_FM10420_QDA2) },
+       { RTE_PCI_DEVICE(FM10K_INTEL_VENDOR_ID, FM10K_DEV_ID_VF) },
        { .vendor_id = 0, /* sentinel */ },
 };
 
 static struct eth_driver rte_pmd_fm10k = {
        .pci_drv = {
-               .name = "rte_pmd_fm10k",
                .id_table = pci_id_fm10k_map,
                .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC |
                        RTE_PCI_DRV_DETACHABLE,
+               .probe = rte_eth_dev_pci_probe,
+               .remove = rte_eth_dev_pci_remove,
        },
        .eth_dev_init = eth_fm10k_dev_init,
        .eth_dev_uninit = eth_fm10k_dev_uninit,
        .dev_private_size = sizeof(struct fm10k_adapter),
 };
 
-/*
- * Driver initialization routine.
- * Invoked once at EAL init time.
- * Register itself as the [Poll Mode] Driver of PCI FM10K devices.
- */
-static int
-rte_pmd_fm10k_init(__rte_unused const char *name,
-       __rte_unused const char *params)
-{
-       PMD_INIT_FUNC_TRACE();
-       rte_eth_driver_register(&rte_pmd_fm10k);
-       return 0;
-}
-
-static struct rte_driver rte_fm10k_driver = {
-       .type = PMD_PDEV,
-       .init = rte_pmd_fm10k_init,
-};
-
-PMD_REGISTER_DRIVER(rte_fm10k_driver);
+RTE_PMD_REGISTER_PCI(net_fm10k, rte_pmd_fm10k.pci_drv);
+RTE_PMD_REGISTER_PCI_TABLE(net_fm10k, pci_id_fm10k_map);
+RTE_PMD_REGISTER_KMOD_DEP(net_fm10k, "* igb_uio | uio_pci_generic | vfio");