From patchwork Wed Apr 28 08:42:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 92318 X-Patchwork-Delegate: thomas@monjalon.net 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 0A965A0A0E; Wed, 28 Apr 2021 10:42:54 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7A0324014E; Wed, 28 Apr 2021 10:42:54 +0200 (CEST) Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) by mails.dpdk.org (Postfix) with ESMTP id 1D4BA40147 for ; Wed, 28 Apr 2021 10:42:53 +0200 (CEST) Received: from DGGEMS411-HUB.china.huawei.com (unknown [172.30.72.60]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4FVXCP5jV6zlb3P for ; Wed, 28 Apr 2021 16:40:49 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by DGGEMS411-HUB.china.huawei.com (10.3.19.211) with Microsoft SMTP Server id 14.3.498.0; Wed, 28 Apr 2021 16:42:49 +0800 From: "Min Hu (Connor)" To: CC: Date: Wed, 28 Apr 2021 16:42:59 +0800 Message-ID: <1619599379-470-1-git-send-email-humin29@huawei.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 X-Originating-IP: [10.69.192.56] X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH] examples/ethtool: fix pause configuration 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 Sender: "dev" From: Huisong Li Currently, the pause command in ethtool to enable Rx/Tx pause has the following problem. Namely, Assume that the device supports flow control auto-negotiation to set pause parameters, which will the device that does not support flow control auto-negotiation fails to run this command. This patch supports the configuration of flow control auto-negotiation and fixes the print format and style of the pause cmd to make it more readable. Fixes: bda68ab9d1e7 ("examples/ethtool: add user-space ethtool sample application") Signed-off-by: Huisong Li Signed-off-by: Min Hu (Connor) Acked-by: Stephen Hemminger --- examples/ethtool/ethtool-app/ethapp.c | 59 +++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/examples/ethtool/ethtool-app/ethapp.c b/examples/ethtool/ethtool-app/ethapp.c index 36a1c37..057fa97 100644 --- a/examples/ethtool/ethtool-app/ethapp.c +++ b/examples/ethtool/ethtool-app/ethapp.c @@ -49,6 +49,13 @@ struct pcmd_intintint_params { uint16_t rx; }; +struct pcmd_pause_params { + cmdline_fixed_string_t cmd; + uint16_t port; + cmdline_fixed_string_t mode; + cmdline_fixed_string_t autoneg; + cmdline_fixed_string_t an_status; +}; /* Parameter-less commands */ cmdline_parse_token_string_t pcmd_quit_token_cmd = @@ -116,12 +123,18 @@ cmdline_parse_token_num_t pcmd_intintint_token_rx = /* Pause commands */ cmdline_parse_token_string_t pcmd_pause_token_cmd = - TOKEN_STRING_INITIALIZER(struct pcmd_intstr_params, cmd, "pause"); + TOKEN_STRING_INITIALIZER(struct pcmd_pause_params, cmd, "pause"); cmdline_parse_token_num_t pcmd_pause_token_port = - TOKEN_NUM_INITIALIZER(struct pcmd_intstr_params, port, RTE_UINT16); -cmdline_parse_token_string_t pcmd_pause_token_opt = - TOKEN_STRING_INITIALIZER(struct pcmd_intstr_params, - opt, "all#tx#rx#none"); + TOKEN_NUM_INITIALIZER(struct pcmd_pause_params, port, RTE_UINT16); +cmdline_parse_token_string_t pcmd_pause_token_mode = + TOKEN_STRING_INITIALIZER(struct pcmd_pause_params, + mode, "full#tx#rx#none"); +cmdline_parse_token_string_t pcmd_pause_token_autoneg = + TOKEN_STRING_INITIALIZER(struct pcmd_pause_params, + autoneg, "autoneg"); +cmdline_parse_token_string_t pcmd_pause_token_an_status = + TOKEN_STRING_INITIALIZER(struct pcmd_pause_params, + an_status, "on#off"); /* VLAN commands */ cmdline_parse_token_string_t pcmd_vlan_token_cmd = @@ -348,13 +361,12 @@ pcmd_module_eeprom_callback(void *ptr_params, fclose(fp_eeprom); } - static void pcmd_pause_callback(void *ptr_params, __rte_unused struct cmdline *ctx, void *ptr_data) { - struct pcmd_intstr_params *params = ptr_params; + struct pcmd_pause_params *params = ptr_params; struct ethtool_pauseparam info; int stat; @@ -366,39 +378,38 @@ pcmd_pause_callback(void *ptr_params, stat = rte_ethtool_get_pauseparam(params->port, &info); } else { memset(&info, 0, sizeof(info)); - if (strcasecmp("all", params->opt) == 0) { + if (strcasecmp("full", params->mode) == 0) { info.tx_pause = 1; info.rx_pause = 1; - } else if (strcasecmp("tx", params->opt) == 0) { + } else if (strcasecmp("tx", params->mode) == 0) { info.tx_pause = 1; info.rx_pause = 0; - } else if (strcasecmp("rx", params->opt) == 0) { + } else if (strcasecmp("rx", params->mode) == 0) { info.tx_pause = 0; info.rx_pause = 1; } else { info.tx_pause = 0; info.rx_pause = 0; } - /* Assume auto-negotiation wanted */ - info.autoneg = 1; + + if (strcasecmp("on", params->an_status) == 0) + info.autoneg = 1; + else + info.autoneg = 0; + stat = rte_ethtool_set_pauseparam(params->port, &info); } if (stat == 0) { - if (info.rx_pause && info.tx_pause) - printf("Port %i: Tx & Rx Paused\n", params->port); - else if (info.rx_pause) - printf("Port %i: Rx Paused\n", params->port); - else if (info.tx_pause) - printf("Port %i: Tx Paused\n", params->port); - else - printf("Port %i: Tx & Rx not paused\n", params->port); + printf("Pause parameters for Port %i:\n", params->port); + printf("Rx pause: %s\n", info.rx_pause ? "on" : "off"); + printf("Tx pause: %s\n", info.tx_pause ? "on" : "off"); + printf("Autoneg: %s\n", info.autoneg ? "on" : "off"); } else if (stat == -ENOTSUP) printf("Port %i: Operation not supported\n", params->port); else printf("Port %i: Error %i\n", params->port, stat); } - static void pcmd_open_callback(__rte_unused void *ptr_params, __rte_unused struct cmdline *ctx, @@ -741,11 +752,13 @@ cmdline_parse_inst_t pcmd_pause = { .f = pcmd_pause_callback, .data = NULL, .help_str = - "pause \n Pause/unpause port", + "pause autoneg \n Pause/unpause port", .tokens = { (void *)&pcmd_pause_token_cmd, (void *)&pcmd_pause_token_port, - (void *)&pcmd_pause_token_opt, + (void *)&pcmd_pause_token_mode, + (void *)&pcmd_pause_token_autoneg, + (void *)&pcmd_pause_token_an_status, NULL }, };