> -----Original Message-----
> From: Asaf Penso <as...@mellanox.com>
> Sent: Wednesday, May 6, 2020 15:07
> To: Thomas Monjalon <tho...@monjalon.net>; ferruh.yi...@intel.com;
> arybche...@solarflare.com; Slava Ovsiienko <viachesl...@mellanox.com>;
> Matan Azrad <ma...@mellanox.com>
> Cc: dev@dpdk.org
> Subject: [PATCH v3] net/mlx5: add 200G link speed
> 
> There is no way to report back a link speed of 200Gbps.
> 
> Adding 200G link speed.
> 
> Signed-off-by: Asaf Penso <as...@mellanox.com>
For the mlx5-related part:
Acked-by: Viacheslav Ovsiienko <viachesl...@mellanox.com>

> ---
>  app/test-pmd/cmdline.c                      | 12 +++++++-----
>  doc/guides/rel_notes/release_20_05.rst      |  2 ++
>  doc/guides/testpmd_app_ug/testpmd_funcs.rst |  2 +-
>  drivers/net/mlx5/mlx5_ethdev.c              | 22 +++++++++++++++++++++-
>  lib/librte_ethdev/rte_ethdev.c              |  2 ++
>  lib/librte_ethdev/rte_ethdev.h              |  2 ++
>  6 files changed, 35 insertions(+), 7 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> 1375f22..e6c6b68 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -769,7 +769,7 @@ static void cmd_help_long_parsed(void
> *parsed_result,
>                       "    Detach physical or virtual dev by port_id\n\n"
> 
>                       "port config (port_id|all)"
> -                     " speed
> (10|100|1000|10000|25000|40000|50000|100000|auto)"
> +                     " speed
> (10|100|1000|10000|25000|40000|50000|100000|200000|auto)"
>                       " duplex (half|full|auto)\n"
>                       "    Set speed and duplex for all ports or port_id\n\n"
> 
> @@ -1619,6 +1619,8 @@ parse_and_check_speed_duplex(char *speedstr,
> char *duplexstr, uint32_t *speed)
>                       *speed = ETH_LINK_SPEED_50G;
>               } else if (!strcmp(speedstr, "100000")) {
>                       *speed = ETH_LINK_SPEED_100G;
> +             } else if (!strcmp(speedstr, "200000")) {
> +                     *speed = ETH_LINK_SPEED_200G;
>               } else if (!strcmp(speedstr, "auto")) {
>                       *speed = ETH_LINK_SPEED_AUTONEG;
>               } else {
> @@ -1666,7 +1668,7 @@ cmdline_parse_token_string_t
> cmd_config_speed_all_item1 =
>       TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item1,
> "speed");  cmdline_parse_token_string_t cmd_config_speed_all_value1 =
>       TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value1,
> -
>       "10#100#1000#10000#25000#40000#50000#100000#auto");
> +
>       "10#100#1000#10000#25000#40000#50000#100000#200000#auto")
> ;
>  cmdline_parse_token_string_t cmd_config_speed_all_item2 =
>       TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item2,
> "duplex");  cmdline_parse_token_string_t cmd_config_speed_all_value2 =
> @@ -1677,7 +1679,7 @@ cmdline_parse_inst_t cmd_config_speed_all = {
>       .f = cmd_config_speed_all_parsed,
>       .data = NULL,
>       .help_str = "port config all speed "
> -             "10|100|1000|10000|25000|40000|50000|100000|auto
> duplex "
> +
>       "10|100|1000|10000|25000|40000|50000|100000|200000|auto
> duplex "
>                                                       "half|full|auto",
>       .tokens = {
>               (void *)&cmd_config_speed_all_port,
> @@ -1741,7 +1743,7 @@ cmdline_parse_token_string_t
> cmd_config_speed_specific_item1 =
>                                                               "speed");
>  cmdline_parse_token_string_t cmd_config_speed_specific_value1 =
>       TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific,
> value1,
> -
>       "10#100#1000#10000#25000#40000#50000#100000#auto");
> +
>       "10#100#1000#10000#25000#40000#50000#100000#200000#auto")
> ;
>  cmdline_parse_token_string_t cmd_config_speed_specific_item2 =
>       TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific,
> item2,
>                                                               "duplex");
> @@ -1753,7 +1755,7 @@ cmdline_parse_inst_t cmd_config_speed_specific
> = {
>       .f = cmd_config_speed_specific_parsed,
>       .data = NULL,
>       .help_str = "port config <port_id> speed "
> -             "10|100|1000|10000|25000|40000|50000|100000|auto
> duplex "
> +
>       "10|100|1000|10000|25000|40000|50000|100000|200000|auto
> duplex "
>                                                       "half|full|auto",
>       .tokens = {
>               (void *)&cmd_config_speed_specific_port,
> diff --git a/doc/guides/rel_notes/release_20_05.rst
> b/doc/guides/rel_notes/release_20_05.rst
> index 777d36e..eb8a623 100644
> --- a/doc/guides/rel_notes/release_20_05.rst
> +++ b/doc/guides/rel_notes/release_20_05.rst
> @@ -66,6 +66,8 @@ New Features
>    Added tracepoints in ``EAL``, ``ethdev``, ``cryptodev``, ``eventdev`` and
>    ``mempool`` libraries for important functions.
> 
> +* **ethdev: Added a new value to link speed for 200Gbps **
> +
>  * **Added new API for rte_ring.**
> 
>    * New synchronization modes for rte_ring.
> diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> index a360ecc..a1cbb2e 100644
> --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> @@ -2153,7 +2153,7 @@ port config - speed
> 
>  Set the speed and duplex mode for all ports or a specific port::
> 
> -   testpmd> port config (port_id|all) speed
> (10|100|1000|10000|25000|40000|50000|100000|auto) \
> +   testpmd> port config (port_id|all) speed
> + (10|100|1000|10000|25000|40000|50000|100000|200000|auto) \
>              duplex (half|full|auto)
> 
>  port config - queues/descriptors
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c
> b/drivers/net/mlx5/mlx5_ethdev.c index d7d3bc7..47f11b9 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -86,6 +86,7 @@ struct ethtool_link_settings {
>       uint32_t link_mode_masks[];
>  };
> 
> +/* The kernel values can be found in /include/uapi/linux/ethtool.h */
>  #define ETHTOOL_GLINKSETTINGS 0x0000004c  #define
> ETHTOOL_LINK_MODE_1000baseT_Full_BIT 5  #define
> ETHTOOL_LINK_MODE_Autoneg_BIT 6 @@ -119,6 +120,13 @@ struct
> ethtool_link_settings {  #define
> ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT 38  #define
> ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT 39  #endif
> +#ifndef HAVE_ETHTOOL_LINK_MODE_200G
> +#define ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT 62 #define
> +ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT 63 #define
> +ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT 0 /* 64 - 64 */
> +#define ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT 1 /* 65 - 64 */
> +#define ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT 2 /* 66 - 64 */
> #endif
> 
>  /**
>   * Get master interface name from private structure.
> @@ -537,7 +545,8 @@ mlx5_set_default_params(struct rte_eth_dev *dev,
> struct rte_eth_dev_info *info)
>       info->default_txportconf.ring_size = 256;
>       info->default_rxportconf.burst_size = MLX5_RX_DEFAULT_BURST;
>       info->default_txportconf.burst_size = MLX5_TX_DEFAULT_BURST;
> -     if (priv->link_speed_capa & ETH_LINK_SPEED_100G) {
> +     if ((priv->link_speed_capa & ETH_LINK_SPEED_200G) |
> +             (priv->link_speed_capa & ETH_LINK_SPEED_100G)) {
>               info->default_rxportconf.nb_queues = 16;
>               info->default_txportconf.nb_queues = 16;
>               if (dev->data->nb_rx_queues > 2 ||
> @@ -1028,6 +1037,17 @@ mlx5_link_update_unlocked_gs(struct
> rte_eth_dev *dev,
> 
> MLX5_BITSHIFT(ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT) |
> 
> MLX5_BITSHIFT(ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT)))
>               priv->link_speed_capa |= ETH_LINK_SPEED_100G;
> +     if (sc &
> (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT) |
> +
> MLX5_BITSHIFT(ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT)))
> +             priv->link_speed_capa |= ETH_LINK_SPEED_200G;
> +
> +     sc = ecmd->link_mode_masks[2] |
> +             ((uint64_t)ecmd->link_mode_masks[3] << 32);
> +     if (sc &
> (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT) |
> +               MLX5_BITSHIFT(
> +
>       ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT) |
> +
> MLX5_BITSHIFT(ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT)))
> +             priv->link_speed_capa |= ETH_LINK_SPEED_200G;
>       dev_link.link_duplex = ((ecmd->duplex == DUPLEX_HALF) ?
>                               ETH_LINK_HALF_DUPLEX :
> ETH_LINK_FULL_DUPLEX);
>       dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & diff --
> git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index
> 72aed59..a64df8f 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -1099,6 +1099,8 @@ rte_eth_speed_bitflag(uint32_t speed, int duplex)
>               return ETH_LINK_SPEED_56G;
>       case ETH_SPEED_NUM_100G:
>               return ETH_LINK_SPEED_100G;
> +     case ETH_SPEED_NUM_200G:
> +             return ETH_LINK_SPEED_200G;
>       default:
>               return 0;
>       }
> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
> index 0f6d053..a49242b 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -284,6 +284,7 @@ struct rte_eth_stats {
>  #define ETH_LINK_SPEED_50G      (1 << 12)  /**<  50 Gbps */
>  #define ETH_LINK_SPEED_56G      (1 << 13)  /**<  56 Gbps */
>  #define ETH_LINK_SPEED_100G     (1 << 14)  /**< 100 Gbps */
> +#define ETH_LINK_SPEED_200G     (1 << 15)  /**< 200 Gbps */
> 
>  /**
>   * Ethernet numeric link speeds in Mbps @@ -301,6 +302,7 @@ struct
> rte_eth_stats {
>  #define ETH_SPEED_NUM_50G      50000 /**<  50 Gbps */
>  #define ETH_SPEED_NUM_56G      56000 /**<  56 Gbps */
>  #define ETH_SPEED_NUM_100G    100000 /**< 100 Gbps */
> +#define ETH_SPEED_NUM_200G    200000 /**< 200 Gbps */
> 
>  /**
>   * A structure used to retrieve link-level information of an Ethernet port.
> --
> 2.7.4

Reply via email to