Commit 1918651f authored by Randall Huang's avatar Randall Huang Committed by Martin K. Petersen
Browse files

scsi: ufs: Clear UAC for RPMB after ufshcd resets

If RPMB is not provisioned, we may see RPMB failure after UFS
suspend/resume.  Inject request_sense to clear uac in ufshcd reset flow.

Link: https://lore.kernel.org/r/20201201041402.3860525-1-jaegeuk@kernel.org


Reported-by: default avatarkernel test robot <lkp@intel.com>
Reviewed-by: default avatarStanley Chu <stanley.chu@mediatek.com>
Signed-off-by: default avatarRandall Huang <huangrandall@google.com>
Signed-off-by: default avatarLeo Liou <leoliou@google.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@google.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 1fa05700
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -225,6 +225,7 @@ static int ufshcd_reset_and_restore(struct ufs_hba *hba);
static int ufshcd_eh_host_reset_handler(struct scsi_cmnd *cmd);
static int ufshcd_clear_tm_cmd(struct ufs_hba *hba, int tag);
static void ufshcd_hba_exit(struct ufs_hba *hba);
static int ufshcd_clear_ua_wluns(struct ufs_hba *hba);
static int ufshcd_probe_hba(struct ufs_hba *hba, bool async);
static int ufshcd_setup_clocks(struct ufs_hba *hba, bool on);
static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba);
@@ -6895,7 +6896,8 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba)

	/* Establish the link again and restore the device */
	err = ufshcd_probe_hba(hba, false);

	if (!err)
		ufshcd_clear_ua_wluns(hba);
out:
	if (err)
		dev_err(hba->dev, "%s: Host init failed %d\n", __func__, err);
@@ -8379,13 +8381,7 @@ static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba,
	 * handling context.
	 */
	hba->host->eh_noresume = 1;
	if (hba->wlun_dev_clr_ua) {
		ret = ufshcd_send_request_sense(hba, sdp);
		if (ret)
			goto out;
		/* Unit attention condition is cleared now */
		hba->wlun_dev_clr_ua = false;
	}
	ufshcd_clear_ua_wluns(hba);

	cmd[4] = pwr_mode << 4;

@@ -8406,7 +8402,7 @@ static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba,

	if (!ret)
		hba->curr_dev_pwr_mode = pwr_mode;
out:

	scsi_device_put(sdp);
	hba->host->eh_noresume = 0;
	return ret;