Browse Source

Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev:
  [libata] Call flush_dcache_page after PIO data transfers in libata-sff.c
  ahci: add Acer G725 to broken suspend list
  libata: fix ata_id_logical_per_physical_sectors
  libata-scsi passthru: fix bug which truncated LBA48 return values
Linus Torvalds 15 years ago
parent
commit
56dca4ceb7
4 changed files with 21 additions and 3 deletions
  1. 15 0
      drivers/ata/ahci.c
  2. 1 1
      drivers/ata/libata-scsi.c
  3. 3 0
      drivers/ata/libata-sff.c
  4. 2 2
      include/linux/ata.h

+ 15 - 0
drivers/ata/ahci.c

@@ -2868,6 +2868,21 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
 			},
 			},
 			.driver_data = "F.23",	/* cutoff BIOS version */
 			.driver_data = "F.23",	/* cutoff BIOS version */
 		},
 		},
+		/*
+		 * Acer eMachines G725 has the same problem.  BIOS
+		 * V1.03 is known to be broken.  V3.04 is known to
+		 * work.  Inbetween, there are V1.06, V2.06 and V3.03
+		 * that we don't have much idea about.  For now,
+		 * blacklist anything older than V3.04.
+		 */
+		{
+			.ident = "G725",
+			.matches = {
+				DMI_MATCH(DMI_SYS_VENDOR, "eMachines"),
+				DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"),
+			},
+			.driver_data = "V3.04",	/* cutoff BIOS version */
+		},
 		{ }	/* terminate list */
 		{ }	/* terminate list */
 	};
 	};
 	const struct dmi_system_id *dmi = dmi_first_match(sysids);
 	const struct dmi_system_id *dmi = dmi_first_match(sysids);

+ 1 - 1
drivers/ata/libata-scsi.c

@@ -2875,7 +2875,7 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
 	 * write indication (used for PIO/DMA setup), result TF is
 	 * write indication (used for PIO/DMA setup), result TF is
 	 * copied back and we don't whine too much about its failure.
 	 * copied back and we don't whine too much about its failure.
 	 */
 	 */
-	tf->flags = ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
+	tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
 	if (scmd->sc_data_direction == DMA_TO_DEVICE)
 	if (scmd->sc_data_direction == DMA_TO_DEVICE)
 		tf->flags |= ATA_TFLAG_WRITE;
 		tf->flags |= ATA_TFLAG_WRITE;
 
 

+ 3 - 0
drivers/ata/libata-sff.c

@@ -893,6 +893,9 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
 				       do_write);
 				       do_write);
 	}
 	}
 
 
+	if (!do_write)
+		flush_dcache_page(page);
+
 	qc->curbytes += qc->sect_size;
 	qc->curbytes += qc->sect_size;
 	qc->cursg_ofs += qc->sect_size;
 	qc->cursg_ofs += qc->sect_size;
 
 

+ 2 - 2
include/linux/ata.h

@@ -647,9 +647,9 @@ static inline int ata_id_has_large_logical_sectors(const u16 *id)
 	return id[ATA_ID_SECTOR_SIZE] & (1 << 13);
 	return id[ATA_ID_SECTOR_SIZE] & (1 << 13);
 }
 }
 
 
-static inline u8 ata_id_logical_per_physical_sectors(const u16 *id)
+static inline u16 ata_id_logical_per_physical_sectors(const u16 *id)
 {
 {
-	return id[ATA_ID_SECTOR_SIZE] & 0xf;
+	return 1 << (id[ATA_ID_SECTOR_SIZE] & 0xf);
 }
 }
 
 
 static inline int ata_id_has_lba48(const u16 *id)
 static inline int ata_id_has_lba48(const u16 *id)