RDMA/qedr: Add support for read with invalidate, supported in iWARP
authorKalderon, Michal <Michal.Kalderon@cavium.com>
Wed, 26 Jul 2017 11:41:54 +0000 (14:41 +0300)
committerDoug Ledford <dledford@redhat.com>
Fri, 18 Aug 2017 16:25:42 +0000 (12:25 -0400)
iWARP supports read with invalidate. There is an assumption
that read with invalidate will only be called on an iWARP device

Signed-off-by: Michal Kalderon <Michal.Kalderon@cavium.com>
Signed-off-by: Ram Amrani <Ram.Amrani@cavium.com>
Signed-off-by: Ariel Elior <Ariel.Elior@cavium.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/qedr/qedr_hsi_rdma.h
drivers/infiniband/hw/qedr/verbs.c

index 5c98d2055cadfb91e33e5102b900bb6043c615a4..b7587f10e7dea0679e73a19f23113a521b1d7a2f 100644 (file)
@@ -655,8 +655,10 @@ struct rdma_sq_rdma_wqe_1st {
 #define RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG_SHIFT      4
 #define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_MASK  0x1
 #define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_SHIFT 5
-#define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK        0x3
-#define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT       6
+#define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_MASK     0x1
+#define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_SHIFT    6
+#define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK        0x1
+#define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT       7
        u8 wqe_size;
        u8 prev_wqe_size;
 };
index a4c29325a9aecd63be42a57093143aa304bca86f..237ae5e40e766a7c318269746fc79413ea00e170 100644 (file)
@@ -2845,6 +2845,7 @@ static enum ib_wc_opcode qedr_ib_to_wc_opcode(enum ib_wr_opcode opcode)
        case IB_WR_SEND_WITH_INV:
                return IB_WC_SEND;
        case IB_WR_RDMA_READ:
+       case IB_WR_RDMA_READ_WITH_INV:
                return IB_WC_RDMA_READ;
        case IB_WR_ATOMIC_CMP_AND_SWP:
                return IB_WC_COMP_SWAP;
@@ -3005,11 +3006,8 @@ static int __qedr_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
                qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
                break;
        case IB_WR_RDMA_READ_WITH_INV:
-               DP_ERR(dev,
-                      "RDMA READ WITH INVALIDATE not supported\n");
-               *bad_wr = wr;
-               rc = -EINVAL;
-               break;
+               SET_FIELD2(wqe->flags, RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG, 1);
+               /* fallthrough... same is identical to RDMA READ */
 
        case IB_WR_RDMA_READ:
                wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_RD;