diff options
Diffstat (limited to 'drivers/infiniband/hw/cxgb4/device.c')
-rw-r--r-- | drivers/infiniband/hw/cxgb4/device.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c index 9489a388376c..f4fa50a609e2 100644 --- a/drivers/infiniband/hw/cxgb4/device.c +++ b/drivers/infiniband/hw/cxgb4/device.c | |||
@@ -682,7 +682,10 @@ static void c4iw_dealloc(struct uld_ctx *ctx) | |||
682 | idr_destroy(&ctx->dev->hwtid_idr); | 682 | idr_destroy(&ctx->dev->hwtid_idr); |
683 | idr_destroy(&ctx->dev->stid_idr); | 683 | idr_destroy(&ctx->dev->stid_idr); |
684 | idr_destroy(&ctx->dev->atid_idr); | 684 | idr_destroy(&ctx->dev->atid_idr); |
685 | iounmap(ctx->dev->rdev.oc_mw_kva); | 685 | if (ctx->dev->rdev.bar2_kva) |
686 | iounmap(ctx->dev->rdev.bar2_kva); | ||
687 | if (ctx->dev->rdev.oc_mw_kva) | ||
688 | iounmap(ctx->dev->rdev.oc_mw_kva); | ||
686 | ib_dealloc_device(&ctx->dev->ibdev); | 689 | ib_dealloc_device(&ctx->dev->ibdev); |
687 | ctx->dev = NULL; | 690 | ctx->dev = NULL; |
688 | } | 691 | } |
@@ -722,11 +725,31 @@ static struct c4iw_dev *c4iw_alloc(const struct cxgb4_lld_info *infop) | |||
722 | } | 725 | } |
723 | devp->rdev.lldi = *infop; | 726 | devp->rdev.lldi = *infop; |
724 | 727 | ||
725 | devp->rdev.oc_mw_pa = pci_resource_start(devp->rdev.lldi.pdev, 2) + | 728 | /* |
726 | (pci_resource_len(devp->rdev.lldi.pdev, 2) - | 729 | * For T5 devices, we map all of BAR2 with WC. |
727 | roundup_pow_of_two(devp->rdev.lldi.vr->ocq.size)); | 730 | * For T4 devices with onchip qp mem, we map only that part |
728 | devp->rdev.oc_mw_kva = ioremap_wc(devp->rdev.oc_mw_pa, | 731 | * of BAR2 with WC. |
729 | devp->rdev.lldi.vr->ocq.size); | 732 | */ |
733 | devp->rdev.bar2_pa = pci_resource_start(devp->rdev.lldi.pdev, 2); | ||
734 | if (is_t5(devp->rdev.lldi.adapter_type)) { | ||
735 | devp->rdev.bar2_kva = ioremap_wc(devp->rdev.bar2_pa, | ||
736 | pci_resource_len(devp->rdev.lldi.pdev, 2)); | ||
737 | if (!devp->rdev.bar2_kva) { | ||
738 | pr_err(MOD "Unable to ioremap BAR2\n"); | ||
739 | return ERR_PTR(-EINVAL); | ||
740 | } | ||
741 | } else if (ocqp_supported(infop)) { | ||
742 | devp->rdev.oc_mw_pa = | ||
743 | pci_resource_start(devp->rdev.lldi.pdev, 2) + | ||
744 | pci_resource_len(devp->rdev.lldi.pdev, 2) - | ||
745 | roundup_pow_of_two(devp->rdev.lldi.vr->ocq.size); | ||
746 | devp->rdev.oc_mw_kva = ioremap_wc(devp->rdev.oc_mw_pa, | ||
747 | devp->rdev.lldi.vr->ocq.size); | ||
748 | if (!devp->rdev.oc_mw_kva) { | ||
749 | pr_err(MOD "Unable to ioremap onchip mem\n"); | ||
750 | return ERR_PTR(-EINVAL); | ||
751 | } | ||
752 | } | ||
730 | 753 | ||
731 | PDBG(KERN_INFO MOD "ocq memory: " | 754 | PDBG(KERN_INFO MOD "ocq memory: " |
732 | "hw_start 0x%x size %u mw_pa 0x%lx mw_kva %p\n", | 755 | "hw_start 0x%x size %u mw_pa 0x%lx mw_kva %p\n", |
@@ -1003,9 +1026,11 @@ static int enable_qp_db(int id, void *p, void *data) | |||
1003 | static void resume_rc_qp(struct c4iw_qp *qp) | 1026 | static void resume_rc_qp(struct c4iw_qp *qp) |
1004 | { | 1027 | { |
1005 | spin_lock(&qp->lock); | 1028 | spin_lock(&qp->lock); |
1006 | t4_ring_sq_db(&qp->wq, qp->wq.sq.wq_pidx_inc); | 1029 | t4_ring_sq_db(&qp->wq, qp->wq.sq.wq_pidx_inc, |
1030 | is_t5(qp->rhp->rdev.lldi.adapter_type), NULL); | ||
1007 | qp->wq.sq.wq_pidx_inc = 0; | 1031 | qp->wq.sq.wq_pidx_inc = 0; |
1008 | t4_ring_rq_db(&qp->wq, qp->wq.rq.wq_pidx_inc); | 1032 | t4_ring_rq_db(&qp->wq, qp->wq.rq.wq_pidx_inc, |
1033 | is_t5(qp->rhp->rdev.lldi.adapter_type), NULL); | ||
1009 | qp->wq.rq.wq_pidx_inc = 0; | 1034 | qp->wq.rq.wq_pidx_inc = 0; |
1010 | spin_unlock(&qp->lock); | 1035 | spin_unlock(&qp->lock); |
1011 | } | 1036 | } |