]> git.openfabrics.org - ~emulex/for-vlad/old/compat-rdma.git/commitdiff
mlx4/5: Added bug fixes
authorVladimir Sokolovsky <vlad@mellanox.com>
Tue, 12 May 2015 10:38:45 +0000 (13:38 +0300)
committerVladimir Sokolovsky <vlad@mellanox.com>
Tue, 12 May 2015 11:11:38 +0000 (14:11 +0300)
 7c68dd435b3ea128550c3eed62cd3cb405431374 net/mlx4_core: Fix wrong reading of reserved_eqs
 492f5add4be84652bbe13da8a250d60c6856a5c5 net/mlx4_en: Doorbell is byteswapped in Little Endian archs
 772103e6b1a0ceb4fb482fb9414e55ac9be27250 net/mlx4_core: Fix mem leak in SRIOV mlx4_init_one error flow
 30a5da5b3301e386de99911fe6c1cd1aa37fb970 net/mlx4_core: Fix HW2SW_EQ to conform to the firmware spec
 19ab574f6271a2f912a449cfdea14a60098fba90 net/mlx4: Fix memory corruption in mlx4_MAD_IFC_wrapper
 5a2e87b16875f9b83b7e9494cf1fce8e17dc764a net/mlx4_core: Fix kernel Oops (mem corruption) when working
 f5956fafb00afab474c3886b6297f9b5e7aff722 net/mlx4_core: Fix wrong mask and error flow for the
 a16f3565703cfc3094938fb3c979cbb90f6d9eb4 net/mlx4_en: Fix off-by-one in ethtool statistics display
 4cbdd27c9c3abf87d6fe88cdd749218193ed3e12 net/mlx5_core: Fix a bug in alloc_token
 fde913e25496761a4e2a4c81230c913aba6289a2 net/mlx4_core: Fix error message deprecation for ConnectX-2
 42eab005a5dd5d7ea2b0328aecc4d6cc0c23c9c2 mlx4: Fix tx ring affinity_mask creation
 f94813f3c1d02090cc02dcfcbed339897830acb8 mlx4_en: Use correct loop cursor in error path.
 479163f4608214d18bc3266ab6e4b578897a3052 mlx5: don't duplicate kvfree()
 3a9e161a59b29b3aa2f39446b26622867322bf2b net/mlx5_core: Fix min vectors value in
 2d446d18aa09f16aef9e34774c4fcbc8a84a923e net/mlx5_core: Fix command queue size enforcement
 6b60d5e221ce11f6b247136bd221dbd952fe931e net/mlx5_core: Clear outbox of dealloc uar
 28c167fa8f8ea1850e6053bffb8ee30c1ac4411a net/mlx5_core: Add more supported devices
 065bd8c28ba37d04c9a5b732173c1508954b1f58 mlx5: avoid build warnings on 32-bit
 1c755cc5be5023c9523d558de0c507316efa6c62 net/mlx5_core: Move to use hex PCI device IDs
 1d966d03a37f7f58abf12e87203d03f96950cfd0 net: Mellanox: Delete unnecessary checks before the
 de61390cb3e03186f85997fe08a11dcb9f7a01a3 net/mlx5_core: Fix configuration of log_uar_page_sz
 6b9f53bc102d4e61b73c13f661de4a1c358768c1 net/mlx5_core: don't export static symbol
 9ef9baa2acda077f3831f6e7cdf751bc8691f78f net/mlx5_core: Avoid setting DC requestor/responder
 b812b5441e359adb9bd44108f7f91e5b0ba4a768 net/mlx5_core: Clear doorbell record inside
 60722c2ba02be052140998bc80ed77d74e3c03df net/mlx5_core: Use the right inbox struct in destroy
 05e4ecd1dc8b085a9010f20dcb5409b25488480a net/mlx5_core: Avoid copying outbox in aysnc command
 21db507439ec3a76a9587f2ad50ad3e4d13f4440 net/mlx5_core: Avoid usage command work entry after
 59d2d18cc4e9ba30b370db18d0e02d792699da96 mlx5: wrong page mask if CONFIG_ARCH_DMA_ADDR_T_64BIT

Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
28 files changed:
linux-next-cherry-picks/0018-net-mlx4_core-Fix-wrong-reading-of-reserved_eqs.patch [new file with mode: 0644]
linux-next-cherry-picks/0019-net-mlx4_en-Doorbell-is-byteswapped-in-Little-Endian.patch [new file with mode: 0644]
linux-next-cherry-picks/0020-net-mlx4_core-Fix-mem-leak-in-SRIOV-mlx4_init_one-er.patch [new file with mode: 0644]
linux-next-cherry-picks/0021-net-mlx4_core-Fix-HW2SW_EQ-to-conform-to-the-firmwar.patch [new file with mode: 0644]
linux-next-cherry-picks/0022-net-mlx4-Fix-memory-corruption-in-mlx4_MAD_IFC_wrapp.patch [new file with mode: 0644]
linux-next-cherry-picks/0023-net-mlx4_core-Fix-kernel-Oops-mem-corruption-when-wo.patch [new file with mode: 0644]
linux-next-cherry-picks/0024-net-mlx4_core-Fix-wrong-mask-and-error-flow-for-the-.patch [new file with mode: 0644]
linux-next-cherry-picks/0025-net-mlx4_en-Fix-off-by-one-in-ethtool-statistics-dis.patch [new file with mode: 0644]
linux-next-cherry-picks/0026-net-mlx5_core-Fix-a-bug-in-alloc_token.patch [new file with mode: 0644]
linux-next-cherry-picks/0027-net-mlx4_core-Fix-error-message-deprecation-for-Conn.patch [new file with mode: 0644]
linux-next-cherry-picks/0028-mlx4-Fix-tx-ring-affinity_mask-creation.patch [new file with mode: 0644]
linux-next-cherry-picks/0029-mlx4_en-Use-correct-loop-cursor-in-error-path.patch [new file with mode: 0644]
linux-next-cherry-picks/0030-mlx5-don-t-duplicate-kvfree.patch [new file with mode: 0644]
linux-next-cherry-picks/0031-net-mlx5_core-Fix-min-vectors-value-in-mlx5_enable_m.patch [new file with mode: 0644]
linux-next-cherry-picks/0032-net-mlx5_core-Fix-command-queue-size-enforcement.patch [new file with mode: 0644]
linux-next-cherry-picks/0033-net-mlx5_core-Clear-outbox-of-dealloc-uar.patch [new file with mode: 0644]
linux-next-cherry-picks/0034-net-mlx5_core-Add-more-supported-devices.patch [new file with mode: 0644]
linux-next-cherry-picks/0035-mlx5-avoid-build-warnings-on-32-bit.patch [new file with mode: 0644]
linux-next-cherry-picks/0036-net-mlx5_core-Move-to-use-hex-PCI-device-IDs.patch [new file with mode: 0644]
linux-next-cherry-picks/0037-net-Mellanox-Delete-unnecessary-checks-before-the-fu.patch [new file with mode: 0644]
linux-next-cherry-picks/0038-net-mlx5_core-Fix-configuration-of-log_uar_page_sz.patch [new file with mode: 0644]
linux-next-cherry-picks/0039-net-mlx5_core-don-t-export-static-symbol.patch [new file with mode: 0644]
linux-next-cherry-picks/0040-net-mlx5_core-Avoid-setting-DC-requestor-responder-r.patch [new file with mode: 0644]
linux-next-cherry-picks/0041-net-mlx5_core-Clear-doorbell-record-inside-mlx5_db_a.patch [new file with mode: 0644]
linux-next-cherry-picks/0042-net-mlx5_core-Use-the-right-inbox-struct-in-destroy-.patch [new file with mode: 0644]
linux-next-cherry-picks/0043-net-mlx5_core-Avoid-copying-outbox-in-aysnc-command-.patch [new file with mode: 0644]
linux-next-cherry-picks/0044-net-mlx5_core-Avoid-usage-command-work-entry-after-w.patch [new file with mode: 0644]
linux-next-cherry-picks/0045-mlx5-wrong-page-mask-if-CONFIG_ARCH_DMA_ADDR_T_64BIT.patch [new file with mode: 0644]

diff --git a/linux-next-cherry-picks/0018-net-mlx4_core-Fix-wrong-reading-of-reserved_eqs.patch b/linux-next-cherry-picks/0018-net-mlx4_core-Fix-wrong-reading-of-reserved_eqs.patch
new file mode 100644 (file)
index 0000000..bea78a0
--- /dev/null
@@ -0,0 +1,31 @@
+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
+
diff --git a/linux-next-cherry-picks/0019-net-mlx4_en-Doorbell-is-byteswapped-in-Little-Endian.patch b/linux-next-cherry-picks/0019-net-mlx4_en-Doorbell-is-byteswapped-in-Little-Endian.patch
new file mode 100644 (file)
index 0000000..4d66af3
--- /dev/null
@@ -0,0 +1,46 @@
+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
+
diff --git a/linux-next-cherry-picks/0020-net-mlx4_core-Fix-mem-leak-in-SRIOV-mlx4_init_one-er.patch b/linux-next-cherry-picks/0020-net-mlx4_core-Fix-mem-leak-in-SRIOV-mlx4_init_one-er.patch
new file mode 100644 (file)
index 0000000..bd72552
--- /dev/null
@@ -0,0 +1,34 @@
+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
+
diff --git a/linux-next-cherry-picks/0021-net-mlx4_core-Fix-HW2SW_EQ-to-conform-to-the-firmwar.patch b/linux-next-cherry-picks/0021-net-mlx4_core-Fix-HW2SW_EQ-to-conform-to-the-firmwar.patch
new file mode 100644 (file)
index 0000000..f93c167
--- /dev/null
@@ -0,0 +1,133 @@
+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
+
diff --git a/linux-next-cherry-picks/0022-net-mlx4-Fix-memory-corruption-in-mlx4_MAD_IFC_wrapp.patch b/linux-next-cherry-picks/0022-net-mlx4-Fix-memory-corruption-in-mlx4_MAD_IFC_wrapp.patch
new file mode 100644 (file)
index 0000000..bd1e28f
--- /dev/null
@@ -0,0 +1,39 @@
+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
+
diff --git a/linux-next-cherry-picks/0023-net-mlx4_core-Fix-kernel-Oops-mem-corruption-when-wo.patch b/linux-next-cherry-picks/0023-net-mlx4_core-Fix-kernel-Oops-mem-corruption-when-wo.patch
new file mode 100644 (file)
index 0000000..c8c2dae
--- /dev/null
@@ -0,0 +1,52 @@
+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
+
diff --git a/linux-next-cherry-picks/0024-net-mlx4_core-Fix-wrong-mask-and-error-flow-for-the-.patch b/linux-next-cherry-picks/0024-net-mlx4_core-Fix-wrong-mask-and-error-flow-for-the-.patch
new file mode 100644 (file)
index 0000000..7970bc8
--- /dev/null
@@ -0,0 +1,89 @@
+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, &params);
++                              err = mlx4_update_qp(dev, qpn, MLX4_UPDATE_QP_VSD, &params);
++                              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
+
diff --git a/linux-next-cherry-picks/0025-net-mlx4_en-Fix-off-by-one-in-ethtool-statistics-dis.patch b/linux-next-cherry-picks/0025-net-mlx4_en-Fix-off-by-one-in-ethtool-statistics-dis.patch
new file mode 100644 (file)
index 0000000..6876e41
--- /dev/null
@@ -0,0 +1,33 @@
+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
+
diff --git a/linux-next-cherry-picks/0026-net-mlx5_core-Fix-a-bug-in-alloc_token.patch b/linux-next-cherry-picks/0026-net-mlx5_core-Fix-a-bug-in-alloc_token.patch
new file mode 100644 (file)
index 0000000..f0f9ec0
--- /dev/null
@@ -0,0 +1,34 @@
+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
+
diff --git a/linux-next-cherry-picks/0027-net-mlx4_core-Fix-error-message-deprecation-for-Conn.patch b/linux-next-cherry-picks/0027-net-mlx4_core-Fix-error-message-deprecation-for-Conn.patch
new file mode 100644 (file)
index 0000000..cebebaf
--- /dev/null
@@ -0,0 +1,35 @@
+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
+
diff --git a/linux-next-cherry-picks/0028-mlx4-Fix-tx-ring-affinity_mask-creation.patch b/linux-next-cherry-picks/0028-mlx4-Fix-tx-ring-affinity_mask-creation.patch
new file mode 100644 (file)
index 0000000..f9dc2e2
--- /dev/null
@@ -0,0 +1,48 @@
+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
+
diff --git a/linux-next-cherry-picks/0029-mlx4_en-Use-correct-loop-cursor-in-error-path.patch b/linux-next-cherry-picks/0029-mlx4_en-Use-correct-loop-cursor-in-error-path.patch
new file mode 100644 (file)
index 0000000..e7d4976
--- /dev/null
@@ -0,0 +1,29 @@
+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
+
diff --git a/linux-next-cherry-picks/0030-mlx5-don-t-duplicate-kvfree.patch b/linux-next-cherry-picks/0030-mlx5-don-t-duplicate-kvfree.patch
new file mode 100644 (file)
index 0000000..d4801ae
--- /dev/null
@@ -0,0 +1,77 @@
+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
+
diff --git a/linux-next-cherry-picks/0031-net-mlx5_core-Fix-min-vectors-value-in-mlx5_enable_m.patch b/linux-next-cherry-picks/0031-net-mlx5_core-Fix-min-vectors-value-in-mlx5_enable_m.patch
new file mode 100644 (file)
index 0000000..29fd74a
--- /dev/null
@@ -0,0 +1,31 @@
+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
+
diff --git a/linux-next-cherry-picks/0032-net-mlx5_core-Fix-command-queue-size-enforcement.patch b/linux-next-cherry-picks/0032-net-mlx5_core-Fix-command-queue-size-enforcement.patch
new file mode 100644 (file)
index 0000000..0deb54c
--- /dev/null
@@ -0,0 +1,30 @@
+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
+
diff --git a/linux-next-cherry-picks/0033-net-mlx5_core-Clear-outbox-of-dealloc-uar.patch b/linux-next-cherry-picks/0033-net-mlx5_core-Clear-outbox-of-dealloc-uar.patch
new file mode 100644 (file)
index 0000000..7b2d6a7
--- /dev/null
@@ -0,0 +1,29 @@
+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
+
diff --git a/linux-next-cherry-picks/0034-net-mlx5_core-Add-more-supported-devices.patch b/linux-next-cherry-picks/0034-net-mlx5_core-Add-more-supported-devices.patch
new file mode 100644 (file)
index 0000000..d77f4b4
--- /dev/null
@@ -0,0 +1,35 @@
+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
+
diff --git a/linux-next-cherry-picks/0035-mlx5-avoid-build-warnings-on-32-bit.patch b/linux-next-cherry-picks/0035-mlx5-avoid-build-warnings-on-32-bit.patch
new file mode 100644 (file)
index 0000000..24a4fee
--- /dev/null
@@ -0,0 +1,50 @@
+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
+
diff --git a/linux-next-cherry-picks/0036-net-mlx5_core-Move-to-use-hex-PCI-device-IDs.patch b/linux-next-cherry-picks/0036-net-mlx5_core-Move-to-use-hex-PCI-device-IDs.patch
new file mode 100644 (file)
index 0000000..34ff776
--- /dev/null
@@ -0,0 +1,40 @@
+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
+
diff --git a/linux-next-cherry-picks/0037-net-Mellanox-Delete-unnecessary-checks-before-the-fu.patch b/linux-next-cherry-picks/0037-net-Mellanox-Delete-unnecessary-checks-before-the-fu.patch
new file mode 100644 (file)
index 0000000..09520cb
--- /dev/null
@@ -0,0 +1,34 @@
+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
+
diff --git a/linux-next-cherry-picks/0038-net-mlx5_core-Fix-configuration-of-log_uar_page_sz.patch b/linux-next-cherry-picks/0038-net-mlx5_core-Fix-configuration-of-log_uar_page_sz.patch
new file mode 100644 (file)
index 0000000..c331aa1
--- /dev/null
@@ -0,0 +1,30 @@
+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
+
diff --git a/linux-next-cherry-picks/0039-net-mlx5_core-don-t-export-static-symbol.patch b/linux-next-cherry-picks/0039-net-mlx5_core-don-t-export-static-symbol.patch
new file mode 100644 (file)
index 0000000..3912a58
--- /dev/null
@@ -0,0 +1,45 @@
+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
+
diff --git a/linux-next-cherry-picks/0040-net-mlx5_core-Avoid-setting-DC-requestor-responder-r.patch b/linux-next-cherry-picks/0040-net-mlx5_core-Avoid-setting-DC-requestor-responder-r.patch
new file mode 100644 (file)
index 0000000..35c383c
--- /dev/null
@@ -0,0 +1,30 @@
+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
+
diff --git a/linux-next-cherry-picks/0041-net-mlx5_core-Clear-doorbell-record-inside-mlx5_db_a.patch b/linux-next-cherry-picks/0041-net-mlx5_core-Clear-doorbell-record-inside-mlx5_db_a.patch
new file mode 100644 (file)
index 0000000..996fd04
--- /dev/null
@@ -0,0 +1,33 @@
+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
+
diff --git a/linux-next-cherry-picks/0042-net-mlx5_core-Use-the-right-inbox-struct-in-destroy-.patch b/linux-next-cherry-picks/0042-net-mlx5_core-Use-the-right-inbox-struct-in-destroy-.patch
new file mode 100644 (file)
index 0000000..0bd907d
--- /dev/null
@@ -0,0 +1,32 @@
+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
+
diff --git a/linux-next-cherry-picks/0043-net-mlx5_core-Avoid-copying-outbox-in-aysnc-command-.patch b/linux-next-cherry-picks/0043-net-mlx5_core-Avoid-copying-outbox-in-aysnc-command-.patch
new file mode 100644 (file)
index 0000000..4eb71f3
--- /dev/null
@@ -0,0 +1,35 @@
+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
+
diff --git a/linux-next-cherry-picks/0044-net-mlx5_core-Avoid-usage-command-work-entry-after-w.patch b/linux-next-cherry-picks/0044-net-mlx5_core-Avoid-usage-command-work-entry-after-w.patch
new file mode 100644 (file)
index 0000000..1a19f03
--- /dev/null
@@ -0,0 +1,37 @@
+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
+
diff --git a/linux-next-cherry-picks/0045-mlx5-wrong-page-mask-if-CONFIG_ARCH_DMA_ADDR_T_64BIT.patch b/linux-next-cherry-picks/0045-mlx5-wrong-page-mask-if-CONFIG_ARCH_DMA_ADDR_T_64BIT.patch
new file mode 100644 (file)
index 0000000..a3bdbb6
--- /dev/null
@@ -0,0 +1,81 @@
+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
+