aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2017-11-10 14:14:54 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2017-11-10 14:14:54 +0000
commit61fd7ac087c59240522684e53e56dfa40636c477 (patch)
tree8184b5b51c38194d909d428197e0ab7b065167be /sys
parentbb3616ab20b5e99c490576a53850b5ef4baa87a5 (diff)
downloadsrc-61fd7ac087c59240522684e53e56dfa40636c477.tar.gz
src-61fd7ac087c59240522684e53e56dfa40636c477.zip
Add support for configuring local multicast and unicast data traffic loopback
in mlx5en(4) driver via the sysctl interface. Sponsored by: Mellanox Technologies MFC after: 1 week
Notes
Notes: svn path=/head/; revision=325660
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/mlx5/mlx5_en/en.h4
-rw-r--r--sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c38
2 files changed, 41 insertions, 1 deletions
diff --git a/sys/dev/mlx5/mlx5_en/en.h b/sys/dev/mlx5/mlx5_en/en.h
index f109a74df1f3..28ba7d11665b 100644
--- a/sys/dev/mlx5/mlx5_en/en.h
+++ b/sys/dev/mlx5/mlx5_en/en.h
@@ -411,7 +411,9 @@ struct mlx5e_params {
m(+1, u64 modify_tx_dma, "modify_tx_dma", "0: Enable TX 1: Disable TX") \
m(+1, u64 modify_rx_dma, "modify_rx_dma", "0: Enable RX 1: Disable RX") \
m(+1, u64 diag_pci_enable, "diag_pci_enable", "0: Disabled 1: Enabled") \
- m(+1, u64 diag_general_enable, "diag_general_enable", "0: Disabled 1: Enabled")
+ m(+1, u64 diag_general_enable, "diag_general_enable", "0: Disabled 1: Enabled") \
+ m(+1, u64 mc_local_lb, "mc_local_lb", "0: Local multicast loopback enabled 1: Disabled") \
+ m(+1, u64 uc_local_lb, "uc_local_lb", "0: Local unicast loopback enabled 1: Disabled")
#define MLX5E_PARAMS_NUM (0 MLX5E_PARAMS(MLX5E_STATS_COUNT))
diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c b/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c
index 8d3654c4ad1c..906867944771 100644
--- a/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c
+++ b/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c
@@ -421,6 +421,30 @@ mlx5e_ethtool_handler(SYSCTL_HANDLER_ARGS)
priv->params_ethtool.diag_general_enable);
break;
+ case MLX5_PARAM_OFFSET(mc_local_lb):
+ priv->params_ethtool.mc_local_lb =
+ priv->params_ethtool.mc_local_lb ? 1 : 0;
+
+ if (MLX5_CAP_GEN(priv->mdev, disable_local_lb)) {
+ error = mlx5_nic_vport_modify_local_lb(priv->mdev,
+ MLX5_LOCAL_MC_LB, priv->params_ethtool.mc_local_lb);
+ } else {
+ error = EOPNOTSUPP;
+ }
+ break;
+
+ case MLX5_PARAM_OFFSET(uc_local_lb):
+ priv->params_ethtool.uc_local_lb =
+ priv->params_ethtool.uc_local_lb ? 1 : 0;
+
+ if (MLX5_CAP_GEN(priv->mdev, disable_local_lb)) {
+ error = mlx5_nic_vport_modify_local_lb(priv->mdev,
+ MLX5_LOCAL_UC_LB, priv->params_ethtool.uc_local_lb);
+ } else {
+ error = EOPNOTSUPP;
+ }
+ break;
+
default:
break;
}
@@ -732,6 +756,20 @@ mlx5e_create_ethtool(struct mlx5e_priv *priv)
priv->params_ethtool.cqe_zipping = priv->params.cqe_zipping_en;
mlx5e_ethtool_sync_tx_completion_fact(priv);
+ /* get default values for local loopback, if any */
+ if (MLX5_CAP_GEN(priv->mdev, disable_local_lb)) {
+ int err;
+ u8 val;
+
+ err = mlx5_nic_vport_query_local_lb(priv->mdev, MLX5_LOCAL_MC_LB, &val);
+ if (err == 0)
+ priv->params_ethtool.mc_local_lb = val;
+
+ err = mlx5_nic_vport_query_local_lb(priv->mdev, MLX5_LOCAL_UC_LB, &val);
+ if (err == 0)
+ priv->params_ethtool.uc_local_lb = val;
+ }
+
/* create root node */
node = SYSCTL_ADD_NODE(&priv->sysctl_ctx,
SYSCTL_CHILDREN(priv->sysctl_ifnet), OID_AUTO,