aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Dreier <roland@purestorage.com>2011-02-17 14:04:59 -0800
committerRoland Dreier <roland@purestorage.com>2011-02-17 14:04:59 -0800
commit814b0a61204d24f9fba6f7c575e6450d15ce2cf1 (patch)
tree978d0265d1387036e8285685bc0692cade005f90
parentRDMA/nes: Don't generate async events for unregistered devices (diff)
parentIB/qib: Prevent double completions after a timeout or RNR error (diff)
downloadlinux-dev-814b0a61204d24f9fba6f7c575e6450d15ce2cf1.tar.xz
linux-dev-814b0a61204d24f9fba6f7c575e6450d15ce2cf1.zip
Merge branches 'nes' and 'qib' into for-next
-rw-r--r--drivers/infiniband/hw/qib/qib_rc.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/qib/qib_rc.c b/drivers/infiniband/hw/qib/qib_rc.c
index 8245237b67ce..eca0c41f1226 100644
--- a/drivers/infiniband/hw/qib/qib_rc.c
+++ b/drivers/infiniband/hw/qib/qib_rc.c
@@ -1005,7 +1005,8 @@ void qib_rc_send_complete(struct qib_qp *qp, struct qib_ib_header *hdr)
* there are still requests that haven't been acked.
*/
if ((psn & IB_BTH_REQ_ACK) && qp->s_acked != qp->s_tail &&
- !(qp->s_flags & (QIB_S_TIMER | QIB_S_WAIT_RNR | QIB_S_WAIT_PSN)))
+ !(qp->s_flags & (QIB_S_TIMER | QIB_S_WAIT_RNR | QIB_S_WAIT_PSN)) &&
+ (ib_qib_state_ops[qp->state] & QIB_PROCESS_RECV_OK))
start_timer(qp);
while (qp->s_last != qp->s_acked) {
@@ -1439,6 +1440,8 @@ static void qib_rc_rcv_resp(struct qib_ibport *ibp,
}
spin_lock_irqsave(&qp->s_lock, flags);
+ if (!(ib_qib_state_ops[qp->state] & QIB_PROCESS_RECV_OK))
+ goto ack_done;
/* Ignore invalid responses. */
if (qib_cmp24(psn, qp->s_next_psn) >= 0)