static void mlx4_en_modify_rl_res(struct mlx4_en_priv *priv, int ring_id, u8 rate_index) { struct mlx4_en_tx_ring *tx_ring; struct mlx4_update_qp_params update_params; int err; tx_ring = priv->tx_ring[ring_id]; /* Ring validation */ if(!TX_RING_USER_VALID(ring_id)) { en_err(priv, "Failed modifying new rate, ring %d doesn't exist\n", ring_id); /* If the modified ring does not exist, no need to add one * to the reference count of the requested rate */ atomic_subtract_int(&priv->rate_limits[rate_index].ref, 1); return; } if (priv->rate_limits[tx_ring->rl_data.rate_index].rate != priv->rate_limits[rate_index].rate) { update_params.rl_index = rate_index; err = mlx4_update_qp(priv->mdev->dev, tx_ring->qpn, MLX4_UPDATE_QP_RATE_LIMIT, &update_params); if (err) { en_err(priv, "Failed updating ring %d with new rate %uBytes/sec, err: %d\n", ring_id, (priv->rate_limits[rate_index].rate/8), err); atomic_subtract_int(&priv->rate_limits[rate_index].ref, 1); return; } } atomic_subtract_int(&priv->rate_limits[tx_ring->rl_data.rate_index].ref, 1); tx_ring->rl_data.rate_index = rate_index; }
int mlx4_en_change_mcast_lb(struct mlx4_en_priv *priv, struct mlx4_qp *qp, int loopback) { int ret; struct mlx4_update_qp_params qp_params; memset(&qp_params, 0, sizeof(qp_params)); if (!loopback) qp_params.flags = MLX4_UPDATE_QP_PARAMS_FLAGS_ETH_CHECK_MC_LB; ret = mlx4_update_qp(priv->mdev->dev, qp->qpn, MLX4_UPDATE_QP_ETH_SRC_CHECK_MC_LB, &qp_params); return ret; }