From: Beilei Xing <beilei.x...@intel.com>

Only representor will be parsed for probe again.

Signed-off-by: Qi Zhang <qi.z.zh...@intel.com>
Signed-off-by: Beilei Xing <beilei.x...@intel.com>
---
 drivers/net/cpfl/cpfl_ethdev.c | 69 +++++++++++++++++++++++++++-------
 1 file changed, 56 insertions(+), 13 deletions(-)

diff --git a/drivers/net/cpfl/cpfl_ethdev.c b/drivers/net/cpfl/cpfl_ethdev.c
index eb57e355d2..47c4c5c796 100644
--- a/drivers/net/cpfl/cpfl_ethdev.c
+++ b/drivers/net/cpfl/cpfl_ethdev.c
@@ -26,7 +26,7 @@ rte_spinlock_t cpfl_adapter_lock;
 struct cpfl_adapter_list cpfl_adapter_list;
 bool cpfl_adapter_list_init;
 
-static const char * const cpfl_valid_args[] = {
+static const char * const cpfl_valid_args_first[] = {
        CPFL_REPRESENTOR,
        CPFL_TX_SINGLE_Q,
        CPFL_RX_SINGLE_Q,
@@ -34,6 +34,11 @@ static const char * const cpfl_valid_args[] = {
        NULL
 };
 
+static const char * const cpfl_valid_args_again[] = {
+       CPFL_REPRESENTOR,
+       NULL
+};
+
 uint32_t cpfl_supported_speeds[] = {
        RTE_ETH_SPEED_NUM_NONE,
        RTE_ETH_SPEED_NUM_10M,
@@ -1533,7 +1538,7 @@ parse_repr(const char *key __rte_unused, const char 
*value, void *args)
 }
 
 static int
-cpfl_parse_devargs(struct rte_pci_device *pci_dev, struct cpfl_adapter_ext 
*adapter)
+cpfl_parse_devargs(struct rte_pci_device *pci_dev, struct cpfl_adapter_ext 
*adapter, bool first)
 {
        struct rte_devargs *devargs = pci_dev->device.devargs;
        struct cpfl_devargs *cpfl_args = &adapter->devargs;
@@ -1545,7 +1550,8 @@ cpfl_parse_devargs(struct rte_pci_device *pci_dev, struct 
cpfl_adapter_ext *adap
        if (devargs == NULL)
                return 0;
 
-       kvlist = rte_kvargs_parse(devargs->args, cpfl_valid_args);
+       kvlist = rte_kvargs_parse(devargs->args,
+                       first ? cpfl_valid_args_first : cpfl_valid_args_again);
        if (kvlist == NULL) {
                PMD_INIT_LOG(ERR, "invalid kvargs key");
                return -EINVAL;
@@ -1562,6 +1568,9 @@ cpfl_parse_devargs(struct rte_pci_device *pci_dev, struct 
cpfl_adapter_ext *adap
        if (ret != 0)
                goto fail;
 
+       if (!first)
+               return 0;
+
        ret = rte_kvargs_process(kvlist, CPFL_VPORT, &parse_vport,
                                 cpfl_args);
        if (ret != 0)
@@ -2291,18 +2300,11 @@ cpfl_vport_create(struct rte_pci_device *pci_dev, 
struct cpfl_adapter_ext *adapt
 }
 
 static int
-cpfl_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
-              struct rte_pci_device *pci_dev)
+cpfl_pci_probe_first(struct rte_pci_device *pci_dev)
 {
        struct cpfl_adapter_ext *adapter;
        int retval;
 
-       if (!cpfl_adapter_list_init) {
-               rte_spinlock_init(&cpfl_adapter_lock);
-               TAILQ_INIT(&cpfl_adapter_list);
-               cpfl_adapter_list_init = true;
-       }
-
        adapter = rte_zmalloc("cpfl_adapter_ext",
                              sizeof(struct cpfl_adapter_ext), 0);
        if (adapter == NULL) {
@@ -2310,7 +2312,7 @@ cpfl_pci_probe(struct rte_pci_driver *pci_drv 
__rte_unused,
                return -ENOMEM;
        }
 
-       retval = cpfl_parse_devargs(pci_dev, adapter);
+       retval = cpfl_parse_devargs(pci_dev, adapter, true);
        if (retval != 0) {
                PMD_INIT_LOG(ERR, "Failed to parse private devargs");
                return retval;
@@ -2355,6 +2357,46 @@ cpfl_pci_probe(struct rte_pci_driver *pci_drv 
__rte_unused,
        return retval;
 }
 
+static int
+cpfl_pci_probe_again(struct rte_pci_device *pci_dev, struct cpfl_adapter_ext 
*adapter)
+{
+       int ret;
+
+       ret = cpfl_parse_devargs(pci_dev, adapter, false);
+       if (ret != 0) {
+               PMD_INIT_LOG(ERR, "Failed to parse private devargs");
+               return ret;
+       }
+
+       ret = cpfl_repr_devargs_process(adapter);
+       if (ret != 0) {
+               PMD_INIT_LOG(ERR, "Failed to process reprenstor devargs");
+               return ret;
+       }
+
+       return 0;
+}
+
+static int
+cpfl_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
+              struct rte_pci_device *pci_dev)
+{
+       struct cpfl_adapter_ext *adapter;
+
+       if (!cpfl_adapter_list_init) {
+               rte_spinlock_init(&cpfl_adapter_lock);
+               TAILQ_INIT(&cpfl_adapter_list);
+               cpfl_adapter_list_init = true;
+       }
+
+       adapter = cpfl_find_adapter_ext(pci_dev);
+
+       if (adapter == NULL)
+               return cpfl_pci_probe_first(pci_dev);
+       else
+               return cpfl_pci_probe_again(pci_dev, adapter);
+}
+
 static int
 cpfl_pci_remove(struct rte_pci_device *pci_dev)
 {
@@ -2377,7 +2419,8 @@ cpfl_pci_remove(struct rte_pci_device *pci_dev)
 
 static struct rte_pci_driver rte_cpfl_pmd = {
        .id_table       = pci_id_cpfl_map,
-       .drv_flags      = RTE_PCI_DRV_NEED_MAPPING,
+       .drv_flags      = RTE_PCI_DRV_NEED_MAPPING |
+                         RTE_PCI_DRV_PROBE_AGAIN,
        .probe          = cpfl_pci_probe,
        .remove         = cpfl_pci_remove,
 };
-- 
2.34.1

Reply via email to