|
@@ -1256,6 +1256,16 @@ static bool tunnel_offload_supported(struct mlx5_core_dev *dev)
|
|
MLX5_CAP_ETH(dev, tunnel_stateless_geneve_rx));
|
|
MLX5_CAP_ETH(dev, tunnel_stateless_geneve_rx));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void destroy_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
|
|
|
|
+ struct mlx5_ib_rq *rq,
|
|
|
|
+ u32 qp_flags_en)
|
|
|
|
+{
|
|
|
|
+ if (qp_flags_en & (MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC |
|
|
|
|
+ MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC))
|
|
|
|
+ mlx5_ib_disable_lb(dev, false, true);
|
|
|
|
+ mlx5_core_destroy_tir(dev->mdev, rq->tirn);
|
|
|
|
+}
|
|
|
|
+
|
|
static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
|
|
static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
|
|
struct mlx5_ib_rq *rq, u32 tdn,
|
|
struct mlx5_ib_rq *rq, u32 tdn,
|
|
u32 *qp_flags_en)
|
|
u32 *qp_flags_en)
|
|
@@ -1293,17 +1303,17 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
|
|
|
|
|
|
err = mlx5_core_create_tir(dev->mdev, in, inlen, &rq->tirn);
|
|
err = mlx5_core_create_tir(dev->mdev, in, inlen, &rq->tirn);
|
|
|
|
|
|
|
|
+ if (!err && MLX5_GET(tirc, tirc, self_lb_block)) {
|
|
|
|
+ err = mlx5_ib_enable_lb(dev, false, true);
|
|
|
|
+
|
|
|
|
+ if (err)
|
|
|
|
+ destroy_raw_packet_qp_tir(dev, rq, 0);
|
|
|
|
+ }
|
|
kvfree(in);
|
|
kvfree(in);
|
|
|
|
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
-static void destroy_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
|
|
|
|
- struct mlx5_ib_rq *rq)
|
|
|
|
-{
|
|
|
|
- mlx5_core_destroy_tir(dev->mdev, rq->tirn);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
|
static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
|
u32 *in, size_t inlen,
|
|
u32 *in, size_t inlen,
|
|
struct ib_pd *pd)
|
|
struct ib_pd *pd)
|
|
@@ -1372,7 +1382,7 @@ static void destroy_raw_packet_qp(struct mlx5_ib_dev *dev,
|
|
struct mlx5_ib_rq *rq = &raw_packet_qp->rq;
|
|
struct mlx5_ib_rq *rq = &raw_packet_qp->rq;
|
|
|
|
|
|
if (qp->rq.wqe_cnt) {
|
|
if (qp->rq.wqe_cnt) {
|
|
- destroy_raw_packet_qp_tir(dev, rq);
|
|
|
|
|
|
+ destroy_raw_packet_qp_tir(dev, rq, qp->flags_en);
|
|
destroy_raw_packet_qp_rq(dev, rq);
|
|
destroy_raw_packet_qp_rq(dev, rq);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1396,6 +1406,9 @@ static void raw_packet_qp_copy_info(struct mlx5_ib_qp *qp,
|
|
|
|
|
|
static void destroy_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp)
|
|
static void destroy_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp)
|
|
{
|
|
{
|
|
|
|
+ if (qp->flags_en & (MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC |
|
|
|
|
+ MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC))
|
|
|
|
+ mlx5_ib_disable_lb(dev, false, true);
|
|
mlx5_core_destroy_tir(dev->mdev, qp->rss_qp.tirn);
|
|
mlx5_core_destroy_tir(dev->mdev, qp->rss_qp.tirn);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1606,6 +1619,13 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
|
create_tir:
|
|
create_tir:
|
|
err = mlx5_core_create_tir(dev->mdev, in, inlen, &qp->rss_qp.tirn);
|
|
err = mlx5_core_create_tir(dev->mdev, in, inlen, &qp->rss_qp.tirn);
|
|
|
|
|
|
|
|
+ if (!err && MLX5_GET(tirc, tirc, self_lb_block)) {
|
|
|
|
+ err = mlx5_ib_enable_lb(dev, false, true);
|
|
|
|
+
|
|
|
|
+ if (err)
|
|
|
|
+ mlx5_core_destroy_tir(dev->mdev, qp->rss_qp.tirn);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (err)
|
|
if (err)
|
|
goto err;
|
|
goto err;
|
|
|
|
|