From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by smtp.lore.kernel.org (Postfix) with ESMTP id CF9BFCDB479 for ; Wed, 24 Jun 2026 02:04:53 +0000 (UTC) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3C1D640DC9; Wed, 24 Jun 2026 04:03:19 +0200 (CEST) Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by mails.dpdk.org (Postfix) with ESMTP id 1A8E6406A2 for ; Wed, 24 Jun 2026 04:02:50 +0200 (CEST) Received: from localhost.localdomain (unknown [118.112.177.181]) by APP-03 (Coremail) with SMTP id rQCowABnPJPIOjtqaIaoFQ--.11868S2; Wed, 24 Jun 2026 10:02:48 +0800 (CST) From: liujie5@linkdatatechnology.com To: stephen@networkplumber.org Cc: dev@dpdk.org, Jie Liu Subject: [PATCH v6 22/23] net/sxe2: add private devargs parsing Date: Wed, 24 Jun 2026 10:02:48 +0800 Message-ID: <20260624020248.3687368-1-liujie5@linkdatatechnology.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260622092731.3092201-1-liujie5@linkdatatechnology.com> References: <20260622092731.3092201-1-liujie5@linkdatatechnology.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: rQCowABnPJPIOjtqaIaoFQ--.11868S2 X-Coremail-Antispam: 1UD129KBjvAXoW3Aw45Gw47Kw4UGF1xKr1fXrb_yoW8CrWfto WIgrW3Xa4fZ34Ig3ykAr1kCrW2vw48Cw15Ja1S9F4DuwsxGw15KF1aqr13XF1DWFsYqF1U u3Z2y3s7trs7JF18n29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUYo7AC8VAFwI0_Jr0_Gr1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2 x7M28EF7xvwVC0I7IYx2IY67AKxVW5JVW7JwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVWx JVW8Jr1l84ACjcxK6I8E87Iv67AKxVWxJVW8Jr1l84ACjcxK6I8E87Iv6xkF7I0E14v26r 4UJVWxJr1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2Wl Yx0E2Ix0cI8IcVAFwI0_Jw0_WrylYx0Ex4A2jsIE14v26r4j6F4UMcvjeVCFs4IE7xkEbV WUJVW8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lw4CEc2x0rVAK j4xxMxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI 0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y 0x0EwIxGrwCI42IY6xIIjxv20xvE14v26ryj6F1UMIIF0xvE2Ix0cI8IcVCY1x0267AKxV WxJVW8Jr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r4j6F4U MIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JU4v38UUU UU= X-Originating-IP: [118.112.177.181] X-CM-SenderInfo: xolxyxrhv6zxpqngt3pdwhux5qro0w31of0z/ 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: Jie Liu Introduce runtime private device arguments (devargs) support for the sxe2 PMD. This allows users to customize driver behavior at startup without recompiling the source code. The parameters are parsed using the standard 'rte_kvargs' library during the PCI/vdev probing phase. Documentation for these parameters is also updated. Signed-off-by: Jie Liu --- drivers/net/sxe2/sxe2_cmd_chnl.c | 21 +++ drivers/net/sxe2/sxe2_cmd_chnl.h | 3 + drivers/net/sxe2/sxe2_drv_cmd.h | 17 +++ drivers/net/sxe2/sxe2_dump.c | 17 ++- drivers/net/sxe2/sxe2_ethdev.c | 223 +++++++++++++++++++++++++++++++ drivers/net/sxe2/sxe2_ethdev.h | 6 + drivers/net/sxe2/sxe2_flow.c | 9 +- drivers/net/sxe2/sxe2_irq.c | 30 +++++ drivers/net/sxe2/sxe2_rx.c | 12 ++ 9 files changed, 333 insertions(+), 5 deletions(-) diff --git a/drivers/net/sxe2/sxe2_cmd_chnl.c b/drivers/net/sxe2/sxe2_cmd_chnl.c index 43e8c59487..b09989fe50 100644 --- a/drivers/net/sxe2/sxe2_cmd_chnl.c +++ b/drivers/net/sxe2/sxe2_cmd_chnl.c @@ -99,6 +99,27 @@ int32_t sxe2_drv_dev_info_get(struct sxe2_adapter *adapter, return ret; } +int32_t sxe2_drv_fc_state_get(struct sxe2_adapter *adapter, + struct sxe2_drv_vsi_fc_get_resp *dev_fc_state_resp) +{ + int32_t ret = 0; + struct sxe2_common_device *cdev = adapter->cdev; + struct sxe2_drv_cmd_params param = {0}; + struct sxe2_drv_vsi_fc_get_req req = {0}; + + req.vsi_id = adapter->vsi_ctxt.main_vsi->vsi_id; + sxe2_drv_cmd_params_fill(adapter, ¶m, SXE2_DRV_CMD_VSI_FC_GET, + &req, sizeof(req), + dev_fc_state_resp, + sizeof(*dev_fc_state_resp)); + ret = sxe2_drv_cmd_exec(cdev, ¶m); + if (ret) { + PMD_DEV_LOG_ERR(adapter, DRV, "get fc state failed, ret=%d", ret); + ret = -EIO; + } + return ret; +} + int32_t sxe2_drv_dev_fw_info_get(struct sxe2_adapter *adapter, struct sxe2_drv_dev_fw_info_resp *dev_fw_info_resp) { diff --git a/drivers/net/sxe2/sxe2_cmd_chnl.h b/drivers/net/sxe2/sxe2_cmd_chnl.h index 988d4b458b..d63caad526 100644 --- a/drivers/net/sxe2/sxe2_cmd_chnl.h +++ b/drivers/net/sxe2/sxe2_cmd_chnl.h @@ -99,6 +99,9 @@ int32_t sxe2_drv_vsi_stats_reset(struct sxe2_adapter *adapter); int32_t sxe2_drv_queue_info_get_update(struct sxe2_adapter *adapter, struct eth_queue_stats *qstats); +int32_t sxe2_drv_fc_state_get(struct sxe2_adapter *adapter, + struct sxe2_drv_vsi_fc_get_resp *dev_fc_state_resp); + int32_t sxe2_drv_rxq_mapping_set(struct rte_eth_dev *eth_dev, uint16_t queue_id, uint8_t pool_idx); int32_t sxe2_drv_txq_mapping_set(struct rte_eth_dev *eth_dev, uint16_t queue_id, uint8_t pool_idx); diff --git a/drivers/net/sxe2/sxe2_drv_cmd.h b/drivers/net/sxe2/sxe2_drv_cmd.h index 3fabf351af..03ef3b315d 100644 --- a/drivers/net/sxe2/sxe2_drv_cmd.h +++ b/drivers/net/sxe2/sxe2_drv_cmd.h @@ -651,6 +651,23 @@ struct __rte_aligned(4) __rte_packed_begin sxe2_drv_sfp_resp { uint8_t data[]; } __rte_packed_end; +enum sxe2_fc_type { + SXE2_FC_T_DIS = 0, + SXE2_FC_T_LFC, + SXE2_FC_T_PFC, + SXE2_FC_T_UNKNOWN = 255, +}; + +struct __rte_aligned(4) __rte_packed_begin sxe2_drv_vsi_fc_get_req { + uint16_t vsi_id; + uint8_t rsv[2]; +} __rte_packed_end; + +struct __rte_aligned(4) __rte_packed_begin sxe2_drv_vsi_fc_get_resp { + uint8_t fc_enable; + uint8_t rsv[3]; +} __rte_packed_end; + enum sxe2_drv_cmd_module { SXE2_DRV_CMD_MODULE_HANDSHAKE = 0, SXE2_DRV_CMD_MODULE_DEV = 1, diff --git a/drivers/net/sxe2/sxe2_dump.c b/drivers/net/sxe2/sxe2_dump.c index d43473e083..e9cc47a966 100644 --- a/drivers/net/sxe2/sxe2_dump.c +++ b/drivers/net/sxe2/sxe2_dump.c @@ -78,13 +78,11 @@ sxe2_dump_dev_args_info(FILE *file, struct rte_eth_dev *dev) fprintf(file, " - Device Args Info:\n" "\t -- no_sched_mode: %s\n" - "\t -- flow-duplicate-pattern: %u\n" "\t -- fnav-stat-type: %u\n" "\t -- sched_layer_mode: %u\n" "\t -- rx_low_latency: %s\n" "\t -- function-flow-direct: %s\n", adapter->devargs.no_sched_mode ? "On" : "Off", - adapter->devargs.flow_dup_pattern_mode, adapter->devargs.fnav_stat_type, adapter->devargs.sched_layer_mode, adapter->devargs.rx_low_latency ? "On" : "Off", @@ -186,6 +184,20 @@ static void sxe2_dump_filter_info(FILE *file, struct rte_eth_dev *dev) return; } +static void sxe2_dump_fc_state(FILE *file, struct rte_eth_dev *dev) +{ + struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev); + + if (!(adapter->cap_flags & SXE2_DEV_CAPS_OFFLOAD_FC_STATE)) + goto l_end; + + fprintf(file, " -- fc state:\n" + "\t -- curr_state: %u\n", + adapter->fc_state_ctx.curr_state); +l_end: + return; +} + static const char *sxe2_vsi_id_str(uint16_t vsi_id, char *buf, size_t len) { if (vsi_id == SXE2_INVALID_VSI_ID) @@ -272,6 +284,7 @@ int32_t sxe2_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) sxe2_dump_dev_args_info(str, dev); sxe2_dump_filter_info(str, dev); sxe2_dump_switchdev_info(str, dev); + sxe2_dump_fc_state(str, dev); (void)fflush(str); diff --git a/drivers/net/sxe2/sxe2_ethdev.c b/drivers/net/sxe2/sxe2_ethdev.c index 6267f0499d..b24d2f1839 100644 --- a/drivers/net/sxe2/sxe2_ethdev.c +++ b/drivers/net/sxe2/sxe2_ethdev.c @@ -67,6 +67,12 @@ static const struct rte_pci_id pci_id_sxe2_tbl[] = { { RTE_PCI_DEVICE(SXE2_PCI_VENDOR_ID_206F, SXE2_PCI_DEVICE_ID_VF_1)}, { .vendor_id = 0, }, }; +#define SXE2_TXSCH_NODE_ADJ_LVL_MAX 3 +#define SXE2_DEVARG_FUNC_FLOW_DIRCT "function-flow-direct" +#define SXE2_DEVARG_FNAV_STAT_TYPE "fnav-stat-type" +#define SXE2_DEVARG_NO_SCHED_MODE "no-sched-mode" +#define SXE2_DEVARG_SCHED_LAYER_MODE "sched-layer-mode" +#define SXE2_DEVARG_RX_LOW_LATENCY "rx-low-latency" static struct sxe2_pci_map_addr_info sxe2_net_map_addr_info_pf[SXE2_PCI_MAP_RES_MAX_COUNT] = { [SXE2_PCI_MAP_RES_INVALID] = {.addr_base = 0, @@ -963,6 +969,121 @@ sxe2_buffer_split_supported_hdr_ptypes_get(struct rte_eth_dev *dev __rte_unused, return ptypes; } +static int32_t sxe2_parse_fnav_stat_type(const char *key, const char *value, void *args) +{ + int32_t ret = -EINVAL; + uint8_t *num = (uint8_t *)args; + unsigned long fnav_stat_type; + char *endptr = NULL; + + if (value == NULL || args == NULL) { + ret = 0; + goto l_end; + } + errno = 0; + fnav_stat_type = strtoul(value, &endptr, 10); + if (errno != 0 || endptr == value || *endptr != '\0') { + PMD_LOG_WARN(INIT, "%s: \"%s\" is not a valid int value.", + key, value); + goto l_end; + } + if (fnav_stat_type > SXE2_FNAV_STAT_ENA_ALL || + fnav_stat_type == SXE2_FNAV_STAT_ENA_NONE) { + PMD_LOG_ERR(INIT, "%s: \"%s\" out of range [1-3].", + key, value); + goto l_end; + } + *num = (uint8_t)fnav_stat_type; + ret = 0; +l_end: + return ret; +} +static int32_t sxe2_parse_sched_layer_mode(const char *key, const char *value, void *args) +{ + int32_t ret = -EINVAL; + uint8_t *num = (uint8_t *)args; + unsigned long sched_layer_mode; + char *endptr = NULL; + + if (value == NULL || args == NULL) { + ret = 0; + goto l_end; + } + errno = 0; + sched_layer_mode = strtoul(value, &endptr, 10); + if (errno != 0 || endptr == value || *endptr != '\0') { + PMD_LOG_WARN(INIT, "%s: \"%s\" is not a valid int value.", + key, value); + goto l_end; + } + if (sched_layer_mode > SXE2_TXSCH_NODE_ADJ_LVL_MAX) { + PMD_LOG_ERR(INIT, "%s: \"%s\" > 3.", + key, value); + goto l_end; + } + *num = (uint8_t)sched_layer_mode; + ret = 0; +l_end: + return ret; +} +static int32_t sxe2_parse_no_sched_mode(const char *key, const char *value, void *args) +{ + int32_t ret = -EINVAL; + uint8_t *num = (uint8_t *)args; + unsigned long no_sched_mode; + char *endptr = NULL; + + if (value == NULL || args == NULL) { + ret = 0; + goto l_end; + } + errno = 0; + no_sched_mode = strtoul(value, &endptr, 10); + if (errno != 0 || endptr == value || *endptr != '\0') { + PMD_LOG_WARN(INIT, "%s: \"%s\" is not a valid int value.", + key, value); + goto l_end; + } + if (no_sched_mode != 1) { + PMD_LOG_ERR(INIT, "%s: \"%s\" != 1.", + key, value); + goto l_end; + } + *num = (uint8_t)no_sched_mode; + ret = 0; +l_end: + return ret; +} + +static int32_t sxe2_parse_bool(const char *key, const char *value, void *args) +{ + int32_t ret = -EINVAL; + uint8_t *num = (uint8_t *)args; + unsigned long bool_val; + char *endptr = NULL; + + if (value == NULL || args == NULL) { + ret = 0; + goto l_end; + } + errno = 0; + bool_val = strtoul(value, &endptr, 10); + if (errno != 0 || endptr == value || *endptr != '\0') { + PMD_LOG_WARN(INIT, "%s: \"%s\" is not a valid int value.", + key, value); + goto l_end; + } + if (bool_val != 0 && bool_val != 1) { + PMD_LOG_ERR(INIT, "%s: \"%s\" out of range [0|1].", + key, value); + goto l_end; + } + *num = (uint8_t)bool_val; + ret = 0; +l_end: + return ret; +} + struct sxe2_pci_map_bar_info *sxe2_dev_get_bar_info(struct sxe2_adapter *adapter, enum sxe2_pci_map_resource res_type) { @@ -1030,6 +1151,56 @@ void *sxe2_pci_map_addr_get(struct sxe2_adapter *adapter, return addr; } +static int32_t sxe2_args_parse(struct rte_eth_dev *dev, struct sxe2_dev_kvargs_info *kvargs) +{ + struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev); + int32_t ret = 0; + PMD_INIT_FUNC_TRACE(); + + if (kvargs == NULL) + goto l_end; + ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_FNAV_STAT_TYPE, + &sxe2_parse_fnav_stat_type, + &adapter->devargs.fnav_stat_type); + if (ret) { + PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse fnav stat type, ret:%d", ret); + goto l_end; + } + + ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_NO_SCHED_MODE, + &sxe2_parse_no_sched_mode, + &adapter->devargs.no_sched_mode); + if (ret) { + PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse no sched mode, ret:%d", ret); + goto l_end; + } + ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_SCHED_LAYER_MODE, + &sxe2_parse_sched_layer_mode, + &adapter->devargs.sched_layer_mode); + if (ret) { + PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse sched layer mode, ret:%d", ret); + goto l_end; + } + + ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_FUNC_FLOW_DIRCT, + &sxe2_parse_bool, + &adapter->devargs.func_flow_direct_en); + if (ret) { + PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse function flow rule enable," + "ret:%d", ret); + goto l_end; + } + ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_RX_LOW_LATENCY, + &sxe2_parse_bool, + &adapter->devargs.rx_low_latency); + if (ret) { + PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse rx low latency, ret:%d", ret); + goto l_end; + } +l_end: + return ret; +} + static int32_t sxe2_eth_init(struct rte_eth_dev *dev) { int32_t ret = 0; @@ -1582,6 +1753,37 @@ void sxe2_dev_pci_map_uinit(struct rte_eth_dev *dev) adapter->dev_info.dev_data = NULL; } +static int32_t sxe2_fc_state_init(struct rte_eth_dev *dev) +{ + struct sxe2_adapter *adapter = + SXE2_DEV_PRIVATE_TO_ADAPTER(dev); + struct sxe2_drv_vsi_fc_get_resp fc_resp = {0}; + int32_t ret; + + if (!(adapter->cap_flags & SXE2_DEV_CAPS_OFFLOAD_FC_STATE)) { + adapter->fc_state_ctx.cfg_state = 0; + adapter->fc_state_ctx.curr_state = 0; + ret = 0; + goto l_end; + } + ret = sxe2_drv_fc_state_get(adapter, &fc_resp); + if (ret) { + PMD_LOG_ERR(INIT, "Failed to get fc state, ret=[%d]", ret); + goto l_end; + } + adapter->fc_state_ctx.cfg_state = fc_resp.fc_enable; + adapter->fc_state_ctx.curr_state = 0; +l_end: + return ret; +} +static void sxe2_fc_state_uinit(struct rte_eth_dev *dev) +{ + struct sxe2_adapter *adapter = + SXE2_DEV_PRIVATE_TO_ADAPTER(dev); + adapter->fc_state_ctx.cfg_state = 0; + adapter->fc_state_ctx.curr_state = 0; +} + uint32_t sxe2_sched_mode_get(struct sxe2_adapter *adapter) { uint32_t ret_mode = SXE2_SCHED_MODE_INVALID; @@ -1664,6 +1866,12 @@ static int32_t sxe2_dev_init(struct rte_eth_dev *dev, goto l_end; } + ret = sxe2_args_parse(dev, kvargs); + if (ret) { + PMD_LOG_ERR(INIT, "Failed to parse devargs, ret=%d", ret); + goto l_end; + } + ret = sxe2_hw_init(dev); if (ret) { PMD_LOG_ERR(INIT, "Failed to initialize hw, ret=[%d]", ret); @@ -1730,6 +1938,12 @@ static int32_t sxe2_dev_init(struct rte_eth_dev *dev, goto init_flow_err; } + ret = sxe2_fc_state_init(dev); + if (ret) { + PMD_LOG_ERR(INIT, "Failed to init fc state, ret=%d", ret); + goto init_fc_state_err; + } + ret = sxe2_sched_init(dev); if (ret) { PMD_LOG_ERR(INIT, "Failed to init sched, ret=%d", ret); @@ -1753,6 +1967,8 @@ static int32_t sxe2_dev_init(struct rte_eth_dev *dev, init_xstats_err: (void)sxe2_sched_uinit(dev); init_sched_err: + sxe2_fc_state_uinit(dev); +init_fc_state_err: (void)sxe2_flow_uninit(dev); init_flow_err: init_rss_err: @@ -1798,6 +2014,7 @@ static int32_t sxe2_dev_close(struct rte_eth_dev *dev) sxe2_eth_uinit(dev); sxe2_dev_pci_map_uinit(dev); sxe2_free_repr_info(dev); + sxe2_fc_state_uinit(dev); l_end: return 0; @@ -2103,6 +2320,12 @@ RTE_INIT(rte_sxe2_pmd_init) RTE_PMD_EXPORT_NAME(net_sxe2); RTE_PMD_REGISTER_PCI_TABLE(net_sxe2, pci_id_sxe2_tbl); RTE_PMD_REGISTER_KMOD_DEP(net_sxe2, "* sxe2"); +RTE_PMD_REGISTER_PARAM_STRING(net_sxe2, + "function-flow-direct=<0|1> " + "fnav-stat-type=<1|2|3> " + "no-sched-mode=<0|1> " + "sched-layer-mode=<0-3> " + "rx-low-latency=<0|1>"); RTE_LOG_REGISTER_SUFFIX(sxe2_log_init, init, NOTICE); RTE_LOG_REGISTER_SUFFIX(sxe2_log_driver, driver, NOTICE); diff --git a/drivers/net/sxe2/sxe2_ethdev.h b/drivers/net/sxe2/sxe2_ethdev.h index a68b95c0d0..c54e8a435e 100644 --- a/drivers/net/sxe2/sxe2_ethdev.h +++ b/drivers/net/sxe2/sxe2_ethdev.h @@ -310,6 +310,11 @@ struct sxe2_filter_context { bool cur_l2_config; }; +struct sxe2_fc_state_ctxt { + uint8_t curr_state; + uint8_t cfg_state; +}; + struct sxe2_adapter { struct sxe2_common_device *cdev; struct sxe2_dev_info dev_info; @@ -331,6 +336,7 @@ struct sxe2_adapter { struct sxe2_security_ctx security_ctx; struct sxe2_repr_context repr_ctxt; struct sxe2_switchdev_info switchdev_info; + struct sxe2_fc_state_ctxt fc_state_ctx; bool rule_started; bool flow_isolated; bool flow_isolate_cfg; diff --git a/drivers/net/sxe2/sxe2_flow.c b/drivers/net/sxe2/sxe2_flow.c index 187ad95166..5b26f44640 100644 --- a/drivers/net/sxe2/sxe2_flow.c +++ b/drivers/net/sxe2/sxe2_flow.c @@ -759,6 +759,7 @@ static int32_t sxe2_flow_validate_with_flow(struct rte_eth_dev *dev, const struct rte_flow_action actions[], struct rte_flow_error *error) { + struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev); int32_t ret = 0; struct sxe2_flow *flow = NULL; @@ -801,9 +802,11 @@ static int32_t sxe2_flow_validate_with_flow(struct rte_eth_dev *dev, ret = sxe2_flow_check_flow_list_duplicate(dev, flow_list); if (ret != 0) { - rte_flow_error_set(error, EEXIST, RTE_FLOW_ERROR_TYPE_ITEM, - NULL, "Duplicate flow."); - PMD_LOG_ERR(DRV, "Duplicate flow."); + rte_flow_error_set(error, EEXIST, RTE_FLOW_ERROR_TYPE_ITEM, NULL, + adapter->devargs.flow_dup_pattern_mode ? + "Duplicate flow pattern." : + "Duplicate flow pattern is not allowed."); + PMD_LOG_ERR(DRV, "Duplicate flow pattern."); goto l_end; } l_end: diff --git a/drivers/net/sxe2/sxe2_irq.c b/drivers/net/sxe2/sxe2_irq.c index d8e0b19463..3306504761 100644 --- a/drivers/net/sxe2/sxe2_irq.c +++ b/drivers/net/sxe2/sxe2_irq.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "sxe2_ethdev.h" #include "sxe2_irq.h" @@ -47,6 +48,31 @@ static struct sxe2_event_handler event_handler = { static RTE_ATOMIC(uint32_t)event_thread_run; +static int32_t sxe2_fc_state_callback(struct rte_eth_dev *dev) +{ + struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev); + struct sxe2_drv_vsi_fc_get_resp fc_resp = {0}; + int32_t ret; + + if (!(adapter->cap_flags & SXE2_DEV_CAPS_OFFLOAD_FC_STATE)) { + ret = 0; + goto l_end; + } + ret = sxe2_drv_fc_state_get(adapter, &fc_resp); + if (ret) { + PMD_LOG_ERR(INIT, "Failed to get fc state, ret=[%d]", ret); + goto l_end; + } + adapter->fc_state_ctx.cfg_state = fc_resp.fc_enable; + if (dev->data->dev_started) { + PMD_LOG_NOTICE(DRV, "Interrupt event: FC status changed." + "cfg_state:%u curr_state:%u", + adapter->fc_state_ctx.cfg_state, + adapter->fc_state_ctx.curr_state); + } +l_end: + return ret; +} static void sxe2_event_irq_common_handler(struct sxe2_adapter *adapter, uint64_t oicr) { @@ -68,6 +94,10 @@ static void sxe2_event_irq_common_handler(struct sxe2_adapter *adapter, uint64_t PMD_DEV_LOG_INFO(adapter, DRV, "event notify legacy"); (void)sxe2_switchdev_notify_callback(adapter, false); } + if (oicr & RTE_BIT32(SXE2_COM_FC_ST_CHANGE)) { + PMD_DEV_LOG_INFO(adapter, DRV, "fc event notify legacy"); + (void)sxe2_fc_state_callback(dev); + } } static uint32_t sxe2_event_intr_handle(void *param __rte_unused) diff --git a/drivers/net/sxe2/sxe2_rx.c b/drivers/net/sxe2/sxe2_rx.c index 820d4f0620..d700c60083 100644 --- a/drivers/net/sxe2/sxe2_rx.c +++ b/drivers/net/sxe2/sxe2_rx.c @@ -467,12 +467,24 @@ int32_t __rte_cold sxe2_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queu int32_t __rte_cold sxe2_rxqs_all_start(struct rte_eth_dev *dev) { struct rte_eth_dev_data *data = dev->data; + struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev); + struct sxe2_drv_vsi_fc_get_resp fc_resp = {0}; struct sxe2_rx_queue *rxq; uint16_t nb_rxq; uint16_t nb_started_rxq; int32_t ret; PMD_INIT_FUNC_TRACE(); + if (adapter->cap_flags & SXE2_DEV_CAPS_OFFLOAD_FC_STATE) { + ret = sxe2_drv_fc_state_get(adapter, &fc_resp); + if (ret) { + PMD_LOG_ERR(RX, "Failed to get fc state, ret=[%d]", ret); + goto l_end; + } + adapter->fc_state_ctx.cfg_state = fc_resp.fc_enable; + adapter->fc_state_ctx.curr_state = adapter->fc_state_ctx.cfg_state; + } + for (nb_rxq = 0; nb_rxq < data->nb_rx_queues; nb_rxq++) { rxq = dev->data->rx_queues[nb_rxq]; if (!rxq || rxq->rx_deferred_start) -- 2.52.0