]> git.openfabrics.org - ~emulex/tmp/compat-rdma/.git/commitdiff
RDMA/ocrdma : ocrdma upstream sync up patch.
authorSelvin Xavier <selvin.xavier@avagotech.com>
Tue, 2 Jun 2015 17:56:02 +0000 (10:56 -0700)
committerSelvin Xavier <selvin.xavier@avagotech.com>
Tue, 2 Jun 2015 17:56:02 +0000 (10:56 -0700)
These patches are pushed upstream for linux 4.1 release
Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
linux-next-pending/0011-RDMA-ocrdma-Fix-EQ-destroy-failure-during-driver-unl.patch [new file with mode: 0644]
linux-next-pending/0012-RDMA-ocrdma-Report-EQ-full-fatal-error.patch [new file with mode: 0644]
linux-next-pending/0013-RDMA-ocrdma-Fix-QP-state-transition-in-destroy_qp.patch [new file with mode: 0644]
linux-next-pending/0014-RDMA-ocrdma-Use-VID-0-if-PFC-is-enabled-and-vlan-is-.patch [new file with mode: 0644]
linux-next-pending/0015-RDMA-ocrdma-Fix-the-request-length-for-RDMA_QUERY_QP.patch [new file with mode: 0644]
linux-next-pending/0016-RDMA-ocrdma-Prevent-allocation-of-DPP-PDs-if-FW-does.patch [new file with mode: 0644]
linux-next-pending/0017-RDMA-ocrdma-Fix-dmac-resolution-for-link-local-addre.patch [new file with mode: 0644]
linux-next-pending/0018-RDMA-ocrdma-Fail-connection-for-MTU-lesser-than-512.patch [new file with mode: 0644]
linux-next-pending/0019-RDMA-ocrdma-Update-ocrdma-version-number.patch [new file with mode: 0644]

diff --git a/linux-next-pending/0011-RDMA-ocrdma-Fix-EQ-destroy-failure-during-driver-unl.patch b/linux-next-pending/0011-RDMA-ocrdma-Fix-EQ-destroy-failure-during-driver-unl.patch
new file mode 100644 (file)
index 0000000..f641054
--- /dev/null
@@ -0,0 +1,35 @@
+From ff726edc2bdac1839b2b431bc96747de7ebbf8bb Mon Sep 17 00:00:00 2001
+From: Selvin Xavier <selvin.xavier@avagotech.com>
+Date: Wed, 6 May 2015 11:17:54 +0530
+Subject: [PATCH V2 for-4.1 1/9] RDMA/ocrdma: Fix EQ destroy failure during
+ driver unload
+
+Changing the destroy sequence of mailbox queue and event queues.
+FW expects mailbox queue to be destroyed before desroying the EQs.
+
+Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
+Signed-off-by: Devesh Sharma <devesh.sharma@avagotech.com>
+---
+ drivers/infiniband/hw/ocrdma/ocrdma_hw.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+index 0c9e959..3a5ea5af 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+@@ -3147,9 +3147,9 @@ void ocrdma_cleanup_hw(struct ocrdma_dev *dev)
+       ocrdma_free_pd_pool(dev);
+       ocrdma_mbx_delete_ah_tbl(dev);
+-      /* cleanup the eqs */
+-      ocrdma_destroy_eqs(dev);
+-
+       /* cleanup the control path */
+       ocrdma_destroy_mq(dev);
++
++      /* cleanup the eqs */
++      ocrdma_destroy_eqs(dev);
+ }
+-- 
+2.2.0
+
diff --git a/linux-next-pending/0012-RDMA-ocrdma-Report-EQ-full-fatal-error.patch b/linux-next-pending/0012-RDMA-ocrdma-Report-EQ-full-fatal-error.patch
new file mode 100644 (file)
index 0000000..e4ad5d6
--- /dev/null
@@ -0,0 +1,64 @@
+From 82ce3d572fbad0fffa26f3fd7979dddd78bb4d33 Mon Sep 17 00:00:00 2001
+From: Devesh Sharma <devesh.sharma@avagotech.com>
+Date: Wed, 6 May 2015 20:48:08 +0530
+Subject: [PATCH V2 for-4.1 2/9] RDMA/ocrdma: Report EQ full fatal error
+
+Detect when Event Queue (EQ) becomes full and print a warning message.
+
+Signed-off-by: Devesh Sharma <devesh.sharma@avagotech.com>
+Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
+---
+ drivers/infiniband/hw/ocrdma/ocrdma_hw.c  | 6 ++++++
+ drivers/infiniband/hw/ocrdma/ocrdma_sli.h | 7 +++++++
+ 2 files changed, 13 insertions(+)
+
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+index 3a5ea5af..65759ac 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+@@ -933,12 +933,18 @@ static irqreturn_t ocrdma_irq_handler(int irq, void *handle)
+       struct ocrdma_eqe eqe;
+       struct ocrdma_eqe *ptr;
+       u16 cq_id;
++      u8 mcode;
+       int budget = eq->cq_cnt;
+       do {
+               ptr = ocrdma_get_eqe(eq);
+               eqe = *ptr;
+               ocrdma_le32_to_cpu(&eqe, sizeof(eqe));
++              mcode = (eqe.id_valid & OCRDMA_EQE_MAJOR_CODE_MASK)
++                              >> OCRDMA_EQE_MAJOR_CODE_SHIFT;
++              if (mcode == OCRDMA_MAJOR_CODE_SENTINAL)
++                      pr_err("EQ full on eqid = 0x%x, eqe = 0x%x\n",
++                             eq->q.id, eqe.id_valid);
+               if ((eqe.id_valid & OCRDMA_EQE_VALID_MASK) == 0)
+                       break;
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
+index 243c87c..baf9b8a 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
+@@ -1624,12 +1624,19 @@ struct ocrdma_delete_ah_tbl_rsp {
+ enum {
+       OCRDMA_EQE_VALID_SHIFT          = 0,
+       OCRDMA_EQE_VALID_MASK           = BIT(0),
++      OCRDMA_EQE_MAJOR_CODE_MASK      = 0x0E,
++      OCRDMA_EQE_MAJOR_CODE_SHIFT     = 0x01,
+       OCRDMA_EQE_FOR_CQE_MASK         = 0xFFFE,
+       OCRDMA_EQE_RESOURCE_ID_SHIFT    = 16,
+       OCRDMA_EQE_RESOURCE_ID_MASK     = 0xFFFF <<
+                               OCRDMA_EQE_RESOURCE_ID_SHIFT,
+ };
++enum major_code {
++      OCRDMA_MAJOR_CODE_COMPLETION    = 0x00,
++      OCRDMA_MAJOR_CODE_SENTINAL      = 0x01
++};
++
+ struct ocrdma_eqe {
+       u32 id_valid;
+ };
+-- 
+2.2.0
+
diff --git a/linux-next-pending/0013-RDMA-ocrdma-Fix-QP-state-transition-in-destroy_qp.patch b/linux-next-pending/0013-RDMA-ocrdma-Fix-QP-state-transition-in-destroy_qp.patch
new file mode 100644 (file)
index 0000000..a147486
--- /dev/null
@@ -0,0 +1,47 @@
+From bc0ae2e7159279fb7fb2cd4aaa557be308cca8d5 Mon Sep 17 00:00:00 2001
+From: Devesh Sharma <devesh.sharma@avagotech.com>
+Date: Tue, 5 May 2015 19:49:31 +0530
+Subject: [PATCH V2 for-4.1 3/9] RDMA/ocrdma: Fix QP state transition in
+ destroy_qp
+
+Don't move QP to error state, if QP is in reset state during QP
+destroy operation.
+
+Signed-off-by: Devesh Sharma <devesh.sharma@avagotech.com>
+Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
+---
+ drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+index 8771755..06e8ab7 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+@@ -1721,18 +1721,20 @@ int ocrdma_destroy_qp(struct ib_qp *ibqp)
+       struct ocrdma_qp *qp;
+       struct ocrdma_dev *dev;
+       struct ib_qp_attr attrs;
+-      int attr_mask = IB_QP_STATE;
++      int attr_mask;
+       unsigned long flags;
+       qp = get_ocrdma_qp(ibqp);
+       dev = get_ocrdma_dev(ibqp->device);
+-      attrs.qp_state = IB_QPS_ERR;
+       pd = qp->pd;
+       /* change the QP state to ERROR */
+-      _ocrdma_modify_qp(ibqp, &attrs, attr_mask);
+-
++      if (qp->state != OCRDMA_QPS_RST) {
++              attrs.qp_state = IB_QPS_ERR;
++              attr_mask = IB_QP_STATE;
++              _ocrdma_modify_qp(ibqp, &attrs, attr_mask);
++      }
+       /* ensure that CQEs for newly created QP (whose id may be same with
+        * one which just getting destroyed are same), dont get
+        * discarded until the old CQEs are discarded.
+-- 
+2.2.0
+
diff --git a/linux-next-pending/0014-RDMA-ocrdma-Use-VID-0-if-PFC-is-enabled-and-vlan-is-.patch b/linux-next-pending/0014-RDMA-ocrdma-Use-VID-0-if-PFC-is-enabled-and-vlan-is-.patch
new file mode 100644 (file)
index 0000000..c24cf01
--- /dev/null
@@ -0,0 +1,76 @@
+From 14bfbc5b2aca8a9908cdbf5b3974f7e6c60cf797 Mon Sep 17 00:00:00 2001
+From: Devesh Sharma <devesh.sharma@avagotech.com>
+Date: Sat, 16 May 2015 04:57:43 +0530
+Subject: [PATCH V2 for-4.1 4/9] RDMA/ocrdma: Use VID 0 if PFC is enabled and
+ vlan is not configured
+
+If the adapter ports are in PFC mode and VLAN is not configured,
+use vlan tag 0 for RoCE traffic. Also, log an advisory message
+in system logs.
+
+Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
+Signed-off-by: Devesh Sharma <devesh.sharma@avagotech.com>
+Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
+---
+ drivers/infiniband/hw/ocrdma/ocrdma_ah.c |  8 +++++++-
+ drivers/infiniband/hw/ocrdma/ocrdma_hw.c | 12 +++++++++++-
+ 2 files changed, 18 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_ah.c b/drivers/infiniband/hw/ocrdma/ocrdma_ah.c
+index d812904..2a5993b 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_ah.c
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_ah.c
+@@ -56,7 +56,13 @@ static inline int set_av_attr(struct ocrdma_dev *dev, struct ocrdma_ah *ah,
+       vlan_tag = attr->vlan_id;
+       if (!vlan_tag || (vlan_tag > 0xFFF))
+               vlan_tag = dev->pvid;
+-      if (vlan_tag && (vlan_tag < 0x1000)) {
++      if (vlan_tag || dev->pfc_state) {
++              if (!vlan_tag) {
++                      pr_err("ocrdma%d:Using VLAN with PFC is recommended\n",
++                              dev->id);
++                      pr_err("ocrdma%d:Using VLAN 0 for this connection\n",
++                              dev->id);
++              }
+               eth.eth_type = cpu_to_be16(0x8100);
+               eth.roce_eth_type = cpu_to_be16(OCRDMA_ROCE_ETH_TYPE);
+               vlan_tag |= (dev->sl & 0x07) << OCRDMA_VID_PCP_SHIFT;
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+index 65759ac..da688d7 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+@@ -2434,7 +2434,7 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
+       int status;
+       struct ib_ah_attr *ah_attr = &attrs->ah_attr;
+       union ib_gid sgid, zgid;
+-      u32 vlan_id;
++      u32 vlan_id = 0xFFFF;
+       u8 mac_addr[6];
+       struct ocrdma_dev *dev = get_ocrdma_dev(qp->ibqp.device);
+@@ -2474,12 +2474,22 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
+       cmd->params.vlan_dmac_b4_to_b5 = mac_addr[4] | (mac_addr[5] << 8);
+       if (attr_mask & IB_QP_VID) {
+               vlan_id = attrs->vlan_id;
++      } else if (dev->pfc_state) {
++              vlan_id = 0;
++              pr_err("ocrdma%d:Using VLAN with PFC is recommended\n",
++                      dev->id);
++              pr_err("ocrdma%d:Using VLAN 0 for this connection\n",
++                      dev->id);
++      }
++
++      if (vlan_id < 0x1000) {
+               cmd->params.vlan_dmac_b4_to_b5 |=
+                   vlan_id << OCRDMA_QP_PARAMS_VLAN_SHIFT;
+               cmd->flags |= OCRDMA_QP_PARA_VLAN_EN_VALID;
+               cmd->params.rnt_rc_sl_fl |=
+                       (dev->sl & 0x07) << OCRDMA_QP_PARAMS_SL_SHIFT;
+       }
++
+       return 0;
+ }
+-- 
+2.2.0
+
diff --git a/linux-next-pending/0015-RDMA-ocrdma-Fix-the-request-length-for-RDMA_QUERY_QP.patch b/linux-next-pending/0015-RDMA-ocrdma-Fix-the-request-length-for-RDMA_QUERY_QP.patch
new file mode 100644 (file)
index 0000000..2cc329e
--- /dev/null
@@ -0,0 +1,44 @@
+From 01422961424ed566cb065aabc90a34cab5a2d2c5 Mon Sep 17 00:00:00 2001
+From: Mitesh Ahuja <mitesh.ahuja@avagotech.com>
+Date: Tue, 5 May 2015 13:57:21 +0530
+Subject: [PATCH V2 for-4.1 5/9] RDMA/ocrdma: Fix the request length for
+ RDMA_QUERY_QP mailbox command to FW.
+
+Fix ocrdma_query_qp to pass correct mailbox request length to FW.
+
+Signed-off-by: Mitesh Ahuja <mitesh.ahuja@avagotech.com>
+Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
+---
+ drivers/infiniband/hw/ocrdma/ocrdma_hw.c  | 2 +-
+ drivers/infiniband/hw/ocrdma/ocrdma_sli.h | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+index da688d7..5636eb6 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+@@ -2412,7 +2412,7 @@ int ocrdma_mbx_query_qp(struct ocrdma_dev *dev, struct ocrdma_qp *qp,
+       struct ocrdma_query_qp *cmd;
+       struct ocrdma_query_qp_rsp *rsp;
+-      cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_QUERY_QP, sizeof(*cmd));
++      cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_QUERY_QP, sizeof(*rsp));
+       if (!cmd)
+               return status;
+       cmd->qp_id = qp->id;
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
+index baf9b8a..02ad0ae 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
+@@ -1176,6 +1176,8 @@ struct ocrdma_query_qp_rsp {
+       struct ocrdma_mqe_hdr hdr;
+       struct ocrdma_mbx_rsp rsp;
+       struct ocrdma_qp_params params;
++      u32 dpp_credits_cqid;
++      u32 rbq_id;
+ };
+ enum {
+-- 
+2.2.0
+
diff --git a/linux-next-pending/0016-RDMA-ocrdma-Prevent-allocation-of-DPP-PDs-if-FW-does.patch b/linux-next-pending/0016-RDMA-ocrdma-Prevent-allocation-of-DPP-PDs-if-FW-does.patch
new file mode 100644 (file)
index 0000000..7ffa18c
--- /dev/null
@@ -0,0 +1,117 @@
+From 4a0ea055f0ec497c351b67177b6eb8c3027c1d68 Mon Sep 17 00:00:00 2001
+From: Mitesh Ahuja <mitesh.ahuja@avagotech.com>
+Date: Tue, 19 May 2015 11:17:58 +0530
+Subject: [PATCH V2 for-4.1 6/9] RDMA/ocrdma: Prevent allocation of DPP PDs if
+ FW doesnt support it
+
+If DPP PDs are not supported by the FW, allocate only normal PDs.
+
+Signed-off-by: Mitesh Ahuja <mitesh.ahuja@avagotech.com>
+Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
+Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
+---
+ drivers/infiniband/hw/ocrdma/ocrdma_hw.c    | 53 ++++++++++++++---------------
+ drivers/infiniband/hw/ocrdma/ocrdma_verbs.c |  2 +-
+ 2 files changed, 27 insertions(+), 28 deletions(-)
+
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+index 5636eb6..ac7347a 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+@@ -1440,27 +1440,30 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev)
+       struct ocrdma_alloc_pd_range_rsp *rsp;
+       /* Pre allocate the DPP PDs */
+-      cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd));
+-      if (!cmd)
+-              return -ENOMEM;
+-      cmd->pd_count = dev->attr.max_dpp_pds;
+-      cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP;
+-      status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
+-      if (status)
+-              goto mbx_err;
+-      rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;
+-
+-      if ((rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) && rsp->pd_count) {
+-              dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >>
+-                              OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT;
+-              dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid &
+-                              OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;
+-              dev->pd_mgr->max_dpp_pd = rsp->pd_count;
+-              pd_bitmap_size = BITS_TO_LONGS(rsp->pd_count) * sizeof(long);
+-              dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size,
+-                                                   GFP_KERNEL);
++      if (dev->attr.max_dpp_pds) {
++              cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE,
++                                        sizeof(*cmd));
++              if (!cmd)
++                      return -ENOMEM;
++              cmd->pd_count = dev->attr.max_dpp_pds;
++              cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP;
++              status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
++              rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;
++
++              if (!status && (rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) &&
++                  rsp->pd_count) {
++                      dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >>
++                                      OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT;
++                      dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid &
++                                      OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;
++                      dev->pd_mgr->max_dpp_pd = rsp->pd_count;
++                      pd_bitmap_size =
++                              BITS_TO_LONGS(rsp->pd_count) * sizeof(long);
++                      dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size,
++                                                           GFP_KERNEL);
++              }
++              kfree(cmd);
+       }
+-      kfree(cmd);
+       cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd));
+       if (!cmd)
+@@ -1468,10 +1471,8 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev)
+       cmd->pd_count = dev->attr.max_pd - dev->attr.max_dpp_pds;
+       status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
+-      if (status)
+-              goto mbx_err;
+       rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;
+-      if (rsp->pd_count) {
++      if (!status && rsp->pd_count) {
+               dev->pd_mgr->pd_norm_start = rsp->dpp_page_pdid &
+                                       OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;
+               dev->pd_mgr->max_normal_pd = rsp->pd_count;
+@@ -1479,15 +1480,13 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev)
+               dev->pd_mgr->pd_norm_bitmap = kzalloc(pd_bitmap_size,
+                                                     GFP_KERNEL);
+       }
++      kfree(cmd);
+       if (dev->pd_mgr->pd_norm_bitmap || dev->pd_mgr->pd_dpp_bitmap) {
+               /* Enable PD resource manager */
+               dev->pd_mgr->pd_prealloc_valid = true;
+-      } else {
+-              return -ENOMEM;
++              return 0;
+       }
+-mbx_err:
+-      kfree(cmd);
+       return status;
+ }
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+index 06e8ab7..9dcb660 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+@@ -365,7 +365,7 @@ static struct ocrdma_pd *_ocrdma_alloc_pd(struct ocrdma_dev *dev,
+       if (!pd)
+               return ERR_PTR(-ENOMEM);
+-      if (udata && uctx) {
++      if (udata && uctx && dev->attr.max_dpp_pds) {
+               pd->dpp_enabled =
+                       ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R;
+               pd->num_dpp_qp =
+-- 
+2.2.0
+
diff --git a/linux-next-pending/0017-RDMA-ocrdma-Fix-dmac-resolution-for-link-local-addre.patch b/linux-next-pending/0017-RDMA-ocrdma-Fix-dmac-resolution-for-link-local-addre.patch
new file mode 100644 (file)
index 0000000..9eed186
--- /dev/null
@@ -0,0 +1,49 @@
+From 55db35ce74a379a4f76ec03f81794141f91984d9 Mon Sep 17 00:00:00 2001
+From: Mitesh Ahuja <mitesh.ahuja@avagotech.com>
+Date: Wed, 13 May 2015 06:32:25 +0530
+Subject: [PATCH V2 for-4.1 7/9] RDMA/ocrdma: Fix dmac resolution for link
+ local address
+
+rdma_addr_find_dmac_by_grh fails to resolve dmac for link local address.
+Use rdma_get_ll_mac to resolve the link local address.
+
+Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
+Signed-off-by: Mitesh Ahuja <mitesh.ahuja@avagotech.com>
+Signed-off-by: Devesh Sharma <devesh.sharma@avagotech.com>
+Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
+---
+ drivers/infiniband/hw/ocrdma/ocrdma.h    | 2 ++
+ drivers/infiniband/hw/ocrdma/ocrdma_ah.c | 4 +++-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma.h b/drivers/infiniband/hw/ocrdma/ocrdma.h
+index c9780d9..ee9e335 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma.h
++++ b/drivers/infiniband/hw/ocrdma/ocrdma.h
+@@ -515,6 +515,8 @@ static inline int ocrdma_resolve_dmac(struct ocrdma_dev *dev,
+       memcpy(&in6, ah_attr->grh.dgid.raw, sizeof(in6));
+       if (rdma_is_multicast_addr(&in6))
+               rdma_get_mcast_mac(&in6, mac_addr);
++      else if (rdma_link_local_addr(&in6))
++              rdma_get_ll_mac(&in6, mac_addr);
+       else
+               memcpy(mac_addr, ah_attr->dmac, ETH_ALEN);
+       return 0;
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_ah.c b/drivers/infiniband/hw/ocrdma/ocrdma_ah.c
+index 2a5993b..f5a5ea836 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_ah.c
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_ah.c
+@@ -127,7 +127,9 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr)
+               goto av_conf_err;
+       }
+-      if (pd->uctx) {
++      if ((pd->uctx) &&
++          (!rdma_is_multicast_addr((struct in6_addr *)attr->grh.dgid.raw)) &&
++          (!rdma_link_local_addr((struct in6_addr *)attr->grh.dgid.raw))) {
+               status = rdma_addr_find_dmac_by_grh(&sgid, &attr->grh.dgid,
+                                         attr->dmac, &attr->vlan_id);
+               if (status) {
+-- 
+2.2.0
+
diff --git a/linux-next-pending/0018-RDMA-ocrdma-Fail-connection-for-MTU-lesser-than-512.patch b/linux-next-pending/0018-RDMA-ocrdma-Fail-connection-for-MTU-lesser-than-512.patch
new file mode 100644 (file)
index 0000000..ffa2691
--- /dev/null
@@ -0,0 +1,34 @@
+From 440db91607a7e188a7428b45f70a9c6a8593fe93 Mon Sep 17 00:00:00 2001
+From: Naga Irrinki <naga.irrinki@avagotech.com>
+Date: Sat, 9 May 2015 06:47:04 +0530
+Subject: [PATCH V2 for-4.1 8/9] RDMA/ocrdma: Fail connection for MTU lesser
+ than 512
+
+HW currently restricts the IB MTU range between 512 and 4096.
+Fail connection for MTUs lesser than 512.
+
+Signed-off-by: Naga Irrinki <naga.irrinki@avagotech.com>
+Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
+---
+ drivers/infiniband/hw/ocrdma/ocrdma_hw.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+index ac7347a..47615ff 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
++++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+@@ -2534,8 +2534,10 @@ static int ocrdma_set_qp_params(struct ocrdma_qp *qp,
+               cmd->flags |= OCRDMA_QP_PARA_DST_QPN_VALID;
+       }
+       if (attr_mask & IB_QP_PATH_MTU) {
+-              if (attrs->path_mtu < IB_MTU_256 ||
++              if (attrs->path_mtu < IB_MTU_512 ||
+                   attrs->path_mtu > IB_MTU_4096) {
++                      pr_err("ocrdma%d: IB MTU %d is not supported\n",
++                             dev->id, ib_mtu_enum_to_int(attrs->path_mtu));
+                       status = -EINVAL;
+                       goto pmtu_err;
+               }
+-- 
+2.2.0
+
diff --git a/linux-next-pending/0019-RDMA-ocrdma-Update-ocrdma-version-number.patch b/linux-next-pending/0019-RDMA-ocrdma-Update-ocrdma-version-number.patch
new file mode 100644 (file)
index 0000000..69845be
--- /dev/null
@@ -0,0 +1,28 @@
+From 69ec8dabf989ba272a3300bea866f2068aa2fe8a Mon Sep 17 00:00:00 2001
+From: Selvin Xavier <selvin.xavier@avagotech.com>
+Date: Sat, 16 May 2015 08:56:30 +0530
+Subject: [PATCH V2 for-4.1 9/9] RDMA/ocrdma: Update ocrdma version number
+
+Updating the driver version to 10.6.0.0
+
+Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com>
+---
+ drivers/infiniband/hw/ocrdma/ocrdma.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/ocrdma/ocrdma.h b/drivers/infiniband/hw/ocrdma/ocrdma.h
+index ee9e335..b396344 100644
+--- a/drivers/infiniband/hw/ocrdma/ocrdma.h
++++ b/drivers/infiniband/hw/ocrdma/ocrdma.h
+@@ -40,7 +40,7 @@
+ #include <be_roce.h>
+ #include "ocrdma_sli.h"
+-#define OCRDMA_ROCE_DRV_VERSION "10.4.205.0u"
++#define OCRDMA_ROCE_DRV_VERSION "10.6.0.0_ofed"
+ #define OCRDMA_ROCE_DRV_DESC "Emulex OneConnect RoCE Driver"
+ #define OCRDMA_NODE_DESC "Emulex OneConnect RoCE HCA"
+-- 
+2.2.0
+