aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOr Gerlitz <ogerlitz@mellanox.com>2015-03-18 08:57:35 -0400
committerDavid S. Miller <davem@davemloft.net>2015-03-18 14:55:19 -0400
commitc10e4fc6c45616dbadb8ccee189e2c09fb8f056f (patch)
tree6ddfb4d3d0ebd6f034418b4790cca649bd37a1e6
parentfc31e2560a2443410fe45c27116fae736541a7b5 (diff)
net/mlx4_en: Add tx queue maxrate support
Add ndo_set_tx_maxrate support. To support per tx queue maxrate limit, we use the update-qp firmware command to do run-time rate setting for the qp that serves this tx ring. Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Ido Shamay <idos@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index c59ed925adaf..d8dc3f985c2b 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -2379,6 +2379,33 @@ static netdev_features_t mlx4_en_features_check(struct sk_buff *skb,
2379} 2379}
2380#endif 2380#endif
2381 2381
2382int mlx4_en_set_tx_maxrate(struct net_device *dev, int queue_index, u32 maxrate)
2383{
2384 struct mlx4_en_priv *priv = netdev_priv(dev);
2385 struct mlx4_en_tx_ring *tx_ring = priv->tx_ring[queue_index];
2386 struct mlx4_update_qp_params params;
2387 int err;
2388
2389 if (!(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_QP_RATE_LIMIT))
2390 return -EOPNOTSUPP;
2391
2392 /* rate provided to us in Mbs, check if it fits into 12 bits, if not use Gbs */
2393 if (maxrate >> 12) {
2394 params.rate_unit = MLX4_QP_RATE_LIMIT_GBS;
2395 params.rate_val = maxrate / 1000;
2396 } else if (maxrate) {
2397 params.rate_unit = MLX4_QP_RATE_LIMIT_MBS;
2398 params.rate_val = maxrate;
2399 } else { /* zero serves to revoke the QP rate-limitation */
2400 params.rate_unit = 0;
2401 params.rate_val = 0;
2402 }
2403
2404 err = mlx4_update_qp(priv->mdev->dev, tx_ring->qpn, MLX4_UPDATE_QP_RATE_LIMIT,
2405 &params);
2406 return err;
2407}
2408
2382static const struct net_device_ops mlx4_netdev_ops = { 2409static const struct net_device_ops mlx4_netdev_ops = {
2383 .ndo_open = mlx4_en_open, 2410 .ndo_open = mlx4_en_open,
2384 .ndo_stop = mlx4_en_close, 2411 .ndo_stop = mlx4_en_close,
@@ -2410,6 +2437,7 @@ static const struct net_device_ops mlx4_netdev_ops = {
2410 .ndo_del_vxlan_port = mlx4_en_del_vxlan_port, 2437 .ndo_del_vxlan_port = mlx4_en_del_vxlan_port,
2411 .ndo_features_check = mlx4_en_features_check, 2438 .ndo_features_check = mlx4_en_features_check,
2412#endif 2439#endif
2440 .ndo_set_tx_maxrate = mlx4_en_set_tx_maxrate,
2413}; 2441};
2414 2442
2415static const struct net_device_ops mlx4_netdev_ops_master = { 2443static const struct net_device_ops mlx4_netdev_ops_master = {
@@ -2444,6 +2472,7 @@ static const struct net_device_ops mlx4_netdev_ops_master = {
2444 .ndo_del_vxlan_port = mlx4_en_del_vxlan_port, 2472 .ndo_del_vxlan_port = mlx4_en_del_vxlan_port,
2445 .ndo_features_check = mlx4_en_features_check, 2473 .ndo_features_check = mlx4_en_features_check,
2446#endif 2474#endif
2475 .ndo_set_tx_maxrate = mlx4_en_set_tx_maxrate,
2447}; 2476};
2448 2477
2449struct mlx4_en_bond { 2478struct mlx4_en_bond {