From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by dpdk.org (Postfix) with ESMTP id 4A1801B010 for ; Tue, 2 Jan 2018 21:53:16 +0100 (CET) Received: by mail-pf0-f195.google.com with SMTP id l24so26099118pfj.6 for ; Tue, 02 Jan 2018 12:53:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TviLv3Oak9P3PdGIKB60Tl9XHtrr6Uq1snsvkWfRyjg=; b=IGLXkToDKWCXPd9J5AFqlRtsszsRgVv5IJsXZ6A2m++hypFpiUrB3QZq+LanXYjx5O tkkDq+cododkuctWOX0c8GRPU0kO4IqxcXaYpPFs55W2bfkc7XAxT7+Dh5T6R/wi+2I9 Z4VygkUS3LsH5X0sDAZSnAWUEQZ5jcAujAXZ3Kj5bXzVZk7kiogoOjQADyqq1MMDvwwR UENU3dLFc7Yy/Ct7ULvMpL/d21ffEIKd/qL77tMN8LkTUt4qzcTHUV+KdNOeWnYj2erk yray/B1bptZ4waB5vC2UKMnqYKq0Wdu85eutE6kr3eTr7DCoAbw+eyZlBlc9jjnAE6oR qZ3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=TviLv3Oak9P3PdGIKB60Tl9XHtrr6Uq1snsvkWfRyjg=; b=N0ErBUf3zT+xQ4LKRdaMadUbVb0nR93yi9LSweBTLsltVwFNOLaDmskokEIRq5oh1V eGrgWakizgQ+xjnb/Zy7GRxh5ajySa8c6DZyg/SV2XXQTdB6upzVgj3fbC0gLue0JmUd vzHyrLUKha8i3O5VNn2wQQ00iaoQeRQ0BD5rnLcO/k9QPhnoo0WJIQx4tbdieB0+9qOJ 35HWU249lZLokAHzEj8KpY8hVmBMyo3InmtB98PhCxCTEqAlduGb8+CsKn6zFXpKk8UW YM3dxLeLVYyXvhjfVJJOAoyhFA4vkKIUunniAZ1nXBHJSbkhOVncks9/iNHbvMjZbCZK r5hg== X-Gm-Message-State: AKGB3mLJ4LCYtKDahPiTl0P+kUEe98DsMEFsehkDBvxzExVPX2p3NOe3 u7jvEm+N4wbQdZ7XjoStlRL52w== X-Google-Smtp-Source: ACJfBotnzGasth1kD6BwrrL38GgBTYPGd5rCwXjA7asCpXUzwiti0VnLpprMln2WOHKDVUvuvlTG/g== X-Received: by 10.98.89.4 with SMTP id n4mr46152126pfb.133.1514926395202; Tue, 02 Jan 2018 12:53:15 -0800 (PST) Received: from xeon-e3.lan (204-195-18-133.wavecable.com. [204.195.18.133]) by smtp.gmail.com with ESMTPSA id p1sm26223005pgr.53.2018.01.02.12.53.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 02 Jan 2018 12:53:14 -0800 (PST) From: Stephen Hemminger To: adrien.mazarguil@6wind.com, nelio.laranjeiro@6wind.com, yskoh@mellanox.com Cc: dev@dpdk.org, Stephen Hemminger Date: Tue, 2 Jan 2018 12:53:10 -0800 Message-Id: <20180102205310.3586-3-stephen@networkplumber.org> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180102205310.3586-1-stephen@networkplumber.org> References: <20180102205310.3586-1-stephen@networkplumber.org> Subject: [dpdk-dev] [PATCH 2/2] mlx5: don't depend on kernel version X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Jan 2018 20:53:16 -0000 This driver uses ethtool to get link status. The ethtool API has new and old deprecated API. Rather than checking kernel version, use the same algorithm that the ethtool command does; check the new API first and if that fails, try the old one. Also, use common code for getting link state up/down and comparing for changes. Signed-off-by: Stephen Hemminger --- drivers/net/mlx5/mlx5_ethdev.c | 110 ++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 63 deletions(-) diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index 388507f109f7..2dc32cdf58b9 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -49,7 +49,6 @@ #include #include #include -#include #include #include #include @@ -757,36 +756,25 @@ mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev) * Pointer to Ethernet device structure. */ static int -mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev) +mlx5_link_update_unlocked_gset(struct priv *priv, struct ifreq *ifr, + struct rte_eth_link *dev_link) { - struct priv *priv = mlx5_get_priv(dev); struct ethtool_cmd edata = { .cmd = ETHTOOL_GSET /* Deprecated since Linux v4.5. */ }; - struct ifreq ifr; - struct rte_eth_link dev_link; int link_speed = 0; - /* priv_lock() is not taken to allow concurrent calls. */ - - if (priv_ifreq(priv, SIOCGIFFLAGS, &ifr)) { - WARN("ioctl(SIOCGIFFLAGS) failed: %s", strerror(errno)); - return -1; - } - memset(&dev_link, 0, sizeof(dev_link)); - dev_link.link_status = ((ifr.ifr_flags & IFF_UP) && - (ifr.ifr_flags & IFF_RUNNING)); - ifr.ifr_data = (void *)&edata; - if (priv_ifreq(priv, SIOCETHTOOL, &ifr)) { + ifr->ifr_data = (void *)&edata; + if (priv_ifreq(priv, SIOCETHTOOL, ifr)) { WARN("ioctl(SIOCETHTOOL, ETHTOOL_GSET) failed: %s", strerror(errno)); return -1; } link_speed = ethtool_cmd_speed(&edata); if (link_speed == -1) - dev_link.link_speed = 0; + dev_link->link_speed = 0; else - dev_link.link_speed = link_speed; + dev_link->link_speed = link_speed; priv->link_speed_capa = 0; if (edata.supported & SUPPORTED_Autoneg) priv->link_speed_capa |= ETH_LINK_SPEED_AUTONEG; @@ -800,17 +788,9 @@ mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev) SUPPORTED_40000baseSR4_Full | SUPPORTED_40000baseLR4_Full)) priv->link_speed_capa |= ETH_LINK_SPEED_40G; - dev_link.link_duplex = ((edata.duplex == DUPLEX_HALF) ? + 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 & - ETH_LINK_SPEED_FIXED); - if (memcmp(&dev_link, &dev->data->dev_link, sizeof(dev_link))) { - /* Link status changed. */ - dev->data->dev_link = dev_link; - return 0; - } - /* Link status is still the same. */ - return -1; + return 0; } /** @@ -820,23 +800,14 @@ mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev) * Pointer to Ethernet device structure. */ static int -mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev) +mlx5_link_update_unlocked_gs(struct priv *priv, struct ifreq *ifr, + struct rte_eth_link *dev_link) { - struct priv *priv = mlx5_get_priv(dev); struct ethtool_link_settings gcmd = { .cmd = ETHTOOL_GLINKSETTINGS }; - struct ifreq ifr; - struct rte_eth_link dev_link; uint64_t sc; - if (priv_ifreq(priv, SIOCGIFFLAGS, &ifr)) { - WARN("ioctl(SIOCGIFFLAGS) failed: %s", strerror(errno)); - return -1; - } - memset(&dev_link, 0, sizeof(dev_link)); - dev_link.link_status = ((ifr.ifr_flags & IFF_UP) && - (ifr.ifr_flags & IFF_RUNNING)); - ifr.ifr_data = (void *)&gcmd; - if (priv_ifreq(priv, SIOCETHTOOL, &ifr)) { + ifr->ifr_data = (void *)&gcmd; + if (priv_ifreq(priv, SIOCETHTOOL, ifr)) { DEBUG("ioctl(SIOCETHTOOL, ETHTOOL_GLINKSETTINGS) failed: %s", strerror(errno)); return -1; @@ -849,13 +820,13 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev) struct ethtool_link_settings *ecmd = (void *)data; *ecmd = gcmd; - ifr.ifr_data = (void *)ecmd; - if (priv_ifreq(priv, SIOCETHTOOL, &ifr)) { + ifr->ifr_data = (void *)ecmd; + if (priv_ifreq(priv, SIOCETHTOOL, ifr)) { DEBUG("ioctl(SIOCETHTOOL, ETHTOOL_GLINKSETTINGS) failed: %s", strerror(errno)); return -1; } - dev_link.link_speed = ecmd->speed; + dev_link->link_speed = ecmd->speed; sc = ecmd->link_mode_masks[0] | ((uint64_t)ecmd->link_mode_masks[1] << 32); priv->link_speed_capa = 0; @@ -893,17 +864,9 @@ 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; - dev_link.link_duplex = ((ecmd->duplex == DUPLEX_HALF) ? + 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 & - ETH_LINK_SPEED_FIXED); - if (memcmp(&dev_link, &dev->data->dev_link, sizeof(dev_link))) { - /* Link status changed. */ - dev->data->dev_link = dev_link; - return 0; - } - /* Link status is still the same. */ - return -1; + return 0; } /** @@ -917,15 +880,36 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev) int mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused) { - struct utsname utsname; - int ver[3]; - - if (uname(&utsname) == -1 || - sscanf(utsname.release, "%d.%d.%d", - &ver[0], &ver[1], &ver[2]) != 3 || - KERNEL_VERSION(ver[0], ver[1], ver[2]) < KERNEL_VERSION(4, 9, 0)) - return mlx5_link_update_unlocked_gset(dev); - return mlx5_link_update_unlocked_gs(dev); + struct priv *priv = mlx5_get_priv(dev); + struct rte_eth_link dev_link; + struct ifreq ifr; + int ret; + + if (priv_ifreq(priv, SIOCGIFFLAGS, &ifr)) { + WARN("ioctl(SIOCGIFFLAGS) failed: %s", strerror(errno)); + return -1; + } + memset(&dev_link, 0, sizeof(dev_link)); + dev_link.link_status = ((ifr.ifr_flags & IFF_UP) && + (ifr.ifr_flags & IFF_RUNNING)); + + dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & + ETH_LINK_SPEED_FIXED); + + ret = mlx5_link_update_unlocked_gs(priv, &ifr, &dev_link); + if (ret) + ret = mlx5_link_update_unlocked_gset(priv, &ifr, &dev_link); + + if (ret) + return ret; + + if (memcmp(&dev_link, &dev->data->dev_link, sizeof(dev_link))) { + /* Link status changed. */ + dev->data->dev_link = dev_link; + return 0; + } + /* Link status is still the same. */ + return -1; } /** -- 2.15.1