#define CMD_POLL_TOKEN 0xffff
 #define CMD_MAX_NUM 32
 
-static int hns_roce_cmd_mbox_post_hw(struct hns_roce_dev *hr_dev, u64 in_param,
-                                    u64 out_param, u32 in_modifier, u8 op,
-                                    u16 token, int event)
+static int hns_roce_cmd_mbox_post_hw(struct hns_roce_dev *hr_dev,
+                                    struct hns_roce_mbox_msg *mbox_msg)
 {
-       return hr_dev->hw->post_mbox(hr_dev, in_param, out_param, in_modifier,
-                                    op, token, event);
+       return hr_dev->hw->post_mbox(hr_dev, mbox_msg);
 }
 
 /* this should be called with "poll_sem" */
-static int __hns_roce_cmd_mbox_poll(struct hns_roce_dev *hr_dev, u64 in_param,
-                                   u64 out_param, unsigned long in_modifier,
-                                   u8 op)
+static int __hns_roce_cmd_mbox_poll(struct hns_roce_dev *hr_dev,
+                                   struct hns_roce_mbox_msg *mbox_msg)
 {
        int ret;
 
-       ret = hns_roce_cmd_mbox_post_hw(hr_dev, in_param, out_param,
-                                       in_modifier, op, CMD_POLL_TOKEN, 0);
+       ret = hns_roce_cmd_mbox_post_hw(hr_dev, mbox_msg);
        if (ret) {
                dev_err_ratelimited(hr_dev->dev,
                                    "failed to post mailbox 0x%x in poll mode, ret = %d.\n",
-                                   op, ret);
+                                   mbox_msg->cmd, ret);
                return ret;
        }
 
        return hr_dev->hw->poll_mbox_done(hr_dev);
 }
 
-static int hns_roce_cmd_mbox_poll(struct hns_roce_dev *hr_dev, u64 in_param,
-                                 u64 out_param, unsigned long in_modifier,
-                                 u8 op)
+static int hns_roce_cmd_mbox_poll(struct hns_roce_dev *hr_dev,
+                                 struct hns_roce_mbox_msg *mbox_msg)
 {
        int ret;
 
        down(&hr_dev->cmd.poll_sem);
-       ret = __hns_roce_cmd_mbox_poll(hr_dev, in_param, out_param, in_modifier,
-                                      op);
+       ret = __hns_roce_cmd_mbox_poll(hr_dev, mbox_msg);
        up(&hr_dev->cmd.poll_sem);
 
        return ret;
        complete(&context->done);
 }
 
-static int __hns_roce_cmd_mbox_wait(struct hns_roce_dev *hr_dev, u64 in_param,
-                                   u64 out_param, unsigned long in_modifier,
-                                   u8 op)
+static int __hns_roce_cmd_mbox_wait(struct hns_roce_dev *hr_dev,
+                                   struct hns_roce_mbox_msg *mbox_msg)
 {
        struct hns_roce_cmdq *cmd = &hr_dev->cmd;
        struct hns_roce_cmd_context *context;
 
        reinit_completion(&context->done);
 
-       ret = hns_roce_cmd_mbox_post_hw(hr_dev, in_param, out_param,
-                                       in_modifier, op, context->token, 1);
+       mbox_msg->token = context->token;
+       ret = hns_roce_cmd_mbox_post_hw(hr_dev, mbox_msg);
        if (ret) {
                dev_err_ratelimited(dev,
                                    "failed to post mailbox 0x%x in event mode, ret = %d.\n",
-                                   op, ret);
+                                   mbox_msg->cmd, ret);
                goto out;
        }
 
        if (!wait_for_completion_timeout(&context->done,
                                msecs_to_jiffies(HNS_ROCE_CMD_TIMEOUT_MSECS))) {
                dev_err_ratelimited(dev, "[cmd] token 0x%x mailbox 0x%x timeout.\n",
-                                   context->token, op);
+                                   context->token, mbox_msg->cmd);
                ret = -EBUSY;
                goto out;
        }
        ret = context->result;
        if (ret)
                dev_err_ratelimited(dev, "[cmd] token 0x%x mailbox 0x%x error %d.\n",
-                                   context->token, op, ret);
+                                   context->token, mbox_msg->cmd, ret);
 
 out:
        context->busy = 0;
        return ret;
 }
 
-static int hns_roce_cmd_mbox_wait(struct hns_roce_dev *hr_dev, u64 in_param,
-                                 u64 out_param, unsigned long in_modifier,
-                                 u8 op)
+static int hns_roce_cmd_mbox_wait(struct hns_roce_dev *hr_dev,
+                                 struct hns_roce_mbox_msg *mbox_msg)
 {
        int ret;
 
        down(&hr_dev->cmd.event_sem);
-       ret = __hns_roce_cmd_mbox_wait(hr_dev, in_param, out_param, in_modifier,
-                                      op);
+       ret = __hns_roce_cmd_mbox_wait(hr_dev, mbox_msg);
        up(&hr_dev->cmd.event_sem);
 
        return ret;
 }
 
 int hns_roce_cmd_mbox(struct hns_roce_dev *hr_dev, u64 in_param, u64 out_param,
-                     unsigned long in_modifier, u8 op)
+                     u8 cmd, unsigned long tag)
 {
+       struct hns_roce_mbox_msg mbox_msg = {};
        bool is_busy;
 
        if (hr_dev->hw->chk_mbox_avail)
                if (!hr_dev->hw->chk_mbox_avail(hr_dev, &is_busy))
                        return is_busy ? -EBUSY : 0;
 
-       if (hr_dev->cmd.use_events)
-               return hns_roce_cmd_mbox_wait(hr_dev, in_param, out_param,
-                                             in_modifier, op);
-       else
-               return hns_roce_cmd_mbox_poll(hr_dev, in_param, out_param,
-                                             in_modifier, op);
+       mbox_msg.in_param = in_param;
+       mbox_msg.out_param = out_param;
+       mbox_msg.cmd = cmd;
+       mbox_msg.tag = tag;
+
+       if (hr_dev->cmd.use_events) {
+               mbox_msg.event_en = 1;
+
+               return hns_roce_cmd_mbox_wait(hr_dev, &mbox_msg);
+       } else {
+               mbox_msg.event_en = 0;
+               mbox_msg.token = CMD_POLL_TOKEN;
+
+               return hns_roce_cmd_mbox_poll(hr_dev, &mbox_msg);
+       }
 }
 
 int hns_roce_cmd_init(struct hns_roce_dev *hr_dev)
 
        return ret;
 }
 
-static int config_hem_ba_to_hw(struct hns_roce_dev *hr_dev, unsigned long obj,
-                              dma_addr_t base_addr, u8 op)
+static int config_hem_ba_to_hw(struct hns_roce_dev *hr_dev,
+                              dma_addr_t base_addr, u8 cmd, unsigned long tag)
 {
-       struct hns_roce_cmd_mailbox *mbox = hns_roce_alloc_cmd_mailbox(hr_dev);
+       struct hns_roce_cmd_mailbox *mbox;
        int ret;
 
+       mbox = hns_roce_alloc_cmd_mailbox(hr_dev);
        if (IS_ERR(mbox))
                return PTR_ERR(mbox);
 
-       ret = hns_roce_cmd_mbox(hr_dev, base_addr, mbox->dma, obj, op);
+       ret = hns_roce_cmd_mbox(hr_dev, base_addr, mbox->dma, cmd, tag);
        hns_roce_free_cmd_mailbox(hr_dev, mbox);
        return ret;
 }
                free_dip_list(hr_dev);
 }
 
-static int hns_roce_mbox_post(struct hns_roce_dev *hr_dev, u64 in_param,
-                             u64 out_param, u32 in_modifier,
-                             u8 op, u16 token, int event)
+static int hns_roce_mbox_post(struct hns_roce_dev *hr_dev,
+                             struct hns_roce_mbox_msg *mbox_msg)
 {
        struct hns_roce_cmq_desc desc;
        struct hns_roce_post_mbox *mb = (struct hns_roce_post_mbox *)desc.data;
 
        hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_POST_MB, false);
 
-       mb->in_param_l = cpu_to_le32(in_param);
-       mb->in_param_h = cpu_to_le32(in_param >> 32);
-       mb->out_param_l = cpu_to_le32(out_param);
-       mb->out_param_h = cpu_to_le32(out_param >> 32);
-       mb->cmd_tag = cpu_to_le32(in_modifier << 8 | op);
-       mb->token_event_en = cpu_to_le32(event << 16 | token);
+       mb->in_param_l = cpu_to_le32(mbox_msg->in_param);
+       mb->in_param_h = cpu_to_le32(mbox_msg->in_param >> 32);
+       mb->out_param_l = cpu_to_le32(mbox_msg->out_param);
+       mb->out_param_h = cpu_to_le32(mbox_msg->out_param >> 32);
+       mb->cmd_tag = cpu_to_le32(mbox_msg->tag << 8 | mbox_msg->cmd);
+       mb->token_event_en = cpu_to_le32(mbox_msg->event_en << 16 |
+                                        mbox_msg->token);
 
        return hns_roce_cmq_send(hr_dev, &desc, 1);
 }
        return ret;
 }
 
-static int v2_post_mbox(struct hns_roce_dev *hr_dev, u64 in_param,
-                       u64 out_param, u32 in_modifier,
-                       u8 op, u16 token, int event)
+static int v2_post_mbox(struct hns_roce_dev *hr_dev,
+                       struct hns_roce_mbox_msg *mbox_msg)
 {
        u8 status = 0;
        int ret;
        }
 
        /* Post new message to mbox */
-       ret = hns_roce_mbox_post(hr_dev, in_param, out_param, in_modifier,
-                                op, token, event);
+       ret = hns_roce_mbox_post(hr_dev, mbox_msg);
        if (ret)
                dev_err_ratelimited(hr_dev->dev,
                                    "failed to post mailbox, ret = %d.\n", ret);
 }
 
 static int get_op_for_set_hem(struct hns_roce_dev *hr_dev, u32 type,
-                             u32 step_idx, u8 *mbox_op)
+                             u32 step_idx, u8 *mbox_cmd)
 {
-       u8 op;
+       u8 cmd;
 
        switch (type) {
        case HEM_TYPE_QPC:
-               op = HNS_ROCE_CMD_WRITE_QPC_BT0;
+               cmd = HNS_ROCE_CMD_WRITE_QPC_BT0;
                break;
        case HEM_TYPE_MTPT:
-               op = HNS_ROCE_CMD_WRITE_MPT_BT0;
+               cmd = HNS_ROCE_CMD_WRITE_MPT_BT0;
                break;
        case HEM_TYPE_CQC:
-               op = HNS_ROCE_CMD_WRITE_CQC_BT0;
+               cmd = HNS_ROCE_CMD_WRITE_CQC_BT0;
                break;
        case HEM_TYPE_SRQC:
-               op = HNS_ROCE_CMD_WRITE_SRQC_BT0;
+               cmd = HNS_ROCE_CMD_WRITE_SRQC_BT0;
                break;
        case HEM_TYPE_SCCC:
-               op = HNS_ROCE_CMD_WRITE_SCCC_BT0;
+               cmd = HNS_ROCE_CMD_WRITE_SCCC_BT0;
                break;
        case HEM_TYPE_QPC_TIMER:
-               op = HNS_ROCE_CMD_WRITE_QPC_TIMER_BT0;
+               cmd = HNS_ROCE_CMD_WRITE_QPC_TIMER_BT0;
                break;
        case HEM_TYPE_CQC_TIMER:
-               op = HNS_ROCE_CMD_WRITE_CQC_TIMER_BT0;
+               cmd = HNS_ROCE_CMD_WRITE_CQC_TIMER_BT0;
                break;
        default:
                dev_warn(hr_dev->dev, "failed to check hem type %u.\n", type);
                return -EINVAL;
        }
 
-       *mbox_op = op + step_idx;
+       *mbox_cmd = cmd + step_idx;
 
        return 0;
 }
                         dma_addr_t base_addr, u32 hem_type, u32 step_idx)
 {
        int ret;
-       u8 op;
+       u8 cmd;
 
        if (unlikely(hem_type == HEM_TYPE_GMV))
                return config_gmv_ba_to_hw(hr_dev, obj, base_addr);
        if (unlikely(hem_type == HEM_TYPE_SCCC && step_idx))
                return 0;
 
-       ret = get_op_for_set_hem(hr_dev, hem_type, step_idx, &op);
+       ret = get_op_for_set_hem(hr_dev, hem_type, step_idx, &cmd);
        if (ret < 0)
                return ret;
 
-       return config_hem_ba_to_hw(hr_dev, obj, base_addr, op);
+       return config_hem_ba_to_hw(hr_dev, base_addr, cmd, obj);
 }
 
 static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev,
 }
 
 static int hns_roce_v2_clear_hem(struct hns_roce_dev *hr_dev,
-                                struct hns_roce_hem_table *table, int obj,
-                                u32 step_idx)
+                                struct hns_roce_hem_table *table,
+                                int tag, u32 step_idx)
 {
        struct hns_roce_cmd_mailbox *mailbox;
        struct device *dev = hr_dev->dev;
-       u8 op = 0xff;
+       u8 cmd = 0xff;
        int ret;
 
        if (!hns_roce_check_whether_mhop(hr_dev, table->type))
 
        switch (table->type) {
        case HEM_TYPE_QPC:
-               op = HNS_ROCE_CMD_DESTROY_QPC_BT0;
+               cmd = HNS_ROCE_CMD_DESTROY_QPC_BT0;
                break;
        case HEM_TYPE_MTPT:
-               op = HNS_ROCE_CMD_DESTROY_MPT_BT0;
+               cmd = HNS_ROCE_CMD_DESTROY_MPT_BT0;
                break;
        case HEM_TYPE_CQC:
-               op = HNS_ROCE_CMD_DESTROY_CQC_BT0;
+               cmd = HNS_ROCE_CMD_DESTROY_CQC_BT0;
                break;
        case HEM_TYPE_SRQC:
-               op = HNS_ROCE_CMD_DESTROY_SRQC_BT0;
+               cmd = HNS_ROCE_CMD_DESTROY_SRQC_BT0;
                break;
        case HEM_TYPE_SCCC:
        case HEM_TYPE_QPC_TIMER:
                return 0;
        }
 
-       op += step_idx;
+       cmd += step_idx;
 
        mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
        if (IS_ERR(mailbox))
                return PTR_ERR(mailbox);
 
-       /* configure the tag and op */
-       ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, obj, op);
+       ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, cmd, tag);
 
        hns_roce_free_cmd_mailbox(hr_dev, mailbox);
        return ret;
        memcpy(mailbox->buf, context, qpc_size);
        memcpy(mailbox->buf + qpc_size, qpc_mask, qpc_size);
 
-       ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, hr_qp->qpn,
-                               HNS_ROCE_CMD_MODIFY_QPC);
+       ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0,
+                               HNS_ROCE_CMD_MODIFY_QPC, hr_qp->qpn);
 
        hns_roce_free_cmd_mailbox(hr_dev, mailbox);
 
        if (IS_ERR(mailbox))
                return PTR_ERR(mailbox);
 
-       ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, hr_qp->qpn,
-                               HNS_ROCE_CMD_QUERY_QPC);
+       ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, HNS_ROCE_CMD_QUERY_QPC,
+                               hr_qp->qpn);
        if (ret)
                goto out;
 
                hr_reg_write(srq_context, SRQC_LIMIT_WL, srq_attr->srq_limit);
                hr_reg_clear(srqc_mask, SRQC_LIMIT_WL);
 
-               ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, srq->srqn,
-                                       HNS_ROCE_CMD_MODIFY_SRQC);
+               ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0,
+                                       HNS_ROCE_CMD_MODIFY_SRQC, srq->srqn);
                hns_roce_free_cmd_mailbox(hr_dev, mailbox);
                if (ret) {
                        ibdev_err(&hr_dev->ib_dev,
                return PTR_ERR(mailbox);
 
        srq_context = mailbox->buf;
-       ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, srq->srqn,
-                               HNS_ROCE_CMD_QUERY_SRQC);
+       ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma,
+                               HNS_ROCE_CMD_QUERY_SRQC, srq->srqn);
        if (ret) {
                ibdev_err(&hr_dev->ib_dev,
                          "failed to process cmd of querying SRQ, ret = %d.\n",
        hr_reg_write(cq_context, CQC_CQ_PERIOD, cq_period);
        hr_reg_clear(cqc_mask, CQC_CQ_PERIOD);
 
-       ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, hr_cq->cqn,
-                               HNS_ROCE_CMD_MODIFY_CQC);
+       ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0,
+                               HNS_ROCE_CMD_MODIFY_CQC, hr_cq->cqn);
        hns_roce_free_cmd_mailbox(hr_dev, mailbox);
        if (ret)
                ibdev_err(&hr_dev->ib_dev,
 {
        struct device *dev = hr_dev->dev;
        int ret;
+       u8 cmd;
 
        if (eqn < hr_dev->caps.num_comp_vectors)
-               ret = hns_roce_cmd_mbox(hr_dev, 0, 0, eqn & HNS_ROCE_V2_EQN_M,
-                                       HNS_ROCE_CMD_DESTROY_CEQC);
+               cmd = HNS_ROCE_CMD_DESTROY_CEQC;
        else
-               ret = hns_roce_cmd_mbox(hr_dev, 0, 0, eqn & HNS_ROCE_V2_EQN_M,
-                                       HNS_ROCE_CMD_DESTROY_AEQC);
+               cmd = HNS_ROCE_CMD_DESTROY_AEQC;
+
+       ret = hns_roce_cmd_mbox(hr_dev, 0, 0, cmd, eqn & HNS_ROCE_V2_EQN_M);
        if (ret)
                dev_err(dev, "[mailbox cmd] destroy eqc(%u) failed.\n", eqn);
 }
        if (ret)
                goto err_cmd_mbox;
 
-       ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, eq->eqn, eq_cmd);
+       ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, eq_cmd, eq->eqn);
        if (ret) {
                dev_err(hr_dev->dev, "[mailbox cmd] create eqc failed.\n");
                goto err_cmd_mbox;