diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/mlx4/en_ethtool.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/drivers/net/mlx4/en_ethtool.c b/drivers/net/mlx4/en_ethtool.c index d5afd037cd7..b275238fe70 100644 --- a/drivers/net/mlx4/en_ethtool.c +++ b/drivers/net/mlx4/en_ethtool.c | |||
@@ -387,6 +387,42 @@ static void mlx4_en_get_ringparam(struct net_device *dev, | |||
387 | param->tx_pending = mdev->profile.prof[priv->port].tx_ring_size; | 387 | param->tx_pending = mdev->profile.prof[priv->port].tx_ring_size; |
388 | } | 388 | } |
389 | 389 | ||
390 | static int mlx4_ethtool_op_set_flags(struct net_device *dev, u32 data) | ||
391 | { | ||
392 | struct mlx4_en_priv *priv = netdev_priv(dev); | ||
393 | struct mlx4_en_dev *mdev = priv->mdev; | ||
394 | int rc = 0; | ||
395 | int changed = 0; | ||
396 | |||
397 | if (data & ~ETH_FLAG_LRO) | ||
398 | return -EOPNOTSUPP; | ||
399 | |||
400 | if (data & ETH_FLAG_LRO) { | ||
401 | if (mdev->profile.num_lro == 0) | ||
402 | return -EOPNOTSUPP; | ||
403 | if (!(dev->features & NETIF_F_LRO)) | ||
404 | changed = 1; | ||
405 | } else if (dev->features & NETIF_F_LRO) { | ||
406 | changed = 1; | ||
407 | } | ||
408 | |||
409 | if (changed) { | ||
410 | if (netif_running(dev)) { | ||
411 | mutex_lock(&mdev->state_lock); | ||
412 | mlx4_en_stop_port(dev); | ||
413 | } | ||
414 | dev->features ^= NETIF_F_LRO; | ||
415 | if (netif_running(dev)) { | ||
416 | rc = mlx4_en_start_port(dev); | ||
417 | if (rc) | ||
418 | en_err(priv, "Failed to restart port\n"); | ||
419 | mutex_unlock(&mdev->state_lock); | ||
420 | } | ||
421 | } | ||
422 | |||
423 | return rc; | ||
424 | } | ||
425 | |||
390 | const struct ethtool_ops mlx4_en_ethtool_ops = { | 426 | const struct ethtool_ops mlx4_en_ethtool_ops = { |
391 | .get_drvinfo = mlx4_en_get_drvinfo, | 427 | .get_drvinfo = mlx4_en_get_drvinfo, |
392 | .get_settings = mlx4_en_get_settings, | 428 | .get_settings = mlx4_en_get_settings, |
@@ -415,7 +451,7 @@ const struct ethtool_ops mlx4_en_ethtool_ops = { | |||
415 | .get_ringparam = mlx4_en_get_ringparam, | 451 | .get_ringparam = mlx4_en_get_ringparam, |
416 | .set_ringparam = mlx4_en_set_ringparam, | 452 | .set_ringparam = mlx4_en_set_ringparam, |
417 | .get_flags = ethtool_op_get_flags, | 453 | .get_flags = ethtool_op_get_flags, |
418 | .set_flags = ethtool_op_set_flags, | 454 | .set_flags = mlx4_ethtool_op_set_flags, |
419 | }; | 455 | }; |
420 | 456 | ||
421 | 457 | ||