diff options
| author | Søren Schmidt <sos@FreeBSD.org> | 2001-12-11 10:52:57 +0000 |
|---|---|---|
| committer | Søren Schmidt <sos@FreeBSD.org> | 2001-12-11 10:52:57 +0000 |
| commit | 5e4df03df18557690a8d025493817e4543a36f84 (patch) | |
| tree | c499452b72d51be6947e97b6baa94b631bcafe60 /sys/dev/ata | |
| parent | e7a9696aca2275cdb2fe021112723e7d31dc5bca (diff) | |
Notes
Diffstat (limited to 'sys/dev/ata')
| -rw-r--r-- | sys/dev/ata/ata-all.c | 11 | ||||
| -rw-r--r-- | sys/dev/ata/ata-all.h | 1 | ||||
| -rw-r--r-- | sys/dev/ata/ata-dma.c | 44 |
3 files changed, 52 insertions, 4 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c index 49d73543743d..6594bbdd80a7 100644 --- a/sys/dev/ata/ata-all.c +++ b/sys/dev/ata/ata-all.c @@ -1131,11 +1131,18 @@ ata_intr(void *data) case 0x4d38105a: /* Promise Ultra/Fasttrak 66 */ case 0x4d30105a: /* Promise Ultra/Fasttrak 100 */ case 0x0d30105a: /* Promise OEM ATA100 */ - case 0x4d68105a: /* Promise TX2 ATA100 */ - case 0x6268105a: /* Promise TX2v2 ATA100 */ if (!(inl(rman_get_start(sc->bmio) + 0x1c) & (scp->channel ? 0x00004000 : 0x00000400))) return; + goto out; + + case 0x4d68105a: /* Promise TX2 ATA100 */ + case 0x6268105a: /* Promise TX2v2 ATA100 */ + case 0x4d69105a: /* Promise ATA133 */ + outb(rman_get_start(scp->r_bmio) + 0x01, 0x0b); + if (!(inb(rman_get_start(scp->r_bmio) + 0x03) & 0x20)) + return 1; + /* FALLTHROUGH */ out: #endif diff --git a/sys/dev/ata/ata-all.h b/sys/dev/ata/ata-all.h index 0c6f7b4b5e57..8cf403fd0234 100644 --- a/sys/dev/ata/ata-all.h +++ b/sys/dev/ata/ata-all.h @@ -309,6 +309,7 @@ struct ata_softc { #define ATA_PIO4 0x0c #define ATA_DMA 0x10 #define ATA_WDMA2 0x22 +#define ATA_UDMA 0x40 #define ATA_UDMA2 0x42 #define ATA_UDMA4 0x44 #define ATA_UDMA5 0x45 diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c index 8f0ff4269843..01210c5c8731 100644 --- a/sys/dev/ata/ata-dma.c +++ b/sys/dev/ata/ata-dma.c @@ -42,6 +42,7 @@ #include <pci/pcivar.h> #endif #include <machine/bus.h> +#include <sys/rman.h> #include <dev/ata/ata-all.h> #if NPCI > 0 @@ -727,10 +728,49 @@ via_82c586: /* we could set PIO mode timings, but we assume the BIOS did that */ break; + case 0x4d68105a: /* Promise TX2 ATA100 controllers */ + case 0x6268105a: /* Promise TX2v2 ATA100 controllers */ + case 0x4d69105a: /* Promise ATA133 controllers */ + outb(rman_get_start(scp->r_bmio) + 0x01, 0x0b); + if (udmamode >= 4 && !(inb(rman_get_start(scp->r_bmio) + 0x03) & 0x04)){ + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + ATA_UDMA + udmamode, ATA_C_F_SETXFER, + ATA_WAIT_READY); + if (bootverbose) + ata_printf(scp, device, "%s setting %s on Promise chip\n", + (error) ? "failed" : "success", + ata_mode2str(ATA_UDMA + udmamode)); + if (!error) { + scp->mode[ATA_DEV(device)] = ATA_UDMA + udmamode; + 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 %s on Promise chip\n", + (error) ? "failed" : "success", "UDMA2"); + if (!error) { + scp->mode[ATA_DEV(device)] = ATA_UDMA2; + return; + } + } + if (wdmamode >= 2 && apiomode >= 4) { + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); + if (bootverbose) + ata_printf(scp, device, "%s setting %s on Promise chip\n", + (error) ? "failed" : "success", "WDMA2"); + if (!error) { + scp->mode[ATA_DEV(device)] = ATA_WDMA2; + return; + } + } + break; + case 0x4d30105a: /* Promise Ultra/FastTrak 100 controllers */ case 0x0d30105a: /* Promise OEM ATA100 controllers */ - case 0x4d68105a: /* Promise TX2 ATA100 controllers */ - case 0x6268105a: /* Promise TX2v2 ATA100 controllers */ if (!ATAPI_DEVICE(scp, device) && udmamode >= 5 && !(pci_read_config(parent, 0x50, 2)&(scp->channel ? 1<<11 : 1<<10))){ error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, |
