diff options
Diffstat (limited to 'drivers/infiniband/hw/mthca/mthca_main.c')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_main.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c index 1d83cf7caf3..13da9f1d24c 100644 --- a/drivers/infiniband/hw/mthca/mthca_main.c +++ b/drivers/infiniband/hw/mthca/mthca_main.c | |||
@@ -125,6 +125,10 @@ module_param_named(fmr_reserved_mtts, hca_profile.fmr_reserved_mtts, int, 0444); | |||
125 | MODULE_PARM_DESC(fmr_reserved_mtts, | 125 | MODULE_PARM_DESC(fmr_reserved_mtts, |
126 | "number of memory translation table segments reserved for FMR"); | 126 | "number of memory translation table segments reserved for FMR"); |
127 | 127 | ||
128 | static int log_mtts_per_seg = ilog2(MTHCA_MTT_SEG_SIZE / 8); | ||
129 | module_param_named(log_mtts_per_seg, log_mtts_per_seg, int, 0444); | ||
130 | MODULE_PARM_DESC(log_mtts_per_seg, "Log2 number of MTT entries per segment (1-5)"); | ||
131 | |||
128 | static char mthca_version[] __devinitdata = | 132 | static char mthca_version[] __devinitdata = |
129 | DRV_NAME ": Mellanox InfiniBand HCA driver v" | 133 | DRV_NAME ": Mellanox InfiniBand HCA driver v" |
130 | DRV_VERSION " (" DRV_RELDATE ")\n"; | 134 | DRV_VERSION " (" DRV_RELDATE ")\n"; |
@@ -162,6 +166,7 @@ static int mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim) | |||
162 | int err; | 166 | int err; |
163 | u8 status; | 167 | u8 status; |
164 | 168 | ||
169 | mdev->limits.mtt_seg_size = (1 << log_mtts_per_seg) * 8; | ||
165 | err = mthca_QUERY_DEV_LIM(mdev, dev_lim, &status); | 170 | err = mthca_QUERY_DEV_LIM(mdev, dev_lim, &status); |
166 | if (err) { | 171 | if (err) { |
167 | mthca_err(mdev, "QUERY_DEV_LIM command failed, aborting.\n"); | 172 | mthca_err(mdev, "QUERY_DEV_LIM command failed, aborting.\n"); |
@@ -460,11 +465,11 @@ static int mthca_init_icm(struct mthca_dev *mdev, | |||
460 | } | 465 | } |
461 | 466 | ||
462 | /* CPU writes to non-reserved MTTs, while HCA might DMA to reserved mtts */ | 467 | /* CPU writes to non-reserved MTTs, while HCA might DMA to reserved mtts */ |
463 | mdev->limits.reserved_mtts = ALIGN(mdev->limits.reserved_mtts * MTHCA_MTT_SEG_SIZE, | 468 | mdev->limits.reserved_mtts = ALIGN(mdev->limits.reserved_mtts * mdev->limits.mtt_seg_size, |
464 | dma_get_cache_alignment()) / MTHCA_MTT_SEG_SIZE; | 469 | dma_get_cache_alignment()) / mdev->limits.mtt_seg_size; |
465 | 470 | ||
466 | mdev->mr_table.mtt_table = mthca_alloc_icm_table(mdev, init_hca->mtt_base, | 471 | mdev->mr_table.mtt_table = mthca_alloc_icm_table(mdev, init_hca->mtt_base, |
467 | MTHCA_MTT_SEG_SIZE, | 472 | mdev->limits.mtt_seg_size, |
468 | mdev->limits.num_mtt_segs, | 473 | mdev->limits.num_mtt_segs, |
469 | mdev->limits.reserved_mtts, | 474 | mdev->limits.reserved_mtts, |
470 | 1, 0); | 475 | 1, 0); |
@@ -1315,6 +1320,12 @@ static void __init mthca_validate_profile(void) | |||
1315 | printk(KERN_WARNING PFX "Corrected fmr_reserved_mtts to %d.\n", | 1320 | printk(KERN_WARNING PFX "Corrected fmr_reserved_mtts to %d.\n", |
1316 | hca_profile.fmr_reserved_mtts); | 1321 | hca_profile.fmr_reserved_mtts); |
1317 | } | 1322 | } |
1323 | |||
1324 | if ((log_mtts_per_seg < 1) || (log_mtts_per_seg > 5)) { | ||
1325 | printk(KERN_WARNING PFX "bad log_mtts_per_seg (%d). Using default - %d\n", | ||
1326 | log_mtts_per_seg, ilog2(MTHCA_MTT_SEG_SIZE / 8)); | ||
1327 | log_mtts_per_seg = ilog2(MTHCA_MTT_SEG_SIZE / 8); | ||
1328 | } | ||
1318 | } | 1329 | } |
1319 | 1330 | ||
1320 | static int __init mthca_init(void) | 1331 | static int __init mthca_init(void) |