|
@@ -647,6 +647,7 @@ static void send_rc_ack(struct ipath_qp *qp)
|
|
|
|
|
|
queue_ack:
|
|
|
spin_lock_irqsave(&qp->s_lock, flags);
|
|
|
+ dev->n_rc_qacks++;
|
|
|
qp->s_flags |= IPATH_S_ACK_PENDING;
|
|
|
qp->s_nak_state = qp->r_nak_state;
|
|
|
qp->s_ack_psn = qp->r_ack_psn;
|
|
@@ -798,11 +799,13 @@ bail:
|
|
|
|
|
|
static inline void update_last_psn(struct ipath_qp *qp, u32 psn)
|
|
|
{
|
|
|
- if (qp->s_wait_credit) {
|
|
|
- qp->s_wait_credit = 0;
|
|
|
- tasklet_hi_schedule(&qp->s_task);
|
|
|
+ if (qp->s_last_psn != psn) {
|
|
|
+ qp->s_last_psn = psn;
|
|
|
+ if (qp->s_wait_credit) {
|
|
|
+ qp->s_wait_credit = 0;
|
|
|
+ tasklet_hi_schedule(&qp->s_task);
|
|
|
+ }
|
|
|
}
|
|
|
- qp->s_last_psn = psn;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1653,13 +1656,6 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
|
|
|
case OP(SEND_FIRST):
|
|
|
if (!ipath_get_rwqe(qp, 0)) {
|
|
|
rnr_nak:
|
|
|
- /*
|
|
|
- * A RNR NAK will ACK earlier sends and RDMA writes.
|
|
|
- * Don't queue the NAK if a RDMA read or atomic
|
|
|
- * is pending though.
|
|
|
- */
|
|
|
- if (qp->r_nak_state)
|
|
|
- goto done;
|
|
|
qp->r_nak_state = IB_RNR_NAK | qp->r_min_rnr_timer;
|
|
|
qp->r_ack_psn = qp->r_psn;
|
|
|
goto send_ack;
|