Merge branch 'mlx5-next'
authorDavid S. Miller <davem@davemloft.net>
Tue, 9 Dec 2014 01:46:01 +0000 (20:46 -0500)
committerDavid S. Miller <davem@davemloft.net>
Tue, 9 Dec 2014 01:46:01 +0000 (20:46 -0500)
Eli Cohen says:

====================
mlx5 driver updates

The following series contains some fixes to mlx5 as well as update to the list
of supported devices.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/infiniband/hw/mlx5/mr.c
drivers/infiniband/hw/mlx5/qp.c
drivers/net/ethernet/mellanox/mlx5/core/cmd.c
drivers/net/ethernet/mellanox/mlx5/core/eq.c
drivers/net/ethernet/mellanox/mlx5/core/main.c
drivers/net/ethernet/mellanox/mlx5/core/uar.c
include/linux/mlx5/device.h

index 4c89b64..5a80dd9 100644 (file)
@@ -159,6 +159,9 @@ static int add_keys(struct mlx5_ib_dev *dev, int c, int num)
                                            sizeof(*in), reg_mr_callback,
                                            mr, &mr->out);
                if (err) {
+                       spin_lock_irq(&ent->lock);
+                       ent->pending--;
+                       spin_unlock_irq(&ent->lock);
                        mlx5_ib_warn(dev, "create mkey failed %d\n", err);
                        kfree(mr);
                        break;
index 0e2ef9f..1cae1c7 100644 (file)
@@ -1011,9 +1011,14 @@ static void mlx5_ib_lock_cqs(struct mlx5_ib_cq *send_cq, struct mlx5_ib_cq *recv
                        }
                } else {
                        spin_lock_irq(&send_cq->lock);
+                       __acquire(&recv_cq->lock);
                }
        } else if (recv_cq) {
                spin_lock_irq(&recv_cq->lock);
+               __acquire(&send_cq->lock);
+       } else {
+               __acquire(&send_cq->lock);
+               __acquire(&recv_cq->lock);
        }
 }
 
@@ -1033,10 +1038,15 @@ static void mlx5_ib_unlock_cqs(struct mlx5_ib_cq *send_cq, struct mlx5_ib_cq *re
                                spin_unlock_irq(&recv_cq->lock);
                        }
                } else {
+                       __release(&recv_cq->lock);
                        spin_unlock_irq(&send_cq->lock);
                }
        } else if (recv_cq) {
+               __release(&send_cq->lock);
                spin_unlock_irq(&recv_cq->lock);
+       } else {
+               __release(&recv_cq->lock);
+               __release(&send_cq->lock);
        }
 }
 
@@ -2411,7 +2421,7 @@ static u8 get_fence(u8 fence, struct ib_send_wr *wr)
 
 static int begin_wqe(struct mlx5_ib_qp *qp, void **seg,
                     struct mlx5_wqe_ctrl_seg **ctrl,
-                    struct ib_send_wr *wr, int *idx,
+                    struct ib_send_wr *wr, unsigned *idx,
                     int *size, int nreq)
 {
        int err = 0;
@@ -2737,6 +2747,8 @@ out:
 
                if (bf->need_lock)
                        spin_lock(&bf->lock);
+               else
+                       __acquire(&bf->lock);
 
                /* TBD enable WC */
                if (0 && nreq == 1 && bf->uuarn && inl && size > 1 && size <= bf->buf_size / 16) {
@@ -2753,6 +2765,8 @@ out:
                bf->offset ^= bf->buf_size;
                if (bf->need_lock)
                        spin_unlock(&bf->lock);
+               else
+                       __release(&bf->lock);
        }
 
        spin_unlock_irqrestore(&qp->sq.lock, flags);
index 368c6c5..a285305 100644 (file)
@@ -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;
index dfd3ad0..ab68446 100644 (file)
@@ -225,8 +225,8 @@ static int mlx5_eq_int(struct mlx5_core_dev *dev, struct mlx5_eq *eq)
                case MLX5_EVENT_TYPE_WQ_INVAL_REQ_ERROR:
                case MLX5_EVENT_TYPE_WQ_ACCESS_ERROR:
                        rsn = be32_to_cpu(eqe->data.qp_srq.qp_srq_n) & 0xffffff;
-                       mlx5_core_dbg(dev, "event %s(%d) arrived\n",
-                                     eqe_type_str(eqe->type), eqe->type);
+                       mlx5_core_dbg(dev, "event %s(%d) arrived on resource 0x%x\n",
+                                     eqe_type_str(eqe->type), eqe->type, rsn);
                        mlx5_rsc_event(dev, rsn, eqe->type);
                        break;
 
index 71b10b2..3f45256 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/mlx5/qp.h>
 #include <linux/mlx5/srq.h>
 #include <linux/debugfs.h>
+#include <linux/kmod.h>
 #include <linux/mlx5/mlx5_ifc.h>
 #include "mlx5_core.h"
 
@@ -225,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;
 
@@ -840,6 +841,8 @@ struct mlx5_core_event_handler {
                      void *data);
 };
 
+#define MLX5_IB_MOD "mlx5_ib"
+
 static int init_one(struct pci_dev *pdev,
                    const struct pci_device_id *id)
 {
@@ -878,6 +881,10 @@ static int init_one(struct pci_dev *pdev,
                goto out_init;
        }
 
+       err = request_module_nowait(MLX5_IB_MOD);
+       if (err)
+               pr_info("failed request module on %s\n", MLX5_IB_MOD);
+
        return 0;
 
 out_init:
@@ -896,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, }
 };
 
index 0a6348c..06801d6 100644 (file)
@@ -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));
index 1d67fd3..ea4f1c4 100644 (file)
@@ -219,23 +219,15 @@ enum {
 };
 
 enum {
-       MLX5_DEV_CAP_FLAG_RC            = 1LL <<  0,
-       MLX5_DEV_CAP_FLAG_UC            = 1LL <<  1,
-       MLX5_DEV_CAP_FLAG_UD            = 1LL <<  2,
        MLX5_DEV_CAP_FLAG_XRC           = 1LL <<  3,
-       MLX5_DEV_CAP_FLAG_SRQ           = 1LL <<  6,
        MLX5_DEV_CAP_FLAG_BAD_PKEY_CNTR = 1LL <<  8,
        MLX5_DEV_CAP_FLAG_BAD_QKEY_CNTR = 1LL <<  9,
        MLX5_DEV_CAP_FLAG_APM           = 1LL << 17,
        MLX5_DEV_CAP_FLAG_ATOMIC        = 1LL << 18,
        MLX5_DEV_CAP_FLAG_BLOCK_MCAST   = 1LL << 23,
-       MLX5_DEV_CAP_FLAG_ON_DMND_PG    = 1LL << 24,
        MLX5_DEV_CAP_FLAG_CQ_MODER      = 1LL << 29,
        MLX5_DEV_CAP_FLAG_RESIZE_CQ     = 1LL << 30,
-       MLX5_DEV_CAP_FLAG_RESIZE_SRQ    = 1LL << 32,
        MLX5_DEV_CAP_FLAG_DCT           = 1LL << 37,
-       MLX5_DEV_CAP_FLAG_REMOTE_FENCE  = 1LL << 38,
-       MLX5_DEV_CAP_FLAG_TLP_HINTS     = 1LL << 39,
        MLX5_DEV_CAP_FLAG_SIG_HAND_OVER = 1LL << 40,
        MLX5_DEV_CAP_FLAG_CMDIF_CSUM    = 3LL << 46,
 };