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 1b21134ec1..236347eeb3 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) @@ -2289,18 +2298,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) { @@ -2308,7 +2310,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; @@ -2353,6 +2355,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) { @@ -2375,7 +2417,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