* ufshcd_send_command - Send SCSI or device management commands
  * @hba: per adapter instance
  * @task_tag: Task tag of the command
+ * @hwq: pointer to hardware queue instance
  */
 static inline
-void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag)
+void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag,
+                        struct ufs_hw_queue *hwq)
 {
        struct ufshcd_lrb *lrbp = &hba->lrb[task_tag];
        unsigned long flags;
        if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
                ufshcd_start_monitor(hba, lrbp);
 
-       spin_lock_irqsave(&hba->outstanding_lock, flags);
-       if (hba->vops && hba->vops->setup_xfer_req)
-               hba->vops->setup_xfer_req(hba, task_tag, !!lrbp->cmd);
-       __set_bit(task_tag, &hba->outstanding_reqs);
-       ufshcd_writel(hba, 1 << task_tag, REG_UTP_TRANSFER_REQ_DOOR_BELL);
-       spin_unlock_irqrestore(&hba->outstanding_lock, flags);
+       if (is_mcq_enabled(hba)) {
+               int utrd_size = sizeof(struct utp_transfer_req_desc);
+
+               spin_lock(&hwq->sq_lock);
+               memcpy(hwq->sqe_base_addr + (hwq->sq_tail_slot * utrd_size),
+                      lrbp->utr_descriptor_ptr, utrd_size);
+               ufshcd_inc_sq_tail(hwq);
+               spin_unlock(&hwq->sq_lock);
+       } else {
+               spin_lock_irqsave(&hba->outstanding_lock, flags);
+               if (hba->vops && hba->vops->setup_xfer_req)
+                       hba->vops->setup_xfer_req(hba, lrbp->task_tag,
+                                                 !!lrbp->cmd);
+               __set_bit(lrbp->task_tag, &hba->outstanding_reqs);
+               ufshcd_writel(hba, 1 << lrbp->task_tag,
+                             REG_UTP_TRANSFER_REQ_DOOR_BELL);
+               spin_unlock_irqrestore(&hba->outstanding_lock, flags);
+       }
 }
 
 /**
        int tag = scsi_cmd_to_rq(cmd)->tag;
        struct ufshcd_lrb *lrbp;
        int err = 0;
+       struct ufs_hw_queue *hwq = NULL;
 
        WARN_ONCE(tag < 0 || tag >= hba->nutrs, "Invalid tag %d\n", tag);
 
                goto out;
        }
 
-       ufshcd_send_command(hba, tag);
+       ufshcd_send_command(hba, tag, hwq);
 
 out:
        rcu_read_unlock();
                goto out;
 
        hba->dev_cmd.complete = &wait;
+       hba->dev_cmd.cqe = NULL;
 
        ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND, lrbp->ucd_req_ptr);
 
-       ufshcd_send_command(hba, tag);
+       ufshcd_send_command(hba, tag, hba->dev_cmd_queue);
        err = ufshcd_wait_for_dev_cmd(hba, lrbp, timeout);
        ufshcd_add_query_upiu_trace(hba, err ? UFS_QUERY_ERR : UFS_QUERY_COMP,
                                    (struct utp_upiu_req *)lrbp->ucd_rsp_ptr);
 
        ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND, lrbp->ucd_req_ptr);
 
-       ufshcd_send_command(hba, tag);
+       ufshcd_send_command(hba, tag, hba->dev_cmd_queue);
        /*
         * ignore the returning value here - ufshcd_check_query_response is
         * bound to fail since dev_cmd.query and dev_cmd.type were left empty.
 
        hba->dev_cmd.complete = &wait;
 
-       ufshcd_send_command(hba, tag);
+       ufshcd_send_command(hba, tag, hba->dev_cmd_queue);
 
        err = ufshcd_wait_for_dev_cmd(hba, lrbp, ADVANCED_RPMB_REQ_TIMEOUT);