From patchwork Wed Aug 16 15:05:35 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 130395 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 67F884307C; Wed, 16 Aug 2023 08:47:11 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 61C0E4326C; Wed, 16 Aug 2023 08:46:48 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 258F8427E9 for ; Wed, 16 Aug 2023 08:46:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1692168401; x=1723704401; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4JEAszuRjO0bI+ZRASJjvJb4W/iayzkFd3m65D95T48=; b=UEuXOmCXzR7DBe7vAssvhtguoMSwivO2Ul28uE+HUZ1AH1axpAvlNrzB 3td+8D/az6beaME6HD4JciiJ/R3vHj0rogeKIlUsQ6/JXo1aK0EUrVd9/ y0kDqJkUwcxyEOu4eSgahIxoLPmBZUvtbe5MdJjXnA3u54Fk5UW1TWlFK 4lwoxHiXbiZdqnQtZNq1HtEjsXH28ZMpMBcL2HqjbsKuRSSfPXEPY/FF9 w5ftBcarg8LNeBE02S8WSylBE2K5zvTZCm50LDKKvqaebIPuO+KNnJlIh kxHiSZ4A0r9NhRmhN2hpTFQ8e1siKFPqSgBDVxph/jQzPgnUArFf5GdBc g==; X-IronPort-AV: E=McAfee;i="6600,9927,10803"; a="436357181" X-IronPort-AV: E=Sophos;i="6.01,176,1684825200"; d="scan'208";a="436357181" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Aug 2023 23:46:39 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10803"; a="1064714858" X-IronPort-AV: E=Sophos;i="6.01,176,1684825200"; d="scan'208";a="1064714858" Received: from dpdk-beileix-icelake.sh.intel.com ([10.67.116.248]) by fmsmga005.fm.intel.com with ESMTP; 15 Aug 2023 23:46:37 -0700 From: beilei.xing@intel.com To: jingjing.wu@intel.com Cc: dev@dpdk.org, mingxia.liu@intel.com, Beilei Xing , Qi Zhang Subject: [PATCH v2 06/12] net/cpfl: support probe again Date: Wed, 16 Aug 2023 15:05:35 +0000 Message-Id: <20230816150541.144532-7-beilei.xing@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230816150541.144532-1-beilei.xing@intel.com> References: <20230809155134.539287-1-beilei.xing@intel.com> <20230816150541.144532-1-beilei.xing@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Beilei Xing Only representor will be parsed for probe again. Signed-off-by: Qi Zhang Signed-off-by: Beilei Xing --- 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 a820528a0d..09015fbb08 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, };