Loading drivers/infiniband/hw/mlx5/main.c +2 −0 Original line number Diff line number Diff line Loading @@ -282,6 +282,8 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, props->sig_guard_cap = IB_GUARD_T10DIF_CRC | IB_GUARD_T10DIF_CSUM; } if (flags & MLX5_DEV_CAP_FLAG_BLOCK_MCAST) props->device_cap_flags |= IB_DEVICE_BLOCK_MULTICAST_LOOPBACK; props->vendor_id = be32_to_cpup((__be32 *)(out_mad->data + 36)) & 0xffffff; Loading drivers/infiniband/hw/mlx5/qp.c +12 −0 Original line number Diff line number Diff line Loading @@ -807,6 +807,15 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, spin_lock_init(&qp->sq.lock); spin_lock_init(&qp->rq.lock); if (init_attr->create_flags & IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK) { if (!(dev->mdev.caps.flags & MLX5_DEV_CAP_FLAG_BLOCK_MCAST)) { mlx5_ib_dbg(dev, "block multicast loopback isn't supported\n"); return -EINVAL; } else { qp->flags |= MLX5_IB_QP_BLOCK_MULTICAST_LOOPBACK; } } if (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) qp->sq_signal_bits = MLX5_WQE_CTRL_CQ_UPDATE; Loading Loading @@ -878,6 +887,9 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, if (qp->wq_sig) in->ctx.flags_pd |= cpu_to_be32(MLX5_QP_ENABLE_SIG); if (qp->flags & MLX5_IB_QP_BLOCK_MULTICAST_LOOPBACK) in->ctx.flags_pd |= cpu_to_be32(MLX5_QP_BLOCK_MCAST); if (qp->scat_cqe && is_connected(init_attr->qp_type)) { int rcqe_sz; int scqe_sz; Loading drivers/infiniband/hw/mthca/mthca_main.c +2 −6 Original line number Diff line number Diff line Loading @@ -858,13 +858,9 @@ static int mthca_enable_msi_x(struct mthca_dev *mdev) entries[1].entry = 1; entries[2].entry = 2; err = pci_enable_msix(mdev->pdev, entries, ARRAY_SIZE(entries)); if (err) { if (err > 0) mthca_info(mdev, "Only %d MSI-X vectors available, " "not using MSI-X\n", err); err = pci_enable_msix_exact(mdev->pdev, entries, ARRAY_SIZE(entries)); if (err) return err; } mdev->eq_table.eq[MTHCA_EQ_COMP ].msi_x_vector = entries[0].vector; mdev->eq_table.eq[MTHCA_EQ_ASYNC].msi_x_vector = entries[1].vector; Loading drivers/infiniband/hw/qib/qib_pcie.c +28 −27 Original line number Diff line number Diff line Loading @@ -197,46 +197,47 @@ static void qib_msix_setup(struct qib_devdata *dd, int pos, u32 *msixcnt, struct qib_msix_entry *qib_msix_entry) { int ret; u32 tabsize = 0; u16 msix_flags; int nvec = *msixcnt; struct msix_entry *msix_entry; int i; ret = pci_msix_vec_count(dd->pcidev); if (ret < 0) goto do_intx; nvec = min(nvec, ret); /* We can't pass qib_msix_entry array to qib_msix_setup * so use a dummy msix_entry array and copy the allocated * irq back to the qib_msix_entry array. */ msix_entry = kmalloc(*msixcnt * sizeof(*msix_entry), GFP_KERNEL); if (!msix_entry) { ret = -ENOMEM; msix_entry = kmalloc(nvec * sizeof(*msix_entry), GFP_KERNEL); if (!msix_entry) goto do_intx; } for (i = 0; i < *msixcnt; i++) for (i = 0; i < nvec; i++) msix_entry[i] = qib_msix_entry[i].msix; pci_read_config_word(dd->pcidev, pos + PCI_MSIX_FLAGS, &msix_flags); tabsize = 1 + (msix_flags & PCI_MSIX_FLAGS_QSIZE); if (tabsize > *msixcnt) tabsize = *msixcnt; ret = pci_enable_msix(dd->pcidev, msix_entry, tabsize); if (ret > 0) { tabsize = ret; ret = pci_enable_msix(dd->pcidev, msix_entry, tabsize); } do_intx: if (ret) { qib_dev_err(dd, "pci_enable_msix %d vectors failed: %d, falling back to INTx\n", tabsize, ret); tabsize = 0; } for (i = 0; i < tabsize; i++) ret = pci_enable_msix_range(dd->pcidev, msix_entry, 1, nvec); if (ret < 0) goto free_msix_entry; else nvec = ret; for (i = 0; i < nvec; i++) qib_msix_entry[i].msix = msix_entry[i]; kfree(msix_entry); *msixcnt = tabsize; *msixcnt = nvec; return; if (ret) qib_enable_intx(dd->pcidev); free_msix_entry: kfree(msix_entry); do_intx: qib_dev_err(dd, "pci_enable_msix_range %d vectors failed: %d, " "falling back to INTx\n", nvec, ret); *msixcnt = 0; qib_enable_intx(dd->pcidev); } /** Loading include/linux/mlx5/device.h +1 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ enum { 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, Loading Loading
drivers/infiniband/hw/mlx5/main.c +2 −0 Original line number Diff line number Diff line Loading @@ -282,6 +282,8 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, props->sig_guard_cap = IB_GUARD_T10DIF_CRC | IB_GUARD_T10DIF_CSUM; } if (flags & MLX5_DEV_CAP_FLAG_BLOCK_MCAST) props->device_cap_flags |= IB_DEVICE_BLOCK_MULTICAST_LOOPBACK; props->vendor_id = be32_to_cpup((__be32 *)(out_mad->data + 36)) & 0xffffff; Loading
drivers/infiniband/hw/mlx5/qp.c +12 −0 Original line number Diff line number Diff line Loading @@ -807,6 +807,15 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, spin_lock_init(&qp->sq.lock); spin_lock_init(&qp->rq.lock); if (init_attr->create_flags & IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK) { if (!(dev->mdev.caps.flags & MLX5_DEV_CAP_FLAG_BLOCK_MCAST)) { mlx5_ib_dbg(dev, "block multicast loopback isn't supported\n"); return -EINVAL; } else { qp->flags |= MLX5_IB_QP_BLOCK_MULTICAST_LOOPBACK; } } if (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) qp->sq_signal_bits = MLX5_WQE_CTRL_CQ_UPDATE; Loading Loading @@ -878,6 +887,9 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, if (qp->wq_sig) in->ctx.flags_pd |= cpu_to_be32(MLX5_QP_ENABLE_SIG); if (qp->flags & MLX5_IB_QP_BLOCK_MULTICAST_LOOPBACK) in->ctx.flags_pd |= cpu_to_be32(MLX5_QP_BLOCK_MCAST); if (qp->scat_cqe && is_connected(init_attr->qp_type)) { int rcqe_sz; int scqe_sz; Loading
drivers/infiniband/hw/mthca/mthca_main.c +2 −6 Original line number Diff line number Diff line Loading @@ -858,13 +858,9 @@ static int mthca_enable_msi_x(struct mthca_dev *mdev) entries[1].entry = 1; entries[2].entry = 2; err = pci_enable_msix(mdev->pdev, entries, ARRAY_SIZE(entries)); if (err) { if (err > 0) mthca_info(mdev, "Only %d MSI-X vectors available, " "not using MSI-X\n", err); err = pci_enable_msix_exact(mdev->pdev, entries, ARRAY_SIZE(entries)); if (err) return err; } mdev->eq_table.eq[MTHCA_EQ_COMP ].msi_x_vector = entries[0].vector; mdev->eq_table.eq[MTHCA_EQ_ASYNC].msi_x_vector = entries[1].vector; Loading
drivers/infiniband/hw/qib/qib_pcie.c +28 −27 Original line number Diff line number Diff line Loading @@ -197,46 +197,47 @@ static void qib_msix_setup(struct qib_devdata *dd, int pos, u32 *msixcnt, struct qib_msix_entry *qib_msix_entry) { int ret; u32 tabsize = 0; u16 msix_flags; int nvec = *msixcnt; struct msix_entry *msix_entry; int i; ret = pci_msix_vec_count(dd->pcidev); if (ret < 0) goto do_intx; nvec = min(nvec, ret); /* We can't pass qib_msix_entry array to qib_msix_setup * so use a dummy msix_entry array and copy the allocated * irq back to the qib_msix_entry array. */ msix_entry = kmalloc(*msixcnt * sizeof(*msix_entry), GFP_KERNEL); if (!msix_entry) { ret = -ENOMEM; msix_entry = kmalloc(nvec * sizeof(*msix_entry), GFP_KERNEL); if (!msix_entry) goto do_intx; } for (i = 0; i < *msixcnt; i++) for (i = 0; i < nvec; i++) msix_entry[i] = qib_msix_entry[i].msix; pci_read_config_word(dd->pcidev, pos + PCI_MSIX_FLAGS, &msix_flags); tabsize = 1 + (msix_flags & PCI_MSIX_FLAGS_QSIZE); if (tabsize > *msixcnt) tabsize = *msixcnt; ret = pci_enable_msix(dd->pcidev, msix_entry, tabsize); if (ret > 0) { tabsize = ret; ret = pci_enable_msix(dd->pcidev, msix_entry, tabsize); } do_intx: if (ret) { qib_dev_err(dd, "pci_enable_msix %d vectors failed: %d, falling back to INTx\n", tabsize, ret); tabsize = 0; } for (i = 0; i < tabsize; i++) ret = pci_enable_msix_range(dd->pcidev, msix_entry, 1, nvec); if (ret < 0) goto free_msix_entry; else nvec = ret; for (i = 0; i < nvec; i++) qib_msix_entry[i].msix = msix_entry[i]; kfree(msix_entry); *msixcnt = tabsize; *msixcnt = nvec; return; if (ret) qib_enable_intx(dd->pcidev); free_msix_entry: kfree(msix_entry); do_intx: qib_dev_err(dd, "pci_enable_msix_range %d vectors failed: %d, " "falling back to INTx\n", nvec, ret); *msixcnt = 0; qib_enable_intx(dd->pcidev); } /** Loading
include/linux/mlx5/device.h +1 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ enum { 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, Loading