aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorSøren Schmidt <sos@FreeBSD.org>1999-12-07 22:07:18 +0000
committerSøren Schmidt <sos@FreeBSD.org>1999-12-07 22:07:18 +0000
commitbd533091af1a1f1a354f8c143d0b8b17856bb08e (patch)
tree999ca1c1ca2d369adab7a2756f5f1b76d142c3e2 /sys/dev
parent58085ec77720023408684f8edace1c9e1bde7d63 (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ata/ata-all.c39
-rw-r--r--sys/dev/ata/ata-disk.c4
-rw-r--r--sys/dev/ata/ata-dma.c50
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))