|
@@ -167,6 +167,12 @@ static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
|
|
context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT;
|
|
context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if ((cur_state == MLX4_QP_STATE_RTR) &&
|
|
|
|
+ (new_state == MLX4_QP_STATE_RTS) &&
|
|
|
|
+ dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_ROCE_V1_V2)
|
|
|
|
+ context->roce_entropy =
|
|
|
|
+ cpu_to_be16(mlx4_qp_roce_entropy(dev, qp->qpn));
|
|
|
|
+
|
|
*(__be32 *) mailbox->buf = cpu_to_be32(optpar);
|
|
*(__be32 *) mailbox->buf = cpu_to_be32(optpar);
|
|
memcpy(mailbox->buf + 8, context, sizeof *context);
|
|
memcpy(mailbox->buf + 8, context, sizeof *context);
|
|
|
|
|
|
@@ -921,3 +927,23 @@ int mlx4_qp_to_ready(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(mlx4_qp_to_ready);
|
|
EXPORT_SYMBOL_GPL(mlx4_qp_to_ready);
|
|
|
|
+
|
|
|
|
+u16 mlx4_qp_roce_entropy(struct mlx4_dev *dev, u32 qpn)
|
|
|
|
+{
|
|
|
|
+ struct mlx4_qp_context context;
|
|
|
|
+ struct mlx4_qp qp;
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ qp.qpn = qpn;
|
|
|
|
+ err = mlx4_qp_query(dev, &qp, &context);
|
|
|
|
+ if (!err) {
|
|
|
|
+ u32 dest_qpn = be32_to_cpu(context.remote_qpn) & 0xffffff;
|
|
|
|
+ u16 folded_dst = folded_qp(dest_qpn);
|
|
|
|
+ u16 folded_src = folded_qp(qpn);
|
|
|
|
+
|
|
|
|
+ return (dest_qpn != qpn) ?
|
|
|
|
+ ((folded_dst ^ folded_src) | 0xC000) :
|
|
|
|
+ folded_src | 0xC000;
|
|
|
|
+ }
|
|
|
|
+ return 0xdead;
|
|
|
|
+}
|