attr->port_num = 1;
        attr->qp_access_flags = IB_ACCESS_REMOTE_WRITE;
        ret = hr_dev->hw->modify_qp(&hr_qp->ibqp, attr, mask, IB_QPS_INIT,
-                                   IB_QPS_INIT);
+                                   IB_QPS_INIT, NULL);
        if (ret) {
                ibdev_err(ibdev, "failed to modify qp to init, ret = %d.\n",
                          ret);
        rdma_ah_set_sl(&attr->ah_attr, (u8)sl_num);
 
        ret = hr_dev->hw->modify_qp(&hr_qp->ibqp, attr, mask, IB_QPS_INIT,
-                                   IB_QPS_RTR);
+                                   IB_QPS_RTR, NULL);
        hr_dev->loop_idc = loopback;
        if (ret) {
                ibdev_err(ibdev, "failed to modify qp to rtr, ret = %d.\n",
        attr->retry_cnt = HNS_ROCE_FREE_MR_USED_QP_RETRY_CNT;
        attr->timeout = HNS_ROCE_FREE_MR_USED_QP_TIMEOUT;
        ret = hr_dev->hw->modify_qp(&hr_qp->ibqp, attr, mask, IB_QPS_RTR,
-                                   IB_QPS_RTS);
+                                   IB_QPS_RTS, NULL);
        if (ret)
                ibdev_err(ibdev, "failed to modify qp to rts, ret = %d.\n",
                          ret);
 static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
                                 const struct ib_qp_attr *attr, int attr_mask,
                                 struct hns_roce_v2_qp_context *context,
-                                struct hns_roce_v2_qp_context *qpc_mask)
+                                struct hns_roce_v2_qp_context *qpc_mask,
+                                struct ib_udata *udata)
 {
+       struct hns_roce_ucontext *uctx = rdma_udata_to_drv_context(udata,
+                                         struct hns_roce_ucontext, ibucontext);
        struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
        struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
        struct ib_device *ibdev = &hr_dev->ib_dev;
        hr_reg_write(context, QPC_LP_SGEN_INI, 3);
        hr_reg_clear(qpc_mask, QPC_LP_SGEN_INI);
 
+       if (udata && ibqp->qp_type == IB_QPT_RC &&
+           (uctx->config & HNS_ROCE_RQ_INLINE_FLAGS)) {
+               hr_reg_write_bool(context, QPC_RQIE,
+                                 hr_dev->caps.flags &
+                                 HNS_ROCE_CAP_FLAG_RQ_INLINE);
+               hr_reg_clear(qpc_mask, QPC_RQIE);
+       }
+
        return 0;
 }
 
                                      enum ib_qp_state cur_state,
                                      enum ib_qp_state new_state,
                                      struct hns_roce_v2_qp_context *context,
-                                     struct hns_roce_v2_qp_context *qpc_mask)
+                                     struct hns_roce_v2_qp_context *qpc_mask,
+                                     struct ib_udata *udata)
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
        int ret = 0;
                modify_qp_init_to_init(ibqp, attr, context, qpc_mask);
        } else if (cur_state == IB_QPS_INIT && new_state == IB_QPS_RTR) {
                ret = modify_qp_init_to_rtr(ibqp, attr, attr_mask, context,
-                                           qpc_mask);
+                                           qpc_mask, udata);
        } else if (cur_state == IB_QPS_RTR && new_state == IB_QPS_RTS) {
                ret = modify_qp_rtr_to_rts(ibqp, attr, attr_mask, context,
                                           qpc_mask);
 static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
                                 const struct ib_qp_attr *attr,
                                 int attr_mask, enum ib_qp_state cur_state,
-                                enum ib_qp_state new_state)
+                                enum ib_qp_state new_state, struct ib_udata *udata)
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
        struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
        memset(qpc_mask, 0xff, hr_dev->caps.qpc_sz);
 
        ret = hns_roce_v2_set_abs_fields(ibqp, attr, attr_mask, cur_state,
-                                        new_state, context, qpc_mask);
+                                        new_state, context, qpc_mask, udata);
        if (ret)
                goto out;
 
        if (modify_qp_is_ok(hr_qp)) {
                /* Modify qp to reset before destroying qp */
                ret = hns_roce_v2_modify_qp(&hr_qp->ibqp, NULL, 0,
-                                           hr_qp->state, IB_QPS_RESET);
+                                           hr_qp->state, IB_QPS_RESET, udata);
                if (ret)
                        ibdev_err(ibdev,
                                  "failed to modify QP to RST, ret = %d.\n",