]> git.openfabrics.org - ~tnikolova/compat-rdma/.git/commitdiff
vmw_pvrdma: Update patches with fixes
authorAdit Ranadive <aditr@vmware.com>
Wed, 15 Mar 2017 06:44:23 +0000 (23:44 -0700)
committerAdit Ranadive <aditr@vmware.com>
Wed, 15 Mar 2017 07:08:48 +0000 (00:08 -0700)
Added the following fixes:
- Put IB device in PORT_ACTIVE state when module is loaded on boot
- Zero out alloc_ucontext uresp
- Move hardcoded page numbers to macro
- Remove unused variables in post_send/post_recv

Signed-off-by: Adit Ranadive <aditr@vmware.com>
tech-preview/vmw_pvrdma/0001-IB-vmw_pvrdma-Add-user-level-shared-functions.patch
tech-preview/vmw_pvrdma/0004-IB-vmw_pvrdma-Add-functions-for-Verbs-support.patch
tech-preview/vmw_pvrdma/0005-IB-vmw_pvrdma-Add-paravirtual-rdma-device.patch
tech-preview/vmw_pvrdma/0011-IB-vmw_pvrdma-Add-Queue-Pair-support.patch
tech-preview/vmw_pvrdma/0012-IB-vmw_pvrdma-Add-the-main-driver.patch

index ad0cd39053ba833bb0767c8c6ef3fba92ac45c3f..317f22b2bc7dc272da9f1abf297c444beaa1ebfb 100644 (file)
@@ -1,4 +1,4 @@
-From 0d9e1f959e03cbb23cc6ee502bdefb535621e38f Mon Sep 17 00:00:00 2001
+From 2a670e3dc976a787f4ee58f6014210745ee9f414 Mon Sep 17 00:00:00 2001
 From: Adit Ranadive <aditr@vmware.com>
 Date: Mon, 19 Dec 2016 16:17:34 -0800
 Subject: [PATCH 01/14] IB/vmw_pvrdma: Add user-level shared functions
@@ -13,16 +13,16 @@ Reviewed-by: Aditya Sarwade <asarwade@vmware.com>
 Reviewed-by: Bryan Tan <bryantan@vmware.com>
 Signed-off-by: Adit Ranadive <aditr@vmware.com>
 ---
- drivers/infiniband/hw/vmw_pvrdma/vmw_pvrdma-abi.h | 289 ++++++++++++++++++++++
- 1 file changed, 289 insertions(+)
+ drivers/infiniband/hw/vmw_pvrdma/vmw_pvrdma-abi.h | 310 ++++++++++++++++++++++
+ 1 file changed, 310 insertions(+)
  create mode 100644 drivers/infiniband/hw/vmw_pvrdma/vmw_pvrdma-abi.h
 
 diff --git a/drivers/infiniband/hw/vmw_pvrdma/vmw_pvrdma-abi.h b/drivers/infiniband/hw/vmw_pvrdma/vmw_pvrdma-abi.h
 new file mode 100644
-index 0000000..5016abc
+index 0000000..73f2f80
 --- /dev/null
 +++ b/drivers/infiniband/hw/vmw_pvrdma/vmw_pvrdma-abi.h
-@@ -0,0 +1,289 @@
+@@ -0,0 +1,310 @@
 +/*
 + * Copyright (c) 2012-2016 VMware, Inc.  All rights reserved.
 + *
@@ -73,12 +73,12 @@ index 0000000..5016abc
 +
 +#include <linux/types.h>
 +
-+#define PVRDMA_UVERBS_ABI_VERSION     3               /* ABI Version. */
++#define PVRDMA_UVERBS_ABI_VERSION     3
 +#define PVRDMA_UAR_HANDLE_MASK                0x00FFFFFF      /* Bottom 24 bits. */
-+#define PVRDMA_UAR_QP_OFFSET          0               /* QP doorbell. */
++#define PVRDMA_UAR_QP_OFFSET          0               /* QP doorbell offset. */
 +#define PVRDMA_UAR_QP_SEND            BIT(30)         /* Send bit. */
 +#define PVRDMA_UAR_QP_RECV            BIT(31)         /* Recv bit. */
-+#define PVRDMA_UAR_CQ_OFFSET          4               /* CQ doorbell. */
++#define PVRDMA_UAR_CQ_OFFSET          4               /* CQ doorbell offset. */
 +#define PVRDMA_UAR_CQ_ARM_SOL         BIT(29)         /* Arm solicited bit. */
 +#define PVRDMA_UAR_CQ_ARM             BIT(30)         /* Arm bit. */
 +#define PVRDMA_UAR_CQ_POLL            BIT(31)         /* Poll bit. */
@@ -311,6 +311,27 @@ index 0000000..5016abc
 +      __u8 reserved2[7]; /* Pad to next power of 2 (64). */
 +};
 +
++static inline enum pvrdma_wr_opcode ib_wr_opcode_to_pvrdma(enum ib_wr_opcode op)
++{
++      return (enum pvrdma_wr_opcode)op;
++}
++
++static inline enum ib_wc_status pvrdma_wc_status_to_ib(
++                                      enum pvrdma_wc_status status)
++{
++      return (enum ib_wc_status)status;
++}
++
++static inline int pvrdma_wc_opcode_to_ib(int opcode)
++{
++      return opcode;
++}
++
++static inline int pvrdma_wc_flags_to_ib(int flags)
++{
++      return flags;
++}
++
 +#endif /* __VMW_PVRDMA_ABI_H__ */
 -- 
 1.8.3.1
index 552873ec79bdae5bdba0d8d8b89272332fb732f4..33c3b54af421d44571f40e0653e364b0b86191cf 100644 (file)
@@ -1,4 +1,4 @@
-From 46df7fefcb0a8ad5521106d31197bff0043b6032 Mon Sep 17 00:00:00 2001
+From a99dc8aa1c4a24fa125fe2fd43adb71016ebd3b9 Mon Sep 17 00:00:00 2001
 From: Adit Ranadive <aditr@vmware.com>
 Date: Mon, 19 Dec 2016 16:23:19 -0800
 Subject: [PATCH 04/14] IB/vmw_pvrdma: Add functions for Verbs support
@@ -20,7 +20,7 @@ Signed-off-by: Adit Ranadive <aditr@vmware.com>
 
 diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c
 new file mode 100644
-index 0000000..1753075
+index 0000000..1605af7
 --- /dev/null
 +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c
 @@ -0,0 +1,577 @@
@@ -332,7 +332,7 @@ index 0000000..1753075
 +      union pvrdma_cmd_resp rsp;
 +      struct pvrdma_cmd_create_uc *cmd = &req.create_uc;
 +      struct pvrdma_cmd_create_uc_resp *resp = &rsp.create_uc_resp;
-+      struct pvrdma_alloc_ucontext_resp uresp;
++      struct pvrdma_alloc_ucontext_resp uresp = {0};
 +      int ret;
 +      void *ptr;
 +
index b58cc6a64fff729448d27264cf839ebb68435c59..fa950933506b9ed1eda66e8ef6c35d9e9bc22335 100644 (file)
@@ -1,4 +1,4 @@
-From 6e016b78542f10b54148627bb818ce5b2f382566 Mon Sep 17 00:00:00 2001
+From f2eea44bcb98003a734c7dc162340163b954f9a5 Mon Sep 17 00:00:00 2001
 From: Adit Ranadive <aditr@vmware.com>
 Date: Mon, 19 Dec 2016 16:25:09 -0800
 Subject: [PATCH 05/14] IB/vmw_pvrdma: Add paravirtual rdma device
@@ -14,16 +14,16 @@ Reviewed-by: Aditya Sarwade <asarwade@vmware.com>
 Reviewed-by: Bryan Tan <bryantan@vmware.com>
 Signed-off-by: Adit Ranadive <aditr@vmware.com>
 ---
- drivers/infiniband/hw/vmw_pvrdma/pvrdma.h | 475 ++++++++++++++++++++++++++++++
- 1 file changed, 475 insertions(+)
+ drivers/infiniband/hw/vmw_pvrdma/pvrdma.h | 458 ++++++++++++++++++++++++++++++
+ 1 file changed, 458 insertions(+)
  create mode 100644 drivers/infiniband/hw/vmw_pvrdma/pvrdma.h
 
 diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h b/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h
 new file mode 100644
-index 0000000..54384dd
+index 0000000..ea880fc
 --- /dev/null
 +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h
-@@ -0,0 +1,475 @@
+@@ -0,0 +1,458 @@
 +/*
 + * Copyright (c) 2012-2016 VMware, Inc.  All rights reserved.
 + *
@@ -94,7 +94,10 @@ index 0000000..54384dd
 + * VMware PVRDMA PCI device id.
 + */
 +#define PCI_DEVICE_ID_VMWARE_PVRDMA   0x0820
-+#define       PCI_DEVICE_ID_VMWARE_VMXNET3    0x07B0
++#define PCI_DEVICE_ID_VMWARE_VMXNET3    0x07B0
++
++#define PVRDMA_NUM_RING_PAGES         4
++#define PVRDMA_QP_NUM_HEADER_PAGES    1
 +
 +struct pvrdma_dev;
 +
@@ -248,6 +251,7 @@ index 0000000..54384dd
 +      u32 port_cap_mask;
 +      struct mutex port_mutex; /* Port modification mutex. */
 +      bool ib_active;
++      bool enabled;
 +      atomic_t num_qps;
 +      atomic_t num_cqs;
 +      atomic_t num_pds;
@@ -434,27 +438,6 @@ index 0000000..54384dd
 +      return (enum ib_qp_state)state;
 +}
 +
-+static inline enum pvrdma_wr_opcode ib_wr_opcode_to_pvrdma(enum ib_wr_opcode op)
-+{
-+      return (enum pvrdma_wr_opcode)op;
-+}
-+
-+static inline enum ib_wc_status pvrdma_wc_status_to_ib(
-+                                      enum pvrdma_wc_status status)
-+{
-+      return (enum ib_wc_status)status;
-+}
-+
-+static inline int pvrdma_wc_opcode_to_ib(int opcode)
-+{
-+      return opcode;
-+}
-+
-+static inline int pvrdma_wc_flags_to_ib(int flags)
-+{
-+      return flags;
-+}
-+
 +static inline int ib_send_flags_to_pvrdma(int flags)
 +{
 +      return flags & PVRDMA_MASK(PVRDMA_SEND_FLAGS_MAX);
index 716730fe940f679a3c7849078ddaa8ac9c6f75f5..653a9761a3844cfdb0f4d0fd22d41abf23d17b20 100644 (file)
@@ -1,4 +1,4 @@
-From 4b497258985299d35a589b2e176cca5ae9b58d69 Mon Sep 17 00:00:00 2001
+From d41654b3ee6816e060a87f809c38a9e266d14d4a Mon Sep 17 00:00:00 2001
 From: Adit Ranadive <aditr@vmware.com>
 Date: Mon, 19 Dec 2016 16:31:48 -0800
 Subject: [PATCH 11/14] IB/vmw_pvrdma: Add Queue Pair support
@@ -18,7 +18,7 @@ Signed-off-by: Adit Ranadive <aditr@vmware.com>
 
 diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c
 new file mode 100644
-index 0000000..c8c01e5
+index 0000000..6b9ebc7
 --- /dev/null
 +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c
 @@ -0,0 +1,972 @@
@@ -194,8 +194,9 @@ index 0000000..c8c01e5
 +                                           sizeof(struct pvrdma_sge) *
 +                                           qp->sq.max_sg);
 +      /* Note: one extra page for the header. */
-+      qp->npages_send = 1 + (qp->sq.wqe_cnt * qp->sq.wqe_size +
-+                             PAGE_SIZE - 1) / PAGE_SIZE;
++      qp->npages_send = PVRDMA_QP_NUM_HEADER_PAGES +
++                        (qp->sq.wqe_cnt * qp->sq.wqe_size + PAGE_SIZE - 1) /
++                                                              PAGE_SIZE;
 +
 +      return 0;
 +}
@@ -214,6 +215,7 @@ index 0000000..c8c01e5
 +{
 +      struct pvrdma_qp *qp = NULL;
 +      struct pvrdma_dev *dev = to_vdev(pd->device);
++      struct pvrdma_cq *send_cq, *recv_cq;
 +      union pvrdma_cmd_req req;
 +      union pvrdma_cmd_resp rsp;
 +      struct pvrdma_cmd_create_qp *cmd = &req.create_qp;
@@ -299,6 +301,9 @@ index 0000000..c8c01e5
 +              } else {
 +                      qp->is_kernel = true;
 +
++                      send_cq = to_vcq(init_attr->send_cq);
++                      recv_cq = to_vcq(init_attr->recv_cq);
++
 +                      ret = pvrdma_set_sq_size(to_vdev(pd->device),
 +                                               &init_attr->cap,
 +                                               init_attr->qp_type, qp);
@@ -313,7 +318,7 @@ index 0000000..c8c01e5
 +                      qp->npages = qp->npages_send + qp->npages_recv;
 +
 +                      /* Skip header page. */
-+                      qp->sq.offset = PAGE_SIZE;
++                      qp->sq.offset = PVRDMA_QP_NUM_HEADER_PAGES * PAGE_SIZE;
 +
 +                      /* Recv queue pages are after send pages. */
 +                      qp->rq.offset = qp->npages_send * PAGE_SIZE;
@@ -366,7 +371,7 @@ index 0000000..c8c01e5
 +      cmd->qp_type = ib_qp_type_to_pvrdma(init_attr->qp_type);
 +      cmd->access_flags = IB_ACCESS_LOCAL_WRITE;
 +      cmd->total_chunks = qp->npages;
-+      cmd->send_chunks = qp->npages_send - 1;
++      cmd->send_chunks = qp->npages_send - PVRDMA_QP_NUM_HEADER_PAGES;
 +      cmd->pdir_dma = qp->pdir.dir_dma;
 +
 +      dev_dbg(&dev->pdev->dev, "create queuepair with %d, %d, %d, %d\n",
@@ -455,9 +460,11 @@ index 0000000..c8c01e5
 +      cmd->qp_handle = vqp->qp_handle;
 +
 +      ret = pvrdma_cmd_post(to_vdev(qp->device), &req, NULL, 0);
-+      if (ret < 0)
-+              dev_warn(&to_vdev(qp->device)->pdev->dev,
-+                       "destroy queuepair failed, error: %d\n", ret);
++      if (ret < 0) {
++              struct pvrdma_dev *dev = to_vdev(qp->device);
++
++              dev_warn(&dev->pdev->dev, "destroy queuepair failed\n");
++      }
 +
 +      pvrdma_free_qp(vqp);
 +
@@ -579,13 +586,13 @@ index 0000000..c8c01e5
 +      return ret;
 +}
 +
-+static inline void *get_sq_wqe(struct pvrdma_qp *qp, int n)
++static inline void *get_sq_wqe(struct pvrdma_qp *qp, unsigned int n)
 +{
 +      return pvrdma_page_dir_get_ptr(&qp->pdir,
 +                                     qp->sq.offset + n * qp->sq.wqe_size);
 +}
 +
-+static inline void *get_rq_wqe(struct pvrdma_qp *qp, int n)
++static inline void *get_rq_wqe(struct pvrdma_qp *qp, unsigned int n)
 +{
 +      return pvrdma_page_dir_get_ptr(&qp->pdir,
 +                                     qp->rq.offset + n * qp->rq.wqe_size);
@@ -623,9 +630,7 @@ index 0000000..c8c01e5
 +      unsigned long flags;
 +      struct pvrdma_sq_wqe_hdr *wqe_hdr;
 +      struct pvrdma_sge *sge;
-+      int i, index;
-+      int nreq;
-+      int ret;
++      int i, ret;
 +
 +      /*
 +       * In states lower than RTS, we can fail immediately. In other states,
@@ -638,9 +643,8 @@ index 0000000..c8c01e5
 +
 +      spin_lock_irqsave(&qp->sq.lock, flags);
 +
-+      index = pvrdma_idx(&qp->sq.ring->prod_tail, qp->sq.wqe_cnt);
-+      for (nreq = 0; wr; nreq++, wr = wr->next) {
-+              unsigned int tail;
++      while (wr) {
++              unsigned int tail = 0;
 +
 +              if (unlikely(!pvrdma_idx_ring_has_space(
 +                              qp->sq.ring, qp->sq.wqe_cnt, &tail))) {
@@ -705,7 +709,7 @@ index 0000000..c8c01e5
 +                      }
 +              }
 +
-+              wqe_hdr = (struct pvrdma_sq_wqe_hdr *)get_sq_wqe(qp, index);
++              wqe_hdr = (struct pvrdma_sq_wqe_hdr *)get_sq_wqe(qp, tail);
 +              memset(wqe_hdr, 0, sizeof(*wqe_hdr));
 +              wqe_hdr->wr_id = wr->wr_id;
 +              wqe_hdr->num_sge = wr->num_sge;
@@ -796,12 +800,11 @@ index 0000000..c8c01e5
 +              /* Make sure wqe is written before index update */
 +              smp_wmb();
 +
-+              index++;
-+              if (unlikely(index >= qp->sq.wqe_cnt))
-+                      index = 0;
 +              /* Update shared sq ring */
 +              pvrdma_idx_ring_inc(&qp->sq.ring->prod_tail,
 +                                  qp->sq.wqe_cnt);
++
++              wr = wr->next;
 +      }
 +
 +      ret = 0;
@@ -831,7 +834,6 @@ index 0000000..c8c01e5
 +      struct pvrdma_qp *qp = to_vqp(ibqp);
 +      struct pvrdma_rq_wqe_hdr *wqe_hdr;
 +      struct pvrdma_sge *sge;
-+      int index, nreq;
 +      int ret = 0;
 +      int i;
 +
@@ -846,9 +848,8 @@ index 0000000..c8c01e5
 +
 +      spin_lock_irqsave(&qp->rq.lock, flags);
 +
-+      index = pvrdma_idx(&qp->rq.ring->prod_tail, qp->rq.wqe_cnt);
-+      for (nreq = 0; wr; nreq++, wr = wr->next) {
-+              unsigned int tail;
++      while (wr) {
++              unsigned int tail = 0;
 +
 +              if (unlikely(wr->num_sge > qp->rq.max_sg ||
 +                           wr->num_sge < 0)) {
@@ -868,7 +869,7 @@ index 0000000..c8c01e5
 +                      goto out;
 +              }
 +
-+              wqe_hdr = (struct pvrdma_rq_wqe_hdr *)get_rq_wqe(qp, index);
++              wqe_hdr = (struct pvrdma_rq_wqe_hdr *)get_rq_wqe(qp, tail);
 +              wqe_hdr->wr_id = wr->wr_id;
 +              wqe_hdr->num_sge = wr->num_sge;
 +              wqe_hdr->total_len = 0;
@@ -884,12 +885,11 @@ index 0000000..c8c01e5
 +              /* Make sure wqe is written before index update */
 +              smp_wmb();
 +
-+              index++;
-+              if (unlikely(index >= qp->rq.wqe_cnt))
-+                      index = 0;
 +              /* Update shared rq ring */
 +              pvrdma_idx_ring_inc(&qp->rq.ring->prod_tail,
 +                                  qp->rq.wqe_cnt);
++
++              wr = wr->next;
 +      }
 +
 +      spin_unlock_irqrestore(&qp->rq.lock, flags);
index a1de217980f912fa97dfa5b367836246f3b181e3..a5654c10533e0a2f0b08328968db30dc4bf84b40 100644 (file)
@@ -1,4 +1,4 @@
-From a74eaebe910011dc3674339ad5c50abcffb71486 Mon Sep 17 00:00:00 2001
+From 6f647cf23862deb12f81ff4f26c467b7e9eec085 Mon Sep 17 00:00:00 2001
 From: Adit Ranadive <aditr@vmware.com>
 Date: Mon, 19 Dec 2016 16:34:08 -0800
 Subject: [PATCH 12/14] IB/vmw_pvrdma: Add the main driver
@@ -13,16 +13,16 @@ Reviewed-by: Aditya Sarwade <asarwade@vmware.com>
 Reviewed-by: Bryan Tan <bryantan@vmware.com>
 Signed-off-by: Adit Ranadive <aditr@vmware.com>
 ---
- drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c | 1211 ++++++++++++++++++++++++
- 1 file changed, 1211 insertions(+)
+ drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c | 1242 ++++++++++++++++++++++++
+ 1 file changed, 1242 insertions(+)
  create mode 100644 drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
 
 diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
 new file mode 100644
-index 0000000..231a1ce
+index 0000000..459baaa
 --- /dev/null
 +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
-@@ -0,0 +1,1211 @@
+@@ -0,0 +1,1242 @@
 +/*
 + * Copyright (c) 2012-2016 VMware, Inc.  All rights reserved.
 + *
@@ -99,6 +99,8 @@ index 0000000..231a1ce
 +                        void **context);
 +
 +
++static int pvrdma_enable_dev(struct pvrdma_dev *dev);
++
 +static ssize_t show_hca(struct device *device, struct device_attribute *attr,
 +                      char *buf)
 +{
@@ -711,8 +713,7 @@ index 0000000..231a1ce
 +
 +      ret = pvrdma_cmd_post(dev, &req, NULL, 0);
 +      if (ret < 0) {
-+              dev_warn(&dev->pdev->dev,
-+                       "could not create binding, error: %d\n", ret);
++              dev_warn(&dev->pdev->dev, "could not create binding\n");
 +              return -EFAULT;
 +      }
 +      memcpy(&dev->sgid_tbl[index], gid, sizeof(*gid));
@@ -751,7 +752,7 @@ index 0000000..231a1ce
 +      ret = pvrdma_cmd_post(dev, &req, NULL, 0);
 +      if (ret < 0) {
 +              dev_warn(&dev->pdev->dev,
-+                       "could not destroy binding, error: %d\n", ret);
++                       "could not destroy binding\n");
 +              return ret;
 +      }
 +      memset(&dev->sgid_tbl[index], 0, 16);
@@ -780,6 +781,10 @@ index 0000000..231a1ce
 +              pvrdma_dispatch_event(dev, 1, IB_EVENT_PORT_ERR);
 +              break;
 +      case NETDEV_UP:
++              if (!dev->enabled && pvrdma_enable_dev(dev)) {
++                      dev_err(&dev->pdev->dev, "failed to enable device\n");
++                      break;
++              }
 +              pvrdma_dispatch_event(dev, 1, IB_EVENT_PORT_ACTIVE);
 +              break;
 +      default:
@@ -826,6 +831,48 @@ index 0000000..231a1ce
 +      return NOTIFY_DONE;
 +}
 +
++static void pvrdma_disable_dev(struct pvrdma_dev *dev)
++{
++      if (dev->enabled) {
++              ib_unregister_device(&dev->ib_dev);
++              dev->enabled = false;
++      }
++}
++
++static int pvrdma_enable_dev(struct pvrdma_dev *dev)
++{
++      int ret;
++      pvrdma_enable_intrs(dev);
++
++      /* Activate pvrdma device */
++      pvrdma_write_reg(dev, PVRDMA_REG_CTL, PVRDMA_DEVICE_CTL_ACTIVATE);
++
++      /* Make sure the write is complete before reading status. */
++      mb();
++
++      /* Check if device was successfully activated */
++      ret = pvrdma_read_reg(dev, PVRDMA_REG_ERR);
++      if (ret) {
++              dev_err(&dev->pdev->dev, "failed to activate device\n");
++              ret = -EFAULT;
++              goto err_disable_intrs;
++      }
++
++      /* Register IB device */
++      ret = pvrdma_register_device(dev);
++      if (ret) {
++              dev_err(&dev->pdev->dev, "failed to register IB device\n");
++              goto err_disable_intrs;
++      }
++
++      dev->enabled = true;
++      return 0;
++
++err_disable_intrs:
++      pvrdma_disable_intrs(dev);
++      return ret;
++}
++
 +static int pvrdma_pci_probe(struct pci_dev *pdev,
 +                          const struct pci_device_id *id)
 +{
@@ -863,6 +910,9 @@ index 0000000..231a1ce
 +              goto err_free_device;
 +      }
 +
++      /*
++       * DEBUG: Checking PCI: 0x20200; _MEM; len=0x2000
++       */
 +      dev_dbg(&pdev->dev, "PCI resource flags BAR0 %#lx\n",
 +              pci_resource_flags(pdev, 0));
 +      dev_dbg(&pdev->dev, "PCI resource len %#llx\n",
@@ -892,14 +942,14 @@ index 0000000..231a1ce
 +      /* Enable 64-Bit DMA */
 +      if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) == 0) {
 +              ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
-+              if (ret != 0) {
++              if (ret) {
 +                      dev_err(&pdev->dev,
 +                              "pci_set_consistent_dma_mask failed\n");
 +                      goto err_free_resource;
 +              }
 +      } else {
 +              ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
-+              if (ret != 0) {
++              if (ret) {
 +                      dev_err(&pdev->dev,
 +                              "pci_set_dma_mask failed\n");
 +                      goto err_free_resource;
@@ -978,7 +1028,7 @@ index 0000000..231a1ce
 +      dev->dsr->resp_slot_dma = (u64)slot_dma;
 +
 +      /* Async event ring */
-+      dev->dsr->async_ring_pages.num_pages = 4;
++      dev->dsr->async_ring_pages.num_pages = PVRDMA_NUM_RING_PAGES;
 +      ret = pvrdma_page_dir_init(dev, &dev->async_pdir,
 +                                 dev->dsr->async_ring_pages.num_pages, true);
 +      if (ret)
@@ -987,7 +1037,7 @@ index 0000000..231a1ce
 +      dev->dsr->async_ring_pages.pdir_dma = dev->async_pdir.dir_dma;
 +
 +      /* CQ notification ring */
-+      dev->dsr->cq_ring_pages.num_pages = 4;
++      dev->dsr->cq_ring_pages.num_pages = PVRDMA_NUM_RING_PAGES;
 +      ret = pvrdma_page_dir_init(dev, &dev->cq_pdir,
 +                                 dev->dsr->cq_ring_pages.num_pages, true);
 +      if (ret)
@@ -1054,7 +1104,7 @@ index 0000000..231a1ce
 +      if (ret) {
 +              dev_err(&pdev->dev, "failed to allocate interrupts\n");
 +              ret = -ENOMEM;
-+              goto err_netdevice;
++              goto err_free_cq_ring;
 +      }
 +
 +      /* Allocate UAR table. */
@@ -1074,51 +1124,35 @@ index 0000000..231a1ce
 +      }
 +      dev_dbg(&pdev->dev, "gid table len %d\n", dev->dsr->caps.gid_tbl_len);
 +
-+      pvrdma_enable_intrs(dev);
-+
-+      /* Activate pvrdma device */
-+      pvrdma_write_reg(dev, PVRDMA_REG_CTL, PVRDMA_DEVICE_CTL_ACTIVATE);
-+
-+      /* Make sure the write is complete before reading status. */
-+      mb();
-+
-+      /* Check if device was successfully activated */
-+      ret = pvrdma_read_reg(dev, PVRDMA_REG_ERR);
-+      if (ret != 0) {
-+              dev_err(&pdev->dev, "failed to activate device\n");
-+              ret = -EFAULT;
-+              goto err_disable_intr;
-+      }
-+
-+      /* Register IB device */
-+      ret = pvrdma_register_device(dev);
-+      if (ret) {
-+              dev_err(&pdev->dev, "failed to register IB device\n");
-+              goto err_disable_intr;
++      if (netif_running(dev->netdev) && netif_carrier_ok(dev->netdev)) {
++              ret = pvrdma_enable_dev(dev);
++              if (ret) {
++                      dev_err(&pdev->dev, "failed to enable device\n");
++                      goto err_free_sgid_tbl;
++              }
++      } else {
++              dev_info(&pdev->dev, "pvrdma netdev link is down\n");
 +      }
 +
 +      dev->nb_netdev.notifier_call = pvrdma_netdevice_event;
 +      ret = register_netdevice_notifier(&dev->nb_netdev);
 +      if (ret) {
 +              dev_err(&pdev->dev, "failed to register netdevice events\n");
-+              goto err_unreg_ibdev;
++              goto err_disable_dev;
 +      }
 +
 +      dev_info(&pdev->dev, "attached to device\n");
 +      return 0;
 +
-+err_unreg_ibdev:
-+      ib_unregister_device(&dev->ib_dev);
-+err_disable_intr:
-+      pvrdma_disable_intrs(dev);
++err_disable_dev:
++      pvrdma_disable_dev(dev);
++err_free_sgid_tbl:
 +      kfree(dev->sgid_tbl);
 +err_free_uar_table:
 +      pvrdma_uar_table_cleanup(dev);
 +err_free_intrs:
 +      pvrdma_free_irq(dev);
 +      pvrdma_disable_msi_all(dev);
-+err_netdevice:
-+      unregister_netdevice_notifier(&dev->nb_netdev);
 +err_free_cq_ring:
 +      pvrdma_page_dir_cleanup(dev, &dev->cq_pdir);
 +err_free_async_ring:
@@ -1157,10 +1191,7 @@ index 0000000..231a1ce
 +      unregister_netdevice_notifier(&dev->nb_netdev);
 +      dev->nb_netdev.notifier_call = NULL;
 +
-+      flush_workqueue(event_wq);
-+
-+      /* Unregister ib device */
-+      ib_unregister_device(&dev->ib_dev);
++      pvrdma_disable_dev(dev);
 +
 +      mutex_lock(&pvrdma_device_list_lock);
 +      list_del(&dev->device_link);
@@ -1231,7 +1262,7 @@ index 0000000..231a1ce
 +module_exit(pvrdma_cleanup);
 +
 +MODULE_AUTHOR("VMware, Inc");
-+MODULE_DESCRIPTION("VMware Paravirtual RDMA driver");
++MODULE_DESCRIPTION("VMware Virtual RDMA/InfiniBand driver");
 +MODULE_VERSION(DRV_VERSION);
 +MODULE_LICENSE("Dual BSD/GPL");
 --