drivers/net: fix vfio kmod dependency
[dpdk.git] / drivers / net / sfc / sfc_ethdev.c
index 8f36450..bdb4c46 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <rte_dev.h>
 #include <rte_ethdev.h>
+#include <rte_ethdev_pci.h>
 #include <rte_pci.h>
 #include <rte_errno.h>
 
@@ -192,8 +193,6 @@ sfc_dev_configure(struct rte_eth_dev *dev)
        sfc_adapter_lock(sa);
        switch (sa->state) {
        case SFC_ADAPTER_CONFIGURED:
-               sfc_close(sa);
-               SFC_ASSERT(sa->state == SFC_ADAPTER_INITIALIZED);
                /* FALLTHROUGH */
        case SFC_ADAPTER_INITIALIZED:
                rc = sfc_configure(sa);
@@ -1085,10 +1084,12 @@ sfc_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 {
        struct sfc_adapter *sa = dev->data->dev_private;
 
-       if ((sa->rss_channels == 1) ||
-           (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE))
+       if (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE)
                return -ENOTSUP;
 
+       if (sa->rss_channels == 0)
+               return -EINVAL;
+
        sfc_adapter_lock(sa);
 
        /*
@@ -1115,12 +1116,16 @@ sfc_dev_rss_hash_update(struct rte_eth_dev *dev,
        unsigned int efx_hash_types;
        int rc = 0;
 
-       if ((sa->rss_channels == 1) ||
-           (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE)) {
+       if (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE) {
                sfc_err(sa, "RSS is not available");
                return -ENOTSUP;
        }
 
+       if (sa->rss_channels == 0) {
+               sfc_err(sa, "RSS is not configured");
+               return -EINVAL;
+       }
+
        if ((rss_conf->rss_key != NULL) &&
            (rss_conf->rss_key_len != sizeof(sa->rss_key))) {
                sfc_err(sa, "RSS key size is wrong (should be %lu)",
@@ -1177,10 +1182,12 @@ sfc_dev_rss_reta_query(struct rte_eth_dev *dev,
        struct sfc_adapter *sa = dev->data->dev_private;
        int entry;
 
-       if ((sa->rss_channels == 1) ||
-           (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE))
+       if (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE)
                return -ENOTSUP;
 
+       if (sa->rss_channels == 0)
+               return -EINVAL;
+
        if (reta_size != EFX_RSS_TBL_SIZE)
                return -EINVAL;
 
@@ -1210,12 +1217,16 @@ sfc_dev_rss_reta_update(struct rte_eth_dev *dev,
        int rc;
 
 
-       if ((sa->rss_channels == 1) ||
-           (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE)) {
+       if (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE) {
                sfc_err(sa, "RSS is not available");
                return -ENOTSUP;
        }
 
+       if (sa->rss_channels == 0) {
+               sfc_err(sa, "RSS is not configured");
+               return -EINVAL;
+       }
+
        if (reta_size != EFX_RSS_TBL_SIZE) {
                sfc_err(sa, "RETA size is wrong (should be %u)",
                        EFX_RSS_TBL_SIZE);
@@ -1370,9 +1381,6 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
        const char *tx_name = NULL;
        int rc;
 
-       if (sa == NULL || sa->state == SFC_ADAPTER_UNINITIALIZED)
-               return -E_RTE_SECONDARY;
-
        switch (sa->family) {
        case EFX_FAMILY_HUNTINGTON:
        case EFX_FAMILY_MEDFORD:
@@ -1470,6 +1478,7 @@ sfc_register_dp(void)
 
                sfc_dp_register(&sfc_dp_head, &sfc_ef10_tx.dp);
                sfc_dp_register(&sfc_dp_head, &sfc_efx_tx.dp);
+               sfc_dp_register(&sfc_dp_head, &sfc_ef10_simple_tx.dp);
        }
 }
 
@@ -1510,6 +1519,16 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
        sfc_adapter_lock_init(sa);
        sfc_adapter_lock(sa);
 
+       sfc_log_init(sa, "probing");
+       rc = sfc_probe(sa);
+       if (rc != 0)
+               goto fail_probe;
+
+       sfc_log_init(sa, "set device ops");
+       rc = sfc_eth_dev_set_ops(dev);
+       if (rc != 0)
+               goto fail_set_ops;
+
        sfc_log_init(sa, "attaching");
        rc = sfc_attach(sa);
        if (rc != 0)
@@ -1526,12 +1545,14 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
 
        sfc_adapter_unlock(sa);
 
-       sfc_eth_dev_set_ops(dev);
-
        sfc_log_init(sa, "done");
        return 0;
 
 fail_attach:
+fail_set_ops:
+       sfc_unprobe(sa);
+
+fail_probe:
        sfc_adapter_unlock(sa);
        sfc_adapter_lock_fini(sa);
        rte_free(dev->data->mac_addrs);
@@ -1557,6 +1578,7 @@ sfc_eth_dev_uninit(struct rte_eth_dev *dev)
        sfc_adapter_lock(sa);
 
        sfc_detach(sa);
+       sfc_unprobe(sa);
 
        rte_free(dev->data->mac_addrs);
        dev->data->mac_addrs = NULL;
@@ -1587,23 +1609,30 @@ static const struct rte_pci_id pci_id_sfc_efx_map[] = {
        { .vendor_id = 0 /* sentinel */ }
 };
 
-static struct eth_driver sfc_efx_pmd = {
-       .pci_drv = {
-               .id_table = pci_id_sfc_efx_map,
-               .drv_flags =
-                       RTE_PCI_DRV_INTR_LSC |
-                       RTE_PCI_DRV_NEED_MAPPING,
-               .probe = rte_eth_dev_pci_probe,
-               .remove = rte_eth_dev_pci_remove,
-       },
-       .eth_dev_init = sfc_eth_dev_init,
-       .eth_dev_uninit = sfc_eth_dev_uninit,
-       .dev_private_size = sizeof(struct sfc_adapter),
+static int sfc_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 sfc_adapter), sfc_eth_dev_init);
+}
+
+static int sfc_eth_dev_pci_remove(struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_remove(pci_dev, sfc_eth_dev_uninit);
+}
+
+static struct rte_pci_driver sfc_efx_pmd = {
+       .id_table = pci_id_sfc_efx_map,
+       .drv_flags =
+               RTE_PCI_DRV_INTR_LSC |
+               RTE_PCI_DRV_NEED_MAPPING,
+       .probe = sfc_eth_dev_pci_probe,
+       .remove = sfc_eth_dev_pci_remove,
 };
 
-RTE_PMD_REGISTER_PCI(net_sfc_efx, sfc_efx_pmd.pci_drv);
+RTE_PMD_REGISTER_PCI(net_sfc_efx, sfc_efx_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_sfc_efx, pci_id_sfc_efx_map);
-RTE_PMD_REGISTER_KMOD_DEP(net_sfc_efx, "* igb_uio | uio_pci_generic | vfio");
+RTE_PMD_REGISTER_KMOD_DEP(net_sfc_efx, "* igb_uio | uio_pci_generic | vfio-pci");
 RTE_PMD_REGISTER_PARAM_STRING(net_sfc_efx,
        SFC_KVARG_RX_DATAPATH "=" SFC_KVARG_VALUES_RX_DATAPATH " "
        SFC_KVARG_TX_DATAPATH "=" SFC_KVARG_VALUES_TX_DATAPATH " "