|
@@ -32,10 +32,9 @@
|
|
|
|
|
|
#include "en.h"
|
|
|
|
|
|
-static void mlx5e_get_drvinfo(struct net_device *dev,
|
|
|
- struct ethtool_drvinfo *drvinfo)
|
|
|
+void mlx5e_ethtool_get_drvinfo(struct mlx5e_priv *priv,
|
|
|
+ struct ethtool_drvinfo *drvinfo)
|
|
|
{
|
|
|
- struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
struct mlx5_core_dev *mdev = priv->mdev;
|
|
|
|
|
|
strlcpy(drvinfo->driver, DRIVER_NAME, sizeof(drvinfo->driver));
|
|
@@ -49,6 +48,14 @@ static void mlx5e_get_drvinfo(struct net_device *dev,
|
|
|
sizeof(drvinfo->bus_info));
|
|
|
}
|
|
|
|
|
|
+static void mlx5e_get_drvinfo(struct net_device *dev,
|
|
|
+ struct ethtool_drvinfo *drvinfo)
|
|
|
+{
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
+
|
|
|
+ mlx5e_ethtool_get_drvinfo(priv, drvinfo);
|
|
|
+}
|
|
|
+
|
|
|
struct ptys2ethtool_config {
|
|
|
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
|
|
|
__ETHTOOL_DECLARE_LINK_MODE_MASK(advertised);
|
|
@@ -135,6 +142,9 @@ static unsigned long mlx5e_query_pfc_combined(struct mlx5e_priv *priv)
|
|
|
u8 pfc_en_rx;
|
|
|
int err;
|
|
|
|
|
|
+ if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH)
|
|
|
+ return 0;
|
|
|
+
|
|
|
err = mlx5_query_port_pfc(mdev, &pfc_en_tx, &pfc_en_rx);
|
|
|
|
|
|
return err ? 0 : pfc_en_tx | pfc_en_rx;
|
|
@@ -147,6 +157,9 @@ static bool mlx5e_query_global_pause_combined(struct mlx5e_priv *priv)
|
|
|
u32 tx_pause;
|
|
|
int err;
|
|
|
|
|
|
+ if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH)
|
|
|
+ return false;
|
|
|
+
|
|
|
err = mlx5_query_port_pause(mdev, &rx_pause, &tx_pause);
|
|
|
|
|
|
return err ? false : rx_pause | tx_pause;
|
|
@@ -160,9 +173,8 @@ static bool mlx5e_query_global_pause_combined(struct mlx5e_priv *priv)
|
|
|
((mlx5e_query_global_pause_combined(priv) + hweight8(mlx5e_query_pfc_combined(priv))) * \
|
|
|
NUM_PPORT_PER_PRIO_PFC_COUNTERS)
|
|
|
|
|
|
-static int mlx5e_get_sset_count(struct net_device *dev, int sset)
|
|
|
+int mlx5e_ethtool_get_sset_count(struct mlx5e_priv *priv, int sset)
|
|
|
{
|
|
|
- struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
switch (sset) {
|
|
|
case ETH_SS_STATS:
|
|
@@ -186,6 +198,13 @@ static int mlx5e_get_sset_count(struct net_device *dev, int sset)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int mlx5e_get_sset_count(struct net_device *dev, int sset)
|
|
|
+{
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
+
|
|
|
+ return mlx5e_ethtool_get_sset_count(priv, sset);
|
|
|
+}
|
|
|
+
|
|
|
static void mlx5e_fill_stats_strings(struct mlx5e_priv *priv, uint8_t *data)
|
|
|
{
|
|
|
int i, j, tc, prio, idx = 0;
|
|
@@ -273,10 +292,9 @@ static void mlx5e_fill_stats_strings(struct mlx5e_priv *priv, uint8_t *data)
|
|
|
priv->channel_tc2txq[i][tc]);
|
|
|
}
|
|
|
|
|
|
-static void mlx5e_get_strings(struct net_device *dev,
|
|
|
- uint32_t stringset, uint8_t *data)
|
|
|
+void mlx5e_ethtool_get_strings(struct mlx5e_priv *priv,
|
|
|
+ uint32_t stringset, uint8_t *data)
|
|
|
{
|
|
|
- struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
int i;
|
|
|
|
|
|
switch (stringset) {
|
|
@@ -297,10 +315,17 @@ static void mlx5e_get_strings(struct net_device *dev,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void mlx5e_get_ethtool_stats(struct net_device *dev,
|
|
|
- struct ethtool_stats *stats, u64 *data)
|
|
|
+static void mlx5e_get_strings(struct net_device *dev,
|
|
|
+ uint32_t stringset, uint8_t *data)
|
|
|
{
|
|
|
struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
+
|
|
|
+ mlx5e_ethtool_get_strings(priv, stringset, data);
|
|
|
+}
|
|
|
+
|
|
|
+void mlx5e_ethtool_get_ethtool_stats(struct mlx5e_priv *priv,
|
|
|
+ struct ethtool_stats *stats, u64 *data)
|
|
|
+{
|
|
|
struct mlx5e_channels *channels;
|
|
|
struct mlx5_priv *mlx5_priv;
|
|
|
int i, j, tc, prio, idx = 0;
|
|
@@ -395,6 +420,15 @@ static void mlx5e_get_ethtool_stats(struct net_device *dev,
|
|
|
sq_stats_desc, j);
|
|
|
}
|
|
|
|
|
|
+static void mlx5e_get_ethtool_stats(struct net_device *dev,
|
|
|
+ struct ethtool_stats *stats,
|
|
|
+ u64 *data)
|
|
|
+{
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
+
|
|
|
+ mlx5e_ethtool_get_ethtool_stats(priv, stats, data);
|
|
|
+}
|
|
|
+
|
|
|
static u32 mlx5e_rx_wqes_to_packets(struct mlx5e_priv *priv, int rq_wq_type,
|
|
|
int num_wqe)
|
|
|
{
|
|
@@ -439,10 +473,9 @@ static u32 mlx5e_packets_to_rx_wqes(struct mlx5e_priv *priv, int rq_wq_type,
|
|
|
return 1 << (order_base_2(num_wqes));
|
|
|
}
|
|
|
|
|
|
-static void mlx5e_get_ringparam(struct net_device *dev,
|
|
|
- struct ethtool_ringparam *param)
|
|
|
+void mlx5e_ethtool_get_ringparam(struct mlx5e_priv *priv,
|
|
|
+ struct ethtool_ringparam *param)
|
|
|
{
|
|
|
- struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
int rq_wq_type = priv->channels.params.rq_wq_type;
|
|
|
|
|
|
param->rx_max_pending = mlx5e_rx_wqes_to_packets(priv, rq_wq_type,
|
|
@@ -453,10 +486,17 @@ static void mlx5e_get_ringparam(struct net_device *dev,
|
|
|
param->tx_pending = 1 << priv->channels.params.log_sq_size;
|
|
|
}
|
|
|
|
|
|
-static int mlx5e_set_ringparam(struct net_device *dev,
|
|
|
- struct ethtool_ringparam *param)
|
|
|
+static void mlx5e_get_ringparam(struct net_device *dev,
|
|
|
+ struct ethtool_ringparam *param)
|
|
|
{
|
|
|
struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
+
|
|
|
+ mlx5e_ethtool_get_ringparam(priv, param);
|
|
|
+}
|
|
|
+
|
|
|
+int mlx5e_ethtool_set_ringparam(struct mlx5e_priv *priv,
|
|
|
+ struct ethtool_ringparam *param)
|
|
|
+{
|
|
|
int rq_wq_type = priv->channels.params.rq_wq_type;
|
|
|
struct mlx5e_channels new_channels = {};
|
|
|
u32 rx_pending_wqes;
|
|
@@ -468,12 +508,12 @@ static int mlx5e_set_ringparam(struct net_device *dev,
|
|
|
int err = 0;
|
|
|
|
|
|
if (param->rx_jumbo_pending) {
|
|
|
- netdev_info(dev, "%s: rx_jumbo_pending not supported\n",
|
|
|
+ netdev_info(priv->netdev, "%s: rx_jumbo_pending not supported\n",
|
|
|
__func__);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
if (param->rx_mini_pending) {
|
|
|
- netdev_info(dev, "%s: rx_mini_pending not supported\n",
|
|
|
+ netdev_info(priv->netdev, "%s: rx_mini_pending not supported\n",
|
|
|
__func__);
|
|
|
return -EINVAL;
|
|
|
}
|
|
@@ -486,13 +526,13 @@ static int mlx5e_set_ringparam(struct net_device *dev,
|
|
|
param->rx_pending);
|
|
|
|
|
|
if (param->rx_pending < min_rq_size) {
|
|
|
- netdev_info(dev, "%s: rx_pending (%d) < min (%d)\n",
|
|
|
+ netdev_info(priv->netdev, "%s: rx_pending (%d) < min (%d)\n",
|
|
|
__func__, param->rx_pending,
|
|
|
min_rq_size);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
if (param->rx_pending > max_rq_size) {
|
|
|
- netdev_info(dev, "%s: rx_pending (%d) > max (%d)\n",
|
|
|
+ netdev_info(priv->netdev, "%s: rx_pending (%d) > max (%d)\n",
|
|
|
__func__, param->rx_pending,
|
|
|
max_rq_size);
|
|
|
return -EINVAL;
|
|
@@ -501,19 +541,19 @@ static int mlx5e_set_ringparam(struct net_device *dev,
|
|
|
num_mtts = MLX5E_REQUIRED_MTTS(rx_pending_wqes);
|
|
|
if (priv->channels.params.rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ &&
|
|
|
!MLX5E_VALID_NUM_MTTS(num_mtts)) {
|
|
|
- netdev_info(dev, "%s: rx_pending (%d) request can't be satisfied, try to reduce.\n",
|
|
|
+ netdev_info(priv->netdev, "%s: rx_pending (%d) request can't be satisfied, try to reduce.\n",
|
|
|
__func__, param->rx_pending);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
if (param->tx_pending < (1 << MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE)) {
|
|
|
- netdev_info(dev, "%s: tx_pending (%d) < min (%d)\n",
|
|
|
+ netdev_info(priv->netdev, "%s: tx_pending (%d) < min (%d)\n",
|
|
|
__func__, param->tx_pending,
|
|
|
1 << MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
if (param->tx_pending > (1 << MLX5E_PARAMS_MAXIMUM_LOG_SQ_SIZE)) {
|
|
|
- netdev_info(dev, "%s: tx_pending (%d) > max (%d)\n",
|
|
|
+ netdev_info(priv->netdev, "%s: tx_pending (%d) > max (%d)\n",
|
|
|
__func__, param->tx_pending,
|
|
|
1 << MLX5E_PARAMS_MAXIMUM_LOG_SQ_SIZE);
|
|
|
return -EINVAL;
|
|
@@ -549,26 +589,39 @@ unlock:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static void mlx5e_get_channels(struct net_device *dev,
|
|
|
- struct ethtool_channels *ch)
|
|
|
+static int mlx5e_set_ringparam(struct net_device *dev,
|
|
|
+ struct ethtool_ringparam *param)
|
|
|
{
|
|
|
struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
|
|
|
+ return mlx5e_ethtool_set_ringparam(priv, param);
|
|
|
+}
|
|
|
+
|
|
|
+void mlx5e_ethtool_get_channels(struct mlx5e_priv *priv,
|
|
|
+ struct ethtool_channels *ch)
|
|
|
+{
|
|
|
ch->max_combined = priv->profile->max_nch(priv->mdev);
|
|
|
ch->combined_count = priv->channels.params.num_channels;
|
|
|
}
|
|
|
|
|
|
-static int mlx5e_set_channels(struct net_device *dev,
|
|
|
- struct ethtool_channels *ch)
|
|
|
+static void mlx5e_get_channels(struct net_device *dev,
|
|
|
+ struct ethtool_channels *ch)
|
|
|
{
|
|
|
struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
+
|
|
|
+ mlx5e_ethtool_get_channels(priv, ch);
|
|
|
+}
|
|
|
+
|
|
|
+int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv,
|
|
|
+ struct ethtool_channels *ch)
|
|
|
+{
|
|
|
unsigned int count = ch->combined_count;
|
|
|
struct mlx5e_channels new_channels = {};
|
|
|
bool arfs_enabled;
|
|
|
int err = 0;
|
|
|
|
|
|
if (!count) {
|
|
|
- netdev_info(dev, "%s: combined_count=0 not supported\n",
|
|
|
+ netdev_info(priv->netdev, "%s: combined_count=0 not supported\n",
|
|
|
__func__);
|
|
|
return -EINVAL;
|
|
|
}
|
|
@@ -593,7 +646,7 @@ static int mlx5e_set_channels(struct net_device *dev,
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|
|
|
- arfs_enabled = dev->features & NETIF_F_NTUPLE;
|
|
|
+ arfs_enabled = priv->netdev->features & NETIF_F_NTUPLE;
|
|
|
if (arfs_enabled)
|
|
|
mlx5e_arfs_disable(priv);
|
|
|
|
|
@@ -603,7 +656,7 @@ static int mlx5e_set_channels(struct net_device *dev,
|
|
|
if (arfs_enabled) {
|
|
|
err = mlx5e_arfs_enable(priv);
|
|
|
if (err)
|
|
|
- netdev_err(dev, "%s: mlx5e_arfs_enable failed: %d\n",
|
|
|
+ netdev_err(priv->netdev, "%s: mlx5e_arfs_enable failed: %d\n",
|
|
|
__func__, err);
|
|
|
}
|
|
|
|
|
@@ -613,11 +666,17 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static int mlx5e_get_coalesce(struct net_device *netdev,
|
|
|
- struct ethtool_coalesce *coal)
|
|
|
+static int mlx5e_set_channels(struct net_device *dev,
|
|
|
+ struct ethtool_channels *ch)
|
|
|
{
|
|
|
- struct mlx5e_priv *priv = netdev_priv(netdev);
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
+
|
|
|
+ return mlx5e_ethtool_set_channels(priv, ch);
|
|
|
+}
|
|
|
|
|
|
+int mlx5e_ethtool_get_coalesce(struct mlx5e_priv *priv,
|
|
|
+ struct ethtool_coalesce *coal)
|
|
|
+{
|
|
|
if (!MLX5_CAP_GEN(priv->mdev, cq_moderation))
|
|
|
return -EOPNOTSUPP;
|
|
|
|
|
@@ -630,6 +689,14 @@ static int mlx5e_get_coalesce(struct net_device *netdev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int mlx5e_get_coalesce(struct net_device *netdev,
|
|
|
+ struct ethtool_coalesce *coal)
|
|
|
+{
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(netdev);
|
|
|
+
|
|
|
+ return mlx5e_ethtool_get_coalesce(priv, coal);
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
mlx5e_set_priv_channels_coalesce(struct mlx5e_priv *priv, struct ethtool_coalesce *coal)
|
|
|
{
|
|
@@ -653,10 +720,9 @@ mlx5e_set_priv_channels_coalesce(struct mlx5e_priv *priv, struct ethtool_coalesc
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static int mlx5e_set_coalesce(struct net_device *netdev,
|
|
|
- struct ethtool_coalesce *coal)
|
|
|
+int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv,
|
|
|
+ struct ethtool_coalesce *coal)
|
|
|
{
|
|
|
- struct mlx5e_priv *priv = netdev_priv(netdev);
|
|
|
struct mlx5_core_dev *mdev = priv->mdev;
|
|
|
struct mlx5e_channels new_channels = {};
|
|
|
int err = 0;
|
|
@@ -699,6 +765,14 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static int mlx5e_set_coalesce(struct net_device *netdev,
|
|
|
+ struct ethtool_coalesce *coal)
|
|
|
+{
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(netdev);
|
|
|
+
|
|
|
+ return mlx5e_ethtool_set_coalesce(priv, coal);
|
|
|
+}
|
|
|
+
|
|
|
static void ptys2ethtool_supported_link(unsigned long *supported_modes,
|
|
|
u32 eth_proto_cap)
|
|
|
{
|
|
@@ -1298,13 +1372,12 @@ static int mlx5e_set_pauseparam(struct net_device *netdev,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static int mlx5e_get_ts_info(struct net_device *dev,
|
|
|
- struct ethtool_ts_info *info)
|
|
|
+int mlx5e_ethtool_get_ts_info(struct mlx5e_priv *priv,
|
|
|
+ struct ethtool_ts_info *info)
|
|
|
{
|
|
|
- struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
int ret;
|
|
|
|
|
|
- ret = ethtool_op_get_ts_info(dev, info);
|
|
|
+ ret = ethtool_op_get_ts_info(priv->netdev, info);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
@@ -1327,6 +1400,14 @@ static int mlx5e_get_ts_info(struct net_device *dev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int mlx5e_get_ts_info(struct net_device *dev,
|
|
|
+ struct ethtool_ts_info *info)
|
|
|
+{
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
+
|
|
|
+ return mlx5e_ethtool_get_ts_info(priv, info);
|
|
|
+}
|
|
|
+
|
|
|
static __u32 mlx5e_get_wol_supported(struct mlx5_core_dev *mdev)
|
|
|
{
|
|
|
__u32 ret = 0;
|