diff options
author | Yevgeny Petrilin <yevgenyp@mellanox.co.il> | 2008-12-29 21:39:20 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-29 21:39:20 -0500 |
commit | 18cc42a3a17d19774b332e933cf34c71b0d3903c (patch) | |
tree | 91fb800e7db44ebff7201124fe487eb2089f146a /drivers | |
parent | 2d6a7b7559b47f81c50a1df91910edefff79b9b4 (diff) |
mlx4_en: Added "set_ringparam" Ethtool interface implementation
Now using Ethtool to determine ring sizes, removed the module parameters
that controlled those values.
Modifying ring size requires restart of the interface.
Signed-off-by: Yevgeny Petrilin <yevgenyp@mellanox.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/mlx4/en_netdev.c | 8 | ||||
-rw-r--r-- | drivers/net/mlx4/en_params.c | 80 | ||||
-rw-r--r-- | drivers/net/mlx4/mlx4_en.h | 6 |
3 files changed, 61 insertions, 33 deletions
diff --git a/drivers/net/mlx4/en_netdev.c b/drivers/net/mlx4/en_netdev.c index ebada3c7aff2..15bb38d99304 100644 --- a/drivers/net/mlx4/en_netdev.c +++ b/drivers/net/mlx4/en_netdev.c | |||
@@ -552,7 +552,7 @@ static void mlx4_en_linkstate(struct work_struct *work) | |||
552 | } | 552 | } |
553 | 553 | ||
554 | 554 | ||
555 | static int mlx4_en_start_port(struct net_device *dev) | 555 | int mlx4_en_start_port(struct net_device *dev) |
556 | { | 556 | { |
557 | struct mlx4_en_priv *priv = netdev_priv(dev); | 557 | struct mlx4_en_priv *priv = netdev_priv(dev); |
558 | struct mlx4_en_dev *mdev = priv->mdev; | 558 | struct mlx4_en_dev *mdev = priv->mdev; |
@@ -707,7 +707,7 @@ cq_err: | |||
707 | } | 707 | } |
708 | 708 | ||
709 | 709 | ||
710 | static void mlx4_en_stop_port(struct net_device *dev) | 710 | void mlx4_en_stop_port(struct net_device *dev) |
711 | { | 711 | { |
712 | struct mlx4_en_priv *priv = netdev_priv(dev); | 712 | struct mlx4_en_priv *priv = netdev_priv(dev); |
713 | struct mlx4_en_dev *mdev = priv->mdev; | 713 | struct mlx4_en_dev *mdev = priv->mdev; |
@@ -826,7 +826,7 @@ static int mlx4_en_close(struct net_device *dev) | |||
826 | return 0; | 826 | return 0; |
827 | } | 827 | } |
828 | 828 | ||
829 | static void mlx4_en_free_resources(struct mlx4_en_priv *priv) | 829 | void mlx4_en_free_resources(struct mlx4_en_priv *priv) |
830 | { | 830 | { |
831 | int i; | 831 | int i; |
832 | 832 | ||
@@ -845,7 +845,7 @@ static void mlx4_en_free_resources(struct mlx4_en_priv *priv) | |||
845 | } | 845 | } |
846 | } | 846 | } |
847 | 847 | ||
848 | static int mlx4_en_alloc_resources(struct mlx4_en_priv *priv) | 848 | int mlx4_en_alloc_resources(struct mlx4_en_priv *priv) |
849 | { | 849 | { |
850 | struct mlx4_en_dev *mdev = priv->mdev; | 850 | struct mlx4_en_dev *mdev = priv->mdev; |
851 | struct mlx4_en_port_profile *prof = priv->prof; | 851 | struct mlx4_en_port_profile *prof = priv->prof; |
diff --git a/drivers/net/mlx4/en_params.c b/drivers/net/mlx4/en_params.c index 6483ae9d45b1..cfeef0f1bacc 100644 --- a/drivers/net/mlx4/en_params.c +++ b/drivers/net/mlx4/en_params.c | |||
@@ -65,12 +65,6 @@ MLX4_EN_PARM_INT(pfctx, 0, "Priority based Flow Control policy on TX[7:0]." | |||
65 | MLX4_EN_PARM_INT(pfcrx, 0, "Priority based Flow Control policy on RX[7:0]." | 65 | MLX4_EN_PARM_INT(pfcrx, 0, "Priority based Flow Control policy on RX[7:0]." |
66 | " Per priority bit mask"); | 66 | " Per priority bit mask"); |
67 | 67 | ||
68 | MLX4_EN_PARM_INT(tx_ring_size1, MLX4_EN_AUTO_CONF, "Tx ring size for port 1"); | ||
69 | MLX4_EN_PARM_INT(tx_ring_size2, MLX4_EN_AUTO_CONF, "Tx ring size for port 2"); | ||
70 | MLX4_EN_PARM_INT(rx_ring_size1, MLX4_EN_AUTO_CONF, "Rx ring size for port 1"); | ||
71 | MLX4_EN_PARM_INT(rx_ring_size2, MLX4_EN_AUTO_CONF, "Rx ring size for port 2"); | ||
72 | |||
73 | |||
74 | int mlx4_en_get_profile(struct mlx4_en_dev *mdev) | 68 | int mlx4_en_get_profile(struct mlx4_en_dev *mdev) |
75 | { | 69 | { |
76 | struct mlx4_en_profile *params = &mdev->profile; | 70 | struct mlx4_en_profile *params = &mdev->profile; |
@@ -84,6 +78,8 @@ int mlx4_en_get_profile(struct mlx4_en_dev *mdev) | |||
84 | params->prof[i].rx_ppp = pfcrx; | 78 | params->prof[i].rx_ppp = pfcrx; |
85 | params->prof[i].tx_pause = 1; | 79 | params->prof[i].tx_pause = 1; |
86 | params->prof[i].tx_ppp = pfctx; | 80 | params->prof[i].tx_ppp = pfctx; |
81 | params->prof[i].tx_ring_size = MLX4_EN_DEF_TX_RING_SIZE; | ||
82 | params->prof[i].rx_ring_size = MLX4_EN_DEF_RX_RING_SIZE; | ||
87 | } | 83 | } |
88 | if (pfcrx || pfctx) { | 84 | if (pfcrx || pfctx) { |
89 | params->prof[1].tx_ring_num = MLX4_EN_TX_RING_NUM; | 85 | params->prof[1].tx_ring_num = MLX4_EN_TX_RING_NUM; |
@@ -93,29 +89,6 @@ int mlx4_en_get_profile(struct mlx4_en_dev *mdev) | |||
93 | params->prof[2].tx_ring_num = 1; | 89 | params->prof[2].tx_ring_num = 1; |
94 | } | 90 | } |
95 | 91 | ||
96 | if (tx_ring_size1 == MLX4_EN_AUTO_CONF) | ||
97 | tx_ring_size1 = MLX4_EN_DEF_TX_RING_SIZE; | ||
98 | params->prof[1].tx_ring_size = | ||
99 | (tx_ring_size1 < MLX4_EN_MIN_TX_SIZE) ? | ||
100 | MLX4_EN_MIN_TX_SIZE : roundup_pow_of_two(tx_ring_size1); | ||
101 | |||
102 | if (tx_ring_size2 == MLX4_EN_AUTO_CONF) | ||
103 | tx_ring_size2 = MLX4_EN_DEF_TX_RING_SIZE; | ||
104 | params->prof[2].tx_ring_size = | ||
105 | (tx_ring_size2 < MLX4_EN_MIN_TX_SIZE) ? | ||
106 | MLX4_EN_MIN_TX_SIZE : roundup_pow_of_two(tx_ring_size2); | ||
107 | |||
108 | if (rx_ring_size1 == MLX4_EN_AUTO_CONF) | ||
109 | rx_ring_size1 = MLX4_EN_DEF_RX_RING_SIZE; | ||
110 | params->prof[1].rx_ring_size = | ||
111 | (rx_ring_size1 < MLX4_EN_MIN_RX_SIZE) ? | ||
112 | MLX4_EN_MIN_RX_SIZE : roundup_pow_of_two(rx_ring_size1); | ||
113 | |||
114 | if (rx_ring_size2 == MLX4_EN_AUTO_CONF) | ||
115 | rx_ring_size2 = MLX4_EN_DEF_RX_RING_SIZE; | ||
116 | params->prof[2].rx_ring_size = | ||
117 | (rx_ring_size2 < MLX4_EN_MIN_RX_SIZE) ? | ||
118 | MLX4_EN_MIN_RX_SIZE : roundup_pow_of_two(rx_ring_size2); | ||
119 | return 0; | 92 | return 0; |
120 | } | 93 | } |
121 | 94 | ||
@@ -412,6 +385,54 @@ static void mlx4_en_get_pauseparam(struct net_device *dev, | |||
412 | pause->rx_pause = priv->prof->rx_pause; | 385 | pause->rx_pause = priv->prof->rx_pause; |
413 | } | 386 | } |
414 | 387 | ||
388 | static int mlx4_en_set_ringparam(struct net_device *dev, | ||
389 | struct ethtool_ringparam *param) | ||
390 | { | ||
391 | struct mlx4_en_priv *priv = netdev_priv(dev); | ||
392 | struct mlx4_en_dev *mdev = priv->mdev; | ||
393 | u32 rx_size, tx_size; | ||
394 | int port_up = 0; | ||
395 | int err = 0; | ||
396 | |||
397 | if (param->rx_jumbo_pending || param->rx_mini_pending) | ||
398 | return -EINVAL; | ||
399 | |||
400 | rx_size = roundup_pow_of_two(param->rx_pending); | ||
401 | rx_size = max_t(u32, rx_size, MLX4_EN_MIN_RX_SIZE); | ||
402 | tx_size = roundup_pow_of_two(param->tx_pending); | ||
403 | tx_size = max_t(u32, tx_size, MLX4_EN_MIN_TX_SIZE); | ||
404 | |||
405 | if (rx_size == priv->prof->rx_ring_size && | ||
406 | tx_size == priv->prof->tx_ring_size) | ||
407 | return 0; | ||
408 | |||
409 | mutex_lock(&mdev->state_lock); | ||
410 | if (priv->port_up) { | ||
411 | port_up = 1; | ||
412 | mlx4_en_stop_port(dev); | ||
413 | } | ||
414 | |||
415 | mlx4_en_free_resources(priv); | ||
416 | |||
417 | priv->prof->tx_ring_size = tx_size; | ||
418 | priv->prof->rx_ring_size = rx_size; | ||
419 | |||
420 | err = mlx4_en_alloc_resources(priv); | ||
421 | if (err) { | ||
422 | mlx4_err(mdev, "Failed reallocating port resources\n"); | ||
423 | goto out; | ||
424 | } | ||
425 | if (port_up) { | ||
426 | err = mlx4_en_start_port(dev); | ||
427 | if (err) | ||
428 | mlx4_err(mdev, "Failed starting port\n"); | ||
429 | } | ||
430 | |||
431 | out: | ||
432 | mutex_unlock(&mdev->state_lock); | ||
433 | return err; | ||
434 | } | ||
435 | |||
415 | static void mlx4_en_get_ringparam(struct net_device *dev, | 436 | static void mlx4_en_get_ringparam(struct net_device *dev, |
416 | struct ethtool_ringparam *param) | 437 | struct ethtool_ringparam *param) |
417 | { | 438 | { |
@@ -451,6 +472,7 @@ const struct ethtool_ops mlx4_en_ethtool_ops = { | |||
451 | .get_pauseparam = mlx4_en_get_pauseparam, | 472 | .get_pauseparam = mlx4_en_get_pauseparam, |
452 | .set_pauseparam = mlx4_en_set_pauseparam, | 473 | .set_pauseparam = mlx4_en_set_pauseparam, |
453 | .get_ringparam = mlx4_en_get_ringparam, | 474 | .get_ringparam = mlx4_en_get_ringparam, |
475 | .set_ringparam = mlx4_en_set_ringparam, | ||
454 | .get_flags = ethtool_op_get_flags, | 476 | .get_flags = ethtool_op_get_flags, |
455 | .set_flags = ethtool_op_set_flags, | 477 | .set_flags = ethtool_op_set_flags, |
456 | }; | 478 | }; |
diff --git a/drivers/net/mlx4/mlx4_en.h b/drivers/net/mlx4/mlx4_en.h index e78209768def..2e96c7b2180a 100644 --- a/drivers/net/mlx4/mlx4_en.h +++ b/drivers/net/mlx4/mlx4_en.h | |||
@@ -489,6 +489,12 @@ void mlx4_en_destroy_netdev(struct net_device *dev); | |||
489 | int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | 489 | int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, |
490 | struct mlx4_en_port_profile *prof); | 490 | struct mlx4_en_port_profile *prof); |
491 | 491 | ||
492 | int mlx4_en_start_port(struct net_device *dev); | ||
493 | void mlx4_en_stop_port(struct net_device *dev); | ||
494 | |||
495 | void mlx4_en_free_resources(struct mlx4_en_priv *priv); | ||
496 | int mlx4_en_alloc_resources(struct mlx4_en_priv *priv); | ||
497 | |||
492 | int mlx4_en_get_profile(struct mlx4_en_dev *mdev); | 498 | int mlx4_en_get_profile(struct mlx4_en_dev *mdev); |
493 | 499 | ||
494 | int mlx4_en_create_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq, | 500 | int mlx4_en_create_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq, |