aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx4/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/main.c')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c59
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,
90MODULE_PARM_DESC(log_num_mgm_entry_size, "log mgm size, that defines the num" 91MODULE_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