Skip to content
Snippets Groups Projects
Commit 6d0e194d authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik
Browse files

pata_via: disable ATAPI DMA on AVERATEC 3200


On AVERATEC 3200, pata_via causes memory corruption with ATAPI DMA,
which often leads to random kernel oops.  The cause of the problem is
not well understood yet and only small subset of machines using the
controller seem affected.  Blacklist ATAPI DMA on the machine.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=11426


Reported-and-tested-by: default avatarJim Bray <jimsantelmo@gmail.com>
Cc: Alan Cox <alan@linux.intel.com>
Cc: stable@kernel.org
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent ebd1699e
No related merge requests found
...@@ -124,6 +124,17 @@ static const struct via_isa_bridge { ...@@ -124,6 +124,17 @@ static const struct via_isa_bridge {
{ NULL } { NULL }
}; };
static const struct dmi_system_id no_atapi_dma_dmi_table[] = {
{
.ident = "AVERATEC 3200",
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "AVERATEC"),
DMI_MATCH(DMI_BOARD_NAME, "3200"),
},
},
{ }
};
struct via_port { struct via_port {
u8 cached_device; u8 cached_device;
}; };
...@@ -355,6 +366,13 @@ static unsigned long via_mode_filter(struct ata_device *dev, unsigned long mask) ...@@ -355,6 +366,13 @@ static unsigned long via_mode_filter(struct ata_device *dev, unsigned long mask)
mask &= ~ ATA_MASK_UDMA; mask &= ~ ATA_MASK_UDMA;
} }
} }
if (dev->class == ATA_DEV_ATAPI &&
dmi_check_system(no_atapi_dma_dmi_table)) {
ata_dev_warn(dev, "controller locks up on ATAPI DMA, forcing PIO\n");
mask &= ATA_MASK_PIO;
}
return mask; return mask;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment