return ret;
 }
 
+static void ufshcd_request_sense_done(struct request *rq, blk_status_t error)
+{
+       if (error != BLK_STS_OK)
+               pr_err("%s: REQUEST SENSE failed (%d)", __func__, error);
+       blk_put_request(rq);
+}
+
 static int
-ufshcd_send_request_sense(struct ufs_hba *hba, struct scsi_device *sdp);
+ufshcd_request_sense_async(struct ufs_hba *hba, struct scsi_device *sdev)
+{
+       /*
+        * From SPC-6: the REQUEST SENSE command with any allocation length
+        * clears the sense data.
+        */
+       static const u8 cmd[6] = {REQUEST_SENSE, 0, 0, 0, 0, 0};
+       struct scsi_request *rq;
+       struct request *req;
+
+       req = blk_get_request(sdev->request_queue, REQ_OP_DRV_IN, /*flags=*/0);
+       if (IS_ERR(req))
+               return PTR_ERR(req);
+
+       rq = scsi_req(req);
+       rq->cmd_len = ARRAY_SIZE(cmd);
+       memcpy(rq->cmd, cmd, rq->cmd_len);
+       rq->retries = 3;
+       req->timeout = 1 * HZ;
+       req->rq_flags |= RQF_PM | RQF_QUIET;
+
+       blk_execute_rq_nowait(/*bd_disk=*/NULL, req, /*at_head=*/true,
+                             ufshcd_request_sense_done);
+       return 0;
+}
 
 static int ufshcd_clear_ua_wlun(struct ufs_hba *hba, u8 wlun)
 {
        if (ret)
                goto out_err;
 
-       ret = ufshcd_send_request_sense(hba, sdp);
+       ret = ufshcd_request_sense_async(hba, sdp);
        scsi_device_put(sdp);
 out_err:
        if (ret)
        }
 }
 
-static int
-ufshcd_send_request_sense(struct ufs_hba *hba, struct scsi_device *sdp)
-{
-       unsigned char cmd[6] = {REQUEST_SENSE,
-                               0,
-                               0,
-                               0,
-                               UFS_SENSE_SIZE,
-                               0};
-       char *buffer;
-       int ret;
-
-       buffer = kzalloc(UFS_SENSE_SIZE, GFP_KERNEL);
-       if (!buffer) {
-               ret = -ENOMEM;
-               goto out;
-       }
-
-       ret = scsi_execute(sdp, cmd, DMA_FROM_DEVICE, buffer,
-                       UFS_SENSE_SIZE, NULL, NULL,
-                       msecs_to_jiffies(1000), 3, 0, RQF_PM, NULL);
-       if (ret)
-               pr_err("%s: failed with err %d\n", __func__, ret);
-
-       kfree(buffer);
-out:
-       return ret;
-}
-
 /**
  * ufshcd_set_dev_pwr_mode - sends START STOP UNIT command to set device
  *                          power mode