Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-block.git] / drivers / ufs / core / ufshpb.c
index aee0ec4cee70eac41d8769b806fbddce0714e1ff..de2bb8401bc4e4fa0b06bc4a124bff27e3522032 100644 (file)
@@ -671,11 +671,12 @@ static void ufshpb_execute_umap_req(struct ufshpb_lu *hpb,
 
        req->timeout = 0;
        req->end_io_data = umap_req;
+       req->end_io = ufshpb_umap_req_compl_fn;
 
        ufshpb_set_unmap_cmd(scmd->cmnd, rgn);
        scmd->cmd_len = HPB_WRITE_BUFFER_CMD_LENGTH;
 
-       blk_execute_rq_nowait(req, true, ufshpb_umap_req_compl_fn);
+       blk_execute_rq_nowait(req, true);
 
        hpb->stats.umap_req_cnt++;
 }
@@ -707,6 +708,7 @@ static int ufshpb_execute_map_req(struct ufshpb_lu *hpb,
        blk_rq_append_bio(req, map_req->bio);
 
        req->end_io_data = map_req;
+       req->end_io = ufshpb_map_req_compl_fn;
 
        if (unlikely(last))
                mem_size = hpb->last_srgn_entries * HPB_ENTRY_SIZE;
@@ -716,7 +718,7 @@ static int ufshpb_execute_map_req(struct ufshpb_lu *hpb,
                                map_req->rb.srgn_idx, mem_size);
        scmd->cmd_len = HPB_READ_BUFFER_CMD_LENGTH;
 
-       blk_execute_rq_nowait(req, true, ufshpb_map_req_compl_fn);
+       blk_execute_rq_nowait(req, true);
 
        hpb->stats.map_req_cnt++;
        return 0;
@@ -1304,6 +1306,13 @@ void ufshpb_rsp_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
        struct utp_hpb_rsp *rsp_field = &lrbp->ucd_rsp_ptr->hr;
        int data_seg_len;
 
+       data_seg_len = be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_2)
+               & MASK_RSP_UPIU_DATA_SEG_LEN;
+
+       /* If data segment length is zero, rsp_field is not valid */
+       if (!data_seg_len)
+               return;
+
        if (unlikely(lrbp->lun != rsp_field->lun)) {
                struct scsi_device *sdev;
                bool found = false;
@@ -1338,18 +1347,6 @@ void ufshpb_rsp_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
                return;
        }
 
-       data_seg_len = be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_2)
-               & MASK_RSP_UPIU_DATA_SEG_LEN;
-
-       /* To flush remained rsp_list, we queue the map_work task */
-       if (!data_seg_len) {
-               if (!ufshpb_is_general_lun(hpb->lun))
-                       return;
-
-               ufshpb_kick_map_work(hpb);
-               return;
-       }
-
        BUILD_BUG_ON(sizeof(struct utp_hpb_rsp) != UTP_HPB_RSP_SIZE);
 
        if (!ufshpb_is_hpb_rsp_valid(hba, lrbp, rsp_field))