aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Morgenstein <jackm@dev.mellanox.co.il>2012-05-30 05:14:53 -0400
committerDavid S. Miller <davem@davemloft.net>2012-05-31 18:18:16 -0400
commitb91cb3ebcd5ef8db956b8caa486d780dc52b07f1 (patch)
tree76aa23e2322dc4a6ea39778656688a85ea5b03f3
parent13bf58b7604d9adfebb8b7c95e6cfb31ec17c699 (diff)
net/mlx4_core: Fixes for VF / Guest startup flow
- pass the following parameters: - firmware version (added QUERY_FW paravirtualization for that) - disable Blueflame on slaves. KVM disables write combining on guests, and we get better performance without BF in this case. (This requires QUERY_DEV_CAP paravirtualization, also in this commit) - max qp rdma as destination - get rid of a chunk of "if (0)" dead code Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cmd.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/fw.c46
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c17
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4.h10
4 files changed, 63 insertions, 14 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
index 1bcead1fa2f6..842c8ce9494e 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
@@ -617,7 +617,7 @@ static struct mlx4_cmd_info cmd_info[] = {
617 .out_is_imm = false, 617 .out_is_imm = false,
618 .encode_slave_id = false, 618 .encode_slave_id = false,
619 .verify = NULL, 619 .verify = NULL,
620 .wrapper = NULL 620 .wrapper = mlx4_QUERY_FW_wrapper
621 }, 621 },
622 { 622 {
623 .opcode = MLX4_CMD_QUERY_HCA, 623 .opcode = MLX4_CMD_QUERY_HCA,
@@ -635,7 +635,7 @@ static struct mlx4_cmd_info cmd_info[] = {
635 .out_is_imm = false, 635 .out_is_imm = false,
636 .encode_slave_id = false, 636 .encode_slave_id = false,
637 .verify = NULL, 637 .verify = NULL,
638 .wrapper = NULL 638 .wrapper = mlx4_QUERY_DEV_CAP_wrapper
639 }, 639 },
640 { 640 {
641 .opcode = MLX4_CMD_QUERY_FUNC_CAP, 641 .opcode = MLX4_CMD_QUERY_FUNC_CAP,
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index 68f5cd6cb3c7..7f2a4a659627 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -669,6 +669,28 @@ out:
669 return err; 669 return err;
670} 670}
671 671
672int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave,
673 struct mlx4_vhcr *vhcr,
674 struct mlx4_cmd_mailbox *inbox,
675 struct mlx4_cmd_mailbox *outbox,
676 struct mlx4_cmd_info *cmd)
677{
678 int err = 0;
679 u8 field;
680
681 err = mlx4_cmd_box(dev, 0, outbox->dma, 0, 0, MLX4_CMD_QUERY_DEV_CAP,
682 MLX4_CMD_TIME_CLASS_A, MLX4_CMD_NATIVE);
683 if (err)
684 return err;
685
686 /* For guests, report Blueflame disabled */
687 MLX4_GET(field, outbox->buf, QUERY_DEV_CAP_BF_OFFSET);
688 field &= 0x7f;
689 MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_BF_OFFSET);
690
691 return 0;
692}
693
672int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave, 694int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
673 struct mlx4_vhcr *vhcr, 695 struct mlx4_vhcr *vhcr,
674 struct mlx4_cmd_mailbox *inbox, 696 struct mlx4_cmd_mailbox *inbox,
@@ -860,6 +882,9 @@ int mlx4_QUERY_FW(struct mlx4_dev *dev)
860 ((fw_ver & 0xffff0000ull) >> 16) | 882 ((fw_ver & 0xffff0000ull) >> 16) |
861 ((fw_ver & 0x0000ffffull) << 16); 883 ((fw_ver & 0x0000ffffull) << 16);
862 884
885 if (mlx4_is_slave(dev))
886 goto out;
887
863 MLX4_GET(lg, outbox, QUERY_FW_PPF_ID); 888 MLX4_GET(lg, outbox, QUERY_FW_PPF_ID);
864 dev->caps.function = lg; 889 dev->caps.function = lg;
865 890
@@ -927,6 +952,27 @@ out:
927 return err; 952 return err;
928} 953}
929 954
955int mlx4_QUERY_FW_wrapper(struct mlx4_dev *dev, int slave,
956 struct mlx4_vhcr *vhcr,
957 struct mlx4_cmd_mailbox *inbox,
958 struct mlx4_cmd_mailbox *outbox,
959 struct mlx4_cmd_info *cmd)
960{
961 u8 *outbuf;
962 int err;
963
964 outbuf = outbox->buf;
965 err = mlx4_cmd_box(dev, 0, outbox->dma, 0, 0, MLX4_CMD_QUERY_FW,
966 MLX4_CMD_TIME_CLASS_A, MLX4_CMD_NATIVE);
967 if (err)
968 return err;
969
970 /* for slaves, zero out everything except FW version */
971 outbuf[0] = outbuf[1] = 0;
972 memset(&outbuf[8], 0, QUERY_FW_OUT_SIZE - 8);
973 return 0;
974}
975
930static void get_board_id(void *vsd, char *board_id) 976static void get_board_id(void *vsd, char *board_id)
931{ 977{
932 int i; 978 int i;
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 2fe9fe5f7cfb..7f71be0ca5f2 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -430,12 +430,17 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
430 mlx4_log_num_mgm_entry_size = hca_param.log_mc_entry_sz; 430 mlx4_log_num_mgm_entry_size = hca_param.log_mc_entry_sz;
431 431
432 memset(&dev_cap, 0, sizeof(dev_cap)); 432 memset(&dev_cap, 0, sizeof(dev_cap));
433 dev->caps.max_qp_dest_rdma = 1 << hca_param.log_rd_per_qp;
433 err = mlx4_dev_cap(dev, &dev_cap); 434 err = mlx4_dev_cap(dev, &dev_cap);
434 if (err) { 435 if (err) {
435 mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting.\n"); 436 mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting.\n");
436 return err; 437 return err;
437 } 438 }
438 439
440 err = mlx4_QUERY_FW(dev);
441 if (err)
442 mlx4_err(dev, "QUERY_FW command failed: could not get FW version.\n");
443
439 page_size = ~dev->caps.page_size_cap + 1; 444 page_size = ~dev->caps.page_size_cap + 1;
440 mlx4_warn(dev, "HCA minimum page size:%d\n", page_size); 445 mlx4_warn(dev, "HCA minimum page size:%d\n", page_size);
441 if (page_size > PAGE_SIZE) { 446 if (page_size > PAGE_SIZE) {
@@ -499,18 +504,6 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
499 return -ENODEV; 504 return -ENODEV;
500 } 505 }
501 506
502#if 0
503 mlx4_warn(dev, "sqp_demux:%d\n", dev->caps.sqp_demux);
504 mlx4_warn(dev, "num_uars:%d reserved_uars:%d uar region:0x%x bar2:0x%llx\n",
505 dev->caps.num_uars, dev->caps.reserved_uars,
506 dev->caps.uar_page_size * dev->caps.num_uars,
507 pci_resource_len(dev->pdev, 2));
508 mlx4_warn(dev, "num_eqs:%d reserved_eqs:%d\n", dev->caps.num_eqs,
509 dev->caps.reserved_eqs);
510 mlx4_warn(dev, "num_pds:%d reserved_pds:%d slave_pd_shift:%d pd_base:%d\n",
511 dev->caps.num_pds, dev->caps.reserved_pds,
512 dev->caps.slave_pd_shift, dev->caps.pd_base);
513#endif
514 return 0; 507 return 0;
515} 508}
516 509
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
index 86b6e5a2fabf..e5d20220762c 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
@@ -1039,6 +1039,11 @@ int mlx4_init_resource_tracker(struct mlx4_dev *dev);
1039void mlx4_free_resource_tracker(struct mlx4_dev *dev, 1039void mlx4_free_resource_tracker(struct mlx4_dev *dev,
1040 enum mlx4_res_tracker_free_type type); 1040 enum mlx4_res_tracker_free_type type);
1041 1041
1042int mlx4_QUERY_FW_wrapper(struct mlx4_dev *dev, int slave,
1043 struct mlx4_vhcr *vhcr,
1044 struct mlx4_cmd_mailbox *inbox,
1045 struct mlx4_cmd_mailbox *outbox,
1046 struct mlx4_cmd_info *cmd);
1042int mlx4_SET_PORT_wrapper(struct mlx4_dev *dev, int slave, 1047int mlx4_SET_PORT_wrapper(struct mlx4_dev *dev, int slave,
1043 struct mlx4_vhcr *vhcr, 1048 struct mlx4_vhcr *vhcr,
1044 struct mlx4_cmd_mailbox *inbox, 1049 struct mlx4_cmd_mailbox *inbox,
@@ -1054,6 +1059,11 @@ int mlx4_CLOSE_PORT_wrapper(struct mlx4_dev *dev, int slave,
1054 struct mlx4_cmd_mailbox *inbox, 1059 struct mlx4_cmd_mailbox *inbox,
1055 struct mlx4_cmd_mailbox *outbox, 1060 struct mlx4_cmd_mailbox *outbox,
1056 struct mlx4_cmd_info *cmd); 1061 struct mlx4_cmd_info *cmd);
1062int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave,
1063 struct mlx4_vhcr *vhcr,
1064 struct mlx4_cmd_mailbox *inbox,
1065 struct mlx4_cmd_mailbox *outbox,
1066 struct mlx4_cmd_info *cmd);
1057int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave, 1067int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
1058 struct mlx4_vhcr *vhcr, 1068 struct mlx4_vhcr *vhcr,
1059 struct mlx4_cmd_mailbox *inbox, 1069 struct mlx4_cmd_mailbox *inbox,