* [PATCH v5 0/3] scsi: ufs: Add error handling of Auto-Hibernate
@ 2019-05-21 6:44 Stanley Chu
[not found] ` <1558421094-3182-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Stanley Chu @ 2019-05-21 6:44 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.
v5:
- Also re-factor checking of Auto-Hibernation support in other places, e.g., in ufshcd_auto_hibern8_enable() and in ufs-sysfs (Avri Altman)
- Change order of patch "scsi: ufs: Introduce ufshcd_is_auto_hibern8_supported()" to #1 as a preparation patch of whole series
v4:
- Replace original patch "[3/3] scsi: ufs: Use re-factored Auto-Hibernate function" by a new preparation patch "[2/3] scsi: ufs: Introduce ufshcd_is_auto_hibern8_supported()" for re-factoring ufshcd_is_auto_hibern8_supported (Avri Altman)
- Refine UIC mask definitions (Avri Altman)
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: Introduce ufshcd_is_auto_hibern8_supported()
scsi: ufs: Do not overwrite Auto-Hibernate timer
scsi: ufs: Add error-handling of Auto-Hibernate
drivers/scsi/ufs/ufs-sysfs.c | 6 +++---
drivers/scsi/ufs/ufshcd.c | 35 +++++++++++++++++++++++++++++++++--
drivers/scsi/ufs/ufshcd.h | 5 +++++
drivers/scsi/ufs/ufshci.h | 6 ++++--
4 files changed, 45 insertions(+), 7 deletions(-)
--
2.18.0
^ permalink raw reply [flat|nested] 6+ messages in thread[parent not found: <1558421094-3182-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>]
* [PATCH v5 1/3] scsi: ufs: Introduce ufshcd_is_auto_hibern8_supported() [not found] ` <1558421094-3182-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> @ 2019-05-21 6:44 ` Stanley Chu 2019-05-21 8:41 ` [PATCH v5 0/3] scsi: ufs: Add error handling of Auto-Hibernate Avri Altman 1 sibling, 0 replies; 6+ messages in thread From: Stanley Chu @ 2019-05-21 6:44 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 The checking of Auto-Hibernation support is used in many places in the driver, thus re-factor it as ufshcd_is_auto_hibern8_supported() to make code more clean. 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/ufs-sysfs.c | 6 +++--- drivers/scsi/ufs/ufshcd.c | 4 ++-- drivers/scsi/ufs/ufshcd.h | 5 +++++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/ufs/ufs-sysfs.c b/drivers/scsi/ufs/ufs-sysfs.c index 8d9332bb7d0c..f478685122ff 100644 --- a/drivers/scsi/ufs/ufs-sysfs.c +++ b/drivers/scsi/ufs/ufs-sysfs.c @@ -122,7 +122,7 @@ static void ufshcd_auto_hibern8_update(struct ufs_hba *hba, u32 ahit) { unsigned long flags; - if (!(hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT)) + if (!ufshcd_is_auto_hibern8_supported(hba)) return; spin_lock_irqsave(hba->host->host_lock, flags); @@ -164,7 +164,7 @@ static ssize_t auto_hibern8_show(struct device *dev, { struct ufs_hba *hba = dev_get_drvdata(dev); - if (!(hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT)) + if (!ufshcd_is_auto_hibern8_supported(hba)) return -EOPNOTSUPP; return snprintf(buf, PAGE_SIZE, "%d\n", ufshcd_ahit_to_us(hba->ahit)); @@ -177,7 +177,7 @@ static ssize_t auto_hibern8_store(struct device *dev, struct ufs_hba *hba = dev_get_drvdata(dev); unsigned int timer; - if (!(hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT)) + if (!ufshcd_is_auto_hibern8_supported(hba)) return -EOPNOTSUPP; if (kstrtouint(buf, 0, &timer)) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 8c1c551f2b42..0cf698d05426 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -3907,7 +3907,7 @@ static void ufshcd_auto_hibern8_enable(struct ufs_hba *hba) { unsigned long flags; - if (!(hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT) || !hba->ahit) + if (!ufshcd_is_auto_hibern8_supported(hba) || !hba->ahit) return; spin_lock_irqsave(hba->host->host_lock, flags); @@ -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 (ufshcd_is_auto_hibern8_supported(hba)) { hba->ahit = FIELD_PREP(UFSHCI_AHIBERN8_TIMER_MASK, 150) | FIELD_PREP(UFSHCI_AHIBERN8_SCALE_MASK, 3); } 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) \ -- 2.18.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* RE: [PATCH v5 0/3] scsi: ufs: Add error handling of Auto-Hibernate [not found] ` <1558421094-3182-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> 2019-05-21 6:44 ` [PATCH v5 1/3] scsi: ufs: Introduce ufshcd_is_auto_hibern8_supported() Stanley Chu @ 2019-05-21 8:41 ` Avri Altman 1 sibling, 0 replies; 6+ messages in thread From: Avri Altman @ 2019-05-21 8:41 UTC (permalink / raw) To: Stanley Chu, linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, martin.petersen-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org, alim.akhtar-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org, pedrom.sousa-HKixBCOQz3hWk0Htik3J/w@public.gmane.org Cc: marc.w.gonzalez-GANU6spQydw@public.gmane.org, andy.teng-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org, chun-hung.wu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org, kuohong.wang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org, evgreen-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org, linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, peter.wang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org, matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, beanhuo-AL4WhLSQfzjQT0dZR+AlfA@public.gmane.org This series looks fine to me. Thanks, Avri > > 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. > > v5: > - Also re-factor checking of Auto-Hibernation support in other places, e.g., in > ufshcd_auto_hibern8_enable() and in ufs-sysfs (Avri Altman) > - Change order of patch "scsi: ufs: Introduce > ufshcd_is_auto_hibern8_supported()" to #1 as a preparation patch of whole > series > > v4: > - Replace original patch "[3/3] scsi: ufs: Use re-factored Auto-Hibernate > function" by a new preparation patch "[2/3] scsi: ufs: Introduce > ufshcd_is_auto_hibern8_supported()" for re-factoring > ufshcd_is_auto_hibern8_supported (Avri Altman) > - Refine UIC mask definitions (Avri Altman) > > 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: Introduce ufshcd_is_auto_hibern8_supported() > scsi: ufs: Do not overwrite Auto-Hibernate timer > scsi: ufs: Add error-handling of Auto-Hibernate > > drivers/scsi/ufs/ufs-sysfs.c | 6 +++--- > drivers/scsi/ufs/ufshcd.c | 35 +++++++++++++++++++++++++++++++++-- > drivers/scsi/ufs/ufshcd.h | 5 +++++ > drivers/scsi/ufs/ufshci.h | 6 ++++-- > 4 files changed, 45 insertions(+), 7 deletions(-) > > -- > 2.18.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v5 2/3] scsi: ufs: Do not overwrite Auto-Hibernate timer 2019-05-21 6:44 [PATCH v5 0/3] scsi: ufs: Add error handling of Auto-Hibernate Stanley Chu [not found] ` <1558421094-3182-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> @ 2019-05-21 6:44 ` Stanley Chu 2019-05-21 6:44 ` [PATCH v5 3/3] scsi: ufs: Add error-handling of Auto-Hibernate Stanley Chu 2019-05-30 2:19 ` [PATCH v5 0/3] scsi: ufs: Add error handling " Martin K. Petersen 3 siblings, 0 replies; 6+ messages in thread From: Stanley Chu @ 2019-05-21 6:44 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 0cf698d05426..7cd757558203 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 (ufshcd_is_auto_hibern8_supported(hba)) { + 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
* [PATCH v5 3/3] scsi: ufs: Add error-handling of Auto-Hibernate 2019-05-21 6:44 [PATCH v5 0/3] scsi: ufs: Add error handling of Auto-Hibernate Stanley Chu [not found] ` <1558421094-3182-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> 2019-05-21 6:44 ` [PATCH v5 2/3] scsi: ufs: Do not overwrite Auto-Hibernate timer Stanley Chu @ 2019-05-21 6:44 ` Stanley Chu 2019-05-30 2:19 ` [PATCH v5 0/3] scsi: ufs: Add error handling " Martin K. Petersen 3 siblings, 0 replies; 6+ messages in thread From: Stanley Chu @ 2019-05-21 6:44 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/ufshci.h | 6 ++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 7cd757558203..a208589426b1 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_HIBERN8_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_HIBERN8_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_HIBERN8_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_HIBERN8_MASK & intr_status); + if (hba->errors) ufshcd_check_errors(hba); diff --git a/drivers/scsi/ufs/ufshci.h b/drivers/scsi/ufs/ufshci.h index 6fa889de5ee5..dbb75cd28dc8 100644 --- a/drivers/scsi/ufs/ufshci.h +++ b/drivers/scsi/ufs/ufshci.h @@ -144,8 +144,10 @@ enum { #define CONTROLLER_FATAL_ERROR 0x10000 #define SYSTEM_BUS_FATAL_ERROR 0x20000 -#define UFSHCD_UIC_PWR_MASK (UIC_HIBERNATE_ENTER |\ - UIC_HIBERNATE_EXIT |\ +#define UFSHCD_UIC_HIBERN8_MASK (UIC_HIBERNATE_ENTER |\ + UIC_HIBERNATE_EXIT) + +#define UFSHCD_UIC_PWR_MASK (UFSHCD_UIC_HIBERN8_MASK |\ UIC_POWER_MODE) #define UFSHCD_UIC_MASK (UIC_COMMAND_COMPL | UFSHCD_UIC_PWR_MASK) -- 2.18.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v5 0/3] scsi: ufs: Add error handling of Auto-Hibernate 2019-05-21 6:44 [PATCH v5 0/3] scsi: ufs: Add error handling of Auto-Hibernate Stanley Chu ` (2 preceding siblings ...) 2019-05-21 6:44 ` [PATCH v5 3/3] scsi: ufs: Add error-handling of Auto-Hibernate Stanley Chu @ 2019-05-30 2:19 ` Martin K. Petersen 3 siblings, 0 replies; 6+ messages in thread From: Martin K. Petersen @ 2019-05-30 2:19 UTC (permalink / raw) To: Stanley Chu Cc: linux-scsi, martin.petersen, marc.w.gonzalez, andy.teng, chun-hung.wu, kuohong.wang, evgreen, avri.altman, linux-mediatek, peter.wang, alim.akhtar, matthias.bgg, pedrom.sousa, linux-arm-kernel, beanhuo Stanley, > Currently auto-hibernate is activated if host supports auto-hibern8 > capability. However error-handling is not implemented, which makes the > feature somewhat risky. Applied to 5.3/scsi-queue, thanks! -- Martin K. Petersen Oracle Linux Engineering ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-05-30 2:19 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-05-21 6:44 [PATCH v5 0/3] scsi: ufs: Add error handling of Auto-Hibernate Stanley Chu
[not found] ` <1558421094-3182-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
2019-05-21 6:44 ` [PATCH v5 1/3] scsi: ufs: Introduce ufshcd_is_auto_hibern8_supported() Stanley Chu
2019-05-21 8:41 ` [PATCH v5 0/3] scsi: ufs: Add error handling of Auto-Hibernate Avri Altman
2019-05-21 6:44 ` [PATCH v5 2/3] scsi: ufs: Do not overwrite Auto-Hibernate timer Stanley Chu
2019-05-21 6:44 ` [PATCH v5 3/3] scsi: ufs: Add error-handling of Auto-Hibernate Stanley Chu
2019-05-30 2:19 ` [PATCH v5 0/3] scsi: ufs: Add error handling " Martin K. Petersen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).