diff options
author | marius <marius@FreeBSD.org> | 2009-12-13 18:42:06 +0000 |
---|---|---|
committer | marius <marius@FreeBSD.org> | 2009-12-13 18:42:06 +0000 |
commit | 0266d1d9310dadac44284b66cf2f8bb3740f75df (patch) | |
tree | 3c6d8ff6347264029743d4fe3fc602b814972314 | |
parent | 9b1fbd7dcf305c90301ead415bfa69cb7caab37a (diff) | |
download | FreeBSD-src-0266d1d9310dadac44284b66cf2f8bb3740f75df.zip FreeBSD-src-0266d1d9310dadac44284b66cf2f8bb3740f75df.tar.gz |
Properly support M5229 revision 0xc7 and 0xc8:
- These revisions no longer have cable detection capability.
- The UDMA support bit of register 0x4b has been dropped without an
replacement.
- According to Linux it's crucial for working ATAPI DMA support to
also set the reserved bit 1 of regsiter 0x53 with these revisions.
MFC after: 1 week
-rw-r--r-- | sys/dev/ata/chipsets/ata-acerlabs.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/dev/ata/chipsets/ata-acerlabs.c b/sys/dev/ata/chipsets/ata-acerlabs.c index e74b210..e1e4337 100644 --- a/sys/dev/ata/chipsets/ata-acerlabs.c +++ b/sys/dev/ata/chipsets/ata-acerlabs.c @@ -141,11 +141,14 @@ ata_ali_chipinit(device_t dev) /* use device interrupt as byte count end */ pci_write_config(dev, 0x4a, pci_read_config(dev, 0x4a, 1) | 0x20, 1); - /* enable cable detection and UDMA support on newer chips */ - pci_write_config(dev, 0x4b, pci_read_config(dev, 0x4b, 1) | 0x09, 1); + /* enable cable detection and UDMA support on revisions < 0xc7 */ + if (ctlr->chip->chiprev < 0xc7) + pci_write_config(dev, 0x4b, pci_read_config(dev, 0x4b, 1) | + 0x09, 1); - /* enable ATAPI UDMA mode */ - pci_write_config(dev, 0x53, pci_read_config(dev, 0x53, 1) | 0x01, 1); + /* enable ATAPI UDMA mode (even if we are going to do PIO) */ + pci_write_config(dev, 0x53, pci_read_config(dev, 0x53, 1) | + (ctlr->chip->chiprev >= 0xc7 ? 0x03 : 0x01), 1); /* only chips with revision > 0xc4 can do 48bit DMA */ if (ctlr->chip->chiprev <= 0xc4) @@ -276,7 +279,7 @@ ata_ali_setmode(device_t dev, int target, int mode) mode = min(mode, ctlr->chip->max_dma); - if (ctlr->chip->cfg2 & ALI_NEW) { + if (ctlr->chip->cfg2 & ALI_NEW && ctlr->chip->chiprev < 0xc7) { if (mode > ATA_UDMA2 && pci_read_config(parent, 0x4a, 1) & (1 << ch->unit)) { ata_print_cable(dev, "controller"); |