diff options
Diffstat (limited to 'drivers/infiniband/hw/cxgb3/cxio_hal.c')
-rw-r--r-- | drivers/infiniband/hw/cxgb3/cxio_hal.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c index 66eb7030aea8..ed2ee4ba4b7c 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_hal.c +++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c | |||
@@ -456,7 +456,8 @@ void cxio_count_scqes(struct t3_cq *cq, struct t3_wq *wq, int *count) | |||
456 | ptr = cq->sw_rptr; | 456 | ptr = cq->sw_rptr; |
457 | while (!Q_EMPTY(ptr, cq->sw_wptr)) { | 457 | while (!Q_EMPTY(ptr, cq->sw_wptr)) { |
458 | cqe = cq->sw_queue + (Q_PTR2IDX(ptr, cq->size_log2)); | 458 | cqe = cq->sw_queue + (Q_PTR2IDX(ptr, cq->size_log2)); |
459 | if ((SQ_TYPE(*cqe) || (CQE_OPCODE(*cqe) == T3_READ_RESP)) && | 459 | if ((SQ_TYPE(*cqe) || |
460 | ((CQE_OPCODE(*cqe) == T3_READ_RESP) && wq->oldest_read)) && | ||
460 | (CQE_QPID(*cqe) == wq->qpid)) | 461 | (CQE_QPID(*cqe) == wq->qpid)) |
461 | (*count)++; | 462 | (*count)++; |
462 | ptr++; | 463 | ptr++; |
@@ -829,7 +830,8 @@ int cxio_rdma_init(struct cxio_rdev *rdev_p, struct t3_rdma_init_attr *attr) | |||
829 | wqe->mpaattrs = attr->mpaattrs; | 830 | wqe->mpaattrs = attr->mpaattrs; |
830 | wqe->qpcaps = attr->qpcaps; | 831 | wqe->qpcaps = attr->qpcaps; |
831 | wqe->ulpdu_size = cpu_to_be16(attr->tcp_emss); | 832 | wqe->ulpdu_size = cpu_to_be16(attr->tcp_emss); |
832 | wqe->flags = cpu_to_be32(attr->flags); | 833 | wqe->rqe_count = cpu_to_be16(attr->rqe_count); |
834 | wqe->flags_rtr_type = cpu_to_be16(attr->flags|V_RTR_TYPE(attr->rtr_type)); | ||
833 | wqe->ord = cpu_to_be32(attr->ord); | 835 | wqe->ord = cpu_to_be32(attr->ord); |
834 | wqe->ird = cpu_to_be32(attr->ird); | 836 | wqe->ird = cpu_to_be32(attr->ird); |
835 | wqe->qp_dma_addr = cpu_to_be64(attr->qp_dma_addr); | 837 | wqe->qp_dma_addr = cpu_to_be64(attr->qp_dma_addr); |
@@ -1135,6 +1137,18 @@ int cxio_poll_cq(struct t3_wq *wq, struct t3_cq *cq, struct t3_cqe *cqe, | |||
1135 | if (RQ_TYPE(*hw_cqe) && (CQE_OPCODE(*hw_cqe) == T3_READ_RESP)) { | 1137 | if (RQ_TYPE(*hw_cqe) && (CQE_OPCODE(*hw_cqe) == T3_READ_RESP)) { |
1136 | 1138 | ||
1137 | /* | 1139 | /* |
1140 | * If this is an unsolicited read response, then the read | ||
1141 | * was generated by the kernel driver as part of peer-2-peer | ||
1142 | * connection setup. So ignore the completion. | ||
1143 | */ | ||
1144 | if (!wq->oldest_read) { | ||
1145 | if (CQE_STATUS(*hw_cqe)) | ||
1146 | wq->error = 1; | ||
1147 | ret = -1; | ||
1148 | goto skip_cqe; | ||
1149 | } | ||
1150 | |||
1151 | /* | ||
1138 | * Don't write to the HWCQ, so create a new read req CQE | 1152 | * Don't write to the HWCQ, so create a new read req CQE |
1139 | * in local memory. | 1153 | * in local memory. |
1140 | */ | 1154 | */ |