diff options
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_rc.c | 7 | ||||
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_verbs.h | 1 |
2 files changed, 8 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_rc.c b/drivers/infiniband/hw/ipath/ipath_rc.c index 5b5276a270bc..108df667d2ee 100644 --- a/drivers/infiniband/hw/ipath/ipath_rc.c +++ b/drivers/infiniband/hw/ipath/ipath_rc.c | |||
@@ -1189,6 +1189,7 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1189 | wqe = get_swqe_ptr(qp, qp->s_last); | 1189 | wqe = get_swqe_ptr(qp, qp->s_last); |
1190 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) | 1190 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) |
1191 | goto ack_op_err; | 1191 | goto ack_op_err; |
1192 | qp->r_flags &= ~IPATH_R_RDMAR_SEQ; | ||
1192 | /* | 1193 | /* |
1193 | * If this is a response to a resent RDMA read, we | 1194 | * If this is a response to a resent RDMA read, we |
1194 | * have to be careful to copy the data to the right | 1195 | * have to be careful to copy the data to the right |
@@ -1202,6 +1203,9 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1202 | /* no AETH, no ACK */ | 1203 | /* no AETH, no ACK */ |
1203 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { | 1204 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { |
1204 | dev->n_rdma_seq++; | 1205 | dev->n_rdma_seq++; |
1206 | if (qp->r_flags & IPATH_R_RDMAR_SEQ) | ||
1207 | goto ack_done; | ||
1208 | qp->r_flags |= IPATH_R_RDMAR_SEQ; | ||
1205 | ipath_restart_rc(qp, qp->s_last_psn + 1); | 1209 | ipath_restart_rc(qp, qp->s_last_psn + 1); |
1206 | goto ack_done; | 1210 | goto ack_done; |
1207 | } | 1211 | } |
@@ -1263,6 +1267,9 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1263 | /* ACKs READ req. */ | 1267 | /* ACKs READ req. */ |
1264 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { | 1268 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { |
1265 | dev->n_rdma_seq++; | 1269 | dev->n_rdma_seq++; |
1270 | if (qp->r_flags & IPATH_R_RDMAR_SEQ) | ||
1271 | goto ack_done; | ||
1272 | qp->r_flags |= IPATH_R_RDMAR_SEQ; | ||
1266 | ipath_restart_rc(qp, qp->s_last_psn + 1); | 1273 | ipath_restart_rc(qp, qp->s_last_psn + 1); |
1267 | goto ack_done; | 1274 | goto ack_done; |
1268 | } | 1275 | } |
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.h b/drivers/infiniband/hw/ipath/ipath_verbs.h index deee02ca7ca4..9d12ae8a778e 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.h +++ b/drivers/infiniband/hw/ipath/ipath_verbs.h | |||
@@ -444,6 +444,7 @@ struct ipath_qp { | |||
444 | * Bit definitions for r_flags. | 444 | * Bit definitions for r_flags. |
445 | */ | 445 | */ |
446 | #define IPATH_R_REUSE_SGE 0x01 | 446 | #define IPATH_R_REUSE_SGE 0x01 |
447 | #define IPATH_R_RDMAR_SEQ 0x02 | ||
447 | 448 | ||
448 | /* | 449 | /* |
449 | * Bit definitions for s_flags. | 450 | * Bit definitions for s_flags. |