Commit 281e2396 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents 81e4f8d6 f2aac4c7
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -2845,6 +2845,10 @@ int ata_dev_configure(struct ata_device *dev)
	    (id[ATA_ID_SATA_CAPABILITY] & 0xe) == 0x2)
		dev->quirks |= ATA_QUIRK_NOLPM;

	if (dev->quirks & ATA_QUIRK_NO_LPM_ON_ATI &&
	    ata_dev_check_adapter(dev, PCI_VENDOR_ID_ATI))
		dev->quirks |= ATA_QUIRK_NOLPM;

	if (ap->flags & ATA_FLAG_NO_LPM)
		dev->quirks |= ATA_QUIRK_NOLPM;

@@ -3897,6 +3901,7 @@ static const char * const ata_quirk_names[] = {
	[__ATA_QUIRK_MAX_SEC_1024]	= "maxsec1024",
	[__ATA_QUIRK_MAX_TRIM_128M]	= "maxtrim128m",
	[__ATA_QUIRK_NO_NCQ_ON_ATI]	= "noncqonati",
	[__ATA_QUIRK_NO_LPM_ON_ATI]	= "nolpmonati",
	[__ATA_QUIRK_NO_ID_DEV_LOG]	= "noiddevlog",
	[__ATA_QUIRK_NO_LOG_DIR]	= "nologdir",
	[__ATA_QUIRK_NO_FUA]		= "nofua",
@@ -4142,13 +4147,16 @@ static const struct ata_dev_quirks_entry __ata_dev_quirks[] = {
						ATA_QUIRK_ZERO_AFTER_TRIM },
	{ "Samsung SSD 860*",		NULL,	ATA_QUIRK_NO_NCQ_TRIM |
						ATA_QUIRK_ZERO_AFTER_TRIM |
						ATA_QUIRK_NO_NCQ_ON_ATI },
						ATA_QUIRK_NO_NCQ_ON_ATI |
						ATA_QUIRK_NO_LPM_ON_ATI },
	{ "Samsung SSD 870*",		NULL,	ATA_QUIRK_NO_NCQ_TRIM |
						ATA_QUIRK_ZERO_AFTER_TRIM |
						ATA_QUIRK_NO_NCQ_ON_ATI },
						ATA_QUIRK_NO_NCQ_ON_ATI |
						ATA_QUIRK_NO_LPM_ON_ATI },
	{ "SAMSUNG*MZ7LH*",		NULL,	ATA_QUIRK_NO_NCQ_TRIM |
						ATA_QUIRK_ZERO_AFTER_TRIM |
						ATA_QUIRK_NO_NCQ_ON_ATI, },
						ATA_QUIRK_NO_NCQ_ON_ATI |
						ATA_QUIRK_NO_LPM_ON_ATI },
	{ "FCCT*M500*",			NULL,	ATA_QUIRK_NO_NCQ_TRIM |
						ATA_QUIRK_ZERO_AFTER_TRIM },

+2 −0
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ enum ata_quirks {
	__ATA_QUIRK_MAX_SEC_1024,	/* Limit max sects to 1024 */
	__ATA_QUIRK_MAX_TRIM_128M,	/* Limit max trim size to 128M */
	__ATA_QUIRK_NO_NCQ_ON_ATI,	/* Disable NCQ on ATI chipset */
	__ATA_QUIRK_NO_LPM_ON_ATI,	/* Disable LPM on ATI chipset */
	__ATA_QUIRK_NO_ID_DEV_LOG,	/* Identify device log missing */
	__ATA_QUIRK_NO_LOG_DIR,		/* Do not read log directory */
	__ATA_QUIRK_NO_FUA,		/* Do not use FUA */
@@ -432,6 +433,7 @@ enum {
	ATA_QUIRK_MAX_SEC_1024		= (1U << __ATA_QUIRK_MAX_SEC_1024),
	ATA_QUIRK_MAX_TRIM_128M		= (1U << __ATA_QUIRK_MAX_TRIM_128M),
	ATA_QUIRK_NO_NCQ_ON_ATI		= (1U << __ATA_QUIRK_NO_NCQ_ON_ATI),
	ATA_QUIRK_NO_LPM_ON_ATI		= (1U << __ATA_QUIRK_NO_LPM_ON_ATI),
	ATA_QUIRK_NO_ID_DEV_LOG		= (1U << __ATA_QUIRK_NO_ID_DEV_LOG),
	ATA_QUIRK_NO_LOG_DIR		= (1U << __ATA_QUIRK_NO_LOG_DIR),
	ATA_QUIRK_NO_FUA		= (1U << __ATA_QUIRK_NO_FUA),