Message ID | 1538434698-1042-1-git-send-email-john.stultz@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | [RESEND] scsi: ufs: Fix hynix ufs bug with quirk on hi36xx SoC | expand |
On Mon, Oct 15, 2018 at 8:41 PM, Martin K. Petersen <martin.petersen@oracle.com> wrote: > > John, > >> Hynix ufs has deviations on hi36xx platform which will result in ufs >> bursts transfer failures. > > Is this specific to the particular implementation on hi36xx or all SK > Hynix implementations? I'd have to defer to Wei Li on that question. Wei Li? >> + UFS_FIX(UFS_VENDOR_SKHYNIX, UFS_ANY_MODEL, >> + UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME), > > I am not so keen on matching on all current and future models. I'll see if I can narrow down the affected model version on the board I have. Hopefully it doesn't vary too much. Really appreciate the review and the feedback! thanks -john
On Tue, Oct 16, 2018 at 3:48 PM, John Stultz <john.stultz@linaro.org> wrote: > On Mon, Oct 15, 2018 at 8:41 PM, Martin K. Petersen > <martin.petersen@oracle.com> wrote: >> >> John, >> >>> Hynix ufs has deviations on hi36xx platform which will result in ufs >>> bursts transfer failures. >> >> Is this specific to the particular implementation on hi36xx or all SK >> Hynix implementations? > > I'd have to defer to Wei Li on that question. > > Wei Li? Just to short-cut things a bit, as this is probably an obvious followup: if it is hi36xx specific, how would you suggest a such a targeted quirk be added? I'm not sure I see how to get to the ufs_dev_desc from the ufs-hisi.c code. thanks -john
diff --git a/drivers/scsi/ufs/ufs-hisi.c b/drivers/scsi/ufs/ufs-hisi.c index 46df707..452e19f 100644 --- a/drivers/scsi/ufs/ufs-hisi.c +++ b/drivers/scsi/ufs/ufs-hisi.c @@ -20,6 +20,7 @@ #include "unipro.h" #include "ufs-hisi.h" #include "ufshci.h" +#include "ufs_quirks.h" static int ufs_hisi_check_hibern8(struct ufs_hba *hba) { @@ -390,6 +391,14 @@ static void ufs_hisi_set_dev_cap(struct ufs_hisi_dev_params *hisi_param) static void ufs_hisi_pwr_change_pre_change(struct ufs_hba *hba) { + if (hba->dev_quirks & UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME) { + pr_info("ufs flash device must set VS_DebugSaveConfigTime 0x10\n"); + /* VS_DebugSaveConfigTime */ + ufshcd_dme_set(hba, UIC_ARG_MIB(0xD0A0), 0x10); + /* sync length */ + ufshcd_dme_set(hba, UIC_ARG_MIB(0x1556), 0x48); + } + /* update */ ufshcd_dme_set(hba, UIC_ARG_MIB(0x15A8), 0x1); /* PA_TxSkip */ diff --git a/drivers/scsi/ufs/ufs_quirks.h b/drivers/scsi/ufs/ufs_quirks.h index 71f73d1..5d2dfdb 100644 --- a/drivers/scsi/ufs/ufs_quirks.h +++ b/drivers/scsi/ufs/ufs_quirks.h @@ -131,4 +131,10 @@ struct ufs_dev_fix { */ #define UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME (1 << 8) +/* + * Some UFS devices require VS_DebugSaveConfigTime is 0x10, + * enabling this quirk ensure this. + */ +#define UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME (1 << 9) + #endif /* UFS_QUIRKS_H_ */ diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index c55f38e..a67f298 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -230,6 +230,8 @@ static struct ufs_dev_fix ufs_fixups[] = { UFS_FIX(UFS_VENDOR_SKHYNIX, UFS_ANY_MODEL, UFS_DEVICE_NO_VCCQ), UFS_FIX(UFS_VENDOR_SKHYNIX, UFS_ANY_MODEL, UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME), + UFS_FIX(UFS_VENDOR_SKHYNIX, UFS_ANY_MODEL, + UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME), END_FIX };