From 789c68e980a2ef99afeb13056862b5586cf0e955 Mon Sep 17 00:00:00 2001 From: Sanjeev Yadav Date: Thu, 11 Jan 2024 15:25:04 +0530 Subject: [PATCH] ANDROID: scsi: ufs: UFS HPB feature not working UFS HPB feature not working/disabled for some UFS storage device in Android12-5.10 There was below error trigger in the UFS init flow at kernel bootup time. [name:ufshcd_core&]ufshpb_get_dev_info: HPB 103 version is not supported. [name:ufshcd_core&]ufshcd_query_flag: Sending flag query for idn 18 failed, err = 253 [name:ufshcd_core&]ufshcd_query_flag: Sending flag query for idn 18 failed, err = 253 [name:ufshcd_core&]ufshcd_query_flag: Sending flag query for idn 18 failed, err = 253 [name:ufshcd_core&]ufshcd_query_flag_retry: query attribute, opcode 5, idn 18, failed with error 253 after 3 retires It observed that the 0x103 version have some extension of legacy UFS HPB. We have to consider all the extension of legacy (after 0x100 in the code for legacy support). Similar for Advanced version(0x200) also. Added mask for the major version so that it can be picked for legacy or advance HPB version accordingly and support HPB thereafter. UFS HPB feature has been integrated in Linux stable branch from linux-5.15. So it is not there in Linux-5.10.y stable branch and recently from Linux-6.6, this HPB feature removed from the mainline. i.e. submitted this bug here in Android12-5.10 as this is Android specific. Bug: 320628430 Change-Id: I171255de991f19d5d662447939f35e6595d1c4e2 Fixes: 756ecd96f649 ("scsi: ufs: Add HPB 2.0 support") Signed-off-by: Sanjeev Yadav --- drivers/scsi/ufs/ufshpb.c | 2 +- drivers/scsi/ufs/ufshpb.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/ufs/ufshpb.c b/drivers/scsi/ufs/ufshpb.c index a869668f3061..93e27eea89b0 100644 --- a/drivers/scsi/ufs/ufshpb.c +++ b/drivers/scsi/ufs/ufshpb.c @@ -2873,7 +2873,7 @@ void ufshpb_get_dev_info(struct ufs_hba *hba, u8 *desc_buf) hpb_dev_info->control_mode = desc_buf[DEVICE_DESC_PARAM_HPB_CONTROL]; - version = get_unaligned_be16(desc_buf + DEVICE_DESC_PARAM_HPB_VER); + version = get_unaligned_be16(desc_buf + DEVICE_DESC_PARAM_HPB_VER) & HPB_MAJOR_VERSION_MASK; if ((version != HPB_SUPPORT_VERSION) && (version != HPB_SUPPORT_LEGACY_VERSION)) { dev_err(hba->dev, "%s: HPB %x version is not supported.\n", diff --git a/drivers/scsi/ufs/ufshpb.h b/drivers/scsi/ufs/ufshpb.h index a79e07398970..6371ece513d5 100644 --- a/drivers/scsi/ufs/ufshpb.h +++ b/drivers/scsi/ufs/ufshpb.h @@ -53,6 +53,7 @@ #define HPB_SUPPORT_VERSION 0x200 #define HPB_SUPPORT_LEGACY_VERSION 0x100 +#define HPB_MAJOR_VERSION_MASK 0xFF00 enum UFSHPB_MODE { HPB_HOST_CONTROL,