Loading drivers/scsi/ufs/ufshcd.c +20 −4 Original line number Diff line number Diff line Loading @@ -692,6 +692,16 @@ static inline void ufshcd_utrl_clear(struct ufs_hba *hba, u32 pos) ufshcd_writel(hba, ~(1 << pos), REG_UTP_TRANSFER_REQ_LIST_CLEAR); } /** * ufshcd_outstanding_req_clear - Clear a bit in outstanding request field * @hba: per adapter instance * @tag: position of the bit to be cleared */ static inline void ufshcd_outstanding_req_clear(struct ufs_hba *hba, int tag) { __clear_bit(tag, &hba->outstanding_reqs); } /** * ufshcd_get_lists_status - Check UCRDY, UTRLRDY and UTMRLRDY * @reg: Register value of host controller status Loading Loading @@ -2572,8 +2582,14 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba, dev_dbg(hba->dev, "%s: dev_cmd request timedout, tag %d\n", __func__, lrbp->task_tag); if (!ufshcd_clear_cmd(hba, lrbp->task_tag)) /* sucessfully cleared the command, retry if needed */ /* successfully cleared the command, retry if needed */ err = -EAGAIN; /* * in case of an error, after clearing the doorbell, * we also need to clear the outstanding_request * field in hba */ ufshcd_outstanding_req_clear(hba, lrbp->task_tag); } return err; Loading Loading @@ -4694,7 +4710,7 @@ void ufshcd_abort_outstanding_transfer_requests(struct ufs_hba *hba, int result) lrbp->cmd = NULL; /* Clear pending transfer requests */ ufshcd_clear_cmd(hba, index); __clear_bit(index, &hba->outstanding_reqs); ufshcd_outstanding_req_clear(hba, index); clear_bit_unlock(index, &hba->lrb_in_use); /* Do not touch lrbp after scsi done */ cmd->scsi_done(cmd); Loading @@ -4703,7 +4719,7 @@ void ufshcd_abort_outstanding_transfer_requests(struct ufs_hba *hba, int result) if (hba->dev_cmd.complete) { ufshcd_cond_add_cmd_trace(hba, index, "dev_failed"); __clear_bit(index, &hba->outstanding_reqs); ufshcd_outstanding_req_clear(hba, index); complete(hba->dev_cmd.complete); } } Loading Loading @@ -5821,7 +5837,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd) scsi_dma_unmap(cmd); spin_lock_irqsave(host->host_lock, flags); __clear_bit(tag, &hba->outstanding_reqs); ufshcd_outstanding_req_clear(hba, tag); hba->lrb[tag].cmd = NULL; spin_unlock_irqrestore(host->host_lock, flags); Loading Loading
drivers/scsi/ufs/ufshcd.c +20 −4 Original line number Diff line number Diff line Loading @@ -692,6 +692,16 @@ static inline void ufshcd_utrl_clear(struct ufs_hba *hba, u32 pos) ufshcd_writel(hba, ~(1 << pos), REG_UTP_TRANSFER_REQ_LIST_CLEAR); } /** * ufshcd_outstanding_req_clear - Clear a bit in outstanding request field * @hba: per adapter instance * @tag: position of the bit to be cleared */ static inline void ufshcd_outstanding_req_clear(struct ufs_hba *hba, int tag) { __clear_bit(tag, &hba->outstanding_reqs); } /** * ufshcd_get_lists_status - Check UCRDY, UTRLRDY and UTMRLRDY * @reg: Register value of host controller status Loading Loading @@ -2572,8 +2582,14 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba, dev_dbg(hba->dev, "%s: dev_cmd request timedout, tag %d\n", __func__, lrbp->task_tag); if (!ufshcd_clear_cmd(hba, lrbp->task_tag)) /* sucessfully cleared the command, retry if needed */ /* successfully cleared the command, retry if needed */ err = -EAGAIN; /* * in case of an error, after clearing the doorbell, * we also need to clear the outstanding_request * field in hba */ ufshcd_outstanding_req_clear(hba, lrbp->task_tag); } return err; Loading Loading @@ -4694,7 +4710,7 @@ void ufshcd_abort_outstanding_transfer_requests(struct ufs_hba *hba, int result) lrbp->cmd = NULL; /* Clear pending transfer requests */ ufshcd_clear_cmd(hba, index); __clear_bit(index, &hba->outstanding_reqs); ufshcd_outstanding_req_clear(hba, index); clear_bit_unlock(index, &hba->lrb_in_use); /* Do not touch lrbp after scsi done */ cmd->scsi_done(cmd); Loading @@ -4703,7 +4719,7 @@ void ufshcd_abort_outstanding_transfer_requests(struct ufs_hba *hba, int result) if (hba->dev_cmd.complete) { ufshcd_cond_add_cmd_trace(hba, index, "dev_failed"); __clear_bit(index, &hba->outstanding_reqs); ufshcd_outstanding_req_clear(hba, index); complete(hba->dev_cmd.complete); } } Loading Loading @@ -5821,7 +5837,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd) scsi_dma_unmap(cmd); spin_lock_irqsave(host->host_lock, flags); __clear_bit(tag, &hba->outstanding_reqs); ufshcd_outstanding_req_clear(hba, tag); hba->lrb[tag].cmd = NULL; spin_unlock_irqrestore(host->host_lock, flags); Loading