aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-12-01 14:23:33 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2008-12-01 14:23:33 -0500
commit7ac01108e71ca8ccc2ded4ee98035d0e5db9c981 (patch)
treeafb50d33254337c73d450687cfeae18aa096b6c0
parent4bc2a9bf8cbb63f3bb9797b2bf30b2316bd27a2b (diff)
parentac70a964b0e22a95af3628c344815857a01461b7 (diff)
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
-rw-r--r--drivers/ata/ata_piix.c15
-rw-r--r--drivers/ata/libata-core.c21
-rw-r--r--drivers/ata/pata_rb532_cf.c15
-rw-r--r--include/linux/libata.h1
4 files changed, 47 insertions, 5 deletions
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
index 8e37be19bbf5..d6d97d8f3fa4 100644
--- a/drivers/ata/ata_piix.c
+++ b/drivers/ata/ata_piix.c
@@ -1066,6 +1066,21 @@ static int piix_broken_suspend(void)
1066 if (dmi_find_device(DMI_DEV_TYPE_OEM_STRING, oemstrs[i], NULL)) 1066 if (dmi_find_device(DMI_DEV_TYPE_OEM_STRING, oemstrs[i], NULL))
1067 return 1; 1067 return 1;
1068 1068
1069 /* TECRA M4 sometimes forgets its identify and reports bogus
1070 * DMI information. As the bogus information is a bit
1071 * generic, match as many entries as possible. This manual
1072 * matching is necessary because dmi_system_id.matches is
1073 * limited to four entries.
1074 */
1075 if (!strcmp(dmi_get_system_info(DMI_SYS_VENDOR), "TOSHIBA") &&
1076 !strcmp(dmi_get_system_info(DMI_PRODUCT_NAME), "000000") &&
1077 !strcmp(dmi_get_system_info(DMI_PRODUCT_VERSION), "000000") &&
1078 !strcmp(dmi_get_system_info(DMI_PRODUCT_SERIAL), "000000") &&
1079 !strcmp(dmi_get_system_info(DMI_BOARD_VENDOR), "TOSHIBA") &&
1080 !strcmp(dmi_get_system_info(DMI_BOARD_NAME), "Portable PC") &&
1081 !strcmp(dmi_get_system_info(DMI_BOARD_VERSION), "Version A0"))
1082 return 1;
1083
1069 return 0; 1084 return 0;
1070} 1085}
1071 1086
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 4214bfb13bbd..5e2eb740df46 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -2492,6 +2492,13 @@ int ata_dev_configure(struct ata_device *dev)
2492 } 2492 }
2493 } 2493 }
2494 2494
2495 if ((dev->horkage & ATA_HORKAGE_FIRMWARE_WARN) && print_info) {
2496 ata_dev_printk(dev, KERN_WARNING, "WARNING: device requires "
2497 "firmware update to be fully functional.\n");
2498 ata_dev_printk(dev, KERN_WARNING, " contact the vendor "
2499 "or visit http://ata.wiki.kernel.org.\n");
2500 }
2501
2495 return 0; 2502 return 0;
2496 2503
2497err_out_nosup: 2504err_out_nosup:
@@ -4042,6 +4049,20 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
4042 { "ST380817AS", "3.42", ATA_HORKAGE_NONCQ }, 4049 { "ST380817AS", "3.42", ATA_HORKAGE_NONCQ },
4043 { "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ }, 4050 { "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ },
4044 4051
4052 /* Seagate NCQ + FLUSH CACHE firmware bug */
4053 { "ST31500341AS", "9JU138", ATA_HORKAGE_NONCQ |
4054 ATA_HORKAGE_FIRMWARE_WARN },
4055 { "ST31000333AS", "9FZ136", ATA_HORKAGE_NONCQ |
4056 ATA_HORKAGE_FIRMWARE_WARN },
4057 { "ST3640623AS", "9FZ164", ATA_HORKAGE_NONCQ |
4058 ATA_HORKAGE_FIRMWARE_WARN },
4059 { "ST3640323AS", "9FZ134", ATA_HORKAGE_NONCQ |
4060 ATA_HORKAGE_FIRMWARE_WARN },
4061 { "ST3320813AS", "9FZ182", ATA_HORKAGE_NONCQ |
4062 ATA_HORKAGE_FIRMWARE_WARN },
4063 { "ST3320613AS", "9FZ162", ATA_HORKAGE_NONCQ |
4064 ATA_HORKAGE_FIRMWARE_WARN },
4065
4045 /* Blacklist entries taken from Silicon Image 3124/3132 4066 /* Blacklist entries taken from Silicon Image 3124/3132
4046 Windows driver .inf file - also several Linux problem reports */ 4067 Windows driver .inf file - also several Linux problem reports */
4047 { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, }, 4068 { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, },
diff --git a/drivers/ata/pata_rb532_cf.c b/drivers/ata/pata_rb532_cf.c
index f8b3ffc8ae9e..c2e6fb9f2ef9 100644
--- a/drivers/ata/pata_rb532_cf.c
+++ b/drivers/ata/pata_rb532_cf.c
@@ -39,9 +39,11 @@
39#define RB500_CF_MAXPORTS 1 39#define RB500_CF_MAXPORTS 1
40#define RB500_CF_IO_DELAY 400 40#define RB500_CF_IO_DELAY 400
41 41
42#define RB500_CF_REG_CMD 0x0800 42#define RB500_CF_REG_BASE 0x0800
43#define RB500_CF_REG_ERR 0x080D
43#define RB500_CF_REG_CTRL 0x080E 44#define RB500_CF_REG_CTRL 0x080E
44#define RB500_CF_REG_DATA 0x0C00 45/* 32bit buffered data register offset */
46#define RB500_CF_REG_DBUF32 0x0C00
45 47
46struct rb532_cf_info { 48struct rb532_cf_info {
47 void __iomem *iobase; 49 void __iomem *iobase;
@@ -72,11 +74,12 @@ static void rb532_pata_exec_command(struct ata_port *ap,
72 rb532_pata_finish_io(ap); 74 rb532_pata_finish_io(ap);
73} 75}
74 76
75static void rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf, 77static unsigned int rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf,
76 unsigned int buflen, int write_data) 78 unsigned int buflen, int write_data)
77{ 79{
78 struct ata_port *ap = adev->link->ap; 80 struct ata_port *ap = adev->link->ap;
79 void __iomem *ioaddr = ap->ioaddr.data_addr; 81 void __iomem *ioaddr = ap->ioaddr.data_addr;
82 int retlen = buflen;
80 83
81 if (write_data) { 84 if (write_data) {
82 for (; buflen > 0; buflen--, buf++) 85 for (; buflen > 0; buflen--, buf++)
@@ -87,6 +90,7 @@ static void rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf,
87 } 90 }
88 91
89 rb532_pata_finish_io(adev->link->ap); 92 rb532_pata_finish_io(adev->link->ap);
93 return retlen;
90} 94}
91 95
92static void rb532_pata_freeze(struct ata_port *ap) 96static void rb532_pata_freeze(struct ata_port *ap)
@@ -146,13 +150,14 @@ static void rb532_pata_setup_ports(struct ata_host *ah)
146 ap->pio_mask = 0x1f; /* PIO4 */ 150 ap->pio_mask = 0x1f; /* PIO4 */
147 ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO; 151 ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO;
148 152
149 ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_CMD; 153 ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_BASE;
150 ap->ioaddr.ctl_addr = info->iobase + RB500_CF_REG_CTRL; 154 ap->ioaddr.ctl_addr = info->iobase + RB500_CF_REG_CTRL;
151 ap->ioaddr.altstatus_addr = info->iobase + RB500_CF_REG_CTRL; 155 ap->ioaddr.altstatus_addr = info->iobase + RB500_CF_REG_CTRL;
152 156
153 ata_sff_std_ports(&ap->ioaddr); 157 ata_sff_std_ports(&ap->ioaddr);
154 158
155 ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DATA; 159 ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DBUF32;
160 ap->ioaddr.error_addr = info->iobase + RB500_CF_REG_ERR;
156} 161}
157 162
158static __devinit int rb532_pata_driver_probe(struct platform_device *pdev) 163static __devinit int rb532_pata_driver_probe(struct platform_device *pdev)
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 59b0f1c807b5..ed3f26eb5df1 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -375,6 +375,7 @@ enum {
375 ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */ 375 ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */
376 ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 11), /* use ATAPI DMA for commands 376 ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 11), /* use ATAPI DMA for commands
377 not multiple of 16 bytes */ 377 not multiple of 16 bytes */
378 ATA_HORKAGE_FIRMWARE_WARN = (1 << 12), /* firwmare update warning */
378 379
379 /* DMA mask for user DMA control: User visible values; DO NOT 380 /* DMA mask for user DMA control: User visible values; DO NOT
380 renumber */ 381 renumber */