> -----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