|
@@ -299,3 +299,34 @@ int mlx4_qp_query(struct mlx4_dev *dev, struct mlx4_qp *qp,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(mlx4_qp_query);
|
|
|
|
|
|
+int mlx4_qp_to_ready(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
|
|
|
+ struct mlx4_qp_context *context,
|
|
|
+ struct mlx4_qp *qp, enum mlx4_qp_state *qp_state)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ int i;
|
|
|
+ enum mlx4_qp_state states[] = {
|
|
|
+ MLX4_QP_STATE_RST,
|
|
|
+ MLX4_QP_STATE_INIT,
|
|
|
+ MLX4_QP_STATE_RTR,
|
|
|
+ MLX4_QP_STATE_RTS
|
|
|
+ };
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(states) - 1; i++) {
|
|
|
+ context->flags &= cpu_to_be32(~(0xf << 28));
|
|
|
+ context->flags |= cpu_to_be32(states[i + 1] << 28);
|
|
|
+ err = mlx4_qp_modify(dev, mtt, states[i], states[i + 1],
|
|
|
+ context, 0, 0, qp);
|
|
|
+ if (err) {
|
|
|
+ mlx4_err(dev, "Failed to bring QP to state: "
|
|
|
+ "%d with error: %d\n",
|
|
|
+ states[i + 1], err);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ *qp_state = states[i + 1];
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(mlx4_qp_to_ready);
|