Fix an issue where the network adapter could be left in down state

after changing the HW LRO sysctl when previously in up state.

Reviewed by:	gnn
Sponsored by:	Mellanox Technologies
MFC after:	5 days
Differential Revision:	https://reviews.freebsd.org/D4941
This commit is contained in:
Hans Petter Selasky 2016-01-19 10:24:47 +00:00
parent 636d1fec4d
commit d7633a3070

View File

@ -178,23 +178,21 @@ mlx5e_ethtool_handler(SYSCTL_HANDLER_ARGS)
priv->params.tx_cq_moderation_mode = priv->params_ethtool.tx_coalesce_mode;
/* we always agree to turn off HW LRO - but not always to turn on */
if (priv->params_ethtool.hw_lro) {
if (priv->params_ethtool.hw_lro != 1) {
priv->params_ethtool.hw_lro = priv->params.hw_lro_en;
error = EINVAL;
goto done;
}
if (priv->ifp->if_capenable & IFCAP_LRO)
priv->params.hw_lro_en = !!MLX5_CAP_ETH(priv->mdev, lro_cap);
else {
/* set the correct (0) value to params_ethtool.hw_lro, issue a warning and return error */
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;
} else {
priv->params.hw_lro_en = 0;
priv->params_ethtool.hw_lro = 0;
error = EINVAL;
if_printf(priv->ifp, "Can't set HW_LRO to a device with LRO turned off");
goto done;
if_printf(priv->ifp, "Can't enable HW LRO: "
"The HW or SW LRO feature is disabled");
}
} else {
priv->params.hw_lro_en = false;
priv->params.hw_lro_en = 0;
}
if (&priv->params_ethtool.arg[arg2] ==
@ -208,7 +206,6 @@ mlx5e_ethtool_handler(SYSCTL_HANDLER_ARGS)
priv->params_ethtool.cqe_zipping = 0;
}
}
if (was_opened)
mlx5e_open_locked(priv->ifp);
done: