summaryrefslogtreecommitdiff
path: root/drivers/ata/pata_via.c
diff options
context:
space:
mode:
authorAlan Cox <alan@lxorguk.ukuu.org.uk>2007-05-23 22:39:01 +0100
committerJeff Garzik <jeff@garzik.org>2007-05-24 20:34:48 -0400
commitcf5792d20cdc9a88abf9984a2224f57de1952926 (patch)
treec887e7b38d139f08c3d4204945dceda1afa9a651 /drivers/ata/pata_via.c
parent6dffaf61e22d21e539ae7e30c2e33e41230c3d52 (diff)
downloadlwn-cf5792d20cdc9a88abf9984a2224f57de1952926.tar.gz
lwn-cf5792d20cdc9a88abf9984a2224f57de1952926.zip
pata_via: Handle laptops via DMI
Oh the joy of saving a fraction of a cent using short 40 wire cables and not faking 80wire Teach the VIA driver that there are some systems we need to know are magically wired for high speeds. Signed-off-by: Alan Cox <alan@redhat.com> Tested-by: Francis Russell <FrancisRussell@btinternet.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/pata_via.c')
-rw-r--r--drivers/ata/pata_via.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
index e4c71f76bd55..708dfc0c716b 100644
--- a/drivers/ata/pata_via.c
+++ b/drivers/ata/pata_via.c
@@ -60,6 +60,7 @@
#include <linux/delay.h>
#include <scsi/scsi_host.h>
#include <linux/libata.h>
+#include <linux/dmi.h>
#define DRV_NAME "pata_via"
#define DRV_VERSION "0.3.1"
@@ -122,6 +123,31 @@ static const struct via_isa_bridge {
{ NULL }
};
+
+/*
+ * Cable special cases
+ */
+
+static struct dmi_system_id cable_dmi_table[] = {
+ {
+ .ident = "Acer Ferrari 3400",
+ .matches = {
+ DMI_MATCH(DMI_BOARD_VENDOR, "Acer,Inc."),
+ DMI_MATCH(DMI_BOARD_NAME, "Ferrari 3400"),
+ },
+ },
+ { }
+};
+
+static int via_cable_override(struct pci_dev *pdev)
+{
+ /* Systems by DMI */
+ if (dmi_check_system(cable_dmi_table))
+ return 1;
+ return 0;
+}
+
+
/**
* via_cable_detect - cable detection
* @ap: ATA port
@@ -139,6 +165,9 @@ static int via_cable_detect(struct ata_port *ap) {
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
u32 ata66;
+ if (via_cable_override(pdev))
+ return ATA_CBL_PATA40_SHORT;
+
/* Early chips are 40 wire */
if ((config->flags & VIA_UDMA) < VIA_UDMA_66)
return ATA_CBL_PATA40;