On Tue, Jan 31, 2017 at 01:45:29PM +0200, Shahaf Shuler wrote: > Trying to query the link status through new kernel ioctl API > ETHTOOL_GLINKSETTINGS was always failing due to kernel bug. > The bug was fixed on version 4.9 > this patch uses the legacy ioctl API for lower kernels. > > Fixes: 188408719888 ("net/mlx5: fix support for newer link speeds") > CC: sta...@dpdk.org > > Signed-off-by: Shahaf Shuler <shah...@mellanox.com> > --- > on v2: > * remove HAVE_ETHTOOL_LINK_MODE_* > > --- > drivers/net/mlx5/Makefile | 15 --------------- > drivers/net/mlx5/mlx5_ethdev.c | 12 +++--------- > 2 files changed, 3 insertions(+), 24 deletions(-) > > diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile > index 671089c..0b8f7ba 100644 > --- a/drivers/net/mlx5/Makefile > +++ b/drivers/net/mlx5/Makefile > @@ -122,21 +122,6 @@ mlx5_autoconf.h.new: > $(RTE_SDK)/buildtools/auto-config-h.sh > infiniband/mlx5_hw.h \ > enum MLX5_OPCODE_TSO \ > $(AUTOCONF_OUTPUT) > - $Q sh -- '$<' '$@' \ > - HAVE_ETHTOOL_LINK_MODE_25G \ > - /usr/include/linux/ethtool.h \ > - enum ETHTOOL_LINK_MODE_25000baseCR_Full_BIT \ > - $(AUTOCONF_OUTPUT) > - $Q sh -- '$<' '$@' \ > - HAVE_ETHTOOL_LINK_MODE_50G \ > - /usr/include/linux/ethtool.h \ > - enum ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT \ > - $(AUTOCONF_OUTPUT) > - $Q sh -- '$<' '$@' \ > - HAVE_ETHTOOL_LINK_MODE_100G \ > - /usr/include/linux/ethtool.h \ > - enum ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT \ > - $(AUTOCONF_OUTPUT) > > # Create mlx5_autoconf.h or update it in case it differs from the new one. > > diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c > index 8efdff7..53599fa 100644 > --- a/drivers/net/mlx5/mlx5_ethdev.c > +++ b/drivers/net/mlx5/mlx5_ethdev.c > @@ -46,6 +46,7 @@ > #include <netinet/in.h> > #include <linux/ethtool.h> > #include <linux/sockios.h> > +#include <linux/version.h> > #include <fcntl.h> > > /* DPDK headers don't like -pedantic. */ > @@ -697,7 +698,7 @@ struct priv * > > /** > * Retrieve physical link information (unlocked version using new ioctl from > - * Linux 4.5). > + * Linux 4.9). > * > * @param dev > * Pointer to Ethernet device structure. > @@ -707,7 +708,7 @@ struct priv * > static int > mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev, int wait_to_complete) > { > -#ifdef ETHTOOL_GLINKSETTINGS > +#if KERNEL_VERSION(4, 9, 0) <= LINUX_VERSION_CODE > struct priv *priv = mlx5_get_priv(dev); > struct ethtool_link_settings edata = { > .cmd = ETHTOOL_GLINKSETTINGS, > @@ -757,25 +758,18 @@ struct priv * > ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT | > ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT)) > priv->link_speed_capa |= ETH_LINK_SPEED_56G; > - /* Link speeds available in kernel v4.6. */ > -#ifdef HAVE_ETHTOOL_LINK_MODE_25G > if (sc & (ETHTOOL_LINK_MODE_25000baseCR_Full_BIT | > ETHTOOL_LINK_MODE_25000baseKR_Full_BIT | > ETHTOOL_LINK_MODE_25000baseSR_Full_BIT)) > priv->link_speed_capa |= ETH_LINK_SPEED_25G; > -#endif > -#ifdef HAVE_ETHTOOL_LINK_MODE_50G > if (sc & (ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT | > ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT)) > priv->link_speed_capa |= ETH_LINK_SPEED_50G; > -#endif > -#ifdef HAVE_ETHTOOL_LINK_MODE_100G > if (sc & (ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT | > ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT | > ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT | > ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT)) > priv->link_speed_capa |= ETH_LINK_SPEED_100G; > -#endif > dev_link.link_duplex = ((edata.duplex == DUPLEX_HALF) ? > ETH_LINK_HALF_DUPLEX : ETH_LINK_FULL_DUPLEX); > dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & > -- > 1.8.3.1
Acked-by: Nelio Laranjeiro <nelio.laranje...@6wind.com> -- Nélio Laranjeiro 6WIND