diff options
| author | Søren Schmidt <sos@FreeBSD.org> | 1999-12-07 22:07:18 +0000 |
|---|---|---|
| committer | Søren Schmidt <sos@FreeBSD.org> | 1999-12-07 22:07:18 +0000 |
| commit | bd533091af1a1f1a354f8c143d0b8b17856bb08e (patch) | |
| tree | 999ca1c1ca2d369adab7a2756f5f1b76d142c3e2 /sys/dev | |
| parent | 58085ec77720023408684f8edace1c9e1bde7d63 (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ata/ata-all.c | 39 | ||||
| -rw-r--r-- | sys/dev/ata/ata-disk.c | 4 | ||||
| -rw-r--r-- | sys/dev/ata/ata-dma.c | 50 |
3 files changed, 61 insertions, 32 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c index 0467dd208dd8b..669b67e0ffc75 100644 --- a/sys/dev/ata/ata-all.c +++ b/sys/dev/ata/ata-all.c @@ -188,37 +188,43 @@ ata_pcimatch(device_t dev) switch (pci_get_devid(dev)) { /* supported chipsets */ case 0x12308086: - return "Intel PIIX IDE controller"; + return "Intel PIIX ATA controller"; case 0x70108086: - return "Intel PIIX3 IDE controller"; + return "Intel PIIX3 ATA controller"; case 0x71118086: - return "Intel PIIX4 IDE controller"; + return "Intel PIIX4 ATA controller"; case 0x522910b9: - return "AcerLabs Aladdin IDE controller"; + return "AcerLabs Aladdin ATA controller"; case 0x4d33105a: - return "Promise Ultra/33 IDE controller"; + return "Promise Ultra/33 ATA controller"; case 0x4d38105a: - return "Promise Ultra/66 IDE controller"; + return "Promise Ultra/66 ATA controller"; case 0x00041103: - return "HighPoint HPT366 IDE controller"; + return "HighPoint HPT366 ATA controller"; case 0x05711106: /* 82c586 & 82c686 */ - return "VIA Apollo IDE controller"; + switch (pci_read_config(dev, 0x08, 1)) { + case 1: + return "VIA 82C586 ATA controller"; + case 6: + return "VIA 82C686 ATA controller"; + } + return "VIA Apollo ATA controller"; /* unsupported but known chipsets, generic DMA only */ - case 0x05961106: /* 82c596 */ - return "VIA Apollo IDE controller (generic mode)"; + case 0x05961106: + return "VIA 82C596 ATA controller (generic mode)"; case 0x06401095: - return "CMD 640 IDE controller (generic mode)"; + return "CMD 640 ATA controller (generic mode)"; case 0x06461095: - return "CMD 646 IDE controller (generic mode)"; + return "CMD 646 ATA controller (generic mode)"; case 0xc6931080: - return "Cypress 82C693 IDE controller (generic mode)"; + return "Cypress 82C693 ATA controller (generic mode)"; case 0x01021078: - return "Cyrix 5530 IDE controller (generic mode)"; + return "Cyrix 5530 ATA controller (generic mode)"; default: if (pci_get_class(dev) == PCIC_STORAGE && (pci_get_subclass(dev) == PCIS_STORAGE_IDE)) - return "Unknown PCI IDE controller (generic mode)"; + return "Unknown PCI ATA controller (generic mode)"; } return NULL; } @@ -227,6 +233,7 @@ static int ata_pciprobe(device_t dev) { const char *desc = ata_pcimatch(dev); + if (desc) { device_set_desc(dev, desc); return 0; @@ -839,8 +846,10 @@ ata_command(struct ata_softc *scp, int32_t device, u_int32_t command, printf("ata%d-%s: timeout waiting for command=%02x s=%02x e=%02x\n", scp->lun, device ? "slave" : "master", command, scp->status, scp->error); + scp->active = ATA_IDLE; return -1; } + scp->active = ATA_IDLE; break; case ATA_IMMEDIATE: diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c index b5d573e0b074b..f4e5e1cd8d1c4 100644 --- a/sys/dev/ata/ata-disk.c +++ b/sys/dev/ata/ata-disk.c @@ -158,6 +158,7 @@ ad_attach(void *notused) free(adp, M_AD); continue; } + adp->controller->dev_softc[(adp->unit==ATA_MASTER)?0:1] = adp; adp->heads = adp->ata_parm->heads; adp->sectors = adp->ata_parm->sectors; adp->total_secs = @@ -198,9 +199,6 @@ ad_attach(void *notused) if ((adp->num_tags = (adp->ata_parm->queuelen & 0x1f) + 1)) adp->flags |= AD_F_TAG_ENABLED; - /* store our softc */ - adp->controller->dev_softc[(adp->unit==ATA_MASTER)?0:1] = adp; - bpack(adp->ata_parm->model, model_buf, sizeof(model_buf)); bpack(adp->ata_parm->revision, revision_buf, sizeof(revision_buf)); diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c index 0909b3c7350e4..c40596216b35b 100644 --- a/sys/dev/ata/ata-dma.c +++ b/sys/dev/ata/ata-dma.c @@ -35,6 +35,8 @@ #include <sys/buf.h> #include <sys/malloc.h> #include <sys/bus.h> +#include <sys/disk.h> +#include <sys/devicestat.h> #include <vm/vm.h> #include <vm/pmap.h> #if NPCI > 0 @@ -44,6 +46,7 @@ #include <machine/apm_bios.h> #endif #include <dev/ata/ata-all.h> +#include <dev/ata/ata-disk.h> /* prototypes */ static void hpt366_timing(struct ata_softc *, int32_t, int32_t); @@ -225,26 +228,34 @@ ata_dmainit(struct ata_softc *scp, int32_t device, /* we could set PIO mode timings, but we assume the BIOS did that */ break; - case 0x05711106: /* VIA Apollo 82c586 / 82c686 */ + case 0x05711106: /* VIA Apollo 82c571 / 82c586 / 82c686 */ devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1); - if (udmamode >= 2 && pci_read_config(scp->dev, 0x0d, 1) >= 0x20) { + + /* UDMA4 mode only on rev 6 (VT82C686) hardware */ + if (udmamode >= 4 && pci_read_config(scp->dev, 0x08, 1) == 0x06) { int8_t byte = pci_read_config(scp->dev, 0x53 - devno, 1); /* enable UDMA transfer modes setting by SETFEATURES cmd */ pci_write_config(scp->dev, 0x53 - devno, (byte & 0x1c) | 0x40, 1); - - if (udmamode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); - if (bootverbose) - printf("ata%d: %s: %s setting up UDMA4 mode on VIA chip\n", - scp->lun, (device == ATA_MASTER) ? "master":"slave", - (error) ? "failed" : "success"); - if (!error) { - scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4; - return 0; - } + if (bootverbose) + printf("ata%d: %s: %s setting up UDMA4 mode on VIA chip\n", + scp->lun, (device == ATA_MASTER) ? "master":"slave", + (error) ? "failed" : "success"); + if (!error) { + scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4; + return 0; } + pci_write_config(scp->dev, 0x53 - devno, byte, 1); + } + + /* UDMA2 mode only on rev 1 and up (VT82C586, VT82C686) hardware */ + if (udmamode >= 2 && pci_read_config(scp->dev, 0x08, 1) >= 0x01) { + int8_t byte = pci_read_config(scp->dev, 0x53 - devno, 1); + + /* enable UDMA transfer modes setting by SETFEATURES cmd */ + pci_write_config(scp->dev, 0x53 - devno, (byte & 0x1c) | 0x40, 1); error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) @@ -252,6 +263,17 @@ ata_dmainit(struct ata_softc *scp, int32_t device, scp->lun, (device == ATA_MASTER) ? "master" : "slave", (error) ? "failed" : "success"); if (!error) { + if ((device == ATA_MASTER && scp->devices & ATA_ATA_MASTER) || + (device == ATA_SLAVE && scp->devices & ATA_ATA_SLAVE)) { + struct ata_params *ap = ((struct ad_softc *) + (scp->dev_softc[(device==ATA_MASTER)?0:1]))->ata_parm; + + if ((pci_read_config(scp->dev, 0x08, 1) == 0x06) && + (ap->udmamodes & 0x10) && !ap->cblid) { + pci_write_config(scp->dev, 0x53 - devno, + (byte & 0x1c) | 0x42, 1); + } + } scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; return 0; } @@ -330,7 +352,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device, pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004fe924, 4); break; - case 0x00041103: /* HighPoint HPT366 IDE controller */ + case 0x00041103: /* HighPoint HPT366 controller */ /* no ATAPI devices for now */ if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) || (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE)) |
