* [PATCH v1 1/3] scsi: ufs: do not overwrite auto-hibern8 timer
2019-05-13 14:36 [PATCH v1 0/3] scsi: ufs: add error handlings of auto-hibern8 Stanley Chu
@ 2019-05-13 14:36 ` Stanley Chu
2019-05-13 14:36 ` [PATCH v1 2/3] scsi: ufs: add error handling of auto-hibern8 Stanley Chu
` (2 subsequent siblings)
3 siblings, 0 replies; 11+ messages in thread
From: Stanley Chu @ 2019-05-13 14:36 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,
subhashj, linux-mediatek, peter.wang, vivek.gautam, matthias.bgg,
sayalil, Stanley Chu, linux-arm-kernel, beanhuo
Some vendor-specific initialization flow may set its own
auto-hibern8 timer. In this case, do not overwrite timer value
as "default value" in ufshcd_init().
Signed-off-by: Stanley Chu <stanley.chu@mediatek.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 e040f9dd9ff3..1665820c22fd 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -8309,7 +8309,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] 11+ messages in thread* [PATCH v1 2/3] scsi: ufs: add error handling of auto-hibern8
2019-05-13 14:36 [PATCH v1 0/3] scsi: ufs: add error handlings of auto-hibern8 Stanley Chu
2019-05-13 14:36 ` [PATCH v1 1/3] scsi: ufs: do not overwrite auto-hibern8 timer Stanley Chu
@ 2019-05-13 14:36 ` Stanley Chu
2019-05-13 18:21 ` [EXT] " Bean Huo (beanhuo)
[not found] ` <1557758186-18706-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
2019-05-13 14:51 ` [PATCH v1 0/3] scsi: ufs: add error handlings of auto-hibern8 Marc Gonzalez
3 siblings, 1 reply; 11+ messages in thread
From: Stanley Chu @ 2019-05-13 14:36 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,
subhashj, linux-mediatek, peter.wang, vivek.gautam, matthias.bgg,
sayalil, Stanley Chu, linux-arm-kernel, beanhuo
Currently auto-hibern8 is activated if host supports
auto-hibern8 capability. However no error handlings are existed thus
this feature is kind of risky.
If "Hibernate Enter" or "Hibernate Exit" fail happens
during auto-hibern8 flow, the corresponding interrupt
"UIC_HIBERNATE_ENTER" or "UIC_HIBERNATE_EXIT" shall be raised
according to UFS specification.
This patch adds auto-hibern8 error handlings:
- Monitor "Hibernate Enter" and "Hibernate Exit" interrupts after
auto-hibern8 feature is activated.
- If fail happens, trigger error handlings just like "manual-hibernate"
fail and use the same flow: Identify errors and 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>
---
drivers/scsi/ufs/ufshcd.c | 14 ++++++++++++++
drivers/scsi/ufs/ufshcd.h | 13 +++++++++++++
drivers/scsi/ufs/ufshci.h | 3 +++
3 files changed, 30 insertions(+)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 1665820c22fd..e0e3930abc19 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) ||
+ ufshcd_is_auto_hibern8_error(hba, hba->saved_err) ||
((hba->saved_err & UIC_ERROR) &&
(hba->saved_uic_err & (UFSHCD_UIC_DL_PA_INIT_ERROR |
UFSHCD_UIC_DL_NAC_RECEIVED_ERROR |
@@ -5431,6 +5432,15 @@ static void ufshcd_check_errors(struct ufs_hba *hba)
queue_eh_work = true;
}
+ if (ufshcd_is_auto_hibern8_error(hba, hba->errors)) {
+ 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 +5503,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..1bd9c8b61ed2 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -740,6 +740,19 @@ return true;
#endif
}
+static inline bool ufshcd_is_auto_hibern8_supported(struct ufs_hba *hba)
+{
+ return (hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT);
+}
+
+static inline bool ufshcd_is_auto_hibern8_error(struct ufs_hba *hba,
+ u32 intr_mask)
+{
+ return (ufshcd_is_auto_hibern8_supported(hba) &&
+ !hba->uic_async_done &&
+ (intr_mask & UFSHCD_UIC_AH8_ERROR_MASK));
+}
+
#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] 11+ messages in thread* RE: [EXT] [PATCH v1 2/3] scsi: ufs: add error handling of auto-hibern8
2019-05-13 14:36 ` [PATCH v1 2/3] scsi: ufs: add error handling of auto-hibern8 Stanley Chu
@ 2019-05-13 18:21 ` Bean Huo (beanhuo)
[not found] ` <BN7PR08MB568438668FC7C90A1284F53DDB0F0-7KdolmqvL8eEpBUohhTomJNArRD3w/9+vxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
0 siblings, 1 reply; 11+ messages in thread
From: Bean Huo (beanhuo) @ 2019-05-13 18:21 UTC (permalink / raw)
To: Stanley Chu, linux-scsi@vger.kernel.org,
martin.petersen@oracle.com, avri.altman@wdc.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, subhashj@codeaurora.org,
linux-mediatek@lists.infradead.org, peter.wang@mediatek.com,
vivek.gautam@codeaurora.org, matthias.bgg@gmail.com,
sayalil@codeaurora.org, linux-arm-kernel@lists.infradead.org
Hi, Stanley
>+
>+static inline bool ufshcd_is_auto_hibern8_error(struct ufs_hba *hba,
>+ u32 intr_mask)
>+{
>+ return (ufshcd_is_auto_hibern8_supported(hba) &&
>+ !hba->uic_async_done &&
Here check if uic_async_done is NULL, no big problem so far, but not safe enough.
How about setting a flag in ufshcd_auto_hibern8_enable(),
I concern about how to compatible with auto_hibern8 disabled condition.
//Bean
^ permalink raw reply [flat|nested] 11+ messages in thread
[parent not found: <1557758186-18706-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>]
* [PATCH v1 3/3] scsi: ufs: use re-factored auto_hibern8 function
[not found] ` <1557758186-18706-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
@ 2019-05-13 14:36 ` Stanley Chu
0 siblings, 0 replies; 11+ messages in thread
From: Stanley Chu @ 2019-05-13 14:36 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, subhashj-sgV2jX0FEOL9JmXXK+q4OQ,
linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
peter.wang-NuS5LvNUpcJWk0Htik3J/w,
vivek.gautam-sgV2jX0FEOL9JmXXK+q4OQ,
matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w,
sayalil-sgV2jX0FEOL9JmXXK+q4OQ, 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>
---
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 e0e3930abc19..17df5913389d 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -8323,7 +8323,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] 11+ messages in thread
* Re: [PATCH v1 0/3] scsi: ufs: add error handlings of auto-hibern8
2019-05-13 14:36 [PATCH v1 0/3] scsi: ufs: add error handlings of auto-hibern8 Stanley Chu
` (2 preceding siblings ...)
[not found] ` <1557758186-18706-1-git-send-email-stanley.chu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
@ 2019-05-13 14:51 ` Marc Gonzalez
2019-05-14 6:25 ` Stanley Chu
[not found] ` <55818bc4-d464-bb35-25bb-9ef87af8224e-GANU6spQydw@public.gmane.org>
3 siblings, 2 replies; 11+ messages in thread
From: Marc Gonzalez @ 2019-05-13 14:51 UTC (permalink / raw)
To: Stanley Chu, linux-scsi, martin.petersen, avri.altman,
alim.akhtar, pedrom.sousa
Cc: andy.teng, chun-hung.wu, kuohong.wang, evgreen, subhashj,
linux-mediatek, peter.wang, vivek.gautam, matthias.bgg, sayalil,
linux-arm-kernel, beanhuo
On 13/05/2019 16:36, Stanley Chu wrote:
> Currently auto-hibern8 is activated if host supports
> auto-hibern8 capability. However no error handlings are existed thus
> this feature is kind of risky.
This last sentence is not very idiomatic.
I would suggest:
"However, error-handling is not implemented, which makes the feature
somewhat risky."
> If "Hibernate Enter" or "Hibernate Exit" fail happens
I would suggest:
If either "Hibernate Enter" or "Hibernate Exit" fail during ...
> during auto-hibern8 flow, the corresponding interrupt
> "UIC_HIBERNATE_ENTER" or "UIC_HIBERNATE_EXIT" shall be raised
> according to UFS specification.
>
> This patch adds auto-hibern8 error handlings:
error-handling
> - Monitor "Hibernate Enter" and "Hibernate Exit" interrupts after
> auto-hibern8 feature is activated.
I just want to take this opportunity to ask a rhetorical question.
Who in the Great Heavens thought it would be a good idea to call the
feature "auto-hibern8" ?
Was it really worth it to save 2 characters by writing "8" instead
of "ate" ?
This bugs me so much that I just might send a patch to fix it up.
Regards.
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH v1 0/3] scsi: ufs: add error handlings of auto-hibern8
2019-05-13 14:51 ` [PATCH v1 0/3] scsi: ufs: add error handlings of auto-hibern8 Marc Gonzalez
@ 2019-05-14 6:25 ` Stanley Chu
[not found] ` <55818bc4-d464-bb35-25bb-9ef87af8224e-GANU6spQydw@public.gmane.org>
1 sibling, 0 replies; 11+ messages in thread
From: Stanley Chu @ 2019-05-14 6:25 UTC (permalink / raw)
To: Marc Gonzalez
Cc: linux-scsi, martin.petersen, vivek.gautam, andy.teng,
chun-hung.wu, kuohong.wang, subhashj, evgreen, avri.altman,
linux-mediatek, peter.wang, alim.akhtar, matthias.bgg, sayalil,
pedrom.sousa, linux-arm-kernel, beanhuo
Hi Marc,
Thank you so much for below suggestions. I will fix them all in next
version.
On Mon, 2019-05-13 at 16:51 +0200, Marc Gonzalez wrote:
> On 13/05/2019 16:36, Stanley Chu wrote:
>
> > Currently auto-hibern8 is activated if host supports
> > auto-hibern8 capability. However no error handlings are existed thus
> > this feature is kind of risky.
>
> This last sentence is not very idiomatic.
>
> I would suggest:
> "However, error-handling is not implemented, which makes the feature
> somewhat risky."
>
> > If "Hibernate Enter" or "Hibernate Exit" fail happens
>
> I would suggest:
> If either "Hibernate Enter" or "Hibernate Exit" fail during ...
>
> > during auto-hibern8 flow, the corresponding interrupt
> > "UIC_HIBERNATE_ENTER" or "UIC_HIBERNATE_EXIT" shall be raised
> > according to UFS specification.
> >
> > This patch adds auto-hibern8 error handlings:
>
> error-handling
>
> > - Monitor "Hibernate Enter" and "Hibernate Exit" interrupts after
> > auto-hibern8 feature is activated.
>
> I just want to take this opportunity to ask a rhetorical question.
>
> Who in the Great Heavens thought it would be a good idea to call the
> feature "auto-hibern8" ?
>
> Was it really worth it to save 2 characters by writing "8" instead
> of "ate" ?
>
> This bugs me so much that I just might send a patch to fix it up.
As far as I know, the term "HIBERN8" is mentioned in all UFS related
specifications, like UFS, UFSHCI, UniPro and M-PHY. So probably this
abbreviation has existed for a long time.
>
> Regards.
Thanks,
Stanley
^ permalink raw reply [flat|nested] 11+ messages in thread[parent not found: <55818bc4-d464-bb35-25bb-9ef87af8224e-GANU6spQydw@public.gmane.org>]
* RE: [PATCH v1 0/3] scsi: ufs: add error handlings of auto-hibern8
[not found] ` <55818bc4-d464-bb35-25bb-9ef87af8224e-GANU6spQydw@public.gmane.org>
@ 2019-05-20 5:58 ` Avri Altman
0 siblings, 0 replies; 11+ messages in thread
From: Avri Altman @ 2019-05-20 5:58 UTC (permalink / raw)
To: Marc Gonzalez, 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: 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,
subhashj-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
peter.wang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org,
vivek.gautam-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
sayalil-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
beanhuo-AL4WhLSQfzjQT0dZR+AlfA@public.gmane.org
>
> On 13/05/2019 16:36, Stanley Chu wrote:
>
> > Currently auto-hibern8 is activated if host supports
> > auto-hibern8 capability. However no error handlings are existed thus
> > this feature is kind of risky.
>
> This last sentence is not very idiomatic.
>
> I would suggest:
> "However, error-handling is not implemented, which makes the feature
> somewhat risky."
>
> > If "Hibernate Enter" or "Hibernate Exit" fail happens
>
> I would suggest:
> If either "Hibernate Enter" or "Hibernate Exit" fail during ...
>
> > during auto-hibern8 flow, the corresponding interrupt
> > "UIC_HIBERNATE_ENTER" or "UIC_HIBERNATE_EXIT" shall be raised
> > according to UFS specification.
> >
> > This patch adds auto-hibern8 error handlings:
>
> error-handling
>
> > - Monitor "Hibernate Enter" and "Hibernate Exit" interrupts after
> > auto-hibern8 feature is activated.
>
> I just want to take this opportunity to ask a rhetorical question.
>
> Who in the Great Heavens thought it would be a good idea to call the
> feature "auto-hibern8" ?
>
> Was it really worth it to save 2 characters by writing "8" instead
> of "ate" ?
>
> This bugs me so much that I just might send a patch to fix it up.
As strange as it may be, this is not the product of the creative mind
Of the original driver's authors, nor even JEDEC guys which uses it in
their specs (both UFS & HCI).
This strange amalgam dates back to the mipi-unipro terminology.
Thanks,
Avri
^ permalink raw reply [flat|nested] 11+ messages in thread