]> git.openfabrics.org - ~emulex/libocrdma.git/commitdiff
RDMA/libocrdma: set vlan present bit for UD
authorDevesh Sharma <devesh.sharma@emulex.com>
Thu, 18 Dec 2014 13:28:16 +0000 (18:58 +0530)
committerDevesh Sharma <devesh.sharma@emulex.com>
Sat, 17 Jan 2015 10:42:19 +0000 (16:12 +0530)
This patch tells f/w about the presence of VLAN tag in
the AH being supplied to the QP.

Signed-off-by: Devesh Sharma <devesh.sharma@emulex.com>
src/ocrdma_abi.h
src/ocrdma_main.h
src/ocrdma_verbs.c

index ad7abd43f0a03f2bf93407702747ee6b6c2cf8dd..8102c1c4651522c90a7b267c79354a17da54fb79 100644 (file)
@@ -51,14 +51,14 @@ enum {
 };
 
 #define OCRDMA_DB_CQ_RING_ID_MASK              0x3FF   /* bits 0 - 9 */
-#define OCRDMA_DB_CQ_RING_ID_EXT_MASK  0x0C00  /* bits 10-11 of qid placing at 12-11 */
-#define OCRDMA_DB_CQ_RING_ID_EXT_MASK_SHIFT  0x1       /* qid #2 msbits placing at 12-11 */
+#define OCRDMA_DB_CQ_RING_ID_EXT_MASK          0x0C00  /* bits 10-11 of qid placing at 12-11 */
+#define OCRDMA_DB_CQ_RING_ID_EXT_MASK_SHIFT    0x1     /* qid #2 msbits placing at 12-11 */
 #define OCRDMA_DB_CQ_NUM_POPPED_SHIFT          (16)    /* bits 16 - 28 */
 /* Rearm bit */
 #define OCRDMA_DB_CQ_REARM_SHIFT               (29)    /* bit 29 */
 
 /* solicited bit */
-#define OCRDMA_DB_CQ_SOLICIT_SHIFT   (31)      /* bit 31 */
+#define OCRDMA_DB_CQ_SOLICIT_SHIFT             (31)    /* bit 31 */
 
 struct ocrdma_get_context {
        struct ibv_get_context cmd;
@@ -291,6 +291,7 @@ enum {
        OCRDMA_FLAG_FENCE_R     = 0x8,
        OCRDMA_FLAG_SOLICIT     = 0x10,
        OCRDMA_FLAG_IMM         = 0x20,
+       OCRDMA_FLAG_AH_VLAN_PR  = 0x40,
 
        /* Stag flags */
        OCRDMA_LKEY_FLAG_LOCAL_WR       = 0x1,
index 5a386bb336589b05f521dbfaee58ffbbb3fe9ff3..4e7be756a935bc45dc9d4cc14b26c940d407c71b 100644 (file)
@@ -211,10 +211,17 @@ struct ocrdma_qp {
        int     signaled;       /* signaled QP */
 };
 
+enum {
+       OCRDMA_AH_ID_MASK               = 0x3FF,
+       OCRDMA_AH_VLAN_VALID_MASK       = 0x01,
+       OCRDMA_AH_VLAN_VALID_SHIFT      = 0x1F
+};
+
 struct ocrdma_ah {
        struct ibv_ah ibv_ah;
        struct ocrdma_pd *pd;
        uint16_t id;
+       uint8_t isvlan;
 };
 
 #define get_ocrdma_xxx(xxx, type)                              \
index ab90b4fb16b5cc257bae9f5338a53ba768883dca..d80ab2779a74af4d469de81819e4904a560409fd 100644 (file)
@@ -1196,6 +1196,9 @@ static void ocrdma_build_ud_hdr(struct ocrdma_qp *qp,
        ud_hdr->rsvd_dest_qpn = wr->wr.ud.remote_qpn;
        ud_hdr->qkey = wr->wr.ud.remote_qkey;
        ud_hdr->rsvd_ahid = ah->id;
+       if (ah->isvlan)
+               hdr->cw |= (OCRDMA_FLAG_AH_VLAN_PR <<
+                           OCRDMA_WQE_FLAGS_SHIFT);
 }
 
 static void ocrdma_build_sges(struct ocrdma_hdr_wqe *hdr,
@@ -2156,9 +2159,10 @@ struct ibv_ah *ocrdma_create_ah(struct ibv_pd *ibpd, struct ibv_ah_attr *attr)
        if (status)
                goto cmd_err;
 
-       ah->id = pd->uctx->ah_tbl[ahtbl_idx];
+       ah->id = pd->uctx->ah_tbl[ahtbl_idx] & OCRDMA_AH_ID_MASK;
+       ah->isvlan = (pd->uctx->ah_tbl[ahtbl_idx] >>
+                       OCRDMA_AH_VLAN_VALID_SHIFT);
        return &ah->ibv_ah;
-
 cmd_err:
        ocrdma_free_ah_tbl_id(pd->uctx, ahtbl_idx);
 tbl_err: