-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
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.
+ *
+
+#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. */
+ __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
-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
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 @@
+ 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;
+
-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
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.
+ *
+ * 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;
+
+ 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;
+ 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);
-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
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 @@
+ 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;
+}
+{
+ 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;
+ } 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);
+ 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;
+ 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",
+ 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);
+
+ 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);
+ 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,
+
+ 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))) {
+ }
+ }
+
-+ 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;
+ /* 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;
+ 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;
+
+
+ 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)) {
+ 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;
+ /* 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);
-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
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.
+ *
+ 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)
+{
+
+ 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));
+ 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);
+ 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:
+ 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)
+{
+ 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",
+ /* 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;
+ 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)
+ 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)
+ if (ret) {
+ dev_err(&pdev->dev, "failed to allocate interrupts\n");
+ ret = -ENOMEM;
-+ goto err_netdevice;
++ goto err_free_cq_ring;
+ }
+
+ /* Allocate UAR table. */
+ }
+ 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:
+ 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);
+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");
--