IB/mthca: Generate SQ drained events when requested
Add low-level driver support to ib_mthca so that consumers can request a "send queue drained" event be generated when a transiton to the SQD state completes. Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
@@ -1638,7 +1638,8 @@ int mthca_MODIFY_QP(struct mthca_dev *dev, int trans, u32 num,
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else
|
} else
|
||||||
err = mthca_cmd(dev, mailbox->dma, (!!is_ee << 24) | num,
|
err = mthca_cmd(dev, mailbox->dma,
|
||||||
|
optmask | (!!is_ee << 24) | num,
|
||||||
op_mod, op[trans], CMD_TIME_CLASS_C, status);
|
op_mod, op[trans], CMD_TIME_CLASS_C, status);
|
||||||
|
|
||||||
if (my_mailbox)
|
if (my_mailbox)
|
||||||
|
@@ -415,6 +415,12 @@ static const struct {
|
|||||||
},
|
},
|
||||||
[IB_QPS_SQD] = {
|
[IB_QPS_SQD] = {
|
||||||
.trans = MTHCA_TRANS_RTS2SQD,
|
.trans = MTHCA_TRANS_RTS2SQD,
|
||||||
|
.opt_param = {
|
||||||
|
[UD] = IB_QP_EN_SQD_ASYNC_NOTIFY,
|
||||||
|
[UC] = IB_QP_EN_SQD_ASYNC_NOTIFY,
|
||||||
|
[RC] = IB_QP_EN_SQD_ASYNC_NOTIFY,
|
||||||
|
[MLX] = IB_QP_EN_SQD_ASYNC_NOTIFY
|
||||||
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
[IB_QPS_SQD] = {
|
[IB_QPS_SQD] = {
|
||||||
@@ -577,6 +583,7 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask)
|
|||||||
struct mthca_qp_param *qp_param;
|
struct mthca_qp_param *qp_param;
|
||||||
struct mthca_qp_context *qp_context;
|
struct mthca_qp_context *qp_context;
|
||||||
u32 req_param, opt_param;
|
u32 req_param, opt_param;
|
||||||
|
u32 sqd_event = 0;
|
||||||
u8 status;
|
u8 status;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@@ -841,8 +848,13 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask)
|
|||||||
qp_context->srqn = cpu_to_be32(1 << 24 |
|
qp_context->srqn = cpu_to_be32(1 << 24 |
|
||||||
to_msrq(ibqp->srq)->srqn);
|
to_msrq(ibqp->srq)->srqn);
|
||||||
|
|
||||||
|
if (cur_state == IB_QPS_RTS && new_state == IB_QPS_SQD &&
|
||||||
|
attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY &&
|
||||||
|
attr->en_sqd_async_notify)
|
||||||
|
sqd_event = 1 << 31;
|
||||||
|
|
||||||
err = mthca_MODIFY_QP(dev, state_table[cur_state][new_state].trans,
|
err = mthca_MODIFY_QP(dev, state_table[cur_state][new_state].trans,
|
||||||
qp->qpn, 0, mailbox, 0, &status);
|
qp->qpn, 0, mailbox, sqd_event, &status);
|
||||||
if (status) {
|
if (status) {
|
||||||
mthca_warn(dev, "modify QP %d returned status %02x.\n",
|
mthca_warn(dev, "modify QP %d returned status %02x.\n",
|
||||||
state_table[cur_state][new_state].trans, status);
|
state_table[cur_state][new_state].trans, status);
|
||||||
|
Reference in New Issue
Block a user