mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
scsi: ufs: qcom: Add UFSHCD_QUIRK_BROKEN_LSDBS_CAP for SM8550 SoC
SM8550 SoC has the UFSHCI 4.0 compliant UFS controller and only supports legacy single doorbell mode without MCQ. But due to a hardware bug, it reports 1 in the 'Legacy Queue & Single Doorbell Support (LSDBS)' field of the Controller Capabilities register. This field is supposed to read as 0 if legacy single doorbell mode is supported and 1 otherwise. Starting with commit0c60eb0cc3
("scsi: ufs: core: Check LSDBS cap when !mcq"), ufshcd driver is now relying on the LSDBS field to decide when to use the legacy doorbell mode if MCQ is not supported. And this ends up breaking UFS on SM8550: ufshcd-qcom 1d84000.ufs: ufshcd_init: failed to initialize (legacy doorbell mode not supported) ufshcd-qcom 1d84000.ufs: error -EINVAL: Initialization failed with error -22 So use the UFSHCD_QUIRK_BROKEN_LSDBS_CAP quirk for SM8550 SoC so that the ufshcd driver could use legacy doorbell mode correctly. Fixes:0c60eb0cc3
("scsi: ufs: core: Check LSDBS cap when !mcq") Tested-by: Amit Pundir <amit.pundir@linaro.org> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Link: https://lore.kernel.org/r/20240816-ufs-bug-fix-v3-2-e6fe0e18e2a3@linaro.org Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
cd06b713a6
commit
ea593e028a
@ -857,6 +857,9 @@ static void ufs_qcom_advertise_quirks(struct ufs_hba *hba)
|
|||||||
|
|
||||||
if (host->hw_ver.major > 0x3)
|
if (host->hw_ver.major > 0x3)
|
||||||
hba->quirks |= UFSHCD_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH;
|
hba->quirks |= UFSHCD_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH;
|
||||||
|
|
||||||
|
if (of_device_is_compatible(hba->dev->of_node, "qcom,sm8550-ufshc"))
|
||||||
|
hba->quirks |= UFSHCD_QUIRK_BROKEN_LSDBS_CAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ufs_qcom_set_phy_gear(struct ufs_qcom_host *host)
|
static void ufs_qcom_set_phy_gear(struct ufs_qcom_host *host)
|
||||||
@ -1848,6 +1851,7 @@ static void ufs_qcom_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
static const struct of_device_id ufs_qcom_of_match[] __maybe_unused = {
|
static const struct of_device_id ufs_qcom_of_match[] __maybe_unused = {
|
||||||
{ .compatible = "qcom,ufshc" },
|
{ .compatible = "qcom,ufshc" },
|
||||||
|
{ .compatible = "qcom,sm8550-ufshc" },
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, ufs_qcom_of_match);
|
MODULE_DEVICE_TABLE(of, ufs_qcom_of_match);
|
||||||
|
Loading…
Reference in New Issue
Block a user