diff options
Diffstat (limited to 'drivers/infiniband/hw/mthca')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_mr.c | 20 | ||||
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_profile.c | 2 |
2 files changed, 16 insertions, 6 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c index 7d08f2038aff..958c6d5b6bc0 100644 --- a/drivers/infiniband/hw/mthca/mthca_mr.c +++ b/drivers/infiniband/hw/mthca/mthca_mr.c | |||
@@ -765,7 +765,7 @@ void mthca_arbel_fmr_unmap(struct mthca_dev *dev, struct mthca_fmr *fmr) | |||
765 | int mthca_init_mr_table(struct mthca_dev *dev) | 765 | int mthca_init_mr_table(struct mthca_dev *dev) |
766 | { | 766 | { |
767 | unsigned long addr; | 767 | unsigned long addr; |
768 | int err, i; | 768 | int mpts, mtts, err, i; |
769 | 769 | ||
770 | err = mthca_alloc_init(&dev->mr_table.mpt_alloc, | 770 | err = mthca_alloc_init(&dev->mr_table.mpt_alloc, |
771 | dev->limits.num_mpts, | 771 | dev->limits.num_mpts, |
@@ -799,13 +799,21 @@ int mthca_init_mr_table(struct mthca_dev *dev) | |||
799 | err = -EINVAL; | 799 | err = -EINVAL; |
800 | goto err_fmr_mpt; | 800 | goto err_fmr_mpt; |
801 | } | 801 | } |
802 | mpts = mtts = 1 << i; | ||
803 | } else { | ||
804 | mpts = dev->limits.num_mtt_segs; | ||
805 | mtts = dev->limits.num_mpts; | ||
806 | } | ||
807 | |||
808 | if (!mthca_is_memfree(dev) && | ||
809 | (dev->mthca_flags & MTHCA_FLAG_FMR)) { | ||
802 | 810 | ||
803 | addr = pci_resource_start(dev->pdev, 4) + | 811 | addr = pci_resource_start(dev->pdev, 4) + |
804 | ((pci_resource_len(dev->pdev, 4) - 1) & | 812 | ((pci_resource_len(dev->pdev, 4) - 1) & |
805 | dev->mr_table.mpt_base); | 813 | dev->mr_table.mpt_base); |
806 | 814 | ||
807 | dev->mr_table.tavor_fmr.mpt_base = | 815 | dev->mr_table.tavor_fmr.mpt_base = |
808 | ioremap(addr, (1 << i) * sizeof(struct mthca_mpt_entry)); | 816 | ioremap(addr, mpts * sizeof(struct mthca_mpt_entry)); |
809 | 817 | ||
810 | if (!dev->mr_table.tavor_fmr.mpt_base) { | 818 | if (!dev->mr_table.tavor_fmr.mpt_base) { |
811 | mthca_warn(dev, "MPT ioremap for FMR failed.\n"); | 819 | mthca_warn(dev, "MPT ioremap for FMR failed.\n"); |
@@ -818,19 +826,21 @@ int mthca_init_mr_table(struct mthca_dev *dev) | |||
818 | dev->mr_table.mtt_base); | 826 | dev->mr_table.mtt_base); |
819 | 827 | ||
820 | dev->mr_table.tavor_fmr.mtt_base = | 828 | dev->mr_table.tavor_fmr.mtt_base = |
821 | ioremap(addr, (1 << i) * MTHCA_MTT_SEG_SIZE); | 829 | ioremap(addr, mtts * MTHCA_MTT_SEG_SIZE); |
822 | if (!dev->mr_table.tavor_fmr.mtt_base) { | 830 | if (!dev->mr_table.tavor_fmr.mtt_base) { |
823 | mthca_warn(dev, "MTT ioremap for FMR failed.\n"); | 831 | mthca_warn(dev, "MTT ioremap for FMR failed.\n"); |
824 | err = -ENOMEM; | 832 | err = -ENOMEM; |
825 | goto err_fmr_mtt; | 833 | goto err_fmr_mtt; |
826 | } | 834 | } |
835 | } | ||
827 | 836 | ||
828 | err = mthca_buddy_init(&dev->mr_table.tavor_fmr.mtt_buddy, i); | 837 | if (dev->limits.fmr_reserved_mtts) { |
838 | err = mthca_buddy_init(&dev->mr_table.tavor_fmr.mtt_buddy, fls(mtts - 1)); | ||
829 | if (err) | 839 | if (err) |
830 | goto err_fmr_mtt_buddy; | 840 | goto err_fmr_mtt_buddy; |
831 | 841 | ||
832 | /* Prevent regular MRs from using FMR keys */ | 842 | /* Prevent regular MRs from using FMR keys */ |
833 | err = mthca_buddy_alloc(&dev->mr_table.mtt_buddy, i); | 843 | err = mthca_buddy_alloc(&dev->mr_table.mtt_buddy, fls(mtts - 1)); |
834 | if (err) | 844 | if (err) |
835 | goto err_reserve_fmr; | 845 | goto err_reserve_fmr; |
836 | 846 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_profile.c b/drivers/infiniband/hw/mthca/mthca_profile.c index 58d44aa3c302..26bf86d1cfcd 100644 --- a/drivers/infiniband/hw/mthca/mthca_profile.c +++ b/drivers/infiniband/hw/mthca/mthca_profile.c | |||
@@ -277,7 +277,7 @@ u64 mthca_make_profile(struct mthca_dev *dev, | |||
277 | * out of the MR pool. They don't use additional memory, but | 277 | * out of the MR pool. They don't use additional memory, but |
278 | * we assign them as part of the HCA profile anyway. | 278 | * we assign them as part of the HCA profile anyway. |
279 | */ | 279 | */ |
280 | if (mthca_is_memfree(dev)) | 280 | if (mthca_is_memfree(dev) || BITS_PER_LONG == 64) |
281 | dev->limits.fmr_reserved_mtts = 0; | 281 | dev->limits.fmr_reserved_mtts = 0; |
282 | else | 282 | else |
283 | dev->limits.fmr_reserved_mtts = request->fmr_reserved_mtts; | 283 | dev->limits.fmr_reserved_mtts = request->fmr_reserved_mtts; |