diff options
| -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 d5afd037cd7d..b275238fe70d 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 | ||
