Skip to content

Commit 281e239

Browse files
committed
Merge tag 'ata-6.14-final' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux
Pull ata fix from Niklas Cassel: - Fix a regression on ATI AHCI controllers, where certain Samsung drives fails to be detected on a warm boot when LPM is enabled. LPM on ATI AHCI works fine with other drives. Likewise, the Samsung drives works fine with LPM with other AHI controllers. Thus, just like the weirdo ATA_QUIRK_NO_NCQ_ON_ATI quirk, add a new ATA_QUIRK_NO_LPM_ON_ATI quirk to disable LPM only on ATI AHCI controllers. * tag 'ata-6.14-final' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux: ata: libata-core: Add ATA_QUIRK_NO_LPM_ON_ATI for certain Samsung SSDs
2 parents 81e4f8d + f2aac4c commit 281e239

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

Diff for: drivers/ata/libata-core.c

+11-3
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

Diff for: include/linux/libata.h

+2
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)