net/mlx4_en: Add tx queue maxrate support
authorOr Gerlitz <ogerlitz@mellanox.com>
Wed, 18 Mar 2015 12:57:35 +0000 (14:57 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 Mar 2015 18:55:19 +0000 (14:55 -0400)
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>
drivers/net/ethernet/mellanox/mlx4/en_netdev.c

index c59ed92..d8dc3f9 100644 (file)
@@ -2379,6 +2379,33 @@ static netdev_features_t mlx4_en_features_check(struct sk_buff *skb,
 }
 #endif
 
+int mlx4_en_set_tx_maxrate(struct net_device *dev, int queue_index, u32 maxrate)
+{
+       struct mlx4_en_priv *priv = netdev_priv(dev);
+       struct mlx4_en_tx_ring *tx_ring = priv->tx_ring[queue_index];
+       struct mlx4_update_qp_params params;
+       int err;
+
+       if (!(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_QP_RATE_LIMIT))
+               return -EOPNOTSUPP;
+
+       /* rate provided to us in Mbs, check if it fits into 12 bits, if not use Gbs */
+       if (maxrate >> 12) {
+               params.rate_unit = MLX4_QP_RATE_LIMIT_GBS;
+               params.rate_val  = maxrate / 1000;
+       } else if (maxrate) {
+               params.rate_unit = MLX4_QP_RATE_LIMIT_MBS;
+               params.rate_val  = maxrate;
+       } else { /* zero serves to revoke the QP rate-limitation */
+               params.rate_unit = 0;
+               params.rate_val  = 0;
+       }
+
+       err = mlx4_update_qp(priv->mdev->dev, tx_ring->qpn, MLX4_UPDATE_QP_RATE_LIMIT,
+                            &params);
+       return err;
+}
+
 static const struct net_device_ops mlx4_netdev_ops = {
        .ndo_open               = mlx4_en_open,
        .ndo_stop               = mlx4_en_close,
@@ -2410,6 +2437,7 @@ static const struct net_device_ops mlx4_netdev_ops = {
        .ndo_del_vxlan_port     = mlx4_en_del_vxlan_port,
        .ndo_features_check     = mlx4_en_features_check,
 #endif
+       .ndo_set_tx_maxrate     = mlx4_en_set_tx_maxrate,
 };
 
 static const struct net_device_ops mlx4_netdev_ops_master = {
@@ -2444,6 +2472,7 @@ static const struct net_device_ops mlx4_netdev_ops_master = {
        .ndo_del_vxlan_port     = mlx4_en_del_vxlan_port,
        .ndo_features_check     = mlx4_en_features_check,
 #endif
+       .ndo_set_tx_maxrate     = mlx4_en_set_tx_maxrate,
 };
 
 struct mlx4_en_bond {