Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3fa1fa3e authored by Roland Dreier's avatar Roland Dreier
Browse files

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: default avatarRoland Dreier <rolandd@cisco.com>
parent 5e9f71a1
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -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)
+13 −1
Original line number Original line Diff line number Diff line
@@ -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);