{IB, net}/mlx5: Move the modify QP operation table to mlx5_ib
When modifying a QP, the desired operation was determined in the mlx5_core using a transition table that takes the current state, the final state, and returns the desired operation. Since this logic will be used for Raw Packet QP, move the operation table to the mlx5_ib. Signed-off-by: Majd Dibbiny <majd@mellanox.com> Reviewed-by: Matan Barak <matanb@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
Родитель
75850d0bce
Коммит
427c1e7bcd
|
@ -1528,10 +1528,9 @@ static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp)
|
||||||
|
|
||||||
if (qp->state != IB_QPS_RESET) {
|
if (qp->state != IB_QPS_RESET) {
|
||||||
mlx5_ib_qp_disable_pagefaults(qp);
|
mlx5_ib_qp_disable_pagefaults(qp);
|
||||||
if (mlx5_core_qp_modify(dev->mdev, to_mlx5_state(qp->state),
|
if (mlx5_core_qp_modify(dev->mdev, MLX5_CMD_OP_2RST_QP,
|
||||||
MLX5_QP_STATE_RST, in, 0,
|
in, 0, &base->mqp))
|
||||||
&base->mqp))
|
mlx5_ib_warn(dev, "mlx5_ib: modify QP 0x%06x to RESET failed\n",
|
||||||
mlx5_ib_warn(dev, "mlx5_ib: modify QP %06x to RESET failed\n",
|
|
||||||
base->mqp.qpn);
|
base->mqp.qpn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1989,6 +1988,43 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp,
|
||||||
const struct ib_qp_attr *attr, int attr_mask,
|
const struct ib_qp_attr *attr, int attr_mask,
|
||||||
enum ib_qp_state cur_state, enum ib_qp_state new_state)
|
enum ib_qp_state cur_state, enum ib_qp_state new_state)
|
||||||
{
|
{
|
||||||
|
static const u16 optab[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE] = {
|
||||||
|
[MLX5_QP_STATE_RST] = {
|
||||||
|
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
||||||
|
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
||||||
|
[MLX5_QP_STATE_INIT] = MLX5_CMD_OP_RST2INIT_QP,
|
||||||
|
},
|
||||||
|
[MLX5_QP_STATE_INIT] = {
|
||||||
|
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
||||||
|
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
||||||
|
[MLX5_QP_STATE_INIT] = MLX5_CMD_OP_INIT2INIT_QP,
|
||||||
|
[MLX5_QP_STATE_RTR] = MLX5_CMD_OP_INIT2RTR_QP,
|
||||||
|
},
|
||||||
|
[MLX5_QP_STATE_RTR] = {
|
||||||
|
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
||||||
|
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
||||||
|
[MLX5_QP_STATE_RTS] = MLX5_CMD_OP_RTR2RTS_QP,
|
||||||
|
},
|
||||||
|
[MLX5_QP_STATE_RTS] = {
|
||||||
|
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
||||||
|
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
||||||
|
[MLX5_QP_STATE_RTS] = MLX5_CMD_OP_RTS2RTS_QP,
|
||||||
|
},
|
||||||
|
[MLX5_QP_STATE_SQD] = {
|
||||||
|
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
||||||
|
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
||||||
|
},
|
||||||
|
[MLX5_QP_STATE_SQER] = {
|
||||||
|
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
||||||
|
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
||||||
|
[MLX5_QP_STATE_RTS] = MLX5_CMD_OP_SQERR2RTS_QP,
|
||||||
|
},
|
||||||
|
[MLX5_QP_STATE_ERR] = {
|
||||||
|
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
||||||
|
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct mlx5_ib_dev *dev = to_mdev(ibqp->device);
|
struct mlx5_ib_dev *dev = to_mdev(ibqp->device);
|
||||||
struct mlx5_ib_qp *qp = to_mqp(ibqp);
|
struct mlx5_ib_qp *qp = to_mqp(ibqp);
|
||||||
struct mlx5_ib_qp_base *base = &qp->trans_qp.base;
|
struct mlx5_ib_qp_base *base = &qp->trans_qp.base;
|
||||||
|
@ -2001,6 +2037,7 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp,
|
||||||
int sqd_event;
|
int sqd_event;
|
||||||
int mlx5_st;
|
int mlx5_st;
|
||||||
int err;
|
int err;
|
||||||
|
u16 op;
|
||||||
|
|
||||||
in = kzalloc(sizeof(*in), GFP_KERNEL);
|
in = kzalloc(sizeof(*in), GFP_KERNEL);
|
||||||
if (!in)
|
if (!in)
|
||||||
|
@ -2147,11 +2184,15 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp,
|
||||||
(new_state == IB_QPS_RESET || new_state == IB_QPS_ERR))
|
(new_state == IB_QPS_RESET || new_state == IB_QPS_ERR))
|
||||||
mlx5_ib_qp_disable_pagefaults(qp);
|
mlx5_ib_qp_disable_pagefaults(qp);
|
||||||
|
|
||||||
|
if (mlx5_cur >= MLX5_QP_NUM_STATE || mlx5_new >= MLX5_QP_NUM_STATE ||
|
||||||
|
!optab[mlx5_cur][mlx5_new])
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
op = optab[mlx5_cur][mlx5_new];
|
||||||
optpar = ib_mask_to_mlx5_opt(attr_mask);
|
optpar = ib_mask_to_mlx5_opt(attr_mask);
|
||||||
optpar &= opt_mask[mlx5_cur][mlx5_new][mlx5_st];
|
optpar &= opt_mask[mlx5_cur][mlx5_new][mlx5_st];
|
||||||
in->optparam = cpu_to_be32(optpar);
|
in->optparam = cpu_to_be32(optpar);
|
||||||
err = mlx5_core_qp_modify(dev->mdev, to_mlx5_state(cur_state),
|
err = mlx5_core_qp_modify(dev->mdev, op, in, sqd_event,
|
||||||
to_mlx5_state(new_state), in, sqd_event,
|
|
||||||
&base->mqp);
|
&base->mqp);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -348,59 +348,15 @@ int mlx5_core_destroy_qp(struct mlx5_core_dev *dev,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mlx5_core_destroy_qp);
|
EXPORT_SYMBOL_GPL(mlx5_core_destroy_qp);
|
||||||
|
|
||||||
int mlx5_core_qp_modify(struct mlx5_core_dev *dev, enum mlx5_qp_state cur_state,
|
int mlx5_core_qp_modify(struct mlx5_core_dev *dev, u16 operation,
|
||||||
enum mlx5_qp_state new_state,
|
|
||||||
struct mlx5_modify_qp_mbox_in *in, int sqd_event,
|
struct mlx5_modify_qp_mbox_in *in, int sqd_event,
|
||||||
struct mlx5_core_qp *qp)
|
struct mlx5_core_qp *qp)
|
||||||
{
|
{
|
||||||
static const u16 optab[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE] = {
|
|
||||||
[MLX5_QP_STATE_RST] = {
|
|
||||||
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
|
||||||
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
|
||||||
[MLX5_QP_STATE_INIT] = MLX5_CMD_OP_RST2INIT_QP,
|
|
||||||
},
|
|
||||||
[MLX5_QP_STATE_INIT] = {
|
|
||||||
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
|
||||||
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
|
||||||
[MLX5_QP_STATE_INIT] = MLX5_CMD_OP_INIT2INIT_QP,
|
|
||||||
[MLX5_QP_STATE_RTR] = MLX5_CMD_OP_INIT2RTR_QP,
|
|
||||||
},
|
|
||||||
[MLX5_QP_STATE_RTR] = {
|
|
||||||
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
|
||||||
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
|
||||||
[MLX5_QP_STATE_RTS] = MLX5_CMD_OP_RTR2RTS_QP,
|
|
||||||
},
|
|
||||||
[MLX5_QP_STATE_RTS] = {
|
|
||||||
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
|
||||||
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
|
||||||
[MLX5_QP_STATE_RTS] = MLX5_CMD_OP_RTS2RTS_QP,
|
|
||||||
},
|
|
||||||
[MLX5_QP_STATE_SQD] = {
|
|
||||||
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
|
||||||
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
|
||||||
},
|
|
||||||
[MLX5_QP_STATE_SQER] = {
|
|
||||||
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
|
||||||
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
|
||||||
[MLX5_QP_STATE_RTS] = MLX5_CMD_OP_SQERR2RTS_QP,
|
|
||||||
},
|
|
||||||
[MLX5_QP_STATE_ERR] = {
|
|
||||||
[MLX5_QP_STATE_RST] = MLX5_CMD_OP_2RST_QP,
|
|
||||||
[MLX5_QP_STATE_ERR] = MLX5_CMD_OP_2ERR_QP,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mlx5_modify_qp_mbox_out out;
|
struct mlx5_modify_qp_mbox_out out;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
u16 op;
|
|
||||||
|
|
||||||
if (cur_state >= MLX5_QP_NUM_STATE || new_state >= MLX5_QP_NUM_STATE ||
|
|
||||||
!optab[cur_state][new_state])
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
memset(&out, 0, sizeof(out));
|
memset(&out, 0, sizeof(out));
|
||||||
op = optab[cur_state][new_state];
|
in->hdr.opcode = cpu_to_be16(operation);
|
||||||
in->hdr.opcode = cpu_to_be16(op);
|
|
||||||
in->qpn = cpu_to_be32(qp->qpn);
|
in->qpn = cpu_to_be32(qp->qpn);
|
||||||
err = mlx5_cmd_exec(dev, in, sizeof(*in), &out, sizeof(out));
|
err = mlx5_cmd_exec(dev, in, sizeof(*in), &out, sizeof(out));
|
||||||
if (err)
|
if (err)
|
||||||
|
|
|
@ -641,8 +641,7 @@ int mlx5_core_create_qp(struct mlx5_core_dev *dev,
|
||||||
struct mlx5_core_qp *qp,
|
struct mlx5_core_qp *qp,
|
||||||
struct mlx5_create_qp_mbox_in *in,
|
struct mlx5_create_qp_mbox_in *in,
|
||||||
int inlen);
|
int inlen);
|
||||||
int mlx5_core_qp_modify(struct mlx5_core_dev *dev, enum mlx5_qp_state cur_state,
|
int mlx5_core_qp_modify(struct mlx5_core_dev *dev, u16 operation,
|
||||||
enum mlx5_qp_state new_state,
|
|
||||||
struct mlx5_modify_qp_mbox_in *in, int sqd_event,
|
struct mlx5_modify_qp_mbox_in *in, int sqd_event,
|
||||||
struct mlx5_core_qp *qp);
|
struct mlx5_core_qp *qp);
|
||||||
int mlx5_core_destroy_qp(struct mlx5_core_dev *dev,
|
int mlx5_core_destroy_qp(struct mlx5_core_dev *dev,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче