Skip to content

Commit f2aac4c

Browse files
committed
ata: libata-core: Add ATA_QUIRK_NO_LPM_ON_ATI for certain Samsung SSDs
Before commit 7627a0e ("ata: ahci: Drop low power policy board type") the ATI AHCI controllers specified board type 'board_ahci' rather than board type 'board_ahci'. This means that LPM was historically not enabled for the ATI AHCI controllers. By looking at commit 7a8526a ("libata: Add ATA_HORKAGE_NO_NCQ_ON_ATI for Samsung 860 and 870 SSD."), it is clear that, for some unknown reason, that Samsung SSDs do not play nice with ATI AHCI controllers. (When using other AHCI controllers, NCQ can be enabled on these Samsung SSDs without issues.) In a similar way, from user reports, it is clear the ATI AHCI controllers can enable LPM on e.g. Maxtor HDDs perfectly fine, but when enabling LPM on certain Samsung SSDs, things break. (E.g. the SSDs will not get detected by the ATI AHCI controller even after a COMRESET.) Yet, when using LPM on these Samsung SSDs with other AHCI controllers, e.g. Intel AHCI controllers, these Samsung drives appear to work perfectly fine. Considering that the combination of ATI + Samsung, for some unknown reason, does not seem to work well, disable LPM when detecting an ATI AHCI controller with a problematic Samsung SSD. Apply this new ATA_QUIRK_NO_LPM_ON_ATI quirk for all Samsung SSDs that have already been reported to not play nice with ATI (ATA_QUIRK_NO_NCQ_ON_ATI). Fixes: 7627a0e ("ata: ahci: Drop low power policy board type") Suggested-by: Hans de Goede <hdegoede@redhat.com> Reported-by: Eric <eric.4.debian@grabatoulnz.fr> Closes: https://lore.kernel.org/linux-ide/Z8SBZMBjvVXA7OAK@eldamar.lan/ Tested-by: Eric <eric.4.debian@grabatoulnz.fr> Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Link: https://lore.kernel.org/r/20250317170348.1748671-2-cassel@kernel.org Signed-off-by: Niklas Cassel <cassel@kernel.org>
1 parent a2f925a commit f2aac4c

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

drivers/ata/libata-core.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2845,6 +2845,10 @@ int ata_dev_configure(struct ata_device *dev)
28452845
(id[ATA_ID_SATA_CAPABILITY] & 0xe) == 0x2)
28462846
dev->quirks |= ATA_QUIRK_NOLPM;
28472847

2848+
if (dev->quirks & ATA_QUIRK_NO_LPM_ON_ATI &&
2849+
ata_dev_check_adapter(dev, PCI_VENDOR_ID_ATI))
2850+
dev->quirks |= ATA_QUIRK_NOLPM;
2851+
28482852
if (ap->flags & ATA_FLAG_NO_LPM)
28492853
dev->quirks |= ATA_QUIRK_NOLPM;
28502854

@@ -3897,6 +3901,7 @@ static const char * const ata_quirk_names[] = {
38973901
[__ATA_QUIRK_MAX_SEC_1024] = "maxsec1024",
38983902
[__ATA_QUIRK_MAX_TRIM_128M] = "maxtrim128m",
38993903
[__ATA_QUIRK_NO_NCQ_ON_ATI] = "noncqonati",
3904+
[__ATA_QUIRK_NO_LPM_ON_ATI] = "nolpmonati",
39003905
[__ATA_QUIRK_NO_ID_DEV_LOG] = "noiddevlog",
39013906
[__ATA_QUIRK_NO_LOG_DIR] = "nologdir",
39023907
[__ATA_QUIRK_NO_FUA] = "nofua",
@@ -4142,13 +4147,16 @@ static const struct ata_dev_quirks_entry __ata_dev_quirks[] = {
41424147
ATA_QUIRK_ZERO_AFTER_TRIM },
41434148
{ "Samsung SSD 860*", NULL, ATA_QUIRK_NO_NCQ_TRIM |
41444149
ATA_QUIRK_ZERO_AFTER_TRIM |
4145-
ATA_QUIRK_NO_NCQ_ON_ATI },
4150+
ATA_QUIRK_NO_NCQ_ON_ATI |
4151+
ATA_QUIRK_NO_LPM_ON_ATI },
41464152
{ "Samsung SSD 870*", NULL, ATA_QUIRK_NO_NCQ_TRIM |
41474153
ATA_QUIRK_ZERO_AFTER_TRIM |
4148-
ATA_QUIRK_NO_NCQ_ON_ATI },
4154+
ATA_QUIRK_NO_NCQ_ON_ATI |
4155+
ATA_QUIRK_NO_LPM_ON_ATI },
41494156
{ "SAMSUNG*MZ7LH*", NULL, ATA_QUIRK_NO_NCQ_TRIM |
41504157
ATA_QUIRK_ZERO_AFTER_TRIM |
4151-
ATA_QUIRK_NO_NCQ_ON_ATI, },
4158+
ATA_QUIRK_NO_NCQ_ON_ATI |
4159+
ATA_QUIRK_NO_LPM_ON_ATI },
41524160
{ "FCCT*M500*", NULL, ATA_QUIRK_NO_NCQ_TRIM |
41534161
ATA_QUIRK_ZERO_AFTER_TRIM },
41544162

include/linux/libata.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ enum ata_quirks {
8888
__ATA_QUIRK_MAX_SEC_1024, /* Limit max sects to 1024 */
8989
__ATA_QUIRK_MAX_TRIM_128M, /* Limit max trim size to 128M */
9090
__ATA_QUIRK_NO_NCQ_ON_ATI, /* Disable NCQ on ATI chipset */
91+
__ATA_QUIRK_NO_LPM_ON_ATI, /* Disable LPM on ATI chipset */
9192
__ATA_QUIRK_NO_ID_DEV_LOG, /* Identify device log missing */
9293
__ATA_QUIRK_NO_LOG_DIR, /* Do not read log directory */
9394
__ATA_QUIRK_NO_FUA, /* Do not use FUA */
@@ -432,6 +433,7 @@ enum {
432433
ATA_QUIRK_MAX_SEC_1024 = (1U << __ATA_QUIRK_MAX_SEC_1024),
433434
ATA_QUIRK_MAX_TRIM_128M = (1U << __ATA_QUIRK_MAX_TRIM_128M),
434435
ATA_QUIRK_NO_NCQ_ON_ATI = (1U << __ATA_QUIRK_NO_NCQ_ON_ATI),
436+
ATA_QUIRK_NO_LPM_ON_ATI = (1U << __ATA_QUIRK_NO_LPM_ON_ATI),
435437
ATA_QUIRK_NO_ID_DEV_LOG = (1U << __ATA_QUIRK_NO_ID_DEV_LOG),
436438
ATA_QUIRK_NO_LOG_DIR = (1U << __ATA_QUIRK_NO_LOG_DIR),
437439
ATA_QUIRK_NO_FUA = (1U << __ATA_QUIRK_NO_FUA),

0 commit comments

Comments
 (0)