Merge tag 'acpi-5.15-rc1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / drivers / infiniband / hw / mlx5 / main.c
index 466f0a5..8664bcf 100644 (file)
@@ -1184,6 +1184,16 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
                                MLX5_IB_TUNNELED_OFFLOADS_MPLS_UDP;
        }
 
+       if (offsetofend(typeof(resp), dci_streams_caps) <= uhw_outlen) {
+               resp.response_length += sizeof(resp.dci_streams_caps);
+
+               resp.dci_streams_caps.max_log_num_concurent =
+                       MLX5_CAP_GEN(mdev, log_max_dci_stream_channels);
+
+               resp.dci_streams_caps.max_log_num_errored =
+                       MLX5_CAP_GEN(mdev, log_max_dci_errored_streams);
+       }
+
        if (uhw_outlen) {
                err = ib_copy_to_udata(uhw, &resp, resp.response_length);
 
@@ -2501,6 +2511,13 @@ static void pkey_change_handler(struct work_struct *work)
                container_of(work, struct mlx5_ib_port_resources,
                             pkey_change_work);
 
+       if (!ports->gsi)
+               /*
+                * We got this event before device was fully configured
+                * and MAD registration code wasn't called/finished yet.
+                */
+               return;
+
        mlx5_ib_gsi_pkey_change(ports->gsi);
 }
 
@@ -2795,33 +2812,16 @@ static int mlx5_ib_dev_res_init(struct mlx5_ib_dev *dev)
        if (!MLX5_CAP_GEN(dev->mdev, xrc))
                return -EOPNOTSUPP;
 
-       mutex_init(&devr->mutex);
-
-       devr->p0 = rdma_zalloc_drv_obj(ibdev, ib_pd);
-       if (!devr->p0)
-               return -ENOMEM;
-
-       devr->p0->device  = ibdev;
-       devr->p0->uobject = NULL;
-       atomic_set(&devr->p0->usecnt, 0);
-
-       ret = mlx5_ib_alloc_pd(devr->p0, NULL);
-       if (ret)
-               goto error0;
+       devr->p0 = ib_alloc_pd(ibdev, 0);
+       if (IS_ERR(devr->p0))
+               return PTR_ERR(devr->p0);
 
-       devr->c0 = rdma_zalloc_drv_obj(ibdev, ib_cq);
-       if (!devr->c0) {
-               ret = -ENOMEM;
+       devr->c0 = ib_create_cq(ibdev, NULL, NULL, NULL, &cq_attr);
+       if (IS_ERR(devr->c0)) {
+               ret = PTR_ERR(devr->c0);
                goto error1;
        }
 
-       devr->c0->device = &dev->ib_dev;
-       atomic_set(&devr->c0->usecnt, 0);
-
-       ret = mlx5_ib_create_cq(devr->c0, &cq_attr, NULL);
-       if (ret)
-               goto err_create_cq;
-
        ret = mlx5_cmd_xrcd_alloc(dev->mdev, &devr->xrcdn0, 0);
        if (ret)
                goto error2;
@@ -2836,45 +2836,22 @@ static int mlx5_ib_dev_res_init(struct mlx5_ib_dev *dev)
        attr.srq_type = IB_SRQT_XRC;
        attr.ext.cq = devr->c0;
 
-       devr->s0 = rdma_zalloc_drv_obj(ibdev, ib_srq);
-       if (!devr->s0) {
-               ret = -ENOMEM;
-               goto error4;
-       }
-
-       devr->s0->device        = &dev->ib_dev;
-       devr->s0->pd            = devr->p0;
-       devr->s0->srq_type      = IB_SRQT_XRC;
-       devr->s0->ext.cq        = devr->c0;
-       ret = mlx5_ib_create_srq(devr->s0, &attr, NULL);
-       if (ret)
+       devr->s0 = ib_create_srq(devr->p0, &attr);
+       if (IS_ERR(devr->s0)) {
+               ret = PTR_ERR(devr->s0);
                goto err_create;
-
-       atomic_inc(&devr->s0->ext.cq->usecnt);
-       atomic_inc(&devr->p0->usecnt);
-       atomic_set(&devr->s0->usecnt, 0);
+       }
 
        memset(&attr, 0, sizeof(attr));
        attr.attr.max_sge = 1;
        attr.attr.max_wr = 1;
        attr.srq_type = IB_SRQT_BASIC;
-       devr->s1 = rdma_zalloc_drv_obj(ibdev, ib_srq);
-       if (!devr->s1) {
-               ret = -ENOMEM;
-               goto error5;
-       }
-
-       devr->s1->device        = &dev->ib_dev;
-       devr->s1->pd            = devr->p0;
-       devr->s1->srq_type      = IB_SRQT_BASIC;
-       devr->s1->ext.cq        = devr->c0;
 
-       ret = mlx5_ib_create_srq(devr->s1, &attr, NULL);
-       if (ret)
+       devr->s1 = ib_create_srq(devr->p0, &attr);
+       if (IS_ERR(devr->s1)) {
+               ret = PTR_ERR(devr->s1);
                goto error6;
-
-       atomic_inc(&devr->p0->usecnt);
-       atomic_set(&devr->s1->usecnt, 0);
+       }
 
        for (port = 0; port < ARRAY_SIZE(devr->ports); ++port)
                INIT_WORK(&devr->ports[port].pkey_change_work,
@@ -2883,23 +2860,15 @@ static int mlx5_ib_dev_res_init(struct mlx5_ib_dev *dev)
        return 0;
 
 error6:
-       kfree(devr->s1);
-error5:
-       mlx5_ib_destroy_srq(devr->s0, NULL);
+       ib_destroy_srq(devr->s0);
 err_create:
-       kfree(devr->s0);
-error4:
        mlx5_cmd_xrcd_dealloc(dev->mdev, devr->xrcdn1, 0);
 error3:
        mlx5_cmd_xrcd_dealloc(dev->mdev, devr->xrcdn0, 0);
 error2:
-       mlx5_ib_destroy_cq(devr->c0, NULL);
-err_create_cq:
-       kfree(devr->c0);
+       ib_destroy_cq(devr->c0);
 error1:
-       mlx5_ib_dealloc_pd(devr->p0, NULL);
-error0:
-       kfree(devr->p0);
+       ib_dealloc_pd(devr->p0);
        return ret;
 }
 
@@ -2908,20 +2877,21 @@ static void mlx5_ib_dev_res_cleanup(struct mlx5_ib_dev *dev)
        struct mlx5_ib_resources *devr = &dev->devr;
        int port;
 
-       mlx5_ib_destroy_srq(devr->s1, NULL);
-       kfree(devr->s1);
-       mlx5_ib_destroy_srq(devr->s0, NULL);
-       kfree(devr->s0);
-       mlx5_cmd_xrcd_dealloc(dev->mdev, devr->xrcdn1, 0);
-       mlx5_cmd_xrcd_dealloc(dev->mdev, devr->xrcdn0, 0);
-       mlx5_ib_destroy_cq(devr->c0, NULL);
-       kfree(devr->c0);
-       mlx5_ib_dealloc_pd(devr->p0, NULL);
-       kfree(devr->p0);
-
-       /* Make sure no change P_Key work items are still executing */
+       /*
+        * Make sure no change P_Key work items are still executing.
+        *
+        * At this stage, the mlx5_ib_event should be unregistered
+        * and it ensures that no new works are added.
+        */
        for (port = 0; port < ARRAY_SIZE(devr->ports); ++port)
                cancel_work_sync(&devr->ports[port].pkey_change_work);
+
+       ib_destroy_srq(devr->s1);
+       ib_destroy_srq(devr->s0);
+       mlx5_cmd_xrcd_dealloc(dev->mdev, devr->xrcdn1, 0);
+       mlx5_cmd_xrcd_dealloc(dev->mdev, devr->xrcdn0, 0);
+       ib_destroy_cq(devr->c0);
+       ib_dealloc_pd(devr->p0);
 }
 
 static u32 get_core_cap_flags(struct ib_device *ibdev,
@@ -3799,6 +3769,7 @@ static const struct ib_device_ops mlx5_ib_dev_ops = {
        INIT_RDMA_OBJ_SIZE(ib_counters, mlx5_ib_mcounters, ibcntrs),
        INIT_RDMA_OBJ_SIZE(ib_cq, mlx5_ib_cq, ibcq),
        INIT_RDMA_OBJ_SIZE(ib_pd, mlx5_ib_pd, ibpd),
+       INIT_RDMA_OBJ_SIZE(ib_qp, mlx5_ib_qp, ibqp),
        INIT_RDMA_OBJ_SIZE(ib_srq, mlx5_ib_srq, ibsrq),
        INIT_RDMA_OBJ_SIZE(ib_ucontext, mlx5_ib_ucontext, ibucontext),
 };
@@ -4061,7 +4032,7 @@ static void mlx5_ib_stage_pre_ib_reg_umr_cleanup(struct mlx5_ib_dev *dev)
                mlx5_ib_warn(dev, "mr cache cleanup failed\n");
 
        if (dev->umrc.qp)
-               mlx5_ib_destroy_qp(dev->umrc.qp, NULL);
+               ib_destroy_qp(dev->umrc.qp);
        if (dev->umrc.cq)
                ib_free_cq(dev->umrc.cq);
        if (dev->umrc.pd)
@@ -4114,23 +4085,17 @@ static int mlx5_ib_stage_post_ib_reg_umr_init(struct mlx5_ib_dev *dev)
        init_attr->cap.max_send_sge = 1;
        init_attr->qp_type = MLX5_IB_QPT_REG_UMR;
        init_attr->port_num = 1;
-       qp = mlx5_ib_create_qp(pd, init_attr, NULL);
+       qp = ib_create_qp(pd, init_attr);
        if (IS_ERR(qp)) {
                mlx5_ib_dbg(dev, "Couldn't create sync UMR QP\n");
                ret = PTR_ERR(qp);
                goto error_3;
        }
-       qp->device     = &dev->ib_dev;
-       qp->real_qp    = qp;
-       qp->uobject    = NULL;
-       qp->qp_type    = MLX5_IB_QPT_REG_UMR;
-       qp->send_cq    = init_attr->send_cq;
-       qp->recv_cq    = init_attr->recv_cq;
 
        attr->qp_state = IB_QPS_INIT;
        attr->port_num = 1;
-       ret = mlx5_ib_modify_qp(qp, attr, IB_QP_STATE | IB_QP_PKEY_INDEX |
-                               IB_QP_PORT, NULL);
+       ret = ib_modify_qp(qp, attr,
+                          IB_QP_STATE | IB_QP_PKEY_INDEX | IB_QP_PORT);
        if (ret) {
                mlx5_ib_dbg(dev, "Couldn't modify UMR QP\n");
                goto error_4;
@@ -4140,7 +4105,7 @@ static int mlx5_ib_stage_post_ib_reg_umr_init(struct mlx5_ib_dev *dev)
        attr->qp_state = IB_QPS_RTR;
        attr->path_mtu = IB_MTU_256;
 
-       ret = mlx5_ib_modify_qp(qp, attr, IB_QP_STATE, NULL);
+       ret = ib_modify_qp(qp, attr, IB_QP_STATE);
        if (ret) {
                mlx5_ib_dbg(dev, "Couldn't modify umr QP to rtr\n");
                goto error_4;
@@ -4148,7 +4113,7 @@ static int mlx5_ib_stage_post_ib_reg_umr_init(struct mlx5_ib_dev *dev)
 
        memset(attr, 0, sizeof(*attr));
        attr->qp_state = IB_QPS_RTS;
-       ret = mlx5_ib_modify_qp(qp, attr, IB_QP_STATE, NULL);
+       ret = ib_modify_qp(qp, attr, IB_QP_STATE);
        if (ret) {
                mlx5_ib_dbg(dev, "Couldn't modify umr QP to rts\n");
                goto error_4;
@@ -4171,7 +4136,7 @@ static int mlx5_ib_stage_post_ib_reg_umr_init(struct mlx5_ib_dev *dev)
        return 0;
 
 error_4:
-       mlx5_ib_destroy_qp(qp, NULL);
+       ib_destroy_qp(qp);
        dev->umrc.qp = NULL;
 
 error_3: