> 2015-09-02 19:13 GMT+09:00 Yaniv Gardi <ygardi@xxxxxxxxxxxxxx>: >> If hibern8 enter command fails then UFS link state may be unknown which >> may result into timeout of all the commands issued after failure. >> >> This change does 2 things (for pre-defined number of retry counts) after >> hibern8 enter failure: >> 1. Recovers the UFS link to active state >> 2. If link is recovered to active state, tries to put the UFS link in >> hibern8 enter again until retry count expires. >> >> Signed-off-by: Subhash Jadavani <subhashj@xxxxxxxxxxxxxx> >> Signed-off-by: Yaniv Gardi <ygardi@xxxxxxxxxxxxxx> >> >> --- >> drivers/scsi/ufs/ufshcd.c | 26 ++++++++++++++++++++++++-- >> 1 file changed, 24 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c >> index 8d5bdf0..5800b08 100644 >> --- a/drivers/scsi/ufs/ufshcd.c >> +++ b/drivers/scsi/ufs/ufshcd.c >> @@ -75,6 +75,9 @@ >> /* maximum number of link-startup retries */ >> #define DME_LINKSTARTUP_RETRIES 3 >> >> +/* Maximum retries for Hibern8 enter */ >> +#define UIC_HIBERN8_ENTER_RETRIES 3 >> + >> /* maximum number of reset retries before giving up */ >> #define MAX_HOST_RESET_RETRIES 5 >> >> @@ -2389,13 +2392,32 @@ out: >> return ret; >> } >> >> -static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba) >> +static int __ufshcd_uic_hibern8_enter(struct ufs_hba *hba) >> { >> + int ret; >> struct uic_command uic_cmd = {0}; >> >> uic_cmd.command = UIC_CMD_DME_HIBER_ENTER; >> + ret = ufshcd_uic_pwr_ctrl(hba, &uic_cmd); >> + >> + if (ret) >> + dev_err(hba->dev, "%s: hibern8 enter failed. ret = %d", >> + __func__, ret); > > This format string is not terminated with '\n'. > (I found several same issues in ufshcd.c) correct. will be modified in the next v4. > >> + >> + return ret; >> +} >> + >> +static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba) >> +{ >> + int ret = 0, retries; >> > > 'ret' will soon be initialized in the loop anyway, so it is unnecessary > to initialized here. correct but, in order to be on the safe side, better to leave this initialization here, as if UIC_HIBERN8_ENTER_RETRIES is modified to 0, we will never get into the for-loop, and thus, ret will be un initialized. > >> - return ufshcd_uic_pwr_ctrl(hba, &uic_cmd); >> + for (retries = UIC_HIBERN8_ENTER_RETRIES; retries > 0; >> retries--) { >> + ret = __ufshcd_uic_hibern8_enter(hba); >> + if (!ret || ret == -ENOLINK) >> + goto out; >> + } >> +out: >> + return ret; >> } >> >> static int ufshcd_uic_hibern8_exit(struct ufs_hba *hba) >> -- >> 1.8.5.2 >> >> -- >> QUALCOMM ISRAEL, on behalf of Qualcomm Innovation Center, Inc. is a >> member of Code Aurora Forum, hosted by The Linux Foundation >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html