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
This commit is contained in:
commit
56dca4ceb7
4 changed files with 21 additions and 3 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue