diff options
-rw-r--r-- | drivers/net/mlx4/main.c | 14 | ||||
-rw-r--r-- | drivers/net/mlx4/mr.c | 6 | ||||
-rw-r--r-- | drivers/net/mlx4/profile.c | 2 | ||||
-rw-r--r-- | include/linux/mlx4/device.h | 1 |
4 files changed, 17 insertions, 6 deletions
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index 30bea9689694..018348c01193 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c | |||
@@ -100,6 +100,10 @@ module_param_named(use_prio, use_prio, bool, 0444); | |||
100 | MODULE_PARM_DESC(use_prio, "Enable steering by VLAN priority on ETH ports " | 100 | MODULE_PARM_DESC(use_prio, "Enable steering by VLAN priority on ETH ports " |
101 | "(0/1, default 0)"); | 101 | "(0/1, default 0)"); |
102 | 102 | ||
103 | static int log_mtts_per_seg = ilog2(MLX4_MTT_ENTRY_PER_SEG); | ||
104 | module_param_named(log_mtts_per_seg, log_mtts_per_seg, int, 0444); | ||
105 | MODULE_PARM_DESC(log_mtts_per_seg, "Log2 number of MTT entries per segment (1-5)"); | ||
106 | |||
103 | int mlx4_check_port_params(struct mlx4_dev *dev, | 107 | int mlx4_check_port_params(struct mlx4_dev *dev, |
104 | enum mlx4_port_type *port_type) | 108 | enum mlx4_port_type *port_type) |
105 | { | 109 | { |
@@ -203,12 +207,13 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) | |||
203 | dev->caps.max_cqes = dev_cap->max_cq_sz - 1; | 207 | dev->caps.max_cqes = dev_cap->max_cq_sz - 1; |
204 | dev->caps.reserved_cqs = dev_cap->reserved_cqs; | 208 | dev->caps.reserved_cqs = dev_cap->reserved_cqs; |
205 | dev->caps.reserved_eqs = dev_cap->reserved_eqs; | 209 | dev->caps.reserved_eqs = dev_cap->reserved_eqs; |
210 | dev->caps.mtts_per_seg = 1 << log_mtts_per_seg; | ||
206 | dev->caps.reserved_mtts = DIV_ROUND_UP(dev_cap->reserved_mtts, | 211 | dev->caps.reserved_mtts = DIV_ROUND_UP(dev_cap->reserved_mtts, |
207 | MLX4_MTT_ENTRY_PER_SEG); | 212 | dev->caps.mtts_per_seg); |
208 | dev->caps.reserved_mrws = dev_cap->reserved_mrws; | 213 | dev->caps.reserved_mrws = dev_cap->reserved_mrws; |
209 | dev->caps.reserved_uars = dev_cap->reserved_uars; | 214 | dev->caps.reserved_uars = dev_cap->reserved_uars; |
210 | dev->caps.reserved_pds = dev_cap->reserved_pds; | 215 | dev->caps.reserved_pds = dev_cap->reserved_pds; |
211 | dev->caps.mtt_entry_sz = MLX4_MTT_ENTRY_PER_SEG * dev_cap->mtt_entry_sz; | 216 | dev->caps.mtt_entry_sz = dev->caps.mtts_per_seg * dev_cap->mtt_entry_sz; |
212 | dev->caps.max_msg_sz = dev_cap->max_msg_sz; | 217 | dev->caps.max_msg_sz = dev_cap->max_msg_sz; |
213 | dev->caps.page_size_cap = ~(u32) (dev_cap->min_page_sz - 1); | 218 | dev->caps.page_size_cap = ~(u32) (dev_cap->min_page_sz - 1); |
214 | dev->caps.flags = dev_cap->flags; | 219 | dev->caps.flags = dev_cap->flags; |
@@ -1304,6 +1309,11 @@ static int __init mlx4_verify_params(void) | |||
1304 | return -1; | 1309 | return -1; |
1305 | } | 1310 | } |
1306 | 1311 | ||
1312 | if ((log_mtts_per_seg < 1) || (log_mtts_per_seg > 5)) { | ||
1313 | printk(KERN_WARNING "mlx4_core: bad log_mtts_per_seg: %d\n", log_mtts_per_seg); | ||
1314 | return -1; | ||
1315 | } | ||
1316 | |||
1307 | return 0; | 1317 | return 0; |
1308 | } | 1318 | } |
1309 | 1319 | ||
diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c index 0caf74cae8bc..3b8973d19933 100644 --- a/drivers/net/mlx4/mr.c +++ b/drivers/net/mlx4/mr.c | |||
@@ -209,7 +209,7 @@ int mlx4_mtt_init(struct mlx4_dev *dev, int npages, int page_shift, | |||
209 | } else | 209 | } else |
210 | mtt->page_shift = page_shift; | 210 | mtt->page_shift = page_shift; |
211 | 211 | ||
212 | for (mtt->order = 0, i = MLX4_MTT_ENTRY_PER_SEG; i < npages; i <<= 1) | 212 | for (mtt->order = 0, i = dev->caps.mtts_per_seg; i < npages; i <<= 1) |
213 | ++mtt->order; | 213 | ++mtt->order; |
214 | 214 | ||
215 | mtt->first_seg = mlx4_alloc_mtt_range(dev, mtt->order); | 215 | mtt->first_seg = mlx4_alloc_mtt_range(dev, mtt->order); |
@@ -350,7 +350,7 @@ int mlx4_mr_enable(struct mlx4_dev *dev, struct mlx4_mr *mr) | |||
350 | mpt_entry->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG | | 350 | mpt_entry->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG | |
351 | MLX4_MPT_PD_FLAG_RAE); | 351 | MLX4_MPT_PD_FLAG_RAE); |
352 | mpt_entry->mtt_sz = cpu_to_be32((1 << mr->mtt.order) * | 352 | mpt_entry->mtt_sz = cpu_to_be32((1 << mr->mtt.order) * |
353 | MLX4_MTT_ENTRY_PER_SEG); | 353 | dev->caps.mtts_per_seg); |
354 | } else { | 354 | } else { |
355 | mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_SW_OWNS); | 355 | mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_SW_OWNS); |
356 | } | 356 | } |
@@ -391,7 +391,7 @@ static int mlx4_write_mtt_chunk(struct mlx4_dev *dev, struct mlx4_mtt *mtt, | |||
391 | (start_index + npages - 1) / (PAGE_SIZE / sizeof (u64))) | 391 | (start_index + npages - 1) / (PAGE_SIZE / sizeof (u64))) |
392 | return -EINVAL; | 392 | return -EINVAL; |
393 | 393 | ||
394 | if (start_index & (MLX4_MTT_ENTRY_PER_SEG - 1)) | 394 | if (start_index & (dev->caps.mtts_per_seg - 1)) |
395 | return -EINVAL; | 395 | return -EINVAL; |
396 | 396 | ||
397 | mtts = mlx4_table_find(&priv->mr_table.mtt_table, mtt->first_seg + | 397 | mtts = mlx4_table_find(&priv->mr_table.mtt_table, mtt->first_seg + |
diff --git a/drivers/net/mlx4/profile.c b/drivers/net/mlx4/profile.c index cebdf3243ca1..bd22df95adf9 100644 --- a/drivers/net/mlx4/profile.c +++ b/drivers/net/mlx4/profile.c | |||
@@ -98,7 +98,7 @@ u64 mlx4_make_profile(struct mlx4_dev *dev, | |||
98 | profile[MLX4_RES_EQ].size = dev_cap->eqc_entry_sz; | 98 | profile[MLX4_RES_EQ].size = dev_cap->eqc_entry_sz; |
99 | profile[MLX4_RES_DMPT].size = dev_cap->dmpt_entry_sz; | 99 | profile[MLX4_RES_DMPT].size = dev_cap->dmpt_entry_sz; |
100 | profile[MLX4_RES_CMPT].size = dev_cap->cmpt_entry_sz; | 100 | profile[MLX4_RES_CMPT].size = dev_cap->cmpt_entry_sz; |
101 | profile[MLX4_RES_MTT].size = MLX4_MTT_ENTRY_PER_SEG * dev_cap->mtt_entry_sz; | 101 | profile[MLX4_RES_MTT].size = dev->caps.mtts_per_seg * dev_cap->mtt_entry_sz; |
102 | profile[MLX4_RES_MCG].size = MLX4_MGM_ENTRY_SIZE; | 102 | profile[MLX4_RES_MCG].size = MLX4_MGM_ENTRY_SIZE; |
103 | 103 | ||
104 | profile[MLX4_RES_QP].num = request->num_qp; | 104 | profile[MLX4_RES_QP].num = request->num_qp; |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 3aff8a6a389e..ce7cc6c7bcbb 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
@@ -210,6 +210,7 @@ struct mlx4_caps { | |||
210 | int num_comp_vectors; | 210 | int num_comp_vectors; |
211 | int num_mpts; | 211 | int num_mpts; |
212 | int num_mtt_segs; | 212 | int num_mtt_segs; |
213 | int mtts_per_seg; | ||
213 | int fmr_reserved_mtts; | 214 | int fmr_reserved_mtts; |
214 | int reserved_mtts; | 215 | int reserved_mtts; |
215 | int reserved_mrws; | 216 | int reserved_mrws; |