netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV
@ 2012-05-30 19:14 Yevgeny Petrilin
  2012-05-30 19:14 ` [PATCH net 1/6] net/mlx4_core: Fix the slave_id out-of-range test in mlx4_eq_int Yevgeny Petrilin
                   ` (7 more replies)
  0 siblings, 8 replies; 10+ messages in thread
From: Yevgeny Petrilin @ 2012-05-30 19:14 UTC (permalink / raw)
  Cc: netdev, ogerlitz, Yevgeny Petrilin, Jack Morgenstein

From: Yevgeny Petrilin <yevgenyp@mellanox.co.il>

Hi Dave,

Batch of fixes to the mlx4_core and mlx4_en drivers, prepared 
by Jack Morgenstein, who leads our SRIOV development efforts and 
fix various issues all except for one, relate to the driver 
SRIOV functionality.

Jack Morgenstein (5):
  net/mlx4_core: Fix the slave_id out-of-range test in mlx4_eq_int
  net/mlx4_en: Fix improper use of "port" parameter in mlx4_en_event
  net/mlx4_core: Fixes for VF / Guest startup flow
  net/mlx4_core: Check port out-of-range before using in mlx4_slave_cap
  net/mlx4_core: Fix obscure mlx4_cmd_box parameter in QUERY_DEV_CAP

Marcel Apfelbaum (1):
  net/mlx4_core: Fix number of EQs used in ICM initialisation

 drivers/net/ethernet/mellanox/mlx4/cmd.c     |    4 +-
 drivers/net/ethernet/mellanox/mlx4/en_main.c |   12 ++++---
 drivers/net/ethernet/mellanox/mlx4/eq.c      |    2 +-
 drivers/net/ethernet/mellanox/mlx4/fw.c      |   51 ++++++++++++++++++++++++--
 drivers/net/ethernet/mellanox/mlx4/main.c    |   40 +++++++--------------
 drivers/net/ethernet/mellanox/mlx4/mlx4.h    |   10 +++++
 drivers/net/ethernet/mellanox/mlx4/profile.c |    9 +++--
 include/linux/mlx4/device.h                  |    6 +++
 8 files changed, 93 insertions(+), 41 deletions(-)

Cc: Jack Morgenstein <jackm@dev.mellanox.co.il>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH net 1/6] net/mlx4_core: Fix the slave_id out-of-range test in mlx4_eq_int
  2012-05-30 19:14 [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV Yevgeny Petrilin
@ 2012-05-30 19:14 ` Yevgeny Petrilin
  2012-05-30 19:14 ` [PATCH net 2/6] net/mlx4_core: Fix number of EQs used in ICM initialisation Yevgeny Petrilin
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Yevgeny Petrilin @ 2012-05-30 19:14 UTC (permalink / raw)
  Cc: netdev, ogerlitz, Jack Morgenstein

From: Jack Morgenstein <jackm@dev.mellanox.co.il>

Ths fixes the comparison in the FLR (Function Level Reset) event case.

Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx4/eq.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c
index 3b6f8ef..bce98d9 100644
--- a/drivers/net/ethernet/mellanox/mlx4/eq.c
+++ b/drivers/net/ethernet/mellanox/mlx4/eq.c
@@ -426,7 +426,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq)
 
 			mlx4_dbg(dev, "FLR event for slave: %d\n", flr_slave);
 
-			if (flr_slave > dev->num_slaves) {
+			if (flr_slave >= dev->num_slaves) {
 				mlx4_warn(dev,
 					  "Got FLR for unknown function: %d\n",
 					  flr_slave);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH net 2/6] net/mlx4_core: Fix number of EQs used in ICM initialisation
  2012-05-30 19:14 [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV Yevgeny Petrilin
  2012-05-30 19:14 ` [PATCH net 1/6] net/mlx4_core: Fix the slave_id out-of-range test in mlx4_eq_int Yevgeny Petrilin
@ 2012-05-30 19:14 ` Yevgeny Petrilin
  2012-05-30 19:14 ` [PATCH net 3/6] net/mlx4_en: Fix improper use of "port" parameter in mlx4_en_event Yevgeny Petrilin
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Yevgeny Petrilin @ 2012-05-30 19:14 UTC (permalink / raw)
  Cc: netdev, ogerlitz, Marcel Apfelbaum, Jack Morgenstein

From: Marcel Apfelbaum <marcela@dev.mellanox.co.il>

In SRIOV mode, the number of EQs used when computing the total ICM size
was incorrect.

To fix this, we do the following:
1. We add a new structure to mlx4_dev, mlx4_phys_caps, to contain physical HCA
   capabilities.  The PPF uses the phys capabilities when it computes things
   like ICM size.

   The dev_caps structure will then contain the paravirtualized values, making
   bookkeeping much easier in SRIOV mode. We add a structure rather than a
   single parameter because there will be other fields in the phys_caps.

   The first field we add to the mlx4_phys_caps structure is num_phys_eqs.

2. In INIT_HCA, when running in SRIOV mode, the "log_num_eqs" parameter
   passed to the FW is the number of EQs per VF/PF; each function (PF or VF)
   has this number of EQs available.

   However, the total number of EQs which must be allowed for in the ICM is
   (1 << log_num_eqs) * (#VFs + #PFs).  Rather than compute this quantity,
   we allocate ICM space for 1024 EQs (which is the device maximum
   number of EQs, and which is the value we place in the mlx4_phys_caps structure).

   For INIT_HCA, however, we use the per-function number of EQs as described
   above.

Signed-off-by: Marcel Apfelbaum <marcela@dev.mellanox.co.il>
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx4/main.c    |   17 +++++------------
 drivers/net/ethernet/mellanox/mlx4/profile.c |    9 ++++++---
 include/linux/mlx4/device.h                  |    6 ++++++
 3 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 2e024a6..2fe9fe5 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -142,12 +142,6 @@ struct mlx4_port_config {
 	struct pci_dev *pdev;
 };
 
-static inline int mlx4_master_get_num_eqs(struct mlx4_dev *dev)
-{
-	return dev->caps.reserved_eqs +
-		MLX4_MFUNC_EQ_NUM * (dev->num_slaves + 1);
-}
-
 int mlx4_check_port_params(struct mlx4_dev *dev,
 			   enum mlx4_port_type *port_type)
 {
@@ -217,6 +211,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 	}
 
 	dev->caps.num_ports	     = dev_cap->num_ports;
+	dev->phys_caps.num_phys_eqs  = MLX4_MAX_EQ_NUM;
 	for (i = 1; i <= dev->caps.num_ports; ++i) {
 		dev->caps.vl_cap[i]	    = dev_cap->max_vl[i];
 		dev->caps.ib_mtu_cap[i]	    = dev_cap->ib_mtu[i];
@@ -810,9 +805,8 @@ static int mlx4_init_cmpt_table(struct mlx4_dev *dev, u64 cmpt_base,
 	if (err)
 		goto err_srq;
 
-	num_eqs = (mlx4_is_master(dev)) ?
-		roundup_pow_of_two(mlx4_master_get_num_eqs(dev)) :
-		dev->caps.num_eqs;
+	num_eqs = (mlx4_is_master(dev)) ? dev->phys_caps.num_phys_eqs :
+		  dev->caps.num_eqs;
 	err = mlx4_init_icm_table(dev, &priv->eq_table.cmpt_table,
 				  cmpt_base +
 				  ((u64) (MLX4_CMPT_TYPE_EQ *
@@ -874,9 +868,8 @@ static int mlx4_init_icm(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap,
 	}
 
 
-	num_eqs = (mlx4_is_master(dev)) ?
-		roundup_pow_of_two(mlx4_master_get_num_eqs(dev)) :
-		dev->caps.num_eqs;
+	num_eqs = (mlx4_is_master(dev)) ? dev->phys_caps.num_phys_eqs :
+		   dev->caps.num_eqs;
 	err = mlx4_init_icm_table(dev, &priv->eq_table.table,
 				  init_hca->eqc_base, dev_cap->eqc_entry_sz,
 				  num_eqs, num_eqs, 0, 0);
diff --git a/drivers/net/ethernet/mellanox/mlx4/profile.c b/drivers/net/ethernet/mellanox/mlx4/profile.c
index 06e5ade..b83bc92 100644
--- a/drivers/net/ethernet/mellanox/mlx4/profile.c
+++ b/drivers/net/ethernet/mellanox/mlx4/profile.c
@@ -126,7 +126,9 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,
 	profile[MLX4_RES_AUXC].num    = request->num_qp;
 	profile[MLX4_RES_SRQ].num     = request->num_srq;
 	profile[MLX4_RES_CQ].num      = request->num_cq;
-	profile[MLX4_RES_EQ].num      = min_t(unsigned, dev_cap->max_eqs, MAX_MSIX);
+	profile[MLX4_RES_EQ].num      = mlx4_is_mfunc(dev) ?
+					dev->phys_caps.num_phys_eqs :
+					min_t(unsigned, dev_cap->max_eqs, MAX_MSIX);
 	profile[MLX4_RES_DMPT].num    = request->num_mpt;
 	profile[MLX4_RES_CMPT].num    = MLX4_NUM_CMPTS;
 	profile[MLX4_RES_MTT].num     = request->num_mtt * (1 << log_mtts_per_seg);
@@ -215,9 +217,10 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,
 			init_hca->log_num_cqs = profile[i].log_num;
 			break;
 		case MLX4_RES_EQ:
-			dev->caps.num_eqs     = profile[i].num;
+			dev->caps.num_eqs     = roundup_pow_of_two(min_t(unsigned, dev_cap->max_eqs,
+									 MAX_MSIX));
 			init_hca->eqc_base    = profile[i].start;
-			init_hca->log_num_eqs = profile[i].log_num;
+			init_hca->log_num_eqs = ilog2(dev->caps.num_eqs);
 			break;
 		case MLX4_RES_DMPT:
 			dev->caps.num_mpts	= profile[i].num;
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 6e27fa9..6a8f002 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -64,6 +64,7 @@ enum {
 	MLX4_MAX_NUM_PF		= 16,
 	MLX4_MAX_NUM_VF		= 64,
 	MLX4_MFUNC_MAX		= 80,
+	MLX4_MAX_EQ_NUM		= 1024,
 	MLX4_MFUNC_EQ_NUM	= 4,
 	MLX4_MFUNC_MAX_EQES     = 8,
 	MLX4_MFUNC_EQE_MASK     = (MLX4_MFUNC_MAX_EQES - 1)
@@ -239,6 +240,10 @@ static inline u64 mlx4_fw_ver(u64 major, u64 minor, u64 subminor)
 	return (major << 32) | (minor << 16) | subminor;
 }
 
+struct mlx4_phys_caps {
+	u32			num_phys_eqs;
+};
+
 struct mlx4_caps {
 	u64			fw_ver;
 	u32			function;
@@ -499,6 +504,7 @@ struct mlx4_dev {
 	unsigned long		flags;
 	unsigned long		num_slaves;
 	struct mlx4_caps	caps;
+	struct mlx4_phys_caps	phys_caps;
 	struct radix_tree_root	qp_table_tree;
 	u8			rev_id;
 	char			board_id[MLX4_BOARD_ID_LEN];
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH net 3/6] net/mlx4_en: Fix improper use of "port" parameter in mlx4_en_event
  2012-05-30 19:14 [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV Yevgeny Petrilin
  2012-05-30 19:14 ` [PATCH net 1/6] net/mlx4_core: Fix the slave_id out-of-range test in mlx4_eq_int Yevgeny Petrilin
  2012-05-30 19:14 ` [PATCH net 2/6] net/mlx4_core: Fix number of EQs used in ICM initialisation Yevgeny Petrilin
@ 2012-05-30 19:14 ` Yevgeny Petrilin
  2012-05-30 19:14 ` [PATCH net 4/6] net/mlx4_core: Fixes for VF / Guest startup flow Yevgeny Petrilin
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Yevgeny Petrilin @ 2012-05-30 19:14 UTC (permalink / raw)
  Cc: netdev, ogerlitz, Jack Morgenstein

From: Jack Morgenstein <jackm@dev.mellanox.co.il>

Port is used as an array index before we know if that is proper.

For example, in the catas event case, port is zero; however,
the port index should lie in the range (1..2).

Fix this by using 'port' only in the events where it is of interest.

Test for port out of range in the default (unhandled event) case,
and do not output a message if it is not an ethernet port.

Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx4/en_main.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx4/en_main.c b/drivers/net/ethernet/mellanox/mlx4/en_main.c
index 988b242..69ba572 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_main.c
@@ -136,13 +136,12 @@ static void mlx4_en_event(struct mlx4_dev *dev, void *endev_ptr,
 	struct mlx4_en_dev *mdev = (struct mlx4_en_dev *) endev_ptr;
 	struct mlx4_en_priv *priv;
 
-	if (!mdev->pndev[port])
-		return;
-
-	priv = netdev_priv(mdev->pndev[port]);
 	switch (event) {
 	case MLX4_DEV_EVENT_PORT_UP:
 	case MLX4_DEV_EVENT_PORT_DOWN:
+		if (!mdev->pndev[port])
+			return;
+		priv = netdev_priv(mdev->pndev[port]);
 		/* To prevent races, we poll the link state in a separate
 		  task rather than changing it here */
 		priv->link_state = event;
@@ -154,7 +153,10 @@ static void mlx4_en_event(struct mlx4_dev *dev, void *endev_ptr,
 		break;
 
 	default:
-		mlx4_warn(mdev, "Unhandled event: %d\n", event);
+		if (port < 1 || port > dev->caps.num_ports ||
+		    !mdev->pndev[port])
+			return;
+		mlx4_warn(mdev, "Unhandled event %d for port %d\n", event, port);
 	}
 }
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH net 4/6] net/mlx4_core: Fixes for VF / Guest startup flow
  2012-05-30 19:14 [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV Yevgeny Petrilin
                   ` (2 preceding siblings ...)
  2012-05-30 19:14 ` [PATCH net 3/6] net/mlx4_en: Fix improper use of "port" parameter in mlx4_en_event Yevgeny Petrilin
@ 2012-05-30 19:14 ` Yevgeny Petrilin
  2012-05-30 19:14 ` [PATCH net 5/6] net/mlx4_core: Check port out-of-range before using in mlx4_slave_cap Yevgeny Petrilin
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Yevgeny Petrilin @ 2012-05-30 19:14 UTC (permalink / raw)
  Cc: netdev, ogerlitz, Jack Morgenstein

From: Jack Morgenstein <jackm@dev.mellanox.co.il>

- 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>
---
 drivers/net/ethernet/mellanox/mlx4/cmd.c  |    4 +-
 drivers/net/ethernet/mellanox/mlx4/fw.c   |   46 +++++++++++++++++++++++++++++
 drivers/net/ethernet/mellanox/mlx4/main.c |   17 +++-------
 drivers/net/ethernet/mellanox/mlx4/mlx4.h |   10 ++++++
 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 1bcead1..842c8ce 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[] = {
 		.out_is_imm = false,
 		.encode_slave_id = false,
 		.verify = NULL,
-		.wrapper = NULL
+		.wrapper = mlx4_QUERY_FW_wrapper
 	},
 	{
 		.opcode = MLX4_CMD_QUERY_HCA,
@@ -635,7 +635,7 @@ static struct mlx4_cmd_info cmd_info[] = {
 		.out_is_imm = false,
 		.encode_slave_id = false,
 		.verify = NULL,
-		.wrapper = NULL
+		.wrapper = mlx4_QUERY_DEV_CAP_wrapper
 	},
 	{
 		.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 68f5cd6..7f2a4a6 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -669,6 +669,28 @@ out:
 	return err;
 }
 
+int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave,
+			       struct mlx4_vhcr *vhcr,
+			       struct mlx4_cmd_mailbox *inbox,
+			       struct mlx4_cmd_mailbox *outbox,
+			       struct mlx4_cmd_info *cmd)
+{
+	int	err = 0;
+	u8	field;
+
+	err = mlx4_cmd_box(dev, 0, outbox->dma, 0, 0, MLX4_CMD_QUERY_DEV_CAP,
+			   MLX4_CMD_TIME_CLASS_A, MLX4_CMD_NATIVE);
+	if (err)
+		return err;
+
+	/* For guests, report Blueflame disabled */
+	MLX4_GET(field, outbox->buf, QUERY_DEV_CAP_BF_OFFSET);
+	field &= 0x7f;
+	MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_BF_OFFSET);
+
+	return 0;
+}
+
 int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
 			    struct mlx4_vhcr *vhcr,
 			    struct mlx4_cmd_mailbox *inbox,
@@ -860,6 +882,9 @@ int mlx4_QUERY_FW(struct mlx4_dev *dev)
 		((fw_ver & 0xffff0000ull) >> 16) |
 		((fw_ver & 0x0000ffffull) << 16);
 
+	if (mlx4_is_slave(dev))
+		goto out;
+
 	MLX4_GET(lg, outbox, QUERY_FW_PPF_ID);
 	dev->caps.function = lg;
 
@@ -927,6 +952,27 @@ out:
 	return err;
 }
 
+int mlx4_QUERY_FW_wrapper(struct mlx4_dev *dev, int slave,
+			  struct mlx4_vhcr *vhcr,
+			  struct mlx4_cmd_mailbox *inbox,
+			  struct mlx4_cmd_mailbox *outbox,
+			  struct mlx4_cmd_info *cmd)
+{
+	u8 *outbuf;
+	int err;
+
+	outbuf = outbox->buf;
+	err = mlx4_cmd_box(dev, 0, outbox->dma, 0, 0, MLX4_CMD_QUERY_FW,
+			    MLX4_CMD_TIME_CLASS_A, MLX4_CMD_NATIVE);
+	if (err)
+		return err;
+
+	/* for slaves, zero out everything except FW version */
+	outbuf[0] = outbuf[1] = 0;
+	memset(&outbuf[8], 0, QUERY_FW_OUT_SIZE - 8);
+	return 0;
+}
+
 static void get_board_id(void *vsd, char *board_id)
 {
 	int i;
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 2fe9fe5..7f71be0 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)
 	mlx4_log_num_mgm_entry_size = hca_param.log_mc_entry_sz;
 
 	memset(&dev_cap, 0, sizeof(dev_cap));
+	dev->caps.max_qp_dest_rdma = 1 << hca_param.log_rd_per_qp;
 	err = mlx4_dev_cap(dev, &dev_cap);
 	if (err) {
 		mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting.\n");
 		return err;
 	}
 
+	err = mlx4_QUERY_FW(dev);
+	if (err)
+		mlx4_err(dev, "QUERY_FW command failed: could not get FW version.\n");
+
 	page_size = ~dev->caps.page_size_cap + 1;
 	mlx4_warn(dev, "HCA minimum page size:%d\n", page_size);
 	if (page_size > PAGE_SIZE) {
@@ -499,18 +504,6 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
 		return -ENODEV;
 	}
 
-#if 0
-	mlx4_warn(dev, "sqp_demux:%d\n", dev->caps.sqp_demux);
-	mlx4_warn(dev, "num_uars:%d reserved_uars:%d uar region:0x%x bar2:0x%llx\n",
-		  dev->caps.num_uars, dev->caps.reserved_uars,
-		  dev->caps.uar_page_size * dev->caps.num_uars,
-		  pci_resource_len(dev->pdev, 2));
-	mlx4_warn(dev, "num_eqs:%d reserved_eqs:%d\n", dev->caps.num_eqs,
-		  dev->caps.reserved_eqs);
-	mlx4_warn(dev, "num_pds:%d reserved_pds:%d slave_pd_shift:%d pd_base:%d\n",
-		  dev->caps.num_pds, dev->caps.reserved_pds,
-		  dev->caps.slave_pd_shift, dev->caps.pd_base);
-#endif
 	return 0;
 }
 
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
index 86b6e5a..e5d2022 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);
 void mlx4_free_resource_tracker(struct mlx4_dev *dev,
 				enum mlx4_res_tracker_free_type type);
 
+int mlx4_QUERY_FW_wrapper(struct mlx4_dev *dev, int slave,
+			  struct mlx4_vhcr *vhcr,
+			  struct mlx4_cmd_mailbox *inbox,
+			  struct mlx4_cmd_mailbox *outbox,
+			  struct mlx4_cmd_info *cmd);
 int mlx4_SET_PORT_wrapper(struct mlx4_dev *dev, int slave,
 			  struct mlx4_vhcr *vhcr,
 			  struct mlx4_cmd_mailbox *inbox,
@@ -1054,6 +1059,11 @@ int mlx4_CLOSE_PORT_wrapper(struct mlx4_dev *dev, int slave,
 			    struct mlx4_cmd_mailbox *inbox,
 			    struct mlx4_cmd_mailbox *outbox,
 			    struct mlx4_cmd_info *cmd);
+int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave,
+			       struct mlx4_vhcr *vhcr,
+			       struct mlx4_cmd_mailbox *inbox,
+			       struct mlx4_cmd_mailbox *outbox,
+			       struct mlx4_cmd_info *cmd);
 int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
 			    struct mlx4_vhcr *vhcr,
 			    struct mlx4_cmd_mailbox *inbox,
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH net 5/6] net/mlx4_core: Check port out-of-range before using in mlx4_slave_cap
  2012-05-30 19:14 [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV Yevgeny Petrilin
                   ` (3 preceding siblings ...)
  2012-05-30 19:14 ` [PATCH net 4/6] net/mlx4_core: Fixes for VF / Guest startup flow Yevgeny Petrilin
@ 2012-05-30 19:14 ` Yevgeny Petrilin
  2012-05-30 19:14 ` [PATCH net 6/6] net/mlx4_core: Fix obscure mlx4_cmd_box parameter in QUERY_DEV_CAP Yevgeny Petrilin
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Yevgeny Petrilin @ 2012-05-30 19:14 UTC (permalink / raw)
  Cc: netdev, ogerlitz, Jack Morgenstein

From: Jack Morgenstein <jackm@dev.mellanox.co.il>

The range check was performed after using the port number.

Reverse this to prevent a potential array overflow.

Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx4/main.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 7f71be0..ee6f4fe 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -485,15 +485,15 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
 	dev->caps.num_mgms              = 0;
 	dev->caps.num_amgms             = 0;
 
-	for (i = 1; i <= dev->caps.num_ports; ++i)
-		dev->caps.port_mask[i] = dev->caps.port_type[i];
-
 	if (dev->caps.num_ports > MLX4_MAX_PORTS) {
 		mlx4_err(dev, "HCA has %d ports, but we only support %d, "
 			 "aborting.\n", dev->caps.num_ports, MLX4_MAX_PORTS);
 		return -ENODEV;
 	}
 
+	for (i = 1; i <= dev->caps.num_ports; ++i)
+		dev->caps.port_mask[i] = dev->caps.port_type[i];
+
 	if (dev->caps.uar_page_size * (dev->caps.num_uars -
 				       dev->caps.reserved_uars) >
 				       pci_resource_len(dev->pdev, 2)) {
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH net 6/6] net/mlx4_core: Fix obscure mlx4_cmd_box parameter in QUERY_DEV_CAP
  2012-05-30 19:14 [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV Yevgeny Petrilin
                   ` (4 preceding siblings ...)
  2012-05-30 19:14 ` [PATCH net 5/6] net/mlx4_core: Check port out-of-range before using in mlx4_slave_cap Yevgeny Petrilin
@ 2012-05-30 19:14 ` Yevgeny Petrilin
  2012-05-30 20:37 ` [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV David Miller
  2012-05-31 22:19 ` David Miller
  7 siblings, 0 replies; 10+ messages in thread
From: Yevgeny Petrilin @ 2012-05-30 19:14 UTC (permalink / raw)
  Cc: netdev, ogerlitz, Jack Morgenstein

From: Jack Morgenstein <jackm@dev.mellanox.co.il>

The "!mlx4_is_slave" is totally confusing.  Fix with
constant MLX4_CMD_NATIVE, which is the intended behavior.

Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx4/fw.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index 7f2a4a6..9c83bb8 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -412,7 +412,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 	outbox = mailbox->buf;
 
 	err = mlx4_cmd_box(dev, 0, mailbox->dma, 0, 0, MLX4_CMD_QUERY_DEV_CAP,
-			   MLX4_CMD_TIME_CLASS_A, !mlx4_is_slave(dev));
+			   MLX4_CMD_TIME_CLASS_A, MLX4_CMD_NATIVE);
 	if (err)
 		goto out;
 
@@ -590,8 +590,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 
 		for (i = 1; i <= dev_cap->num_ports; ++i) {
 			err = mlx4_cmd_box(dev, 0, mailbox->dma, i, 0, MLX4_CMD_QUERY_PORT,
-					   MLX4_CMD_TIME_CLASS_B,
-					   !mlx4_is_slave(dev));
+					   MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE);
 			if (err)
 				goto out;
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV
  2012-05-30 19:14 [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV Yevgeny Petrilin
                   ` (5 preceding siblings ...)
  2012-05-30 19:14 ` [PATCH net 6/6] net/mlx4_core: Fix obscure mlx4_cmd_box parameter in QUERY_DEV_CAP Yevgeny Petrilin
@ 2012-05-30 20:37 ` David Miller
  2012-05-31  6:37   ` Yevgeny Petrilin
  2012-05-31 22:19 ` David Miller
  7 siblings, 1 reply; 10+ messages in thread
From: David Miller @ 2012-05-30 20:37 UTC (permalink / raw)
  To: yevgenyp; +Cc: netdev, ogerlitz, yevgenyp, jackm


Why did you send multiple copies of some of these patches to
the list?

Patches #1, #2, and #5 showed up twice.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* RE: [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV
  2012-05-30 20:37 ` [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV David Miller
@ 2012-05-31  6:37   ` Yevgeny Petrilin
  0 siblings, 0 replies; 10+ messages in thread
From: Yevgeny Petrilin @ 2012-05-31  6:37 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Or Gerlitz, jackm

> 
> Why did you send multiple copies of some of these patches to the list?
> 
> Patches #1, #2, and #5 showed up twice.

Hi Dave,
Sorry for this, I had some problem with mail client and thought that those 3 weren't sent at the first time.

Yevgeny 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV
  2012-05-30 19:14 [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV Yevgeny Petrilin
                   ` (6 preceding siblings ...)
  2012-05-30 20:37 ` [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV David Miller
@ 2012-05-31 22:19 ` David Miller
  7 siblings, 0 replies; 10+ messages in thread
From: David Miller @ 2012-05-31 22:19 UTC (permalink / raw)
  To: yevgenyp; +Cc: netdev, ogerlitz, yevgenyp, jackm

From: Yevgeny Petrilin <yevgenyp@mellanox.com>
Date: Wed, 30 May 2012 22:14:49 +0300

> Batch of fixes to the mlx4_core and mlx4_en drivers, prepared 
> by Jack Morgenstein, who leads our SRIOV development efforts and 
> fix various issues all except for one, relate to the driver 
> SRIOV functionality.

All applied, thanks.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2012-05-31 22:19 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-30 19:14 [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV Yevgeny Petrilin
2012-05-30 19:14 ` [PATCH net 1/6] net/mlx4_core: Fix the slave_id out-of-range test in mlx4_eq_int Yevgeny Petrilin
2012-05-30 19:14 ` [PATCH net 2/6] net/mlx4_core: Fix number of EQs used in ICM initialisation Yevgeny Petrilin
2012-05-30 19:14 ` [PATCH net 3/6] net/mlx4_en: Fix improper use of "port" parameter in mlx4_en_event Yevgeny Petrilin
2012-05-30 19:14 ` [PATCH net 4/6] net/mlx4_core: Fixes for VF / Guest startup flow Yevgeny Petrilin
2012-05-30 19:14 ` [PATCH net 5/6] net/mlx4_core: Check port out-of-range before using in mlx4_slave_cap Yevgeny Petrilin
2012-05-30 19:14 ` [PATCH net 6/6] net/mlx4_core: Fix obscure mlx4_cmd_box parameter in QUERY_DEV_CAP Yevgeny Petrilin
2012-05-30 20:37 ` [PATCH net 0/6] batch of mlx4 fixes, mostly to SRIOV David Miller
2012-05-31  6:37   ` Yevgeny Petrilin
2012-05-31 22:19 ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).