Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Dec 2018 13:13:40 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r341982 - stable/12/sys/dev/mlx5/mlx5_en
Message-ID:  <201812121313.wBCDDeOf010529@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Wed Dec 12 13:13:39 2018
New Revision: 341982
URL: https://svnweb.freebsd.org/changeset/base/341982

Log:
  MFC r341585:
  mlx5en: Improve configuration of HW LRO.
  
  In order to enable HW LRO, both the "hw_lro" sysctl in the mlx5en(4) config
  space must be set, and the ifconfig(8) LRO capability must be set. Any other
  settings will disable HW LRO.
  
  Sponsored by:   Mellanox Technologies

Modified:
  stable/12/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c
  stable/12/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c
==============================================================================
--- stable/12/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c	Wed Dec 12 13:12:30 2018	(r341981)
+++ stable/12/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c	Wed Dec 12 13:13:39 2018	(r341982)
@@ -669,21 +669,24 @@ mlx5e_ethtool_handler(SYSCTL_HANDLER_ARGS)
 			mlx5e_close_locked(priv->ifp);
 
 		/* import HW LRO mode */
-		if (priv->params_ethtool.hw_lro != 0) {
-			if ((priv->ifp->if_capenable & IFCAP_LRO) &&
-			    MLX5_CAP_ETH(priv->mdev, lro_cap)) {
-				priv->params.hw_lro_en = 1;
-				priv->params_ethtool.hw_lro = 1;
+		if (priv->params_ethtool.hw_lro != 0 &&
+		    MLX5_CAP_ETH(priv->mdev, lro_cap)) {
+			priv->params_ethtool.hw_lro = 1;
+			/* check if feature should actually be enabled */
+			if (priv->ifp->if_capenable & IFCAP_LRO) {
+				priv->params.hw_lro_en = true;
 			} else {
-				priv->params.hw_lro_en = 0;
-				priv->params_ethtool.hw_lro = 0;
-				error = EINVAL;
+				priv->params.hw_lro_en = false;
 
-				if_printf(priv->ifp, "Can't enable HW LRO: "
-				    "The HW or SW LRO feature is disabled\n");
+				if_printf(priv->ifp, "To enable HW LRO "
+				    "please also enable LRO via ifconfig(8).\n");
 			}
 		} else {
-			priv->params.hw_lro_en = 0;
+			/* return an error if HW does not support this feature */
+			if (priv->params_ethtool.hw_lro != 0)
+				error = EINVAL;
+			priv->params.hw_lro_en = false;
+			priv->params_ethtool.hw_lro = 0;
 		}
 		/* restart network interface, if any */
 		if (was_opened)

Modified: stable/12/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
==============================================================================
--- stable/12/sys/dev/mlx5/mlx5_en/mlx5_en_main.c	Wed Dec 12 13:12:30 2018	(r341981)
+++ stable/12/sys/dev/mlx5/mlx5_en/mlx5_en_main.c	Wed Dec 12 13:13:39 2018	(r341982)
@@ -2891,12 +2891,18 @@ mlx5e_ioctl(struct ifnet *ifp, u_long command, caddr_t
 			bool need_restart = false;
 
 			ifp->if_capenable ^= IFCAP_LRO;
+
+			/* figure out if updating HW LRO is needed */
 			if (!(ifp->if_capenable & IFCAP_LRO)) {
 				if (priv->params.hw_lro_en) {
 					priv->params.hw_lro_en = false;
 					need_restart = true;
-					/* Not sure this is the correct way */
-					priv->params_ethtool.hw_lro = priv->params.hw_lro_en;
+				}
+			} else {
+				if (priv->params.hw_lro_en == false &&
+				    priv->params_ethtool.hw_lro != 0) {
+					priv->params.hw_lro_en = true;
+					need_restart = true;
 				}
 			}
 			if (was_opened && need_restart) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201812121313.wBCDDeOf010529>