diff options
| author | Jack Morgenstein <jackm@dev.mellanox.co.il> | 2012-12-06 12:12:00 -0500 |
|---|---|---|
| committer | Roland Dreier <roland@purestorage.com> | 2012-12-19 14:47:22 -0500 |
| commit | 3c439b5586e9200f7e6287ee77c175c4d5b0eeed (patch) | |
| tree | 8194cef0f549fbb81aa70985401220c91f228ee7 | |
| parent | 7b8157bedce2a7b5f07f7ec98c96cd6bd64a2a84 (diff) | |
mlx4_core: Allow choosing flow steering mode
Device managed flow steering will be enabled only under administrator
directive provided through setting the existing module parameter
log_num_mgm_entry_size to -1 (if the device actually supports flow
steering). If flow steering isn't requested or not available, the
driver will use the value of log_num_mgm_entry_size and B0 steering.
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 52 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mcg.c | 7 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 6 | ||||
| -rw-r--r-- | include/linux/mlx4/device.h | 1 |
4 files changed, 50 insertions, 16 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 680d81026cbd..e1bafffbc3b1 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -85,15 +85,15 @@ static int probe_vf; | |||
| 85 | module_param(probe_vf, int, 0644); | 85 | module_param(probe_vf, int, 0644); |
| 86 | MODULE_PARM_DESC(probe_vf, "number of vfs to probe by pf driver (num_vfs > 0)"); | 86 | MODULE_PARM_DESC(probe_vf, "number of vfs to probe by pf driver (num_vfs > 0)"); |
| 87 | 87 | ||
| 88 | int mlx4_log_num_mgm_entry_size = 10; | 88 | int mlx4_log_num_mgm_entry_size = MLX4_DEFAULT_MGM_LOG_ENTRY_SIZE; |
| 89 | module_param_named(log_num_mgm_entry_size, | 89 | module_param_named(log_num_mgm_entry_size, |
| 90 | mlx4_log_num_mgm_entry_size, int, 0444); | 90 | mlx4_log_num_mgm_entry_size, int, 0444); |
| 91 | MODULE_PARM_DESC(log_num_mgm_entry_size, "log mgm size, that defines the num" | 91 | MODULE_PARM_DESC(log_num_mgm_entry_size, "log mgm size, that defines the num" |
| 92 | " of qp per mcg, for example:" | 92 | " of qp per mcg, for example:" |
| 93 | " 10 gives 248.range: 9<=" | 93 | " 10 gives 248.range: 7 <=" |
| 94 | " log_num_mgm_entry_size <= 12." | 94 | " log_num_mgm_entry_size <= 12." |
| 95 | " Not in use with device managed" | 95 | " To activate device managed" |
| 96 | " flow steering"); | 96 | " flow steering when available, set to -1"); |
| 97 | 97 | ||
| 98 | static bool enable_64b_cqe_eqe; | 98 | static bool enable_64b_cqe_eqe; |
| 99 | module_param(enable_64b_cqe_eqe, bool, 0444); | 99 | module_param(enable_64b_cqe_eqe, bool, 0444); |
| @@ -1318,12 +1318,30 @@ static void mlx4_parav_master_pf_caps(struct mlx4_dev *dev) | |||
| 1318 | } | 1318 | } |
| 1319 | } | 1319 | } |
| 1320 | 1320 | ||
| 1321 | static int choose_log_fs_mgm_entry_size(int qp_per_entry) | ||
| 1322 | { | ||
| 1323 | int i = MLX4_MIN_MGM_LOG_ENTRY_SIZE; | ||
| 1324 | |||
| 1325 | for (i = MLX4_MIN_MGM_LOG_ENTRY_SIZE; i <= MLX4_MAX_MGM_LOG_ENTRY_SIZE; | ||
| 1326 | i++) { | ||
| 1327 | if (qp_per_entry <= 4 * ((1 << i) / 16 - 2)) | ||
| 1328 | break; | ||
| 1329 | } | ||
| 1330 | |||
| 1331 | return (i <= MLX4_MAX_MGM_LOG_ENTRY_SIZE) ? i : -1; | ||
| 1332 | } | ||
| 1333 | |||
| 1321 | static void choose_steering_mode(struct mlx4_dev *dev, | 1334 | static void choose_steering_mode(struct mlx4_dev *dev, |
| 1322 | struct mlx4_dev_cap *dev_cap) | 1335 | struct mlx4_dev_cap *dev_cap) |
| 1323 | { | 1336 | { |
| 1324 | if (dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_FS_EN && | 1337 | if (mlx4_log_num_mgm_entry_size == -1 && |
| 1338 | dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_FS_EN && | ||
| 1325 | (!mlx4_is_mfunc(dev) || | 1339 | (!mlx4_is_mfunc(dev) || |
| 1326 | (dev_cap->fs_max_num_qp_per_entry >= (num_vfs + 1)))) { | 1340 | (dev_cap->fs_max_num_qp_per_entry >= (num_vfs + 1))) && |
| 1341 | choose_log_fs_mgm_entry_size(dev_cap->fs_max_num_qp_per_entry) >= | ||
| 1342 | MLX4_MIN_MGM_LOG_ENTRY_SIZE) { | ||
| 1343 | dev->oper_log_mgm_entry_size = | ||
| 1344 | choose_log_fs_mgm_entry_size(dev_cap->fs_max_num_qp_per_entry); | ||
| 1327 | dev->caps.steering_mode = MLX4_STEERING_MODE_DEVICE_MANAGED; | 1345 | dev->caps.steering_mode = MLX4_STEERING_MODE_DEVICE_MANAGED; |
| 1328 | dev->caps.num_qp_per_mgm = dev_cap->fs_max_num_qp_per_entry; | 1346 | dev->caps.num_qp_per_mgm = dev_cap->fs_max_num_qp_per_entry; |
| 1329 | dev->caps.fs_log_max_ucast_qp_range_size = | 1347 | dev->caps.fs_log_max_ucast_qp_range_size = |
| @@ -1340,10 +1358,17 @@ static void choose_steering_mode(struct mlx4_dev *dev, | |||
| 1340 | mlx4_warn(dev, "Must have both UC_STEER and MC_STEER flags " | 1358 | mlx4_warn(dev, "Must have both UC_STEER and MC_STEER flags " |
| 1341 | "set to use B0 steering. Falling back to A0 steering mode.\n"); | 1359 | "set to use B0 steering. Falling back to A0 steering mode.\n"); |
| 1342 | } | 1360 | } |
| 1361 | dev->oper_log_mgm_entry_size = | ||
| 1362 | mlx4_log_num_mgm_entry_size > 0 ? | ||
| 1363 | mlx4_log_num_mgm_entry_size : | ||
| 1364 | MLX4_DEFAULT_MGM_LOG_ENTRY_SIZE; | ||
| 1343 | dev->caps.num_qp_per_mgm = mlx4_get_qp_per_mgm(dev); | 1365 | dev->caps.num_qp_per_mgm = mlx4_get_qp_per_mgm(dev); |
| 1344 | } | 1366 | } |
| 1345 | mlx4_dbg(dev, "Steering mode is: %s\n", | 1367 | mlx4_dbg(dev, "Steering mode is: %s, oper_log_mgm_entry_size = %d, " |
| 1346 | mlx4_steering_mode_str(dev->caps.steering_mode)); | 1368 | "modparam log_num_mgm_entry_size = %d\n", |
| 1369 | mlx4_steering_mode_str(dev->caps.steering_mode), | ||
| 1370 | dev->oper_log_mgm_entry_size, | ||
| 1371 | mlx4_log_num_mgm_entry_size); | ||
| 1347 | } | 1372 | } |
| 1348 | 1373 | ||
| 1349 | static int mlx4_init_hca(struct mlx4_dev *dev) | 1374 | static int mlx4_init_hca(struct mlx4_dev *dev) |
| @@ -2479,6 +2504,17 @@ static int __init mlx4_verify_params(void) | |||
| 2479 | port_type_array[0] = true; | 2504 | port_type_array[0] = true; |
| 2480 | } | 2505 | } |
| 2481 | 2506 | ||
| 2507 | if (mlx4_log_num_mgm_entry_size != -1 && | ||
| 2508 | (mlx4_log_num_mgm_entry_size < MLX4_MIN_MGM_LOG_ENTRY_SIZE || | ||
| 2509 | mlx4_log_num_mgm_entry_size > MLX4_MAX_MGM_LOG_ENTRY_SIZE)) { | ||
| 2510 | pr_warning("mlx4_core: mlx4_log_num_mgm_entry_size (%d) not " | ||
| 2511 | "in legal range (-1 or %d..%d)\n", | ||
| 2512 | mlx4_log_num_mgm_entry_size, | ||
| 2513 | MLX4_MIN_MGM_LOG_ENTRY_SIZE, | ||
| 2514 | MLX4_MAX_MGM_LOG_ENTRY_SIZE); | ||
| 2515 | return -1; | ||
| 2516 | } | ||
| 2517 | |||
| 2482 | return 0; | 2518 | return 0; |
| 2483 | } | 2519 | } |
| 2484 | 2520 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c index e151c21baf2b..1ee4db3c6400 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mcg.c +++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c | |||
| @@ -54,12 +54,7 @@ struct mlx4_mgm { | |||
| 54 | 54 | ||
| 55 | int mlx4_get_mgm_entry_size(struct mlx4_dev *dev) | 55 | int mlx4_get_mgm_entry_size(struct mlx4_dev *dev) |
| 56 | { | 56 | { |
| 57 | if (dev->caps.steering_mode == | 57 | return 1 << dev->oper_log_mgm_entry_size; |
| 58 | MLX4_STEERING_MODE_DEVICE_MANAGED) | ||
| 59 | return 1 << MLX4_FS_MGM_LOG_ENTRY_SIZE; | ||
| 60 | else | ||
| 61 | return min((1 << mlx4_log_num_mgm_entry_size), | ||
| 62 | MLX4_MAX_MGM_ENTRY_SIZE); | ||
| 63 | } | 58 | } |
| 64 | 59 | ||
| 65 | int mlx4_get_qp_per_mgm(struct mlx4_dev *dev) | 60 | int mlx4_get_qp_per_mgm(struct mlx4_dev *dev) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index 1cf42036d7bb..116c5c29d2d1 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
| @@ -94,8 +94,10 @@ enum { | |||
| 94 | }; | 94 | }; |
| 95 | 95 | ||
| 96 | enum { | 96 | enum { |
| 97 | MLX4_MAX_MGM_ENTRY_SIZE = 0x1000, | 97 | MLX4_DEFAULT_MGM_LOG_ENTRY_SIZE = 10, |
| 98 | MLX4_MAX_QP_PER_MGM = 4 * (MLX4_MAX_MGM_ENTRY_SIZE / 16 - 2), | 98 | MLX4_MIN_MGM_LOG_ENTRY_SIZE = 7, |
| 99 | MLX4_MAX_MGM_LOG_ENTRY_SIZE = 12, | ||
| 100 | MLX4_MAX_QP_PER_MGM = 4 * ((1 << MLX4_MAX_MGM_LOG_ENTRY_SIZE) / 16 - 2), | ||
| 99 | MLX4_MTT_ENTRY_PER_SEG = 8, | 101 | MLX4_MTT_ENTRY_PER_SEG = 8, |
| 100 | }; | 102 | }; |
| 101 | 103 | ||
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 21821da2abfd..20ea939c22a6 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
| @@ -625,6 +625,7 @@ struct mlx4_dev { | |||
| 625 | u8 rev_id; | 625 | u8 rev_id; |
| 626 | char board_id[MLX4_BOARD_ID_LEN]; | 626 | char board_id[MLX4_BOARD_ID_LEN]; |
| 627 | int num_vfs; | 627 | int num_vfs; |
| 628 | int oper_log_mgm_entry_size; | ||
| 628 | u64 regid_promisc_array[MLX4_MAX_PORTS + 1]; | 629 | u64 regid_promisc_array[MLX4_MAX_PORTS + 1]; |
| 629 | u64 regid_allmulti_array[MLX4_MAX_PORTS + 1]; | 630 | u64 regid_allmulti_array[MLX4_MAX_PORTS + 1]; |
| 630 | }; | 631 | }; |
