aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/cxgb4/provider.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/cxgb4/provider.c')
-rw-r--r--drivers/infiniband/hw/cxgb4/provider.c46
1 files changed, 32 insertions, 14 deletions
diff --git a/drivers/infiniband/hw/cxgb4/provider.c b/drivers/infiniband/hw/cxgb4/provider.c
index 8f645c83a125..5b9e4220ca08 100644
--- a/drivers/infiniband/hw/cxgb4/provider.c
+++ b/drivers/infiniband/hw/cxgb4/provider.c
@@ -54,9 +54,9 @@
54 54
55#include "iw_cxgb4.h" 55#include "iw_cxgb4.h"
56 56
57static int fastreg_support; 57static int fastreg_support = 1;
58module_param(fastreg_support, int, 0644); 58module_param(fastreg_support, int, 0644);
59MODULE_PARM_DESC(fastreg_support, "Advertise fastreg support (default=0)"); 59MODULE_PARM_DESC(fastreg_support, "Advertise fastreg support (default=1)");
60 60
61static int c4iw_modify_port(struct ib_device *ibdev, 61static int c4iw_modify_port(struct ib_device *ibdev,
62 u8 port, int port_modify_mask, 62 u8 port, int port_modify_mask,
@@ -149,19 +149,28 @@ static int c4iw_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
149 addr = mm->addr; 149 addr = mm->addr;
150 kfree(mm); 150 kfree(mm);
151 151
152 if ((addr >= pci_resource_start(rdev->lldi.pdev, 2)) && 152 if ((addr >= pci_resource_start(rdev->lldi.pdev, 0)) &&
153 (addr < (pci_resource_start(rdev->lldi.pdev, 2) + 153 (addr < (pci_resource_start(rdev->lldi.pdev, 0) +
154 pci_resource_len(rdev->lldi.pdev, 2)))) { 154 pci_resource_len(rdev->lldi.pdev, 0)))) {
155 155
156 /* 156 /*
157 * Map T4 DB register. 157 * MA_SYNC register...
158 */ 158 */
159 if (vma->vm_flags & VM_READ)
160 return -EPERM;
161
162 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 159 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
163 vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND; 160 ret = io_remap_pfn_range(vma, vma->vm_start,
164 vma->vm_flags &= ~VM_MAYREAD; 161 addr >> PAGE_SHIFT,
162 len, vma->vm_page_prot);
163 } else if ((addr >= pci_resource_start(rdev->lldi.pdev, 2)) &&
164 (addr < (pci_resource_start(rdev->lldi.pdev, 2) +
165 pci_resource_len(rdev->lldi.pdev, 2)))) {
166
167 /*
168 * Map user DB or OCQP memory...
169 */
170 if (addr >= rdev->oc_mw_pa)
171 vma->vm_page_prot = t4_pgprot_wc(vma->vm_page_prot);
172 else
173 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
165 ret = io_remap_pfn_range(vma, vma->vm_start, 174 ret = io_remap_pfn_range(vma, vma->vm_start,
166 addr >> PAGE_SHIFT, 175 addr >> PAGE_SHIFT,
167 len, vma->vm_page_prot); 176 len, vma->vm_page_prot);
@@ -382,7 +391,17 @@ static ssize_t show_board(struct device *dev, struct device_attribute *attr,
382static int c4iw_get_mib(struct ib_device *ibdev, 391static int c4iw_get_mib(struct ib_device *ibdev,
383 union rdma_protocol_stats *stats) 392 union rdma_protocol_stats *stats)
384{ 393{
385 return -ENOSYS; 394 struct tp_tcp_stats v4, v6;
395 struct c4iw_dev *c4iw_dev = to_c4iw_dev(ibdev);
396
397 cxgb4_get_tcp_stats(c4iw_dev->rdev.lldi.pdev, &v4, &v6);
398 memset(stats, 0, sizeof *stats);
399 stats->iw.tcpInSegs = v4.tcpInSegs + v6.tcpInSegs;
400 stats->iw.tcpOutSegs = v4.tcpOutSegs + v6.tcpOutSegs;
401 stats->iw.tcpRetransSegs = v4.tcpRetransSegs + v6.tcpRetransSegs;
402 stats->iw.tcpOutRsts = v4.tcpOutRsts + v6.tcpOutSegs;
403
404 return 0;
386} 405}
387 406
388static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL); 407static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
@@ -472,6 +491,7 @@ int c4iw_register_device(struct c4iw_dev *dev)
472 dev->ibdev.post_send = c4iw_post_send; 491 dev->ibdev.post_send = c4iw_post_send;
473 dev->ibdev.post_recv = c4iw_post_receive; 492 dev->ibdev.post_recv = c4iw_post_receive;
474 dev->ibdev.get_protocol_stats = c4iw_get_mib; 493 dev->ibdev.get_protocol_stats = c4iw_get_mib;
494 dev->ibdev.uverbs_abi_ver = C4IW_UVERBS_ABI_VERSION;
475 495
476 dev->ibdev.iwcm = kmalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL); 496 dev->ibdev.iwcm = kmalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL);
477 if (!dev->ibdev.iwcm) 497 if (!dev->ibdev.iwcm)
@@ -496,7 +516,6 @@ int c4iw_register_device(struct c4iw_dev *dev)
496 if (ret) 516 if (ret)
497 goto bail2; 517 goto bail2;
498 } 518 }
499 dev->registered = 1;
500 return 0; 519 return 0;
501bail2: 520bail2:
502 ib_unregister_device(&dev->ibdev); 521 ib_unregister_device(&dev->ibdev);
@@ -515,6 +534,5 @@ void c4iw_unregister_device(struct c4iw_dev *dev)
515 c4iw_class_attributes[i]); 534 c4iw_class_attributes[i]);
516 ib_unregister_device(&dev->ibdev); 535 ib_unregister_device(&dev->ibdev);
517 kfree(dev->ibdev.iwcm); 536 kfree(dev->ibdev.iwcm);
518 dev->registered = 0;
519 return; 537 return;
520} 538}