summaryrefslogtreecommitdiff
path: root/sys/dev/ata
diff options
context:
space:
mode:
authorSøren Schmidt <sos@FreeBSD.org>2001-12-11 10:52:57 +0000
committerSøren Schmidt <sos@FreeBSD.org>2001-12-11 10:52:57 +0000
commit5e4df03df18557690a8d025493817e4543a36f84 (patch)
treec499452b72d51be6947e97b6baa94b631bcafe60 /sys/dev/ata
parente7a9696aca2275cdb2fe021112723e7d31dc5bca (diff)
Notes
Diffstat (limited to 'sys/dev/ata')
-rw-r--r--sys/dev/ata/ata-all.c11
-rw-r--r--sys/dev/ata/ata-all.h1
-rw-r--r--sys/dev/ata/ata-dma.c44
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,