IB/mthca: Generate SQ drained events when requested
authorRoland Dreier <rolandd@cisco.com>
Fri, 3 Feb 2006 22:53:28 +0000 (14:53 -0800)
committerRoland Dreier <rolandd@cisco.com>
Mon, 20 Mar 2006 18:08:12 +0000 (10:08 -0800)
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>
drivers/infiniband/hw/mthca/mthca_cmd.c
drivers/infiniband/hw/mthca/mthca_qp.c

index 7150fd143bffa6f5d3ecb6493897b95748115a7a..9e7baa8b57a92ab41c269311b12dc66b2552524f 100644 (file)
@@ -1638,7 +1638,8 @@ int mthca_MODIFY_QP(struct mthca_dev *dev, int trans, u32 num,
                }
 
        } 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);
 
        if (my_mailbox)
index bdba39a8d9f9743670b6c3cfe652c99781d53f49..97f5303d2c0201f91610ecaf3e5fef860ffce7c8 100644 (file)
@@ -415,6 +415,12 @@ static const struct {
                },
                [IB_QPS_SQD]   = {
                        .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]   = {
@@ -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_context *qp_context;
        u32 req_param, opt_param;
+       u32 sqd_event = 0;
        u8 status;
        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 |
                                               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,
-                             qp->qpn, 0, mailbox, 0, &status);
+                             qp->qpn, 0, mailbox, sqd_event, &status);
        if (status) {
                mthca_warn(dev, "modify QP %d returned status %02x.\n",
                           state_table[cur_state][new_state].trans, status);