aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/fw.c29
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/fw.h2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c2
-rw-r--r--include/linux/mlx4/device.h8
4 files changed, 41 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index 2a02ba522e60..f7488dfef8eb 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -118,6 +118,20 @@ static void dump_dev_cap_flags(struct mlx4_dev *dev, u64 flags)
118 mlx4_dbg(dev, " %s\n", fname[i]); 118 mlx4_dbg(dev, " %s\n", fname[i]);
119} 119}
120 120
121static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags)
122{
123 static const char * const fname[] = {
124 [0] = "RSS support",
125 [1] = "RSS Toeplitz Hash Function support",
126 [2] = "RSS XOR Hash Function support"
127 };
128 int i;
129
130 for (i = 0; i < ARRAY_SIZE(fname); ++i)
131 if (fname[i] && (flags & (1LL << i)))
132 mlx4_dbg(dev, " %s\n", fname[i]);
133}
134
121int mlx4_MOD_STAT_CFG(struct mlx4_dev *dev, struct mlx4_mod_stat_cfg *cfg) 135int mlx4_MOD_STAT_CFG(struct mlx4_dev *dev, struct mlx4_mod_stat_cfg *cfg)
122{ 136{
123 struct mlx4_cmd_mailbox *mailbox; 137 struct mlx4_cmd_mailbox *mailbox;
@@ -346,6 +360,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
346#define QUERY_DEV_CAP_MAX_REQ_QP_OFFSET 0x29 360#define QUERY_DEV_CAP_MAX_REQ_QP_OFFSET 0x29
347#define QUERY_DEV_CAP_MAX_RES_QP_OFFSET 0x2b 361#define QUERY_DEV_CAP_MAX_RES_QP_OFFSET 0x2b
348#define QUERY_DEV_CAP_MAX_GSO_OFFSET 0x2d 362#define QUERY_DEV_CAP_MAX_GSO_OFFSET 0x2d
363#define QUERY_DEV_CAP_RSS_OFFSET 0x2e
349#define QUERY_DEV_CAP_MAX_RDMA_OFFSET 0x2f 364#define QUERY_DEV_CAP_MAX_RDMA_OFFSET 0x2f
350#define QUERY_DEV_CAP_RSZ_SRQ_OFFSET 0x33 365#define QUERY_DEV_CAP_RSZ_SRQ_OFFSET 0x33
351#define QUERY_DEV_CAP_ACK_DELAY_OFFSET 0x35 366#define QUERY_DEV_CAP_ACK_DELAY_OFFSET 0x35
@@ -390,6 +405,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
390#define QUERY_DEV_CAP_RSVD_LKEY_OFFSET 0x98 405#define QUERY_DEV_CAP_RSVD_LKEY_OFFSET 0x98
391#define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET 0xa0 406#define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET 0xa0
392 407
408 dev_cap->flags2 = 0;
393 mailbox = mlx4_alloc_cmd_mailbox(dev); 409 mailbox = mlx4_alloc_cmd_mailbox(dev);
394 if (IS_ERR(mailbox)) 410 if (IS_ERR(mailbox))
395 return PTR_ERR(mailbox); 411 return PTR_ERR(mailbox);
@@ -439,6 +455,17 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
439 else 455 else
440 dev_cap->max_gso_sz = 1 << field; 456 dev_cap->max_gso_sz = 1 << field;
441 457
458 MLX4_GET(field, outbox, QUERY_DEV_CAP_RSS_OFFSET);
459 if (field & 0x20)
460 dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_RSS_XOR;
461 if (field & 0x10)
462 dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_RSS_TOP;
463 field &= 0xf;
464 if (field) {
465 dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_RSS;
466 dev_cap->max_rss_tbl_sz = 1 << field;
467 } else
468 dev_cap->max_rss_tbl_sz = 0;
442 MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_RDMA_OFFSET); 469 MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_RDMA_OFFSET);
443 dev_cap->max_rdma_global = 1 << (field & 0x3f); 470 dev_cap->max_rdma_global = 1 << (field & 0x3f);
444 MLX4_GET(field, outbox, QUERY_DEV_CAP_ACK_DELAY_OFFSET); 471 MLX4_GET(field, outbox, QUERY_DEV_CAP_ACK_DELAY_OFFSET);
@@ -632,8 +659,10 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
632 dev_cap->max_rq_desc_sz, dev_cap->max_rq_sg); 659 dev_cap->max_rq_desc_sz, dev_cap->max_rq_sg);
633 mlx4_dbg(dev, "Max GSO size: %d\n", dev_cap->max_gso_sz); 660 mlx4_dbg(dev, "Max GSO size: %d\n", dev_cap->max_gso_sz);
634 mlx4_dbg(dev, "Max counters: %d\n", dev_cap->max_counters); 661 mlx4_dbg(dev, "Max counters: %d\n", dev_cap->max_counters);
662 mlx4_dbg(dev, "Max RSS Table size: %d\n", dev_cap->max_rss_tbl_sz);
635 663
636 dump_dev_cap_flags(dev, dev_cap->flags); 664 dump_dev_cap_flags(dev, dev_cap->flags);
665 dump_dev_cap_flags2(dev, dev_cap->flags2);
637 666
638out: 667out:
639 mlx4_free_cmd_mailbox(dev, mailbox); 668 mlx4_free_cmd_mailbox(dev, mailbox);
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.h b/drivers/net/ethernet/mellanox/mlx4/fw.h
index e1a5fa56bcbc..64c0399e4b78 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.h
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.h
@@ -79,6 +79,7 @@ struct mlx4_dev_cap {
79 u64 trans_code[MLX4_MAX_PORTS + 1]; 79 u64 trans_code[MLX4_MAX_PORTS + 1];
80 u16 stat_rate_support; 80 u16 stat_rate_support;
81 u64 flags; 81 u64 flags;
82 u64 flags2;
82 int reserved_uars; 83 int reserved_uars;
83 int uar_size; 84 int uar_size;
84 int min_page_sz; 85 int min_page_sz;
@@ -110,6 +111,7 @@ struct mlx4_dev_cap {
110 u32 reserved_lkey; 111 u32 reserved_lkey;
111 u64 max_icm_sz; 112 u64 max_icm_sz;
112 int max_gso_sz; 113 int max_gso_sz;
114 int max_rss_tbl_sz;
113 u8 supported_port_types[MLX4_MAX_PORTS + 1]; 115 u8 supported_port_types[MLX4_MAX_PORTS + 1];
114 u8 suggested_type[MLX4_MAX_PORTS + 1]; 116 u8 suggested_type[MLX4_MAX_PORTS + 1];
115 u8 default_sense[MLX4_MAX_PORTS + 1]; 117 u8 default_sense[MLX4_MAX_PORTS + 1];
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 8bb05b46db86..bb04a8208780 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -272,10 +272,12 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
272 dev->caps.max_msg_sz = dev_cap->max_msg_sz; 272 dev->caps.max_msg_sz = dev_cap->max_msg_sz;
273 dev->caps.page_size_cap = ~(u32) (dev_cap->min_page_sz - 1); 273 dev->caps.page_size_cap = ~(u32) (dev_cap->min_page_sz - 1);
274 dev->caps.flags = dev_cap->flags; 274 dev->caps.flags = dev_cap->flags;
275 dev->caps.flags2 = dev_cap->flags2;
275 dev->caps.bmme_flags = dev_cap->bmme_flags; 276 dev->caps.bmme_flags = dev_cap->bmme_flags;
276 dev->caps.reserved_lkey = dev_cap->reserved_lkey; 277 dev->caps.reserved_lkey = dev_cap->reserved_lkey;
277 dev->caps.stat_rate_support = dev_cap->stat_rate_support; 278 dev->caps.stat_rate_support = dev_cap->stat_rate_support;
278 dev->caps.max_gso_sz = dev_cap->max_gso_sz; 279 dev->caps.max_gso_sz = dev_cap->max_gso_sz;
280 dev->caps.max_rss_tbl_sz = dev_cap->max_rss_tbl_sz;
279 281
280 /* Sense port always allowed on supported devices for ConnectX1 and 2 */ 282 /* Sense port always allowed on supported devices for ConnectX1 and 2 */
281 if (dev->pdev->device != 0x1003) 283 if (dev->pdev->device != 0x1003)
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 834c96c5d879..7f5e8d564e8e 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -98,6 +98,12 @@ enum {
98 MLX4_DEV_CAP_FLAG_SENSE_SUPPORT = 1LL << 55 98 MLX4_DEV_CAP_FLAG_SENSE_SUPPORT = 1LL << 55
99}; 99};
100 100
101enum {
102 MLX4_DEV_CAP_FLAG2_RSS = 1LL << 0,
103 MLX4_DEV_CAP_FLAG2_RSS_TOP = 1LL << 1,
104 MLX4_DEV_CAP_FLAG2_RSS_XOR = 1LL << 2
105};
106
101#define MLX4_ATTR_EXTENDED_PORT_INFO cpu_to_be16(0xff90) 107#define MLX4_ATTR_EXTENDED_PORT_INFO cpu_to_be16(0xff90)
102 108
103enum { 109enum {
@@ -292,11 +298,13 @@ struct mlx4_caps {
292 u32 max_msg_sz; 298 u32 max_msg_sz;
293 u32 page_size_cap; 299 u32 page_size_cap;
294 u64 flags; 300 u64 flags;
301 u64 flags2;
295 u32 bmme_flags; 302 u32 bmme_flags;
296 u32 reserved_lkey; 303 u32 reserved_lkey;
297 u16 stat_rate_support; 304 u16 stat_rate_support;
298 u8 port_width_cap[MLX4_MAX_PORTS + 1]; 305 u8 port_width_cap[MLX4_MAX_PORTS + 1];
299 int max_gso_sz; 306 int max_gso_sz;
307 int max_rss_tbl_sz;
300 int reserved_qps_cnt[MLX4_NUM_QP_REGION]; 308 int reserved_qps_cnt[MLX4_NUM_QP_REGION];
301 int reserved_qps; 309 int reserved_qps;
302 int reserved_qps_base[MLX4_NUM_QP_REGION]; 310 int reserved_qps_base[MLX4_NUM_QP_REGION];