--- /dev/null
+From 7c68dd435b3ea128550c3eed62cd3cb405431374 Mon Sep 17 00:00:00 2001
+From: Matan Barak <matanb@mellanox.com>
+Date: Thu, 13 Nov 2014 14:45:27 +0200
+Subject: [PATCH] net/mlx4_core: Fix wrong reading of reserved_eqs
+
+We mistakenly read the reserved_eqs field as a standard
+numeric value rather than a log2 value.
+
+Signed-off-by: Matan Barak <matanb@mellanox.com>
+Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/fw.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
+index d6dba77..9051b36 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
++++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
+@@ -611,7 +611,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
+ MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_MPT_OFFSET);
+ dev_cap->max_mpts = 1 << (field & 0x3f);
+ MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_EQ_OFFSET);
+- dev_cap->reserved_eqs = field & 0xf;
++ dev_cap->reserved_eqs = 1 << (field & 0xf);
+ MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_EQ_OFFSET);
+ dev_cap->max_eqs = 1 << (field & 0xf);
+ MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_MTT_OFFSET);
+--
+1.8.3.1
+
--- /dev/null
+From 492f5add4be84652bbe13da8a250d60c6856a5c5 Mon Sep 17 00:00:00 2001
+From: Amir Vadai <amirv@mellanox.com>
+Date: Mon, 22 Dec 2014 10:21:57 +0200
+Subject: [PATCH] net/mlx4_en: Doorbell is byteswapped in Little Endian archs
+
+iowrite32() will byteswap it's argument on big endian archs.
+iowrite32be() will byteswap on little endian archs.
+Since we don't want to do this unnecessary byteswap on the fast path,
+doorbell is stored in the NIC's native endianness. Using the right
+iowrite() according to the arch endianness.
+
+CC: Wei Yang <weiyang@linux.vnet.ibm.com>
+CC: David Laight <david.laight@aculab.com>
+Fixes: 6a4e812 ("net/mlx4_en: Avoid calling bswap in tx fast path")
+Signed-off-by: Amir Vadai <amirv@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/en_tx.c | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+index a308d41..e3357bf 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
++++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+@@ -962,7 +962,17 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
+ tx_desc->ctrl.owner_opcode = op_own;
+ if (send_doorbell) {
+ wmb();
+- iowrite32(ring->doorbell_qpn,
++ /* Since there is no iowrite*_native() that writes the
++ * value as is, without byteswapping - using the one
++ * the doesn't do byteswapping in the relevant arch
++ * endianness.
++ */
++#if defined(__LITTLE_ENDIAN)
++ iowrite32(
++#else
++ iowrite32be(
++#endif
++ ring->doorbell_qpn,
+ ring->bf.uar->map + MLX4_SEND_DOORBELL);
+ } else {
+ ring->xmit_more++;
+--
+1.8.3.1
+
--- /dev/null
+From 772103e6b1a0ceb4fb482fb9414e55ac9be27250 Mon Sep 17 00:00:00 2001
+From: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Date: Tue, 27 Jan 2015 15:58:01 +0200
+Subject: [PATCH] net/mlx4_core: Fix mem leak in SRIOV mlx4_init_one error flow
+
+Structs allocated for the resource tracker must be freed in
+the error flow.
+
+Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Signed-off-by: Amir Vadai <amirv@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/main.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
+index 51d5550..cc9f484 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/main.c
++++ b/drivers/net/ethernet/mellanox/mlx4/main.c
+@@ -2979,8 +2979,10 @@ err_free_eq:
+ mlx4_free_eq_table(dev);
+
+ err_master_mfunc:
+- if (mlx4_is_master(dev))
++ if (mlx4_is_master(dev)) {
++ mlx4_free_resource_tracker(dev, RES_TR_FREE_STRUCTS_ONLY);
+ mlx4_multi_func_cleanup(dev);
++ }
+
+ if (mlx4_is_slave(dev)) {
+ kfree(dev->caps.qp0_qkey);
+--
+1.8.3.1
+
--- /dev/null
+From 30a5da5b3301e386de99911fe6c1cd1aa37fb970 Mon Sep 17 00:00:00 2001
+From: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Date: Tue, 27 Jan 2015 15:58:03 +0200
+Subject: [PATCH] net/mlx4_core: Fix HW2SW_EQ to conform to the firmware spec
+
+The driver incorrectly assigned an out-mailbox to this command,
+and used an opcode modifier = 0, which is a reserved value (it
+should use opcode modifier = 1).
+
+Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Signed-off-by: Amir Vadai <amirv@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/cmd.c | 2 +-
+ drivers/net/ethernet/mellanox/mlx4/eq.c | 26 ++++------------------
+ .../net/ethernet/mellanox/mlx4/resource_tracker.c | 16 ++++---------
+ 3 files changed, 9 insertions(+), 35 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
+index 2b48932..928b706 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
++++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
+@@ -1221,7 +1221,7 @@ static struct mlx4_cmd_info cmd_info[] = {
+ {
+ .opcode = MLX4_CMD_HW2SW_EQ,
+ .has_inbox = false,
+- .has_outbox = true,
++ .has_outbox = false,
+ .out_is_imm = false,
+ .encode_slave_id = true,
+ .verify = NULL,
+diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c
+index 4df006d..264bc15 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/eq.c
++++ b/drivers/net/ethernet/mellanox/mlx4/eq.c
+@@ -868,12 +868,10 @@ static int mlx4_SW2HW_EQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox,
+ MLX4_CMD_WRAPPED);
+ }
+
+-static int mlx4_HW2SW_EQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox,
+- int eq_num)
++static int mlx4_HW2SW_EQ(struct mlx4_dev *dev, int eq_num)
+ {
+- return mlx4_cmd_box(dev, 0, mailbox->dma, eq_num,
+- 0, MLX4_CMD_HW2SW_EQ, MLX4_CMD_TIME_CLASS_A,
+- MLX4_CMD_WRAPPED);
++ return mlx4_cmd(dev, 0, eq_num, 1, MLX4_CMD_HW2SW_EQ,
++ MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
+ }
+
+ static int mlx4_num_eq_uar(struct mlx4_dev *dev)
+@@ -1046,7 +1044,6 @@ static void mlx4_free_eq(struct mlx4_dev *dev,
+ struct mlx4_eq *eq)
+ {
+ struct mlx4_priv *priv = mlx4_priv(dev);
+- struct mlx4_cmd_mailbox *mailbox;
+ int err;
+ int i;
+ /* CX3 is capable of extending the CQE/EQE from 32 to 64 bytes, with
+@@ -1054,24 +1051,10 @@ static void mlx4_free_eq(struct mlx4_dev *dev,
+ */
+ int npages = PAGE_ALIGN(dev->caps.eqe_size * eq->nent) / PAGE_SIZE;
+
+- mailbox = mlx4_alloc_cmd_mailbox(dev);
+- if (IS_ERR(mailbox))
+- return;
+-
+- err = mlx4_HW2SW_EQ(dev, mailbox, eq->eqn);
++ err = mlx4_HW2SW_EQ(dev, eq->eqn);
+ if (err)
+ mlx4_warn(dev, "HW2SW_EQ failed (%d)\n", err);
+
+- if (0) {
+- mlx4_dbg(dev, "Dumping EQ context %02x:\n", eq->eqn);
+- for (i = 0; i < sizeof (struct mlx4_eq_context) / 4; ++i) {
+- if (i % 4 == 0)
+- pr_cont("[%02x] ", i * 4);
+- pr_cont(" %08x", be32_to_cpup(mailbox->buf + i * 4));
+- if ((i + 1) % 4 == 0)
+- pr_cont("\n");
+- }
+- }
+ synchronize_irq(eq->irq);
+ tasklet_disable(&eq->tasklet_ctx.task);
+
+@@ -1083,7 +1066,6 @@ static void mlx4_free_eq(struct mlx4_dev *dev,
+
+ kfree(eq->page_list);
+ mlx4_bitmap_free(&priv->eq_table.bitmap, eq->eqn, MLX4_USE_RR);
+- mlx4_free_cmd_mailbox(dev, mailbox);
+ }
+
+ static void mlx4_free_irqs(struct mlx4_dev *dev)
+diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+index 3e93879..79feeb6 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
++++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+@@ -4677,7 +4677,6 @@ static void rem_slave_eqs(struct mlx4_dev *dev, int slave)
+ int state;
+ LIST_HEAD(tlist);
+ int eqn;
+- struct mlx4_cmd_mailbox *mailbox;
+
+ err = move_all_busy(dev, slave, RES_EQ);
+ if (err)
+@@ -4703,20 +4702,13 @@ static void rem_slave_eqs(struct mlx4_dev *dev, int slave)
+ break;
+
+ case RES_EQ_HW:
+- mailbox = mlx4_alloc_cmd_mailbox(dev);
+- if (IS_ERR(mailbox)) {
+- cond_resched();
+- continue;
+- }
+- err = mlx4_cmd_box(dev, slave, 0,
+- eqn & 0xff, 0,
+- MLX4_CMD_HW2SW_EQ,
+- MLX4_CMD_TIME_CLASS_A,
+- MLX4_CMD_NATIVE);
++ err = mlx4_cmd(dev, slave, eqn & 0xff,
++ 1, MLX4_CMD_HW2SW_EQ,
++ MLX4_CMD_TIME_CLASS_A,
++ MLX4_CMD_NATIVE);
+ if (err)
+ mlx4_dbg(dev, "rem_slave_eqs: failed to move slave %d eqs %d to SW ownership\n",
+ slave, eqn);
+- mlx4_free_cmd_mailbox(dev, mailbox);
+ atomic_dec(&eq->mtt->ref_count);
+ state = RES_EQ_RESERVED;
+ break;
+--
+1.8.3.1
+
--- /dev/null
+From 19ab574f6271a2f912a449cfdea14a60098fba90 Mon Sep 17 00:00:00 2001
+From: Matan Barak <matanb@mellanox.com>
+Date: Tue, 27 Jan 2015 15:58:07 +0200
+Subject: [PATCH] net/mlx4: Fix memory corruption in mlx4_MAD_IFC_wrapper
+
+Fix a memory corruption at mlx4_MAD_IFC_wrapper.
+
+A table of size dev->caps.pkey_table_len[port]*sizeof(*table)
+was allocated, but get_full_pkey_table() assumes that the number
+of entries in the table is a multiplication of 32 (which isn't always
+correct).
+
+Fixes: 0a9a018 ('mlx4: MAD_IFC paravirtualization')
+Signed-off-by: Matan Barak <matanb@mellanox.com>
+Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
+Signed-off-by: Amir Vadai <amirv@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/cmd.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
+index 928b706..154effb 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
++++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
+@@ -901,7 +901,9 @@ static int mlx4_MAD_IFC_wrapper(struct mlx4_dev *dev, int slave,
+ index = be32_to_cpu(smp->attr_mod);
+ if (port < 1 || port > dev->caps.num_ports)
+ return -EINVAL;
+- table = kcalloc(dev->caps.pkey_table_len[port], sizeof *table, GFP_KERNEL);
++ table = kcalloc((dev->caps.pkey_table_len[port] / 32) + 1,
++ sizeof(*table) * 32, GFP_KERNEL);
++
+ if (!table)
+ return -ENOMEM;
+ /* need to get the full pkey table because the paravirtualized
+--
+1.8.3.1
+
--- /dev/null
+From 5a2e87b16875f9b83b7e9494cf1fce8e17dc764a Mon Sep 17 00:00:00 2001
+From: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Date: Mon, 2 Feb 2015 15:18:42 +0200
+Subject: [PATCH] net/mlx4_core: Fix kernel Oops (mem corruption) when working
+ with more than 80 VFs
+
+Commit de966c592802 (net/mlx4_core: Support more than 64 VFs) was meant to
+allow up to 126 VFs. However, due to leaving MLX4_MFUNC_MAX too low, using
+more than 80 VFs resulted in memory corruptions (and Oopses) when more than
+80 VFs were requested. In addition, the number of slaves was left too high.
+
+This commit fixes these issues.
+
+Fixes: de966c592802 ("net/mlx4_core: Support more than 64 VFs")
+Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Signed-off-by: Amir Vadai <amirv@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/mlx4.h | 3 ++-
+ include/linux/mlx4/device.h | 2 +-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+index bdd4eea..210691c 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h
++++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+@@ -235,7 +235,8 @@ do { \
+ extern int mlx4_log_num_mgm_entry_size;
+ extern int log_mtts_per_seg;
+
+-#define MLX4_MAX_NUM_SLAVES (MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF)
++#define MLX4_MAX_NUM_SLAVES (min(MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF, \
++ MLX4_MFUNC_MAX))
+ #define ALL_SLAVES 0xff
+
+ struct mlx4_bitmap {
+diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
+index 25c791e..5f3a9aa 100644
+--- a/include/linux/mlx4/device.h
++++ b/include/linux/mlx4/device.h
+@@ -97,7 +97,7 @@ enum {
+ MLX4_MAX_NUM_PF = 16,
+ MLX4_MAX_NUM_VF = 126,
+ MLX4_MAX_NUM_VF_P_PORT = 64,
+- MLX4_MFUNC_MAX = 80,
++ MLX4_MFUNC_MAX = 128,
+ MLX4_MAX_EQ_NUM = 1024,
+ MLX4_MFUNC_EQ_NUM = 4,
+ MLX4_MFUNC_MAX_EQES = 8,
+--
+1.8.3.1
+
--- /dev/null
+From f5956fafb00afab474c3886b6297f9b5e7aff722 Mon Sep 17 00:00:00 2001
+From: Or Gerlitz <ogerlitz@mellanox.com>
+Date: Mon, 2 Mar 2015 18:22:15 +0200
+Subject: [PATCH] net/mlx4_core: Fix wrong mask and error flow for the
+ update-qp command
+
+The bit mask for currently supported driver features (MLX4_UPDATE_QP_SUPPORTED_ATTRS)
+of the update-qp command was defined twice (using enum value and pre-processor
+define directive) and wrong.
+
+The return value of the call to mlx4_update_qp() from within the SRIOV
+resource-tracker was wrongly voided down.
+
+Fix both issues.
+
+issue: none
+Fixes: 09e05c3f78e9 ('net/mlx4: Set vlan stripping policy by the right command')
+Fixes: ce8d9e0d6746 ('net/mlx4_core: Add UPDATE_QP SRIOV wrapper support')
+Signed-off-by: Matan Barak <matanb@mellanox.com>
+Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/qp.c | 1 -
+ drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 9 ++++++---
+ include/linux/mlx4/qp.h | 2 +-
+ 3 files changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/qp.c b/drivers/net/ethernet/mellanox/mlx4/qp.c
+index 2bb8553..eda29db 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/qp.c
++++ b/drivers/net/ethernet/mellanox/mlx4/qp.c
+@@ -412,7 +412,6 @@ err_icm:
+
+ EXPORT_SYMBOL_GPL(mlx4_qp_alloc);
+
+-#define MLX4_UPDATE_QP_SUPPORTED_ATTRS MLX4_UPDATE_QP_SMAC
+ int mlx4_update_qp(struct mlx4_dev *dev, u32 qpn,
+ enum mlx4_update_qp_attr attr,
+ struct mlx4_update_qp_params *params)
+diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+index 486e3d2..d97ca88 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
++++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+@@ -713,7 +713,7 @@ static int update_vport_qp_param(struct mlx4_dev *dev,
+ struct mlx4_vport_oper_state *vp_oper;
+ struct mlx4_priv *priv;
+ u32 qp_type;
+- int port;
++ int port, err = 0;
+
+ port = (qpc->pri_path.sched_queue & 0x40) ? 2 : 1;
+ priv = mlx4_priv(dev);
+@@ -738,7 +738,9 @@ static int update_vport_qp_param(struct mlx4_dev *dev,
+ } else {
+ struct mlx4_update_qp_params params = {.flags = 0};
+
+- mlx4_update_qp(dev, qpn, MLX4_UPDATE_QP_VSD, ¶ms);
++ err = mlx4_update_qp(dev, qpn, MLX4_UPDATE_QP_VSD, ¶ms);
++ if (err)
++ goto out;
+ }
+ }
+
+@@ -773,7 +775,8 @@ static int update_vport_qp_param(struct mlx4_dev *dev,
+ qpc->pri_path.feup |= MLX4_FSM_FORCE_ETH_SRC_MAC;
+ qpc->pri_path.grh_mylmc = (0x80 & qpc->pri_path.grh_mylmc) + vp_oper->mac_idx;
+ }
+- return 0;
++out:
++ return err;
+ }
+
+ static int mpt_mask(struct mlx4_dev *dev)
+diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h
+index 2bbc62a..551f854 100644
+--- a/include/linux/mlx4/qp.h
++++ b/include/linux/mlx4/qp.h
+@@ -427,7 +427,7 @@ struct mlx4_wqe_inline_seg {
+
+ enum mlx4_update_qp_attr {
+ MLX4_UPDATE_QP_SMAC = 1 << 0,
+- MLX4_UPDATE_QP_VSD = 1 << 2,
++ MLX4_UPDATE_QP_VSD = 1 << 1,
+ MLX4_UPDATE_QP_SUPPORTED_ATTRS = (1 << 2) - 1
+ };
+
+--
+1.8.3.1
+
--- /dev/null
+From a16f3565703cfc3094938fb3c979cbb90f6d9eb4 Mon Sep 17 00:00:00 2001
+From: Eran Ben Elisha <eranbe@mellanox.com>
+Date: Wed, 18 Mar 2015 16:51:36 +0200
+Subject: [PATCH] net/mlx4_en: Fix off-by-one in ethtool statistics display
+
+NUM_PORT_STATS was 9 instead of 10, which caused off-by-one bug when
+displaying the statistics starting from tx_chksum_offload in ethtool.
+
+Fixes: f8c6455bb04b ('net/mlx4_en: Extend checksum offloading by CHECKSUM COMPLETE')
+Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com>
+Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
+Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+index 2a8268e..ebbe244 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
++++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+@@ -453,7 +453,7 @@ struct mlx4_en_port_stats {
+ unsigned long rx_chksum_none;
+ unsigned long rx_chksum_complete;
+ unsigned long tx_chksum_offload;
+-#define NUM_PORT_STATS 9
++#define NUM_PORT_STATS 10
+ };
+
+ struct mlx4_en_perf_stats {
+--
+1.8.3.1
+
--- /dev/null
+From 4cbdd27c9c3abf87d6fe88cdd749218193ed3e12 Mon Sep 17 00:00:00 2001
+From: Achiad Shochat <achiad@mellanox.com>
+Date: Thu, 2 Apr 2015 17:07:28 +0300
+Subject: [PATCH] net/mlx5_core: Fix a bug in alloc_token
+
+In alloc_token(), the token '1' would be allocated twice consecutively.
+
+Signed-off-by: Achiad Shochat <achiad@mellanox.com>
+Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+index 0d86269..697d538 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+@@ -125,7 +125,10 @@ static u8 alloc_token(struct mlx5_cmd *cmd)
+ u8 token;
+
+ spin_lock(&cmd->token_lock);
+- token = cmd->token++ % 255 + 1;
++ cmd->token++;
++ if (cmd->token == 0)
++ cmd->token++;
++ token = cmd->token;
+ spin_unlock(&cmd->token_lock);
+
+ return token;
+--
+1.8.3.1
+
--- /dev/null
+From fde913e25496761a4e2a4c81230c913aba6289a2 Mon Sep 17 00:00:00 2001
+From: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Date: Sun, 5 Apr 2015 17:50:48 +0300
+Subject: [PATCH] net/mlx4_core: Fix error message deprecation for ConnectX-2
+ cards
+
+Commit 1daa4303b4ca ("net/mlx4_core: Deprecate error message at
+ConnectX-2 cards startup to debug") did the deprecation only for port 1
+of the card. Need to deprecate for port 2 as well.
+
+Fixes: 1daa4303b4ca ("net/mlx4_core: Deprecate error message at ConnectX-2 cards startup to debug")
+Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Signed-off-by: Amir Vadai <amirv@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/cmd.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
+index 3350721..546ca42 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
++++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
+@@ -724,7 +724,8 @@ static int mlx4_cmd_wait(struct mlx4_dev *dev, u64 in_param, u64 *out_param,
+ * on the host, we deprecate the error message for this
+ * specific command/input_mod/opcode_mod/fw-status to be debug.
+ */
+- if (op == MLX4_CMD_SET_PORT && in_modifier == 1 &&
++ if (op == MLX4_CMD_SET_PORT &&
++ (in_modifier == 1 || in_modifier == 2) &&
+ op_modifier == 0 && context->fw_status == CMD_STAT_BAD_SIZE)
+ mlx4_dbg(dev, "command 0x%x failed: fw status = 0x%x\n",
+ op, context->fw_status);
+--
+1.8.3.1
+
--- /dev/null
+From 42eab005a5dd5d7ea2b0328aecc4d6cc0c23c9c2 Mon Sep 17 00:00:00 2001
+From: Benjamin Poirier <bpoirier@suse.de>
+Date: Tue, 28 Apr 2015 14:49:29 -0700
+Subject: [PATCH] mlx4: Fix tx ring affinity_mask creation
+
+By default, the number of tx queues is limited by the number of online cpus
+in mlx4_en_get_profile(). However, this limit no longer holds after the
+ethtool .set_channels method has been called. In that situation, the driver
+may access invalid bits of certain cpumask variables when queue_index >=
+nr_cpu_ids.
+
+Signed-off-by: Benjamin Poirier <bpoirier@suse.de>
+Acked-by: Ido Shamay <idos@mellanox.com>
+Fixes: d03a68f ("net/mlx4_en: Configure the XPS queue mapping on driver load")
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/en_tx.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+index 1783705..f7bf312 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
++++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+@@ -143,8 +143,10 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
+ ring->hwtstamp_tx_type = priv->hwtstamp_config.tx_type;
+ ring->queue_index = queue_index;
+
+- if (queue_index < priv->num_tx_rings_p_up && cpu_online(queue_index))
+- cpumask_set_cpu(queue_index, &ring->affinity_mask);
++ if (queue_index < priv->num_tx_rings_p_up)
++ cpumask_set_cpu_local_first(queue_index,
++ priv->mdev->dev->numa_node,
++ &ring->affinity_mask);
+
+ *pring = ring;
+ return 0;
+@@ -213,7 +215,7 @@ int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv,
+
+ err = mlx4_qp_to_ready(mdev->dev, &ring->wqres.mtt, &ring->context,
+ &ring->qp, &ring->qp_state);
+- if (!user_prio && cpu_online(ring->queue_index))
++ if (!cpumask_empty(&ring->affinity_mask))
+ netif_set_xps_queue(priv->dev, &ring->affinity_mask,
+ ring->queue_index);
+
+--
+1.8.3.1
+
--- /dev/null
+From f94813f3c1d02090cc02dcfcbed339897830acb8 Mon Sep 17 00:00:00 2001
+From: Benjamin Poirier <bpoirier@suse.de>
+Date: Wed, 29 Apr 2015 15:59:35 -0700
+Subject: [PATCH] mlx4_en: Use correct loop cursor in error path.
+
+Signed-off-by: Benjamin Poirier <bpoirier@suse.de>
+Fixes: 9e311e7 ("net/mlx4_en: Use affinity hint")
+Acked-by: Amir Vadai <amirv@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+index 0f1afc0..bf173d7 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
++++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+@@ -1721,7 +1721,7 @@ mac_err:
+ cq_err:
+ while (rx_index--) {
+ mlx4_en_deactivate_cq(priv, priv->rx_cq[rx_index]);
+- mlx4_en_free_affinity_hint(priv, i);
++ mlx4_en_free_affinity_hint(priv, rx_index);
+ }
+ for (i = 0; i < priv->rx_ring_num; i++)
+ mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]);
+--
+1.8.3.1
+
--- /dev/null
+From 479163f4608214d18bc3266ab6e4b578897a3052 Mon Sep 17 00:00:00 2001
+From: Al Viro <viro@ZenIV.linux.org.uk>
+Date: Thu, 20 Nov 2014 08:13:57 +0000
+Subject: [PATCH] mlx5: don't duplicate kvfree()
+
+Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
+Acked-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/eq.c | 4 ++--
+ drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c | 4 ++--
+ drivers/net/ethernet/mellanox/mlx5/core/port.c | 4 ++--
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
+index ad2c96a..dfd3ad0 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
+@@ -390,7 +390,7 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
+ */
+ eq_update_ci(eq, 1);
+
+- mlx5_vfree(in);
++ kvfree(in);
+ return 0;
+
+ err_irq:
+@@ -400,7 +400,7 @@ err_eq:
+ mlx5_cmd_destroy_eq(dev, eq->eqn);
+
+ err_in:
+- mlx5_vfree(in);
++ kvfree(in);
+
+ err_buf:
+ mlx5_buf_free(dev, &eq->buf);
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
+index d476918..4fdaae9 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
+@@ -349,7 +349,7 @@ out_4k:
+ for (i--; i >= 0; i--)
+ free_4k(dev, be64_to_cpu(in->pas[i]));
+ out_free:
+- mlx5_vfree(in);
++ kvfree(in);
+ return err;
+ }
+
+@@ -400,7 +400,7 @@ static int reclaim_pages(struct mlx5_core_dev *dev, u32 func_id, int npages,
+ }
+
+ out_free:
+- mlx5_vfree(out);
++ kvfree(out);
+ return err;
+ }
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/port.c b/drivers/net/ethernet/mellanox/mlx5/core/port.c
+index 3139658..72c2d00 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/port.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/port.c
+@@ -68,9 +68,9 @@ int mlx5_core_access_reg(struct mlx5_core_dev *dev, void *data_in,
+ memcpy(data_out, out->data, size_out);
+
+ ex2:
+- mlx5_vfree(out);
++ kvfree(out);
+ ex1:
+- mlx5_vfree(in);
++ kvfree(in);
+ return err;
+ }
+ EXPORT_SYMBOL_GPL(mlx5_core_access_reg);
+--
+1.8.3.1
+
--- /dev/null
+From 3a9e161a59b29b3aa2f39446b26622867322bf2b Mon Sep 17 00:00:00 2001
+From: Eli Cohen <eli@dev.mellanox.co.il>
+Date: Tue, 2 Dec 2014 12:26:12 +0200
+Subject: [PATCH] net/mlx5_core: Fix min vectors value in
+ mlx5_enable_msix
+
+mlx5 requires at least one interrupt vector for completions so fix the minvec
+argument to pci_enable_msix_range() accordingly.
+
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+index 4e3c27e..c9d4a02 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+@@ -226,7 +226,7 @@ static int mlx5_enable_msix(struct mlx5_core_dev *dev)
+ table->msix_arr[i].entry = i;
+
+ nvec = pci_enable_msix_range(dev->pdev, table->msix_arr,
+- MLX5_EQ_VEC_COMP_BASE, nvec);
++ MLX5_EQ_VEC_COMP_BASE + 1, nvec);
+ if (nvec < 0)
+ return nvec;
+
+--
+1.8.3.1
+
--- /dev/null
+From 2d446d18aa09f16aef9e34774c4fcbc8a84a923e Mon Sep 17 00:00:00 2001
+From: Eli Cohen <eli@dev.mellanox.co.il>
+Date: Tue, 2 Dec 2014 12:26:13 +0200
+Subject: [PATCH] net/mlx5_core: Fix command queue size enforcement
+
+Command queue descriptor page size is 4KB and not the page size used by the
+kernel.
+
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+index 368c6c5..a285305 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+@@ -1363,7 +1363,7 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)
+ goto err_map;
+ }
+
+- if (cmd->log_sz + cmd->log_stride > PAGE_SHIFT) {
++ if (cmd->log_sz + cmd->log_stride > MLX5_ADAPTER_PAGE_SHIFT) {
+ dev_err(&dev->pdev->dev, "command queue size overflow\n");
+ err = -EINVAL;
+ goto err_map;
+--
+1.8.3.1
+
--- /dev/null
+From 6b60d5e221ce11f6b247136bd221dbd952fe931e Mon Sep 17 00:00:00 2001
+From: Majd Dibbiny <majd@mellanox.com>
+Date: Tue, 2 Dec 2014 12:26:16 +0200
+Subject: [PATCH] net/mlx5_core: Clear outbox of dealloc uar
+
+The outbox should be cleared before executing the command.
+
+Signed-off-by: Majd Dibbiny <majd@mellanox.com>
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/uar.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/uar.c b/drivers/net/ethernet/mellanox/mlx5/core/uar.c
+index 0a6348c..06801d6 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/uar.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/uar.c
+@@ -96,6 +96,7 @@ int mlx5_cmd_free_uar(struct mlx5_core_dev *dev, u32 uarn)
+ int err;
+
+ memset(&in, 0, sizeof(in));
++ memset(&out, 0, sizeof(out));
+ in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_DEALLOC_UAR);
+ in.uarn = cpu_to_be32(uarn);
+ err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
+--
+1.8.3.1
+
--- /dev/null
+From 28c167fa8f8ea1850e6053bffb8ee30c1ac4411a Mon Sep 17 00:00:00 2001
+From: Eli Cohen <eli@dev.mellanox.co.il>
+Date: Tue, 2 Dec 2014 12:26:17 +0200
+Subject: [PATCH] net/mlx5_core: Add more supported devices
+
+Add ConnectX-4LX to the list of supported devices as well as their virtual
+functions.
+
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/main.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+index c9d4a02..3f45256 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+@@ -903,8 +903,12 @@ static void remove_one(struct pci_dev *pdev)
+ }
+
+ static const struct pci_device_id mlx5_core_pci_table[] = {
+- { PCI_VDEVICE(MELLANOX, 4113) }, /* MT4113 Connect-IB */
++ { PCI_VDEVICE(MELLANOX, 4113) }, /* Connect-IB */
++ { PCI_VDEVICE(MELLANOX, 4114) }, /* Connect-IB VF */
+ { PCI_VDEVICE(MELLANOX, 4115) }, /* ConnectX-4 */
++ { PCI_VDEVICE(MELLANOX, 4116) }, /* ConnectX-4 VF */
++ { PCI_VDEVICE(MELLANOX, 4117) }, /* ConnectX-4LX */
++ { PCI_VDEVICE(MELLANOX, 4118) }, /* ConnectX-4LX VF */
+ { 0, }
+ };
+
+--
+1.8.3.1
+
--- /dev/null
+From 065bd8c28ba37d04c9a5b732173c1508954b1f58 Mon Sep 17 00:00:00 2001
+From: Arnd Bergmann <arnd@arndb.de>
+Date: Tue, 13 Jan 2015 17:08:06 +0100
+Subject: [PATCH] mlx5: avoid build warnings on 32-bit
+
+The mlx5 driver passes a string pointer in through a 'u64' variable,
+which on 32-bit machines causes a build warning:
+
+drivers/net/ethernet/mellanox/mlx5/core/debugfs.c: In function 'qp_read_field':
+drivers/net/ethernet/mellanox/mlx5/core/debugfs.c:303:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
+
+The code is in fact safe, so we can shut up the warning by adding
+extra type casts.
+
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/debugfs.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
+index 10e1f1a..4878025 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
+@@ -300,11 +300,11 @@ static u64 qp_read_field(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp,
+ param = qp->pid;
+ break;
+ case QP_STATE:
+- param = (u64)mlx5_qp_state_str(be32_to_cpu(ctx->flags) >> 28);
++ param = (unsigned long)mlx5_qp_state_str(be32_to_cpu(ctx->flags) >> 28);
+ *is_str = 1;
+ break;
+ case QP_XPORT:
+- param = (u64)mlx5_qp_type_str((be32_to_cpu(ctx->flags) >> 16) & 0xff);
++ param = (unsigned long)mlx5_qp_type_str((be32_to_cpu(ctx->flags) >> 16) & 0xff);
+ *is_str = 1;
+ break;
+ case QP_MTU:
+@@ -464,7 +464,7 @@ static ssize_t dbg_read(struct file *filp, char __user *buf, size_t count,
+
+
+ if (is_str)
+- ret = snprintf(tbuf, sizeof(tbuf), "%s\n", (const char *)field);
++ ret = snprintf(tbuf, sizeof(tbuf), "%s\n", (const char *)(unsigned long)field);
+ else
+ ret = snprintf(tbuf, sizeof(tbuf), "0x%llx\n", field);
+
+--
+1.8.3.1
+
--- /dev/null
+From 1c755cc5be5023c9523d558de0c507316efa6c62 Mon Sep 17 00:00:00 2001
+From: Or Gerlitz <ogerlitz@mellanox.com>
+Date: Tue, 3 Feb 2015 17:57:18 +0200
+Subject: [PATCH] net/mlx5_core: Move to use hex PCI device IDs
+
+Align the IDs in the code with the modinfo, lspci -n, etc tools outputs.
+
+Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
+Signed-off-by: Amir Vadai <amirv@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/main.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+index 3f45256..d665193 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+@@ -903,12 +903,12 @@ static void remove_one(struct pci_dev *pdev)
+ }
+
+ static const struct pci_device_id mlx5_core_pci_table[] = {
+- { PCI_VDEVICE(MELLANOX, 4113) }, /* Connect-IB */
+- { PCI_VDEVICE(MELLANOX, 4114) }, /* Connect-IB VF */
+- { PCI_VDEVICE(MELLANOX, 4115) }, /* ConnectX-4 */
+- { PCI_VDEVICE(MELLANOX, 4116) }, /* ConnectX-4 VF */
+- { PCI_VDEVICE(MELLANOX, 4117) }, /* ConnectX-4LX */
+- { PCI_VDEVICE(MELLANOX, 4118) }, /* ConnectX-4LX VF */
++ { PCI_VDEVICE(MELLANOX, 0x1011) }, /* Connect-IB */
++ { PCI_VDEVICE(MELLANOX, 0x1012) }, /* Connect-IB VF */
++ { PCI_VDEVICE(MELLANOX, 0x1013) }, /* ConnectX-4 */
++ { PCI_VDEVICE(MELLANOX, 0x1014) }, /* ConnectX-4 VF */
++ { PCI_VDEVICE(MELLANOX, 0x1015) }, /* ConnectX-4LX */
++ { PCI_VDEVICE(MELLANOX, 0x1016) }, /* ConnectX-4LX VF */
+ { 0, }
+ };
+
+--
+1.8.3.1
+
--- /dev/null
+From 1d966d03a37f7f58abf12e87203d03f96950cfd0 Mon Sep 17 00:00:00 2001
+From: Markus Elfring <elfring@users.sourceforge.net>
+Date: Mon, 9 Feb 2015 11:10:41 +0100
+Subject: [PATCH] net: Mellanox: Delete unnecessary checks before the
+ function call "vunmap"
+
+The vunmap() function performs also input parameter validation.
+Thus the test around the call is not needed.
+
+This issue was detected by using the Coccinelle software.
+
+Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
+Acked-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/alloc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/alloc.c b/drivers/net/ethernet/mellanox/mlx5/core/alloc.c
+index 56779c1..201ca6d 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/alloc.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/alloc.c
+@@ -121,7 +121,7 @@ void mlx5_buf_free(struct mlx5_core_dev *dev, struct mlx5_buf *buf)
+ dma_free_coherent(&dev->pdev->dev, buf->size, buf->direct.buf,
+ buf->direct.map);
+ else {
+- if (BITS_PER_LONG == 64 && buf->direct.buf)
++ if (BITS_PER_LONG == 64)
+ vunmap(buf->direct.buf);
+
+ for (i = 0; i < buf->nbufs; i++)
+--
+1.8.3.1
+
--- /dev/null
+From de61390cb3e03186f85997fe08a11dcb9f7a01a3 Mon Sep 17 00:00:00 2001
+From: Eli Cohen <eli@dev.mellanox.co.il>
+Date: Wed, 11 Feb 2015 16:40:38 +0200
+Subject: [PATCH] net/mlx5_core: Fix configuration of log_uar_page_sz
+
+The current code failed to configure the page size for architectures with page
+size different than 4K - PPC for example.
+
+Signed-off-by: Carol L Soto <clsoto@us.ibm.com>
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/main.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+index d665193..5394a84 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+@@ -291,6 +291,7 @@ static void copy_rw_fields(void *to, struct mlx5_caps *from)
+ MLX5_SET(cmd_hca_cap, to, log_max_ra_req_dc, from->gen.log_max_ra_req_dc);
+ MLX5_SET(cmd_hca_cap, to, log_max_ra_res_dc, from->gen.log_max_ra_res_dc);
+ MLX5_SET(cmd_hca_cap, to, pkey_table_size, to_fw_pkey_sz(from->gen.pkey_table_size));
++ MLX5_SET(cmd_hca_cap, to, log_uar_page_sz, PAGE_SHIFT - 12);
+ v64 = from->gen.flags & MLX5_CAP_BITS_RW_MASK;
+ *flags_off = cpu_to_be64(v64);
+ }
+--
+1.8.3.1
+
--- /dev/null
+From 6b9f53bc102d4e61b73c13f661de4a1c358768c1 Mon Sep 17 00:00:00 2001
+From: Julia Lawall <Julia.Lawall@lip6.fr>
+Date: Wed, 11 Mar 2015 17:56:25 +0100
+Subject: [PATCH] net/mlx5_core: don't export static symbol
+
+The semantic patch that fixes this problem is as follows:
+(http://coccinelle.lip6.fr/)
+
+// <smpl>
+@r@
+type T;
+identifier f;
+@@
+
+static T f (...) { ... }
+
+@@
+identifier r.f;
+declarer name EXPORT_SYMBOL;
+@@
+
+-EXPORT_SYMBOL(f);
+// </smpl>
+
+Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/main.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+index 5394a84..350c629 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+@@ -697,7 +697,6 @@ err_dbg:
+ debugfs_remove(priv->dbg_root);
+ return err;
+ }
+-EXPORT_SYMBOL(mlx5_dev_init);
+
+ static void mlx5_dev_cleanup(struct mlx5_core_dev *dev)
+ {
+--
+1.8.3.1
+
--- /dev/null
+From 9ef9baa2acda077f3831f6e7cdf751bc8691f78f Mon Sep 17 00:00:00 2001
+From: Eli Cohen <eli@dev.mellanox.co.il>
+Date: Thu, 2 Apr 2015 17:07:22 +0300
+Subject: [PATCH] net/mlx5_core: Avoid setting DC requestor/responder
+ resources
+
+PRM does not support setting these values so avoid setting them.
+
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+index 350c629..f29fd55 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
+@@ -288,8 +288,6 @@ static void copy_rw_fields(void *to, struct mlx5_caps *from)
+ MLX5_SET(cmd_hca_cap, to, log_max_ra_req_qp, from->gen.log_max_ra_req_qp);
+ MLX5_SET(cmd_hca_cap, to, log_max_ra_res_qp, from->gen.log_max_ra_res_qp);
+ MLX5_SET(cmd_hca_cap, to, pkey_table_size, from->gen.pkey_table_size);
+- MLX5_SET(cmd_hca_cap, to, log_max_ra_req_dc, from->gen.log_max_ra_req_dc);
+- MLX5_SET(cmd_hca_cap, to, log_max_ra_res_dc, from->gen.log_max_ra_res_dc);
+ MLX5_SET(cmd_hca_cap, to, pkey_table_size, to_fw_pkey_sz(from->gen.pkey_table_size));
+ MLX5_SET(cmd_hca_cap, to, log_uar_page_sz, PAGE_SHIFT - 12);
+ v64 = from->gen.flags & MLX5_CAP_BITS_RW_MASK;
+--
+1.8.3.1
+
--- /dev/null
+From b812b5441e359adb9bd44108f7f91e5b0ba4a768 Mon Sep 17 00:00:00 2001
+From: Saeed Mahameed <saeedm@mellanox.com>
+Date: Thu, 2 Apr 2015 17:07:23 +0300
+Subject: [PATCH] net/mlx5_core: Clear doorbell record inside
+ mlx5_db_alloc()
+
+Do it in one place instead of every where the function is invoked
+
+Signed-off-by: Achiad Shochat <achiad@mellanox.com>
+Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/alloc.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/alloc.c b/drivers/net/ethernet/mellanox/mlx5/core/alloc.c
+index 201ca6d..63dd754 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/alloc.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/alloc.c
+@@ -171,6 +171,9 @@ static int mlx5_alloc_db_from_pgdir(struct mlx5_db_pgdir *pgdir,
+ db->db = pgdir->db_page + offset / sizeof(*pgdir->db_page);
+ db->dma = pgdir->db_dma + offset;
+
++ db->db[0] = 0;
++ db->db[1] = 0;
++
+ return 0;
+ }
+
+--
+1.8.3.1
+
--- /dev/null
+From 60722c2ba02be052140998bc80ed77d74e3c03df Mon Sep 17 00:00:00 2001
+From: Achiad Shochat <achiad@mellanox.com>
+Date: Thu, 2 Apr 2015 17:07:24 +0300
+Subject: [PATCH] net/mlx5_core: Use the right inbox struct in destroy
+ mkey command
+
+struct mlx5_query_mkey_mbox_in rather than mlx5_destroy_mkey_mbox_in
+
+Signed-off-by: Achiad Shochat <achiad@mellanox.com>
+Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/mr.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mr.c b/drivers/net/ethernet/mellanox/mlx5/core/mr.c
+index 184c361..1a9b751 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/mr.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/mr.c
+@@ -141,7 +141,7 @@ EXPORT_SYMBOL(mlx5_core_destroy_mkey);
+ int mlx5_core_query_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr,
+ struct mlx5_query_mkey_mbox_out *out, int outlen)
+ {
+- struct mlx5_destroy_mkey_mbox_in in;
++ struct mlx5_query_mkey_mbox_in in;
+ int err;
+
+ memset(&in, 0, sizeof(in));
+--
+1.8.3.1
+
--- /dev/null
+From 05e4ecd1dc8b085a9010f20dcb5409b25488480a Mon Sep 17 00:00:00 2001
+From: Eli Cohen <eli@dev.mellanox.co.il>
+Date: Thu, 2 Apr 2015 17:07:26 +0300
+Subject: [PATCH] net/mlx5_core: Avoid copying outbox in aysnc command
+ completion
+
+Avoid copying to the output buffer in cmd_exec since this is done after the
+command is completed. Failure to do this may cause cases where the callback
+handler is called before the copy done by cmd_exec which then overwrites it.
+
+Reported-by: Tamer Hleihel <tamerh@mellanox.com>
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+index 43a73d3..290ae87 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+@@ -1236,7 +1236,8 @@ static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out,
+ goto out_out;
+ }
+
+- err = mlx5_copy_from_msg(out, outb, out_size);
++ if (!callback)
++ err = mlx5_copy_from_msg(out, outb, out_size);
+
+ out_out:
+ if (!callback)
+--
+1.8.3.1
+
--- /dev/null
+From 21db507439ec3a76a9587f2ad50ad3e4d13f4440 Mon Sep 17 00:00:00 2001
+From: Ira Gusinsky <irenag@mellanox.com>
+Date: Thu, 2 Apr 2015 17:07:27 +0300
+Subject: [PATCH] net/mlx5_core: Avoid usage command work entry after
+ writing command doorbell
+
+Avoid usage of command work entry in cmd_work_handler since it can be released
+by mlx5_cmd_invoke before the work handler returns to running.
+
+Signed-off-by: Ira Gusinsky <irenag@mellanox.com>
+Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
+Signed-off-by: Eli Cohen <eli@mellanox.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+index 290ae87..0d86269 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+@@ -515,10 +515,11 @@ static void cmd_work_handler(struct work_struct *work)
+ ent->ts1 = ktime_get_ns();
+
+ /* ring doorbell after the descriptor is valid */
++ mlx5_core_dbg(dev, "writing 0x%x to command doorbell\n", 1 << ent->idx);
+ wmb();
+ iowrite32be(1 << ent->idx, &dev->iseg->cmd_dbell);
+- mlx5_core_dbg(dev, "write 0x%x to command doorbell\n", 1 << ent->idx);
+ mmiowb();
++ /* if not in polling don't use ent after this point */
+ if (cmd->mode == CMD_MODE_POLLING) {
+ poll_timeout(ent);
+ /* make sure we read the descriptor after ownership is SW */
+--
+1.8.3.1
+
--- /dev/null
+From 59d2d18cc4e9ba30b370db18d0e02d792699da96 Mon Sep 17 00:00:00 2001
+From: Honggang LI <honli@redhat.com>
+Date: Wed, 15 Apr 2015 16:36:15 +0800
+Subject: [PATCH] mlx5: wrong page mask if CONFIG_ARCH_DMA_ADDR_T_64BIT
+ enabled for 32Bit architectures
+
+If CONFIG_ARCH_DMA_ADDR_T_64BIT enabled for x86 systems and physical
+memory is more than 4GB, dma_map_page may return a valid memory
+address which greater than 0xffffffff. As a result, the mlx5 device page
+allocator RB tree will be initialized with valid addresses greater than
+0xfffffff.
+
+However, (addr & PAGE_MASK) set the high four bytes to zeros. So, it's
+impossible for the function, free_4k, to release the pages whose
+addresses greater than 4GB. Memory leaks. And mlx5_ib module can't
+release the pages when user try to remove the module, as a result,
+system hang.
+
+[root@rdma05 root]# dmesg | grep addr | head
+addr = 3fe384000
+addr & PAGE_MASK = fe384000
+[root@rdma05 root]# rmmod mlx5_ib <---- hang on
+
+---------------------- cosnole log -----------------
+mlx5_ib 0000:04:00.0: irq 138 for MSI/MSI-X
+ alloc irq_desc for 139 on node -1
+ alloc kstat_irqs on node -1
+mlx5_ib 0000:04:00.0: irq 139 for MSI/MSI-X
+0000:04:00.0:free_4k:221:(pid 1519): page not found
+0000:04:00.0:free_4k:221:(pid 1519): page not found
+0000:04:00.0:free_4k:221:(pid 1519): page not found
+0000:04:00.0:free_4k:221:(pid 1519): page not found
+---------------------- cosnole log -----------------
+
+Fixes: bf0bf77f6519 ('mlx5: Support communicating arbitrary host page size to firmware')
+Signed-off-by: Honggang Li <honli@redhat.com>
+Signed-off-by: Doug Ledford <dledford@redhat.com>
+---
+ drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
+index df22383..8a64542 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
+@@ -211,26 +211,28 @@ static int alloc_4k(struct mlx5_core_dev *dev, u64 *addr)
+ return 0;
+ }
+
++#define MLX5_U64_4K_PAGE_MASK ((~(u64)0U) << PAGE_SHIFT)
++
+ static void free_4k(struct mlx5_core_dev *dev, u64 addr)
+ {
+ struct fw_page *fwp;
+ int n;
+
+- fwp = find_fw_page(dev, addr & PAGE_MASK);
++ fwp = find_fw_page(dev, addr & MLX5_U64_4K_PAGE_MASK);
+ if (!fwp) {
+ mlx5_core_warn(dev, "page not found\n");
+ return;
+ }
+
+- n = (addr & ~PAGE_MASK) >> MLX5_ADAPTER_PAGE_SHIFT;
++ n = (addr & ~MLX5_U64_4K_PAGE_MASK) >> MLX5_ADAPTER_PAGE_SHIFT;
+ fwp->free_count++;
+ set_bit(n, &fwp->bitmask);
+ if (fwp->free_count == MLX5_NUM_4K_IN_PAGE) {
+ rb_erase(&fwp->rb_node, &dev->priv.page_root);
+ if (fwp->free_count != 1)
+ list_del(&fwp->list);
+- dma_unmap_page(&dev->pdev->dev, addr & PAGE_MASK, PAGE_SIZE,
+- DMA_BIDIRECTIONAL);
++ dma_unmap_page(&dev->pdev->dev, addr & MLX5_U64_4K_PAGE_MASK,
++ PAGE_SIZE, DMA_BIDIRECTIONAL);
+ __free_page(fwp->page);
+ kfree(fwp);
+ } else if (fwp->free_count == 1) {
+--
+1.8.3.1
+