diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/main.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 59 |
1 files changed, 52 insertions, 7 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index a0313de122d..42645166bae 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/slab.h> | 41 | #include <linux/slab.h> |
42 | #include <linux/io-mapping.h> | 42 | #include <linux/io-mapping.h> |
43 | #include <linux/delay.h> | 43 | #include <linux/delay.h> |
44 | #include <linux/netdevice.h> | ||
44 | 45 | ||
45 | #include <linux/mlx4/device.h> | 46 | #include <linux/mlx4/device.h> |
46 | #include <linux/mlx4/doorbell.h> | 47 | #include <linux/mlx4/doorbell.h> |
@@ -90,7 +91,9 @@ module_param_named(log_num_mgm_entry_size, | |||
90 | 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" |
91 | " of qp per mcg, for example:" | 92 | " of qp per mcg, for example:" |
92 | " 10 gives 248.range: 9<=" | 93 | " 10 gives 248.range: 9<=" |
93 | " log_num_mgm_entry_size <= 12"); | 94 | " log_num_mgm_entry_size <= 12." |
95 | " Not in use with device managed" | ||
96 | " flow steering"); | ||
94 | 97 | ||
95 | #define MLX4_VF (1 << 0) | 98 | #define MLX4_VF (1 << 0) |
96 | 99 | ||
@@ -243,7 +246,6 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) | |||
243 | dev->caps.reserved_srqs = dev_cap->reserved_srqs; | 246 | dev->caps.reserved_srqs = dev_cap->reserved_srqs; |
244 | dev->caps.max_sq_desc_sz = dev_cap->max_sq_desc_sz; | 247 | dev->caps.max_sq_desc_sz = dev_cap->max_sq_desc_sz; |
245 | dev->caps.max_rq_desc_sz = dev_cap->max_rq_desc_sz; | 248 | dev->caps.max_rq_desc_sz = dev_cap->max_rq_desc_sz; |
246 | dev->caps.num_qp_per_mgm = mlx4_get_qp_per_mgm(dev); | ||
247 | /* | 249 | /* |
248 | * Subtract 1 from the limit because we need to allocate a | 250 | * Subtract 1 from the limit because we need to allocate a |
249 | * spare CQE so the HCA HW can tell the difference between an | 251 | * spare CQE so the HCA HW can tell the difference between an |
@@ -274,6 +276,28 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) | |||
274 | dev->caps.max_gso_sz = dev_cap->max_gso_sz; | 276 | dev->caps.max_gso_sz = dev_cap->max_gso_sz; |
275 | dev->caps.max_rss_tbl_sz = dev_cap->max_rss_tbl_sz; | 277 | dev->caps.max_rss_tbl_sz = dev_cap->max_rss_tbl_sz; |
276 | 278 | ||
279 | if (dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_FS_EN) { | ||
280 | dev->caps.steering_mode = MLX4_STEERING_MODE_DEVICE_MANAGED; | ||
281 | dev->caps.num_qp_per_mgm = dev_cap->fs_max_num_qp_per_entry; | ||
282 | dev->caps.fs_log_max_ucast_qp_range_size = | ||
283 | dev_cap->fs_log_max_ucast_qp_range_size; | ||
284 | } else { | ||
285 | if (dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_UC_STEER && | ||
286 | dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER) { | ||
287 | dev->caps.steering_mode = MLX4_STEERING_MODE_B0; | ||
288 | } else { | ||
289 | dev->caps.steering_mode = MLX4_STEERING_MODE_A0; | ||
290 | |||
291 | if (dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_UC_STEER || | ||
292 | dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER) | ||
293 | mlx4_warn(dev, "Must have UC_STEER and MC_STEER flags " | ||
294 | "set to use B0 steering. Falling back to A0 steering mode.\n"); | ||
295 | } | ||
296 | dev->caps.num_qp_per_mgm = mlx4_get_qp_per_mgm(dev); | ||
297 | } | ||
298 | mlx4_dbg(dev, "Steering mode is: %s\n", | ||
299 | mlx4_steering_mode_str(dev->caps.steering_mode)); | ||
300 | |||
277 | /* Sense port always allowed on supported devices for ConnectX1 and 2 */ | 301 | /* Sense port always allowed on supported devices for ConnectX1 and 2 */ |
278 | if (dev->pdev->device != 0x1003) | 302 | if (dev->pdev->device != 0x1003) |
279 | dev->caps.flags |= MLX4_DEV_CAP_FLAG_SENSE_SUPPORT; | 303 | dev->caps.flags |= MLX4_DEV_CAP_FLAG_SENSE_SUPPORT; |
@@ -967,9 +991,11 @@ static int mlx4_init_icm(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap, | |||
967 | } | 991 | } |
968 | 992 | ||
969 | /* | 993 | /* |
970 | * It's not strictly required, but for simplicity just map the | 994 | * For flow steering device managed mode it is required to use |
971 | * whole multicast group table now. The table isn't very big | 995 | * mlx4_init_icm_table. For B0 steering mode it's not strictly |
972 | * and it's a lot easier than trying to track ref counts. | 996 | * required, but for simplicity just map the whole multicast |
997 | * group table now. The table isn't very big and it's a lot | ||
998 | * easier than trying to track ref counts. | ||
973 | */ | 999 | */ |
974 | err = mlx4_init_icm_table(dev, &priv->mcg_table.table, | 1000 | err = mlx4_init_icm_table(dev, &priv->mcg_table.table, |
975 | init_hca->mc_base, | 1001 | init_hca->mc_base, |
@@ -1205,7 +1231,26 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
1205 | goto err_stop_fw; | 1231 | goto err_stop_fw; |
1206 | } | 1232 | } |
1207 | 1233 | ||
1234 | priv->fs_hash_mode = MLX4_FS_L2_HASH; | ||
1235 | |||
1236 | switch (priv->fs_hash_mode) { | ||
1237 | case MLX4_FS_L2_HASH: | ||
1238 | init_hca.fs_hash_enable_bits = 0; | ||
1239 | break; | ||
1240 | |||
1241 | case MLX4_FS_L2_L3_L4_HASH: | ||
1242 | /* Enable flow steering with | ||
1243 | * udp unicast and tcp unicast | ||
1244 | */ | ||
1245 | init_hca.fs_hash_enable_bits = | ||
1246 | MLX4_FS_UDP_UC_EN | MLX4_FS_TCP_UC_EN; | ||
1247 | break; | ||
1248 | } | ||
1249 | |||
1208 | profile = default_profile; | 1250 | profile = default_profile; |
1251 | if (dev->caps.steering_mode == | ||
1252 | MLX4_STEERING_MODE_DEVICE_MANAGED) | ||
1253 | profile.num_mcg = MLX4_FS_NUM_MCG; | ||
1209 | 1254 | ||
1210 | icm_size = mlx4_make_profile(dev, &profile, &dev_cap, | 1255 | icm_size = mlx4_make_profile(dev, &profile, &dev_cap, |
1211 | &init_hca); | 1256 | &init_hca); |
@@ -1539,8 +1584,8 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev) | |||
1539 | struct mlx4_priv *priv = mlx4_priv(dev); | 1584 | struct mlx4_priv *priv = mlx4_priv(dev); |
1540 | struct msix_entry *entries; | 1585 | struct msix_entry *entries; |
1541 | int nreq = min_t(int, dev->caps.num_ports * | 1586 | int nreq = min_t(int, dev->caps.num_ports * |
1542 | min_t(int, num_online_cpus() + 1, MAX_MSIX_P_PORT) | 1587 | min_t(int, netif_get_num_default_rss_queues() + 1, |
1543 | + MSIX_LEGACY_SZ, MAX_MSIX); | 1588 | MAX_MSIX_P_PORT) + MSIX_LEGACY_SZ, MAX_MSIX); |
1544 | int err; | 1589 | int err; |
1545 | int i; | 1590 | int i; |
1546 | 1591 | ||