Message ID | 20240816-ufs-bug-fix-v3-1-e6fe0e18e2a3@linaro.org (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | ufs: qcom: Fix probe failure on SM8550 SoC due to broken LSDBS field | expand |
On 8/15/24 11:25 PM, Manivannan Sadhasivam via B4 Relay wrote: > 'Legacy Queue & Single Doorbell Support (LSDBS)' field in the controller > capabilities register is supposed to report whether the legacy single > doorbell mode is supported in the controller or not. But some controllers > report '1' in this field which corresponds to 'LSDB not supported', but > they indeed support LSDB. So let's add a quirk to handle those controllers. > > If the quirk is enabled by the controller driver, then LSDBS register field > will be ignored and legacy single doorbell mode is assumed to be enabled > always. Reviewed-by: Bart Van Assche <bvanassche@acm.org>
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 0b3d0c8e0dda..a6f818cdef0e 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -2426,7 +2426,11 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba) * 0h: legacy single doorbell support is available * 1h: indicate that legacy single doorbell support has been removed */ - hba->lsdb_sup = !FIELD_GET(MASK_LSDB_SUPPORT, hba->capabilities); + if (!(hba->quirks & UFSHCD_QUIRK_BROKEN_LSDBS_CAP)) + hba->lsdb_sup = !FIELD_GET(MASK_LSDB_SUPPORT, hba->capabilities); + else + hba->lsdb_sup = true; + if (!hba->mcq_sup) return 0; diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h index cac0cdb9a916..0fd2aebac728 100644 --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h @@ -676,6 +676,14 @@ enum ufshcd_quirks { * the standard best practice for managing keys). */ UFSHCD_QUIRK_KEYS_IN_PRDT = 1 << 24, + + /* + * This quirk indicates that the controller reports the value 1 (not + * supported) in the Legacy Single DoorBell Support (LSDBS) bit of the + * Controller Capabilities register although it supports the legacy + * single doorbell mode. + */ + UFSHCD_QUIRK_BROKEN_LSDBS_CAP = 1 << 25, }; enum ufshcd_caps {