* [PATCH v3 0/3] scsi: ufs: Add error handling of Auto-Hibernate
@ 2019-05-20 8:32 Stanley Chu
2019-05-20 8:32 ` [PATCH v3 1/3] scsi: ufs: Do not overwrite Auto-Hibernate timer Stanley Chu
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Stanley Chu @ 2019-05-20 8:32 UTC (permalink / raw)
To: linux-scsi, martin.petersen, avri.altman, alim.akhtar,
pedrom.sousa
Cc: marc.w.gonzalez, andy.teng, chun-hung.wu, kuohong.wang, evgreen,
linux-mediatek, peter.wang, matthias.bgg, Stanley Chu,
linux-arm-kernel, beanhuo
Currently auto-hibernate is activated if host supports
auto-hibern8 capability. However error-handling is not implemented,
which makes the feature somewhat risky.
If either "Hibernate Enter" or "Hibernate Exit" fail during
auto-hibernate flow, the corresponding interrupt
"UIC_HIBERNATE_ENTER" or "UIC_HIBERNATE_EXIT" shall be raised
according to UFS specification.
This patch adds auto-hibernate error-handling:
- Monitor "Hibernate Enter" and "Hibernate Exit" interrupts after
auto-hibernate feature is activated.
- If fail happens, trigger error-handling just like "manual-hibernate"
fail and apply the same recovery flow: schedule UFS error handler in
ufshcd_check_errors(), and then do host reset and restore
in UFS error handler.
v3:
- Fix typo in patch "scsi: ufs: Do not overwrite Auto-Hibernate timer" (Avri Altman)
- Rebase to Linux 5.2-rc1
v2:
- Fix sentences in commit message (Marc Gonzalez)
- Make "Auto-Hibernate" error detection more precise (Bean Huo)
Stanley Chu (3):
scsi: ufs: Do not overwrite Auto-Hibernate timer
scsi: ufs: Add error-handling of Auto-Hibernate
scsi: ufs: Use re-factored Auto-Hibernate function
drivers/scsi/ufs/ufshcd.c | 33 ++++++++++++++++++++++++++++++++-
drivers/scsi/ufs/ufshcd.h | 5 +++++
drivers/scsi/ufs/ufshci.h | 3 +++
3 files changed, 40 insertions(+), 1 deletion(-)
--
2.18.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v3 1/3] scsi: ufs: Do not overwrite Auto-Hibernate timer 2019-05-20 8:32 [PATCH v3 0/3] scsi: ufs: Add error handling of Auto-Hibernate Stanley Chu @ 2019-05-20 8:32 ` Stanley Chu 2019-05-20 8:32 ` [PATCH v3 2/3] scsi: ufs: Add error-handling of Auto-Hibernate Stanley Chu [not found] ` <1558341138-18043-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> 2 siblings, 0 replies; 6+ messages in thread From: Stanley Chu @ 2019-05-20 8:32 UTC (permalink / raw) To: linux-scsi, martin.petersen, avri.altman, alim.akhtar, pedrom.sousa Cc: marc.w.gonzalez, andy.teng, chun-hung.wu, kuohong.wang, evgreen, linux-mediatek, peter.wang, matthias.bgg, Stanley Chu, linux-arm-kernel, beanhuo Some vendor-specific initialization flow may set its own auto-hibernate timer. In this case, do not overwrite timer value as "default value" in ufshcd_init(). Signed-off-by: Stanley Chu <stanley.chu@mediatek.com> Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com> --- drivers/scsi/ufs/ufshcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 8c1c551f2b42..ba04d07df279 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -8312,7 +8312,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) UIC_LINK_HIBERN8_STATE); /* Set the default auto-hiberate idle timer value to 150 ms */ - if (hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT) { + if ((hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT) && !hba->ahit) { hba->ahit = FIELD_PREP(UFSHCI_AHIBERN8_TIMER_MASK, 150) | FIELD_PREP(UFSHCI_AHIBERN8_SCALE_MASK, 3); } -- 2.18.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 2/3] scsi: ufs: Add error-handling of Auto-Hibernate 2019-05-20 8:32 [PATCH v3 0/3] scsi: ufs: Add error handling of Auto-Hibernate Stanley Chu 2019-05-20 8:32 ` [PATCH v3 1/3] scsi: ufs: Do not overwrite Auto-Hibernate timer Stanley Chu @ 2019-05-20 8:32 ` Stanley Chu 2019-05-20 9:51 ` Avri Altman [not found] ` <1558341138-18043-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> 2 siblings, 1 reply; 6+ messages in thread From: Stanley Chu @ 2019-05-20 8:32 UTC (permalink / raw) To: linux-scsi, martin.petersen, avri.altman, alim.akhtar, pedrom.sousa Cc: marc.w.gonzalez, andy.teng, chun-hung.wu, kuohong.wang, evgreen, linux-mediatek, peter.wang, matthias.bgg, Stanley Chu, linux-arm-kernel, beanhuo Currently auto-hibernate is activated if host supports auto-hibern8 capability. However error-handling is not implemented, which makes the feature somewhat risky. If either "Hibernate Enter" or "Hibernate Exit" fail during auto-hibernate flow, the corresponding interrupt "UIC_HIBERNATE_ENTER" or "UIC_HIBERNATE_EXIT" shall be raised according to UFS specification. This patch adds auto-hibernate error-handling: - Monitor "Hibernate Enter" and "Hibernate Exit" interrupts after auto-hibernate feature is activated. - If fail happens, trigger error-handling just like "manual-hibernate" fail and apply the same recovery flow: schedule UFS error handler in ufshcd_check_errors(), and then do host reset and restore in UFS error handler. Signed-off-by: Stanley Chu <stanley.chu@mediatek.com> Reviewed-by: Bean Huo <beanhuo@micron.com> Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com> --- drivers/scsi/ufs/ufshcd.c | 31 +++++++++++++++++++++++++++++++ drivers/scsi/ufs/ufshcd.h | 5 +++++ drivers/scsi/ufs/ufshci.h | 3 +++ 3 files changed, 39 insertions(+) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index ba04d07df279..2123b0bbb1c2 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -5254,6 +5254,7 @@ static void ufshcd_err_handler(struct work_struct *work) goto skip_err_handling; } if ((hba->saved_err & INT_FATAL_ERRORS) || + (hba->saved_err & UFSHCD_UIC_AH8_ERROR_MASK) || ((hba->saved_err & UIC_ERROR) && (hba->saved_uic_err & (UFSHCD_UIC_DL_PA_INIT_ERROR | UFSHCD_UIC_DL_NAC_RECEIVED_ERROR | @@ -5413,6 +5414,23 @@ static void ufshcd_update_uic_error(struct ufs_hba *hba) __func__, hba->uic_error); } +static bool ufshcd_is_auto_hibern8_error(struct ufs_hba *hba, + u32 intr_mask) +{ + if (!ufshcd_is_auto_hibern8_supported(hba)) + return false; + + if (!(intr_mask & UFSHCD_UIC_AH8_ERROR_MASK)) + return false; + + if (hba->active_uic_cmd && + (hba->active_uic_cmd->command == UIC_CMD_DME_HIBER_ENTER || + hba->active_uic_cmd->command == UIC_CMD_DME_HIBER_EXIT)) + return false; + + return true; +} + /** * ufshcd_check_errors - Check for errors that need s/w attention * @hba: per-adapter instance @@ -5431,6 +5449,15 @@ static void ufshcd_check_errors(struct ufs_hba *hba) queue_eh_work = true; } + if (hba->errors & UFSHCD_UIC_AH8_ERROR_MASK) { + dev_err(hba->dev, + "%s: Auto Hibern8 %s failed - status: 0x%08x, upmcrs: 0x%08x\n", + __func__, (hba->errors & UIC_HIBERNATE_ENTER) ? + "Enter" : "Exit", + hba->errors, ufshcd_get_upmcrs(hba)); + queue_eh_work = true; + } + if (queue_eh_work) { /* * update the transfer error masks to sticky bits, let's do this @@ -5493,6 +5520,10 @@ static void ufshcd_tmc_handler(struct ufs_hba *hba) static void ufshcd_sl_intr(struct ufs_hba *hba, u32 intr_status) { hba->errors = UFSHCD_ERROR_MASK & intr_status; + + if (ufshcd_is_auto_hibern8_error(hba, intr_status)) + hba->errors |= (UFSHCD_UIC_AH8_ERROR_MASK & intr_status); + if (hba->errors) ufshcd_check_errors(hba); diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index ecfa898b9ccc..994d73d03207 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -740,6 +740,11 @@ return true; #endif } +static inline bool ufshcd_is_auto_hibern8_supported(struct ufs_hba *hba) +{ + return (hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT); +} + #define ufshcd_writel(hba, val, reg) \ writel((val), (hba)->mmio_base + (reg)) #define ufshcd_readl(hba, reg) \ diff --git a/drivers/scsi/ufs/ufshci.h b/drivers/scsi/ufs/ufshci.h index 6fa889de5ee5..4bcb205f2077 100644 --- a/drivers/scsi/ufs/ufshci.h +++ b/drivers/scsi/ufs/ufshci.h @@ -148,6 +148,9 @@ enum { UIC_HIBERNATE_EXIT |\ UIC_POWER_MODE) +#define UFSHCD_UIC_AH8_ERROR_MASK (UIC_HIBERNATE_ENTER |\ + UIC_HIBERNATE_EXIT) + #define UFSHCD_UIC_MASK (UIC_COMMAND_COMPL | UFSHCD_UIC_PWR_MASK) #define UFSHCD_ERROR_MASK (UIC_ERROR |\ -- 2.18.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* RE: [PATCH v3 2/3] scsi: ufs: Add error-handling of Auto-Hibernate 2019-05-20 8:32 ` [PATCH v3 2/3] scsi: ufs: Add error-handling of Auto-Hibernate Stanley Chu @ 2019-05-20 9:51 ` Avri Altman 2019-05-20 14:05 ` Stanley Chu 0 siblings, 1 reply; 6+ messages in thread From: Avri Altman @ 2019-05-20 9:51 UTC (permalink / raw) To: Stanley Chu, linux-scsi@vger.kernel.org, martin.petersen@oracle.com, alim.akhtar@samsung.com, pedrom.sousa@synopsys.com Cc: marc.w.gonzalez@free.fr, andy.teng@mediatek.com, chun-hung.wu@mediatek.com, kuohong.wang@mediatek.com, evgreen@chromium.org, linux-mediatek@lists.infradead.org, peter.wang@mediatek.com, matthias.bgg@gmail.com, linux-arm-kernel@lists.infradead.org, beanhuo@micron.com Aside from some nits - see below, looks fine. Thanks, Avri > diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h > index ecfa898b9ccc..994d73d03207 100644 > --- a/drivers/scsi/ufs/ufshcd.h > +++ b/drivers/scsi/ufs/ufshcd.h > @@ -740,6 +740,11 @@ return true; > #endif > } > > +static inline bool ufshcd_is_auto_hibern8_supported(struct ufs_hba *hba) > +{ > + return (hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT); > +} Maybe use it elsewhere in the driver, preferable in a preparatory patch, Instead of patch #3. > diff --git a/drivers/scsi/ufs/ufshci.h b/drivers/scsi/ufs/ufshci.h > index 6fa889de5ee5..4bcb205f2077 100644 > --- a/drivers/scsi/ufs/ufshci.h > +++ b/drivers/scsi/ufs/ufshci.h > @@ -148,6 +148,9 @@ enum { > UIC_HIBERNATE_EXIT |\ > UIC_POWER_MODE) > > +#define UFSHCD_UIC_AH8_ERROR_MASK (UIC_HIBERNATE_ENTER |\ > + UIC_HIBERNATE_EXIT) So maybe update UFSHCD_UIC_PWR_MASK above ^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH v3 2/3] scsi: ufs: Add error-handling of Auto-Hibernate 2019-05-20 9:51 ` Avri Altman @ 2019-05-20 14:05 ` Stanley Chu 0 siblings, 0 replies; 6+ messages in thread From: Stanley Chu @ 2019-05-20 14:05 UTC (permalink / raw) To: Avri Altman Cc: linux-scsi@vger.kernel.org, martin.petersen@oracle.com, marc.w.gonzalez@free.fr, andy.teng@mediatek.com, chun-hung.wu@mediatek.com, kuohong.wang@mediatek.com, evgreen@chromium.org, linux-mediatek@lists.infradead.org, peter.wang@mediatek.com, alim.akhtar@samsung.com, matthias.bgg@gmail.com, pedrom.sousa@synopsys.com, linux-arm-kernel@lists.infradead.org, beanhuo@micron.com Hi Avri, On Mon, 2019-05-20 at 09:51 +0000, Avri Altman wrote: > Aside from some nits - see below, looks fine. > > Thanks, > Avri > > > diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h > > index ecfa898b9ccc..994d73d03207 100644 > > --- a/drivers/scsi/ufs/ufshcd.h > > +++ b/drivers/scsi/ufs/ufshcd.h > > @@ -740,6 +740,11 @@ return true; > > #endif > > } > > > > +static inline bool ufshcd_is_auto_hibern8_supported(struct ufs_hba *hba) > > +{ > > + return (hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT); > > +} > Maybe use it elsewhere in the driver, preferable in a preparatory patch, > Instead of patch #3. > OK. I will modify original patch #3 to a preparation patch which just re-factors ufshcd_is_auto_hibern8_supported(), and change its order to #2. > > > > diff --git a/drivers/scsi/ufs/ufshci.h b/drivers/scsi/ufs/ufshci.h > > index 6fa889de5ee5..4bcb205f2077 100644 > > --- a/drivers/scsi/ufs/ufshci.h > > +++ b/drivers/scsi/ufs/ufshci.h > > @@ -148,6 +148,9 @@ enum { > > UIC_HIBERNATE_EXIT |\ > > UIC_POWER_MODE) > > > > +#define UFSHCD_UIC_AH8_ERROR_MASK (UIC_HIBERNATE_ENTER |\ > > + UIC_HIBERNATE_EXIT) > So maybe update UFSHCD_UIC_PWR_MASK above OK. WIll make these definitions more elegant. > > _______________________________________________ > Linux-mediatek mailing list > Linux-mediatek@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-mediatek Thanks, Stanley ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <1558341138-18043-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>]
* [PATCH v3 3/3] scsi: ufs: Use re-factored Auto-Hibernate function [not found] ` <1558341138-18043-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> @ 2019-05-20 8:32 ` Stanley Chu 0 siblings, 0 replies; 6+ messages in thread From: Stanley Chu @ 2019-05-20 8:32 UTC (permalink / raw) To: linux-scsi-u79uwXL29TY76Z2rM5mHXA, martin.petersen-QHcLZuEGTsvQT0dZR+AlfA, avri.altman-Sjgp3cTcYWE, alim.akhtar-Sze3O3UU22JBDgjK7y7TUQ, pedrom.sousa-HKixBCOQz3hWk0Htik3J/w Cc: marc.w.gonzalez-GANU6spQydw, andy.teng-NuS5LvNUpcJWk0Htik3J/w, chun-hung.wu-NuS5LvNUpcJWk0Htik3J/w, kuohong.wang-NuS5LvNUpcJWk0Htik3J/w, evgreen-F7+t8E8rja9g9hUCZPvPmw, linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, peter.wang-NuS5LvNUpcJWk0Htik3J/w, matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w, Stanley Chu, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, beanhuo-AL4WhLSQfzjQT0dZR+AlfA Use re-factored ufshcd_is_auto_hibern8_supported() function in ufshcd_init() instead to make code more cleaner. Signed-off-by: Stanley Chu <stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> Reviewed-by: Bean Huo <beanhuo-AL4WhLSQfzjQT0dZR+AlfA@public.gmane.org> Reviewed-by: Alim Akhtar <alim.akhtar-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> --- drivers/scsi/ufs/ufshcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 2123b0bbb1c2..aad268f020a3 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -8343,7 +8343,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) UIC_LINK_HIBERN8_STATE); /* Set the default auto-hiberate idle timer value to 150 ms */ - if ((hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT) && !hba->ahit) { + if (ufshcd_is_auto_hibern8_supported(hba) && !hba->ahit) { hba->ahit = FIELD_PREP(UFSHCI_AHIBERN8_TIMER_MASK, 150) | FIELD_PREP(UFSHCI_AHIBERN8_SCALE_MASK, 3); } -- 2.18.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-05-20 14:05 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-05-20 8:32 [PATCH v3 0/3] scsi: ufs: Add error handling of Auto-Hibernate Stanley Chu
2019-05-20 8:32 ` [PATCH v3 1/3] scsi: ufs: Do not overwrite Auto-Hibernate timer Stanley Chu
2019-05-20 8:32 ` [PATCH v3 2/3] scsi: ufs: Add error-handling of Auto-Hibernate Stanley Chu
2019-05-20 9:51 ` Avri Altman
2019-05-20 14:05 ` Stanley Chu
[not found] ` <1558341138-18043-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
2019-05-20 8:32 ` [PATCH v3 3/3] scsi: ufs: Use re-factored Auto-Hibernate function Stanley Chu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox