drivers/net: add generic ethdev macro to get PCI device
[dpdk.git] / drivers / net / qede / qede_ethdev.c
index 5f469e5..c28a2bc 100644 (file)
@@ -298,6 +298,7 @@ qede_alloc_etherdev(struct qede_dev *qdev, struct qed_dev_eth_info *info)
        qdev->ops = qed_ops;
 }
 
+#ifdef RTE_LIBRTE_QEDE_DEBUG_INFO
 static void qede_print_adapter_info(struct qede_dev *qdev)
 {
        struct ecore_dev *edev = &qdev->edev;
@@ -326,6 +327,7 @@ static void qede_print_adapter_info(struct qede_dev *qdev)
        DP_INFO(edev, " Firmware file : %s\n", fw_file);
        DP_INFO(edev, "*********************************\n");
 }
+#endif
 
 static void qede_set_ucast_cmn_params(struct ecore_filter_ucast *ucast)
 {
@@ -506,16 +508,18 @@ qede_mac_int_ops(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *ucast,
        return rc;
 }
 
-static void
+static int
 qede_mac_addr_add(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr,
-                 uint32_t index, __rte_unused uint32_t pool)
+                 __rte_unused uint32_t index, __rte_unused uint32_t pool)
 {
        struct ecore_filter_ucast ucast;
+       int re;
 
        qede_set_ucast_cmn_params(&ucast);
        ucast.type = ECORE_FILTER_MAC;
        ether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac);
-       (void)qede_mac_int_ops(eth_dev, &ucast, 1);
+       re = (int)qede_mac_int_ops(eth_dev, &ucast, 1);
+       return re;
 }
 
 static void
@@ -523,9 +527,7 @@ qede_mac_addr_remove(struct rte_eth_dev *eth_dev, uint32_t index)
 {
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
-       struct ether_addr mac_addr;
        struct ecore_filter_ucast ucast;
-       int rc;
 
        PMD_INIT_FUNC_TRACE(edev);
 
@@ -551,8 +553,6 @@ qede_mac_addr_set(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr)
 {
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
-       struct ecore_filter_ucast ucast;
-       int rc;
 
        if (IS_VF(edev) && !ecore_vf_check_mac(ECORE_LEADING_HWFN(edev),
                                               mac_addr->addr_bytes)) {
@@ -562,29 +562,7 @@ qede_mac_addr_set(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr)
                return;
        }
 
-       /* First remove the primary mac */
-       qede_set_ucast_cmn_params(&ucast);
-       ucast.opcode = ECORE_FILTER_REMOVE;
-       ucast.type = ECORE_FILTER_MAC;
-       ether_addr_copy(&qdev->primary_mac,
-                       (struct ether_addr *)&ucast.mac);
-       rc = ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, NULL);
-       if (rc != 0) {
-               DP_ERR(edev, "Unable to remove current macaddr"
-                            " Reverting to previous default mac\n");
-               ether_addr_copy(&qdev->primary_mac,
-                               &eth_dev->data->mac_addrs[0]);
-               return;
-       }
-
-       /* Add new MAC */
-       ucast.opcode = ECORE_FILTER_ADD;
-       ether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac);
-       rc = ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, NULL);
-       if (rc != 0)
-               DP_ERR(edev, "Unable to add new default mac\n");
-       else
-               ether_addr_copy(mac_addr, &qdev->primary_mac);
+       qede_mac_addr_add(eth_dev, mac_addr, 0, 0);
 }
 
 static void qede_config_accept_any_vlan(struct qede_dev *qdev, bool action)
@@ -628,50 +606,11 @@ static int qede_vlan_stripping(struct rte_eth_dev *eth_dev, bool set_stripping)
                DP_ERR(edev, "Update V-PORT failed %d\n", rc);
                return rc;
        }
+       qdev->vlan_strip_flg = set_stripping;
 
        return 0;
 }
 
-static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
-{
-       struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
-       struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
-       struct rte_eth_rxmode *rxmode = &eth_dev->data->dev_conf.rxmode;
-
-       if (mask & ETH_VLAN_STRIP_MASK) {
-               if (rxmode->hw_vlan_strip)
-                       (void)qede_vlan_stripping(eth_dev, 1);
-               else
-                       (void)qede_vlan_stripping(eth_dev, 0);
-       }
-
-       if (mask & ETH_VLAN_FILTER_MASK) {
-               /* VLAN filtering kicks in when a VLAN is added */
-               if (rxmode->hw_vlan_filter) {
-                       qede_vlan_filter_set(eth_dev, 0, 1);
-               } else {
-                       if (qdev->configured_vlans > 1) { /* Excluding VLAN0 */
-                               DP_ERR(edev,
-                                 " Please remove existing VLAN filters"
-                                 " before disabling VLAN filtering\n");
-                               /* Signal app that VLAN filtering is still
-                                * enabled
-                                */
-                               rxmode->hw_vlan_filter = true;
-                       } else {
-                               qede_vlan_filter_set(eth_dev, 0, 0);
-                       }
-               }
-       }
-
-       if (mask & ETH_VLAN_EXTEND_MASK)
-               DP_INFO(edev, "No offloads are supported with VLAN Q-in-Q"
-                       " and classification is based on outer tag only\n");
-
-       DP_INFO(edev, "vlan offload mask %d vlan-strip %d vlan-filter %d\n",
-               mask, rxmode->hw_vlan_strip, rxmode->hw_vlan_filter);
-}
-
 static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev,
                                uint16_t vlan_id, int on)
 {
@@ -762,6 +701,46 @@ static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev,
        return rc;
 }
 
+static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
+{
+       struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
+       struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
+       struct rte_eth_rxmode *rxmode = &eth_dev->data->dev_conf.rxmode;
+
+       if (mask & ETH_VLAN_STRIP_MASK) {
+               if (rxmode->hw_vlan_strip)
+                       (void)qede_vlan_stripping(eth_dev, 1);
+               else
+                       (void)qede_vlan_stripping(eth_dev, 0);
+       }
+
+       if (mask & ETH_VLAN_FILTER_MASK) {
+               /* VLAN filtering kicks in when a VLAN is added */
+               if (rxmode->hw_vlan_filter) {
+                       qede_vlan_filter_set(eth_dev, 0, 1);
+               } else {
+                       if (qdev->configured_vlans > 1) { /* Excluding VLAN0 */
+                               DP_ERR(edev,
+                                 " Please remove existing VLAN filters"
+                                 " before disabling VLAN filtering\n");
+                               /* Signal app that VLAN filtering is still
+                                * enabled
+                                */
+                               rxmode->hw_vlan_filter = true;
+                       } else {
+                               qede_vlan_filter_set(eth_dev, 0, 0);
+                       }
+               }
+       }
+
+       if (mask & ETH_VLAN_EXTEND_MASK)
+               DP_INFO(edev, "No offloads are supported with VLAN Q-in-Q"
+                       " and classification is based on outer tag only\n");
+
+       DP_INFO(edev, "vlan offload mask %d vlan-strip %d vlan-filter %d\n",
+               mask, rxmode->hw_vlan_strip, rxmode->hw_vlan_filter);
+}
+
 static int qede_init_vport(struct qede_dev *qdev)
 {
        struct ecore_dev *edev = &qdev->edev;
@@ -801,7 +780,9 @@ static void qede_prandom_bytes(uint32_t *buff)
 int qede_config_rss(struct rte_eth_dev *eth_dev)
 {
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
+#ifdef RTE_LIBRTE_QEDE_DEBUG_INFO
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
+#endif
        uint32_t def_rss_key[ECORE_RSS_KEY_SIZE];
        struct rte_eth_rss_reta_entry64 reta_conf[2];
        struct rte_eth_rss_conf rss_conf;
@@ -842,7 +823,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
        struct rte_eth_rxmode *rxmode = &eth_dev->data->dev_conf.rxmode;
-       int rc, i, j;
+       int rc;
 
        PMD_INIT_FUNC_TRACE(edev);
 
@@ -925,10 +906,6 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 
        SLIST_INIT(&qdev->vlan_list_head);
 
-       /* Add primary mac for PF */
-       if (IS_PF(edev))
-               qede_mac_addr_set(eth_dev, &qdev->primary_mac);
-
        /* Enable VLAN offloads by default */
        qede_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK  |
                                       ETH_VLAN_FILTER_MASK |
@@ -969,7 +946,7 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev,
 
        PMD_INIT_FUNC_TRACE(edev);
 
-       dev_info->pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
+       dev_info->pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        dev_info->min_rx_bufsize = (uint32_t)QEDE_MIN_RX_BUFF_SIZE;
        dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
        dev_info->rx_desc_lim = qede_rx_desc_lim;
@@ -1072,10 +1049,12 @@ qede_link_update(struct rte_eth_dev *eth_dev, __rte_unused int wait_to_complete)
 
 static void qede_promiscuous_enable(struct rte_eth_dev *eth_dev)
 {
+#ifdef RTE_LIBRTE_QEDE_DEBUG_INIT
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
 
        PMD_INIT_FUNC_TRACE(edev);
+#endif
 
        enum qed_filter_rx_mode_type type = QED_FILTER_RX_MODE_TYPE_PROMISC;
 
@@ -1087,10 +1066,12 @@ static void qede_promiscuous_enable(struct rte_eth_dev *eth_dev)
 
 static void qede_promiscuous_disable(struct rte_eth_dev *eth_dev)
 {
+#ifdef RTE_LIBRTE_QEDE_DEBUG_INIT
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
 
        PMD_INIT_FUNC_TRACE(edev);
+#endif
 
        if (rte_eth_allmulticast_get(eth_dev->data->port_id) == 1)
                qed_configure_filter_rx_mode(eth_dev,
@@ -1122,7 +1103,7 @@ static void qede_poll_sp_sb_cb(void *param)
 
 static void qede_dev_close(struct rte_eth_dev *eth_dev)
 {
-       struct rte_pci_device *pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
        int rc;
@@ -1207,8 +1188,8 @@ qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)
                               RTE_ETHDEV_QUEUE_STAT_CNTRS);
        txq_stat_cntrs = RTE_MIN(QEDE_TSS_COUNT(qdev),
                               RTE_ETHDEV_QUEUE_STAT_CNTRS);
-       if ((rxq_stat_cntrs != QEDE_RSS_COUNT(qdev)) ||
-           (txq_stat_cntrs != QEDE_TSS_COUNT(qdev)))
+       if ((rxq_stat_cntrs != (unsigned int)QEDE_RSS_COUNT(qdev)) ||
+           (txq_stat_cntrs != (unsigned int)QEDE_TSS_COUNT(qdev)))
                DP_VERBOSE(edev, ECORE_MSG_DEBUG,
                       "Not all the queue stats will be displayed. Set"
                       " RTE_ETHDEV_QUEUE_STAT_CNTRS config param"
@@ -1260,8 +1241,9 @@ qede_get_xstats_count(struct qede_dev *qdev) {
 }
 
 static int
-qede_get_xstats_names(__rte_unused struct rte_eth_dev *dev,
-                     struct rte_eth_xstat_name *xstats_names, unsigned limit)
+qede_get_xstats_names(struct rte_eth_dev *dev,
+                     struct rte_eth_xstat_name *xstats_names,
+                     __rte_unused unsigned int limit)
 {
        struct qede_dev *qdev = dev->data->dev_private;
        const unsigned int stat_cnt = qede_get_xstats_count(qdev);
@@ -1489,8 +1471,8 @@ static void qede_init_rss_caps(uint8_t *rss_caps, uint64_t hf)
        *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV6_UDP)  ? ECORE_RSS_IPV6_UDP : 0;
 }
 
-static int qede_rss_hash_update(struct rte_eth_dev *eth_dev,
-                               struct rte_eth_rss_conf *rss_conf)
+int qede_rss_hash_update(struct rte_eth_dev *eth_dev,
+                        struct rte_eth_rss_conf *rss_conf)
 {
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
@@ -1594,18 +1576,73 @@ static int qede_rss_hash_conf_get(struct rte_eth_dev *eth_dev,
        return 0;
 }
 
-static int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
-                               struct rte_eth_rss_reta_entry64 *reta_conf,
-                               uint16_t reta_size)
+static bool qede_update_rss_parm_cmt(struct ecore_dev *edev,
+                                   struct ecore_rss_params *rss)
+{
+       int i, fn;
+       bool rss_mode = 1; /* enable */
+       struct ecore_queue_cid *cid;
+       struct ecore_rss_params *t_rss;
+
+       /* In regular scenario, we'd simply need to take input handlers.
+        * But in CMT, we'd have to split the handlers according to the
+        * engine they were configured on. We'd then have to understand
+        * whether RSS is really required, since 2-queues on CMT doesn't
+        * require RSS.
+        */
+
+       /* CMT should be round-robin */
+       for (i = 0; i < ECORE_RSS_IND_TABLE_SIZE; i++) {
+               cid = rss->rss_ind_table[i];
+
+               if (cid->p_owner == ECORE_LEADING_HWFN(edev))
+                       t_rss = &rss[0];
+               else
+                       t_rss = &rss[1];
+
+               t_rss->rss_ind_table[i / edev->num_hwfns] = cid;
+       }
+
+       t_rss = &rss[1];
+       t_rss->update_rss_ind_table = 1;
+       t_rss->rss_table_size_log = 7;
+       t_rss->update_rss_config = 1;
+
+       /* Make sure RSS is actually required */
+       for_each_hwfn(edev, fn) {
+               for (i = 1; i < ECORE_RSS_IND_TABLE_SIZE / edev->num_hwfns;
+                    i++) {
+                       if (rss[fn].rss_ind_table[i] !=
+                           rss[fn].rss_ind_table[0])
+                               break;
+               }
+
+               if (i == ECORE_RSS_IND_TABLE_SIZE / edev->num_hwfns) {
+                       DP_INFO(edev,
+                               "CMT - 1 queue per-hwfn; Disabling RSS\n");
+                       rss_mode = 0;
+                       goto out;
+               }
+       }
+
+out:
+       t_rss->rss_enable = rss_mode;
+
+       return rss_mode;
+}
+
+int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
+                        struct rte_eth_rss_reta_entry64 *reta_conf,
+                        uint16_t reta_size)
 {
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
        struct ecore_sp_vport_update_params vport_update_params;
-       struct ecore_rss_params params;
+       struct ecore_rss_params *params;
        struct ecore_hwfn *p_hwfn;
        uint16_t i, idx, shift;
        uint8_t entry;
-       int rc;
+       int rc = 0;
 
        if (reta_size > ETH_RSS_RETA_SIZE_128) {
                DP_ERR(edev, "reta_size %d is not supported by hardware\n",
@@ -1614,7 +1651,8 @@ static int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
        }
 
        memset(&vport_update_params, 0, sizeof(vport_update_params));
-       memset(&params, 0, sizeof(params));
+       params = rte_zmalloc("qede_rss", sizeof(*params) * edev->num_hwfns,
+                            RTE_CACHE_LINE_SIZE);
 
        for (i = 0; i < reta_size; i++) {
                idx = i / RTE_RETA_GROUP_SIZE;
@@ -1622,24 +1660,25 @@ static int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
                if (reta_conf[idx].mask & (1ULL << shift)) {
                        entry = reta_conf[idx].reta[shift];
                        /* Pass rxq handles to ecore */
-                       params.rss_ind_table[i] =
+                       params->rss_ind_table[i] =
                                        qdev->fp_array[entry].rxq->handle;
                        /* Update the local copy for RETA query command */
                        qdev->rss_ind_table[i] = entry;
                }
        }
 
+       params->update_rss_ind_table = 1;
+       params->rss_table_size_log = 7;
+       params->update_rss_config = 1;
+
        /* Fix up RETA for CMT mode device */
        if (edev->num_hwfns > 1)
-               qdev->rss_enable = qed_update_rss_parm_cmt(edev,
-                                       params.rss_ind_table[0]);
-       params.update_rss_ind_table = 1;
-       params.rss_table_size_log = 7;
-       params.update_rss_config = 1;
+               qdev->rss_enable = qede_update_rss_parm_cmt(edev,
+                                                           params);
        vport_update_params.vport_id = 0;
        /* Use the current value of rss_enable */
-       params.rss_enable = qdev->rss_enable;
-       vport_update_params.rss_params = &params;
+       params->rss_enable = qdev->rss_enable;
+       vport_update_params.rss_params = params;
 
        for_each_hwfn(edev, i) {
                p_hwfn = &edev->hwfns[i];
@@ -1648,11 +1687,13 @@ static int qede_rss_reta_update(struct rte_eth_dev *eth_dev,
                                           ECORE_SPQ_MODE_EBLOCK, NULL);
                if (rc) {
                        DP_ERR(edev, "vport-update for RSS failed\n");
-                       return rc;
+                       goto out;
                }
        }
 
-       return 0;
+out:
+       rte_free(params);
+       return rc;
 }
 
 static int qede_rss_reta_query(struct rte_eth_dev *eth_dev,
@@ -1682,7 +1723,7 @@ static int qede_rss_reta_query(struct rte_eth_dev *eth_dev,
        return 0;
 }
 
-int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
+static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 {
        struct qede_dev *qdev = QEDE_INIT_QDEV(dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
@@ -1776,14 +1817,14 @@ qede_conf_udp_dst_port(struct rte_eth_dev *eth_dev,
        return 0;
 }
 
-int
+static int
 qede_udp_dst_port_del(struct rte_eth_dev *eth_dev,
                      struct rte_eth_udp_tunnel *tunnel_udp)
 {
        return qede_conf_udp_dst_port(eth_dev, tunnel_udp, false);
 }
 
-int
+static int
 qede_udp_dst_port_add(struct rte_eth_dev *eth_dev,
                      struct rte_eth_udp_tunnel *tunnel_udp)
 {
@@ -2117,13 +2158,12 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
        /* Fix up ecore debug level */
        uint32_t dp_module = ~0 & ~ECORE_MSG_HW;
        uint8_t dp_level = ECORE_LEVEL_VERBOSE;
-       uint32_t max_mac_addrs;
        int rc;
 
        /* Extract key data structures */
        adapter = eth_dev->data->dev_private;
        edev = &adapter->edev;
-       pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
+       pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        pci_addr = pci_dev->addr;
 
        PMD_INIT_FUNC_TRACE(edev);
@@ -2275,7 +2315,9 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
        eth_dev->dev_ops = (is_vf) ? &qede_eth_vf_dev_ops : &qede_eth_dev_ops;
 
        if (do_once) {
+#ifdef RTE_LIBRTE_QEDE_DEBUG_INFO
                qede_print_adapter_info(adapter);
+#endif
                do_once = false;
        }
 
@@ -2382,35 +2424,47 @@ static const struct rte_pci_id pci_id_qede_map[] = {
        {.vendor_id = 0,}
 };
 
-static struct eth_driver rte_qedevf_pmd = {
-       .pci_drv = {
-                   .id_table = pci_id_qedevf_map,
-                   .drv_flags =
-                   RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
-                   .probe = rte_eth_dev_pci_probe,
-                   .remove = rte_eth_dev_pci_remove,
-                  },
-       .eth_dev_init = qedevf_eth_dev_init,
-       .eth_dev_uninit = qedevf_eth_dev_uninit,
-       .dev_private_size = sizeof(struct qede_dev),
+static int qedevf_eth_dev_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 qede_dev), qedevf_eth_dev_init);
+}
+
+static int qedevf_eth_dev_pci_remove(struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_remove(pci_dev, qedevf_eth_dev_uninit);
+}
+
+static struct rte_pci_driver rte_qedevf_pmd = {
+       .id_table = pci_id_qedevf_map,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
+       .probe = qedevf_eth_dev_pci_probe,
+       .remove = qedevf_eth_dev_pci_remove,
 };
 
-static struct eth_driver rte_qede_pmd = {
-       .pci_drv = {
-                   .id_table = pci_id_qede_map,
-                   .drv_flags =
-                   RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
-                   .probe = rte_eth_dev_pci_probe,
-                   .remove = rte_eth_dev_pci_remove,
-                  },
-       .eth_dev_init = qede_eth_dev_init,
-       .eth_dev_uninit = qede_eth_dev_uninit,
-       .dev_private_size = sizeof(struct qede_dev),
+static int qede_eth_dev_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 qede_dev), qede_eth_dev_init);
+}
+
+static int qede_eth_dev_pci_remove(struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_remove(pci_dev, qede_eth_dev_uninit);
+}
+
+static struct rte_pci_driver rte_qede_pmd = {
+       .id_table = pci_id_qede_map,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
+       .probe = qede_eth_dev_pci_probe,
+       .remove = qede_eth_dev_pci_remove,
 };
 
-RTE_PMD_REGISTER_PCI(net_qede, rte_qede_pmd.pci_drv);
+RTE_PMD_REGISTER_PCI(net_qede, rte_qede_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_qede, pci_id_qede_map);
-RTE_PMD_REGISTER_KMOD_DEP(net_qede, "* igb_uio | uio_pci_generic | vfio");
-RTE_PMD_REGISTER_PCI(net_qede_vf, rte_qedevf_pmd.pci_drv);
+RTE_PMD_REGISTER_KMOD_DEP(net_qede, "* igb_uio | uio_pci_generic | vfio-pci");
+RTE_PMD_REGISTER_PCI(net_qede_vf, rte_qedevf_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_qede_vf, pci_id_qedevf_map);
-RTE_PMD_REGISTER_KMOD_DEP(net_qede_vf, "* igb_uio | vfio");
+RTE_PMD_REGISTER_KMOD_DEP(net_qede_vf, "* igb_uio | vfio-pci");