diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/fw.c')
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/fw.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index 24429a99190d..68f5cd6cb3c7 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 | ||
| 121 | static 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 | |||
| 121 | int mlx4_MOD_STAT_CFG(struct mlx4_dev *dev, struct mlx4_mod_stat_cfg *cfg) | 135 | int 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 | ||
| 638 | out: | 667 | out: |
| 639 | mlx4_free_cmd_mailbox(dev, mailbox); | 668 | mlx4_free_cmd_mailbox(dev, mailbox); |
