diff options
author | Vladimir Sokolovsky <vlad@mellanox.co.il> | 2008-07-15 02:48:53 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2008-07-15 02:48:53 -0400 |
commit | 2d92865158d0e21ef4350703af64bc2a610d81d3 (patch) | |
tree | 8b11b29982ccff35bc6810e5a57c568ce1a4ada0 /drivers/net/mlx4/main.c | |
parent | de910bd92137005b5e1ecaf2ce68053d7d7d5350 (diff) |
mlx4_core: Use MOD_STAT_CFG command to get minimal page size
There was a bug in some versions of the mlx4 driver in
mlx4_alloc_fmr(), which hardcoded the minimum acceptable page_shift to
be 12. However, new ConnectX firmware can support a minimum
page_shift of 9 (log_pg_sz of 9 returned by QUERY_DEV_LIM) -- so with
old drivers, ib_fmr_alloc() would fail for ULPs using the device
minimum when creating FMRs.
To preserve firmware compatibility with released mlx4 drivers, the
firmware will continue to return 12 as before for log_page_sz in
QUERY_DEV_CAP for these drivers. However, to enable new drivers to
take advantage of the available smaller page size, the mlx4 driver now
first sets the log_pg_sz to the device minimum by setting a
log_page_sz value to 0 via the MOD_STAT_CFG command and then reading
the real minimum via QUERY_DEV_CAP.
Signed-off-by: Jack Morgenstein <jackm@mellanox.co.il>
Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/net/mlx4/main.c')
-rw-r--r-- | drivers/net/mlx4/main.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index a6aa49fc1d68..d3736013fe9b 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c | |||
@@ -485,6 +485,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
485 | struct mlx4_priv *priv = mlx4_priv(dev); | 485 | struct mlx4_priv *priv = mlx4_priv(dev); |
486 | struct mlx4_adapter adapter; | 486 | struct mlx4_adapter adapter; |
487 | struct mlx4_dev_cap dev_cap; | 487 | struct mlx4_dev_cap dev_cap; |
488 | struct mlx4_mod_stat_cfg mlx4_cfg; | ||
488 | struct mlx4_profile profile; | 489 | struct mlx4_profile profile; |
489 | struct mlx4_init_hca_param init_hca; | 490 | struct mlx4_init_hca_param init_hca; |
490 | u64 icm_size; | 491 | u64 icm_size; |
@@ -502,6 +503,12 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
502 | return err; | 503 | return err; |
503 | } | 504 | } |
504 | 505 | ||
506 | mlx4_cfg.log_pg_sz_m = 1; | ||
507 | mlx4_cfg.log_pg_sz = 0; | ||
508 | err = mlx4_MOD_STAT_CFG(dev, &mlx4_cfg); | ||
509 | if (err) | ||
510 | mlx4_warn(dev, "Failed to override log_pg_sz parameter\n"); | ||
511 | |||
505 | err = mlx4_dev_cap(dev, &dev_cap); | 512 | err = mlx4_dev_cap(dev, &dev_cap); |
506 | if (err) { | 513 | if (err) { |
507 | mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting.\n"); | 514 | mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting.\n"); |