diff options
| author | Søren Schmidt <sos@FreeBSD.org> | 2001-01-17 09:22:13 +0000 |
|---|---|---|
| committer | Søren Schmidt <sos@FreeBSD.org> | 2001-01-17 09:22:13 +0000 |
| commit | af152621e59844fa27c23c8b3f6dabd9ef372fe2 (patch) | |
| tree | 53450eb205c0aeed40d4621193f2e3f7b8ee8aa0 | |
| parent | c0f67a683ae5f06927c696cbbf6522e66e6779d2 (diff) | |
Notes
| -rw-r--r-- | sys/dev/ata/ata-all.c | 3 | ||||
| -rw-r--r-- | sys/dev/ata/ata-dma.c | 46 |
2 files changed, 46 insertions, 3 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c index 9ec4296c8955..9dec51c5adc3 100644 --- a/sys/dev/ata/ata-all.c +++ b/sys/dev/ata/ata-all.c @@ -276,6 +276,8 @@ ata_pci_match(device_t dev) return "VIA 82C596 ATA66 controller"; if (ata_find_dev(dev, 0x05961106, 0)) return "VIA 82C596 ATA33 controller"; + if (ata_find_dev(dev, 0x06861106, 0x40)) + return "VIA 82C686 ATA100 controller"; if (ata_find_dev(dev, 0x06861106, 0)) return "VIA 82C686 ATA66 controller"; return "VIA Apollo ATA controller"; @@ -450,6 +452,7 @@ ata_pci_attach(device_t dev) case 0x05711106: case 0x74091022: /* VIA 82C586, 82C596, 82C686 & AMD 756 default setup */ + /* set prefetch, postwrite */ pci_write_config(dev, 0x41, pci_read_config(dev, 0x41, 1) | 0xf0, 1); diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c index 373f1289bdbb..acf3bfb90df2 100644 --- a/sys/dev/ata/ata-dma.c +++ b/sys/dev/ata/ata-dma.c @@ -353,9 +353,49 @@ ata_dmainit(struct ata_softc *scp, int device, goto via_82c586; case 0x05711106: /* VIA 82C571, 82C586, 82C596, 82C686 */ - if (ata_find_dev(parent, 0x06861106, 0) || /* 82C686a */ - ata_find_dev(parent, 0x05961106, 0x12)) { /* 82C596b */ - + if (ata_find_dev(parent, 0x06861106, 0x40)) { /* 82C686b */ + if (udmamode >= 5) { + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY); + if (bootverbose) + ata_printf(scp, device, + "%s setting UDMA5 on VIA chip\n", + (error) ? "failed" : "success"); + if (!error) { + pci_write_config(parent, 0x53 - devno, 0xf0, 1); + scp->mode[ATA_DEV(device)] = ATA_UDMA5; + return; + } + } + if (udmamode >= 4) { + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); + if (bootverbose) + ata_printf(scp, device, + "%s setting UDMA4 on VIA chip\n", + (error) ? "failed" : "success"); + if (!error) { + pci_write_config(parent, 0x53 - devno, 0xf1, 1); + scp->mode[ATA_DEV(device)] = ATA_UDMA4; + return; + } + } + if (udmamode >= 2) { + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); + if (bootverbose) + ata_printf(scp, device, + "%s setting UDMA2 on VIA chip\n", + (error) ? "failed" : "success"); + if (!error) { + pci_write_config(parent, 0x53 - devno, 0xf4, 1); + scp->mode[ATA_DEV(device)] = ATA_UDMA2; + return; + } + } + } + else if (ata_find_dev(parent, 0x05961106, 0) || /* 82C596a */ + ata_find_dev(parent, 0x05861106, 0x02)) { /* 82C586b */ if (udmamode >= 4) { error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); |
