scsi: ufs: core: Add a quirk for handling broken LSDBS field in controller capabilities register

'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.

Tested-by: Amit Pundir <amit.pundir@linaro.org>
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Link: https://lore.kernel.org/r/20240816-ufs-bug-fix-v3-1-e6fe0e18e2a3@linaro.org
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by Manivannan Sadhasivam and committed by Martin K. Petersen cd06b713 f03e94f2

+13 -1
+5 -1
drivers/ufs/core/ufshcd.c
··· 2426 2426 * 0h: legacy single doorbell support is available 2427 2427 * 1h: indicate that legacy single doorbell support has been removed 2428 2428 */ 2429 - hba->lsdb_sup = !FIELD_GET(MASK_LSDB_SUPPORT, hba->capabilities); 2429 + if (!(hba->quirks & UFSHCD_QUIRK_BROKEN_LSDBS_CAP)) 2430 + hba->lsdb_sup = !FIELD_GET(MASK_LSDB_SUPPORT, hba->capabilities); 2431 + else 2432 + hba->lsdb_sup = true; 2433 + 2430 2434 if (!hba->mcq_sup) 2431 2435 return 0; 2432 2436
+8
include/ufs/ufshcd.h
··· 676 676 * the standard best practice for managing keys). 677 677 */ 678 678 UFSHCD_QUIRK_KEYS_IN_PRDT = 1 << 24, 679 + 680 + /* 681 + * This quirk indicates that the controller reports the value 1 (not 682 + * supported) in the Legacy Single DoorBell Support (LSDBS) bit of the 683 + * Controller Capabilities register although it supports the legacy 684 + * single doorbell mode. 685 + */ 686 + UFSHCD_QUIRK_BROKEN_LSDBS_CAP = 1 << 25, 679 687 }; 680 688 681 689 enum ufshcd_caps {