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: blacklist Seagate drives which time out FLUSH_CACHE when used with NCQ [libata] pata_rb532_cf: fix signature of the xfer function [libata] pata_rb532_cf: fix and rename register definitions ata_piix: add borked Tecra M4 to broken suspend list
This commit is contained in:
Коммит
7ac01108e7
|
@ -1066,6 +1066,21 @@ static int piix_broken_suspend(void)
|
|||
if (dmi_find_device(DMI_DEV_TYPE_OEM_STRING, oemstrs[i], NULL))
|
||||
return 1;
|
||||
|
||||
/* TECRA M4 sometimes forgets its identify and reports bogus
|
||||
* DMI information. As the bogus information is a bit
|
||||
* generic, match as many entries as possible. This manual
|
||||
* matching is necessary because dmi_system_id.matches is
|
||||
* limited to four entries.
|
||||
*/
|
||||
if (!strcmp(dmi_get_system_info(DMI_SYS_VENDOR), "TOSHIBA") &&
|
||||
!strcmp(dmi_get_system_info(DMI_PRODUCT_NAME), "000000") &&
|
||||
!strcmp(dmi_get_system_info(DMI_PRODUCT_VERSION), "000000") &&
|
||||
!strcmp(dmi_get_system_info(DMI_PRODUCT_SERIAL), "000000") &&
|
||||
!strcmp(dmi_get_system_info(DMI_BOARD_VENDOR), "TOSHIBA") &&
|
||||
!strcmp(dmi_get_system_info(DMI_BOARD_NAME), "Portable PC") &&
|
||||
!strcmp(dmi_get_system_info(DMI_BOARD_VERSION), "Version A0"))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -2492,6 +2492,13 @@ int ata_dev_configure(struct ata_device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
if ((dev->horkage & ATA_HORKAGE_FIRMWARE_WARN) && print_info) {
|
||||
ata_dev_printk(dev, KERN_WARNING, "WARNING: device requires "
|
||||
"firmware update to be fully functional.\n");
|
||||
ata_dev_printk(dev, KERN_WARNING, " contact the vendor "
|
||||
"or visit http://ata.wiki.kernel.org.\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_out_nosup:
|
||||
|
@ -4042,6 +4049,20 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|||
{ "ST380817AS", "3.42", ATA_HORKAGE_NONCQ },
|
||||
{ "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ },
|
||||
|
||||
/* Seagate NCQ + FLUSH CACHE firmware bug */
|
||||
{ "ST31500341AS", "9JU138", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST31000333AS", "9FZ136", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640623AS", "9FZ164", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3640323AS", "9FZ134", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320813AS", "9FZ182", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
{ "ST3320613AS", "9FZ162", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
|
||||
/* Blacklist entries taken from Silicon Image 3124/3132
|
||||
Windows driver .inf file - also several Linux problem reports */
|
||||
{ "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, },
|
||||
|
|
|
@ -39,9 +39,11 @@
|
|||
#define RB500_CF_MAXPORTS 1
|
||||
#define RB500_CF_IO_DELAY 400
|
||||
|
||||
#define RB500_CF_REG_CMD 0x0800
|
||||
#define RB500_CF_REG_BASE 0x0800
|
||||
#define RB500_CF_REG_ERR 0x080D
|
||||
#define RB500_CF_REG_CTRL 0x080E
|
||||
#define RB500_CF_REG_DATA 0x0C00
|
||||
/* 32bit buffered data register offset */
|
||||
#define RB500_CF_REG_DBUF32 0x0C00
|
||||
|
||||
struct rb532_cf_info {
|
||||
void __iomem *iobase;
|
||||
|
@ -72,11 +74,12 @@ static void rb532_pata_exec_command(struct ata_port *ap,
|
|||
rb532_pata_finish_io(ap);
|
||||
}
|
||||
|
||||
static void rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf,
|
||||
static unsigned int rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf,
|
||||
unsigned int buflen, int write_data)
|
||||
{
|
||||
struct ata_port *ap = adev->link->ap;
|
||||
void __iomem *ioaddr = ap->ioaddr.data_addr;
|
||||
int retlen = buflen;
|
||||
|
||||
if (write_data) {
|
||||
for (; buflen > 0; buflen--, buf++)
|
||||
|
@ -87,6 +90,7 @@ static void rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf,
|
|||
}
|
||||
|
||||
rb532_pata_finish_io(adev->link->ap);
|
||||
return retlen;
|
||||
}
|
||||
|
||||
static void rb532_pata_freeze(struct ata_port *ap)
|
||||
|
@ -146,13 +150,14 @@ static void rb532_pata_setup_ports(struct ata_host *ah)
|
|||
ap->pio_mask = 0x1f; /* PIO4 */
|
||||
ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO;
|
||||
|
||||
ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_CMD;
|
||||
ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_BASE;
|
||||
ap->ioaddr.ctl_addr = info->iobase + RB500_CF_REG_CTRL;
|
||||
ap->ioaddr.altstatus_addr = info->iobase + RB500_CF_REG_CTRL;
|
||||
|
||||
ata_sff_std_ports(&ap->ioaddr);
|
||||
|
||||
ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DATA;
|
||||
ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DBUF32;
|
||||
ap->ioaddr.error_addr = info->iobase + RB500_CF_REG_ERR;
|
||||
}
|
||||
|
||||
static __devinit int rb532_pata_driver_probe(struct platform_device *pdev)
|
||||
|
|
|
@ -375,6 +375,7 @@ enum {
|
|||
ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */
|
||||
ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 11), /* use ATAPI DMA for commands
|
||||
not multiple of 16 bytes */
|
||||
ATA_HORKAGE_FIRMWARE_WARN = (1 << 12), /* firwmare update warning */
|
||||
|
||||
/* DMA mask for user DMA control: User visible values; DO NOT
|
||||
renumber */
|
||||
|
|
Загрузка…
Ссылка в новой задаче