mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-29 16:44:03 +00:00
Add support for VIA 82C596 controller
Better shared irq handeling for Promise & HPT366 controllers Setup prober PIO mode timings on Promise & HPT366 controllers Update Copyright headers to be Y2K compliant :)
This commit is contained in:
parent
cf8123ed18
commit
aa966b9a64
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=55333
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -74,7 +74,7 @@
|
||||
#if SMP == 0
|
||||
#define isa_apic_irq(x) x
|
||||
#endif
|
||||
#define IOMASK 0xfffffffc /* XXX SOS 0xfffc */
|
||||
#define IOMASK 0xfffffffc
|
||||
|
||||
/* prototypes */
|
||||
static int32_t ata_probe(int32_t, int32_t, int32_t, device_t, int32_t *);
|
||||
@ -189,41 +189,54 @@ ata_pcimatch(device_t dev)
|
||||
/* supported chipsets */
|
||||
case 0x12308086:
|
||||
return "Intel PIIX ATA controller";
|
||||
|
||||
case 0x70108086:
|
||||
return "Intel PIIX3 ATA controller";
|
||||
|
||||
case 0x71118086:
|
||||
case 0x71998086:
|
||||
return "Intel PIIX4 ATA controller";
|
||||
return "Intel PIIX4 ATA-33 controller";
|
||||
|
||||
case 0x522910b9:
|
||||
return "AcerLabs Aladdin ATA controller";
|
||||
return "AcerLabs Aladdin ATA-33 controller";
|
||||
|
||||
case 0x05711106: /* 82c586 & 82c686 */
|
||||
if (ata_find_dev(dev, 0x05861106))
|
||||
return "VIA 82C586 ATA controller";
|
||||
return "VIA 82C586 ATA-33 controller";
|
||||
if (ata_find_dev(dev, 0x05961106))
|
||||
return "VIA 82C596 ATA-33 controller";
|
||||
if (ata_find_dev(dev, 0x06861106))
|
||||
return "VIA 82C686 ATA controller";
|
||||
return "VIA 82C686 ATA-66 controller";
|
||||
return "VIA Apollo ATA controller";
|
||||
|
||||
case 0x55131039:
|
||||
return "SiS 5591 ATA controller";
|
||||
return "SiS 5591 ATA-33 controller";
|
||||
|
||||
case 0x74091022:
|
||||
return "AMD 756 ATA controller";
|
||||
return "AMD 756 ATA-66 controller";
|
||||
|
||||
case 0x4d33105a:
|
||||
return "Promise Ultra/33 ATA controller";
|
||||
return "Promise ATA-33 controller";
|
||||
|
||||
case 0x4d38105a:
|
||||
return "Promise Ultra/66 ATA controller";
|
||||
return "Promise ATA-66 controller";
|
||||
|
||||
case 0x00041103:
|
||||
return "HighPoint HPT366 ATA controller";
|
||||
return "HighPoint HPT366 ATA-66 controller";
|
||||
|
||||
/* unsupported but known chipsets, generic DMA only */
|
||||
case 0x05961106:
|
||||
return "VIA 82C596 ATA controller (generic mode)";
|
||||
case 0x06401095:
|
||||
return "CMD 640 ATA controller (generic mode)";
|
||||
|
||||
case 0x06461095:
|
||||
return "CMD 646 ATA controller (generic mode)";
|
||||
|
||||
case 0xc6931080:
|
||||
return "Cypress 82C693 ATA controller (generic mode)";
|
||||
|
||||
case 0x01021078:
|
||||
return "Cyrix 5530 ATA controller (generic mode)";
|
||||
|
||||
default:
|
||||
if (pci_get_class(dev) == PCIC_STORAGE &&
|
||||
(pci_get_subclass(dev) == PCIS_STORAGE_IDE))
|
||||
@ -321,21 +334,22 @@ ata_pciattach(device_t dev)
|
||||
|
||||
/* do extra chipset specific setups */
|
||||
switch (type) {
|
||||
case 0x522910b9:
|
||||
/* on the Aladdin activate the ATAPI FIFO */
|
||||
case 0x522910b9: /* Aladdin need to activate the ATAPI FIFO */
|
||||
pci_write_config(dev, 0x53,
|
||||
(pci_read_config(dev, 0x53, 1) & ~0x01) | 0x02, 1);
|
||||
break;
|
||||
|
||||
case 0x4d33105a:
|
||||
case 0x4d38105a:
|
||||
/* the Promise's need burst mode to be turned on explicitly */
|
||||
case 0x4d38105a: /* Promise's need burst mode to be turned on */
|
||||
outb(bmaddr_1 + 0x1f, inb(bmaddr_1 + 0x1f) | 0x01);
|
||||
break;
|
||||
|
||||
case 0x00041103: /* HPT366 controller defaults */
|
||||
printf("ata: HPT config %08x\n", pci_read_config(dev, 0x50, 4));
|
||||
break;
|
||||
|
||||
case 0x05711106:
|
||||
case 0x74091022:
|
||||
/* the VIA 82C586, VIA 82C686 & AMD 756 needs some sensible defaults */
|
||||
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);
|
||||
|
||||
@ -360,6 +374,7 @@ ata_pciattach(device_t dev)
|
||||
lun = 0;
|
||||
if (iobase_1 && ata_probe(iobase_1, altiobase_1, bmaddr_1, dev, &lun)) {
|
||||
scp = atadevices[lun];
|
||||
scp->chiptype = type;
|
||||
if (iobase_1 == IO_WD1)
|
||||
#ifdef __i386__
|
||||
inthand_add(device_get_nameunit(dev), irq1, ataintr, scp,
|
||||
@ -383,6 +398,7 @@ ata_pciattach(device_t dev)
|
||||
lun = 1;
|
||||
if (iobase_2 && ata_probe(iobase_2, altiobase_2, bmaddr_2, dev, &lun)) {
|
||||
scp = atadevices[lun];
|
||||
scp->chiptype = type;
|
||||
if (iobase_2 == IO_WD2)
|
||||
#ifdef __i386__
|
||||
inthand_add(device_get_nameunit(dev), irq2, ataintr, scp,
|
||||
@ -575,14 +591,30 @@ ata_probe(int32_t ioaddr, int32_t altioaddr, int32_t bmaddr,
|
||||
static void
|
||||
ataintr(void *data)
|
||||
{
|
||||
struct ata_softc *scp =(struct ata_softc *)data;
|
||||
struct ata_softc *scp = (struct ata_softc *)data;
|
||||
|
||||
/* is this interrupt really for this channel */
|
||||
if ((scp->flags & ATA_DMA_ACTIVE) &&
|
||||
!(ata_dmastatus(scp) & ATA_BMSTAT_INTERRUPT))
|
||||
return;
|
||||
/* check if this interrupt is for us (shared PCI interrupts) */
|
||||
switch (scp->chiptype) {
|
||||
case 0x00041103: /* HighPoint HPT366 controller */
|
||||
if (scp->active == ATA_IDLE)
|
||||
return;
|
||||
if (!(ata_dmastatus(scp) & ATA_BMSTAT_INTERRUPT))
|
||||
return;
|
||||
break;
|
||||
|
||||
if (((scp->status = inb(scp->ioaddr+ATA_STATUS)) & ATA_S_BUSY)==ATA_S_BUSY)
|
||||
case 0x4d33105a: /* Promise 33's */
|
||||
case 0x4d38105a: /* Promise 66's */
|
||||
if (!(inl((pci_read_config(scp->dev, 0x20, 4) & IOMASK) + 0x1c) &
|
||||
((scp->unit) ? 0x00004000 : 0x00000400)))
|
||||
return;
|
||||
break;
|
||||
|
||||
default:
|
||||
if ((scp->flags & ATA_DMA_ACTIVE) &&
|
||||
!(ata_dmastatus(scp) & ATA_BMSTAT_INTERRUPT))
|
||||
return;
|
||||
}
|
||||
if (((scp->status = inb(scp->ioaddr + ATA_STATUS))&ATA_S_BUSY)==ATA_S_BUSY)
|
||||
return;
|
||||
|
||||
/* find & call the responsible driver to process this interrupt */
|
||||
@ -623,7 +655,7 @@ ataintr(void *data)
|
||||
scp->lun, intr_count, scp->status);
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
/* return; SOS XXX */
|
||||
}
|
||||
scp->active = ATA_IDLE;
|
||||
scp->running = NULL;
|
||||
@ -883,24 +915,36 @@ int8_t *
|
||||
ata_mode2str(int32_t mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case ATA_MODE_PIO:
|
||||
return "PIO";
|
||||
case ATA_MODE_WDMA2:
|
||||
return "DMA";
|
||||
case ATA_MODE_UDMA2:
|
||||
return "UDMA33";
|
||||
case ATA_MODE_UDMA3:
|
||||
return "UDMA3";
|
||||
case ATA_MODE_UDMA4:
|
||||
return "UDMA66";
|
||||
case ATA_PIO0: return "PIO0";
|
||||
case ATA_PIO1: return "PIO1";
|
||||
case ATA_PIO2: return "PIO2";
|
||||
case ATA_PIO3: return "PIO3";
|
||||
case ATA_PIO4: return "PIO4";
|
||||
case ATA_WDMA2: return "WDMA2";
|
||||
case ATA_UDMA2: return "UDMA33";
|
||||
case ATA_UDMA4: return "UDMA66";
|
||||
default: return "???";
|
||||
}
|
||||
}
|
||||
|
||||
int8_t
|
||||
ata_pio2mode(int32_t pio)
|
||||
{
|
||||
switch (pio) {
|
||||
default:
|
||||
return "???";
|
||||
case 0: return ATA_PIO0;
|
||||
case 1: return ATA_PIO1;
|
||||
case 2: return ATA_PIO2;
|
||||
case 3: return ATA_PIO3;
|
||||
case 4: return ATA_PIO4;
|
||||
}
|
||||
}
|
||||
|
||||
static int8_t *
|
||||
active2str(int32_t active)
|
||||
{
|
||||
static char buf[8];
|
||||
|
||||
switch (active) {
|
||||
case ATA_IDLE:
|
||||
return("ATA_IDLE");
|
||||
@ -913,7 +957,8 @@ active2str(int32_t active)
|
||||
case ATA_REINITING:
|
||||
return("ATA_REINITING");
|
||||
default:
|
||||
return("UNKNOWN");
|
||||
sprintf(buf, "0x%02x", active);
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -124,12 +124,6 @@ struct ata_dmaentry {
|
||||
u_int32_t count;
|
||||
};
|
||||
|
||||
/* ATA device DMA access modes */
|
||||
#define ATA_WDMA2 0x22
|
||||
#define ATA_UDMA2 0x42
|
||||
#define ATA_UDMA3 0x43
|
||||
#define ATA_UDMA4 0x44
|
||||
|
||||
/* structure describing an ATA device */
|
||||
struct ata_softc {
|
||||
int32_t unit; /* unit on this controller */
|
||||
@ -138,14 +132,18 @@ struct ata_softc {
|
||||
int32_t ioaddr; /* port addr */
|
||||
int32_t altioaddr; /* alternate port addr */
|
||||
int32_t bmaddr; /* bus master DMA port */
|
||||
int32_t chiptype; /* pciid of controller chip */
|
||||
void *dev_softc[2]; /* ptr to devices softc's */
|
||||
struct ata_dmaentry *dmatab[2]; /* DMA transfer tables */
|
||||
int32_t mode[2]; /* transfer mode for devices */
|
||||
#define ATA_MODE_PIO 0x00
|
||||
#define ATA_MODE_WDMA2 0x01
|
||||
#define ATA_MODE_UDMA2 0x02
|
||||
#define ATA_MODE_UDMA3 0x04
|
||||
#define ATA_MODE_UDMA4 0x08
|
||||
#define ATA_PIO0 0x08
|
||||
#define ATA_PIO1 0x09
|
||||
#define ATA_PIO2 0x0a
|
||||
#define ATA_PIO3 0x0b
|
||||
#define ATA_PIO4 0x0c
|
||||
#define ATA_WDMA2 0x22
|
||||
#define ATA_UDMA2 0x42
|
||||
#define ATA_UDMA4 0x44
|
||||
|
||||
int32_t flags; /* controller flags */
|
||||
#define ATA_DMA_ACTIVE 0x01
|
||||
@ -193,6 +191,7 @@ void ata_dmastart(struct ata_softc *);
|
||||
int32_t ata_dmastatus(struct ata_softc *);
|
||||
int32_t ata_dmadone(struct ata_softc *);
|
||||
int8_t *ata_mode2str(int32_t);
|
||||
int8_t ata_pio2mode(int32_t);
|
||||
void bswap(int8_t *, int32_t);
|
||||
void btrim(int8_t *, int32_t);
|
||||
void bpack(int8_t *, int8_t *, int32_t);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -462,6 +462,7 @@ ad_transfer(struct ad_request *request)
|
||||
/* does this drive support multi sector transfers ? */
|
||||
else if (request->currentsize > DEV_BSIZE)
|
||||
cmd = request->flags & AR_F_READ?ATA_C_READ_MULTI:ATA_C_WRITE_MULTI;
|
||||
/* just plain old single sector transfer */
|
||||
else
|
||||
cmd = request->flags & AR_F_READ ? ATA_C_READ : ATA_C_WRITE;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -49,6 +49,7 @@
|
||||
#include <dev/ata/ata-disk.h>
|
||||
|
||||
/* prototypes */
|
||||
static void promise_timing(struct ata_softc *, int32_t, int32_t);
|
||||
static void hpt366_timing(struct ata_softc *, int32_t, int32_t);
|
||||
|
||||
/* misc defines */
|
||||
@ -64,8 +65,8 @@ int32_t
|
||||
ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
int32_t apiomode, int32_t wdmamode, int32_t udmamode)
|
||||
{
|
||||
int32_t type, error;
|
||||
int32_t devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1);
|
||||
int32_t error;
|
||||
void *dmatab;
|
||||
|
||||
if (!scp->bmaddr)
|
||||
@ -94,7 +95,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
}
|
||||
scp->dmatab[(device == ATA_MASTER) ? 0 : 1] = dmatab;
|
||||
|
||||
switch (type = pci_get_devid(scp->dev)) {
|
||||
switch (scp->chiptype) {
|
||||
|
||||
case 0x71118086: /* Intel PIIX4 */
|
||||
case 0x71998086: /* Intel PIIX4 */
|
||||
@ -113,7 +114,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
pci_write_config(scp->dev, 0x48,
|
||||
(pci_read_config(scp->dev, 0x48, 4) &
|
||||
~mask48) | new48, 4);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -145,7 +146,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
printf("ata%d-%s: %s setting up WDMA2 mode on PIIX%s chip\n",
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success",
|
||||
(type == 0x70108086) ? "3" : "4");
|
||||
(scp->chiptype == 0x70108086) ? "3" : "4");
|
||||
if (!error) {
|
||||
if (device == ATA_MASTER) {
|
||||
mask40 = 0x0000330f;
|
||||
@ -171,7 +172,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
pci_write_config(scp->dev, 0x44,
|
||||
(pci_read_config(scp->dev, 0x44, 4) & ~mask44)|
|
||||
new44, 4);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_WDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -197,7 +198,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_WDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -226,7 +227,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
pci_write_config(scp->dev, 0x53,
|
||||
pci_read_config(scp->dev, 0x53, 1) | 0x03, 1);
|
||||
scp->flags |= ATA_ATAPI_DMA_RO;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -241,64 +242,64 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
pci_write_config(scp->dev, 0x53,
|
||||
pci_read_config(scp->dev, 0x53, 1) | 0x03, 1);
|
||||
scp->flags |= ATA_ATAPI_DMA_RO;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_WDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/* we could set PIO mode timings, but we assume the BIOS did that */
|
||||
break;
|
||||
|
||||
case 0x05711106: /* VIA Apollo 82C571 / 82C586 / 82C686 */
|
||||
case 0x05711106: /* VIA 82C571, 82C586, 82C596 & 82C686 */
|
||||
case 0x74091022: /* AMD 756 */
|
||||
/* UDMA4 mode only on 82C686 / AMD 756 hardware */
|
||||
/* UDMA4 mode only on 82C686 and AMD 756 */
|
||||
if ((udmamode >= 4 && ata_find_dev(scp->dev, 0x06861106)) ||
|
||||
(udmamode >= 4 && type == 0x74091022)) {
|
||||
(udmamode >= 4 && scp->chiptype == 0x74091022)) {
|
||||
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 %s chip\n",
|
||||
scp->lun, (device == ATA_MASTER) ? "master":"slave",
|
||||
(error) ? "failed" : "success",
|
||||
(type == 0x74091022) ? "AMD" : "VIA");
|
||||
(scp->chiptype == 0x74091022) ? "AMD" : "VIA");
|
||||
if (!error) {
|
||||
pci_write_config(scp->dev, 0x53 - devno, 0xc3, 1);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA4;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* UDMA2 mode only on 82C686 and AMD 756 and rev 1 and better 82C586 */
|
||||
if ((udmamode >= 2 && ata_find_dev(scp->dev, 0x06861106)) ||
|
||||
(udmamode >= 2 && type == 0x74091022) ||
|
||||
(udmamode >= 2 && ata_find_dev(scp->dev, 0x05861106) &&
|
||||
pci_read_config(scp->dev, 0x08, 1) >= 0x01)) {
|
||||
/* UDMA2 mode only on 82C586 > rev1, 82C596, 82C686, AMD 756 */
|
||||
if ((udmamode >= 2 && ata_find_dev(scp->dev, 0x05861106) &&
|
||||
pci_read_config(scp->dev, 0x08, 1) >= 0x01) ||
|
||||
(udmamode >= 2 && ata_find_dev(scp->dev, 0x05961106)) ||
|
||||
(udmamode >= 2 && ata_find_dev(scp->dev, 0x06861106)) ||
|
||||
(udmamode >= 2 && scp->chiptype == 0x74091022)) {
|
||||
error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
|
||||
ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
|
||||
if (bootverbose)
|
||||
printf("ata%d-%s: %s setting up UDMA2 mode on %s chip\n",
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success",
|
||||
(type == 0x74091022) ? "AMD" : "VIA");
|
||||
(scp->chiptype == 0x74091022) ? "AMD" : "VIA");
|
||||
if (!error) {
|
||||
pci_write_config(scp->dev, 0x53 - devno, 0xc0, 1);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (wdmamode >= 2 && apiomode >= 4) {
|
||||
/* set WDMA2 mode timing */
|
||||
|
||||
error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
|
||||
ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
|
||||
if (bootverbose)
|
||||
printf("ata%d-%s: %s setting up WDMA2 mode on %s chip\n",
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success",
|
||||
(type == 0x74091022) ? "AMD" : "VIA");
|
||||
(scp->chiptype == 0x74091022) ? "AMD" : "VIA");
|
||||
if (!error) {
|
||||
pci_write_config(scp->dev, 0x53 - devno, 0x82, 1);
|
||||
pci_write_config(scp->dev, 0x4b - devno, 0x31, 1);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_WDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -315,7 +316,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
pci_write_config(scp->dev, 0x40 + (devno << 1), 0xa301, 2);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -328,7 +329,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
pci_write_config(scp->dev, 0x40 + (devno << 1), 0x0301, 2);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_WDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -342,7 +343,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
(device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE))
|
||||
break;
|
||||
|
||||
if (udmamode >=4 && type == 0x4d38105a &&
|
||||
if (udmamode >=4 && scp->chiptype == 0x4d38105a &&
|
||||
!(pci_read_config(scp->dev, 0x50, 2)&(scp->unit ? 1<<11 : 1<<10))) {
|
||||
error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
|
||||
ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
|
||||
@ -352,8 +353,8 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
outb(scp->bmaddr+0x11, inl(scp->bmaddr+0x11) | scp->unit ? 8:2);
|
||||
pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4;
|
||||
promise_timing(scp, devno, ATA_UDMA4);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA4;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -365,8 +366,8 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
|
||||
promise_timing(scp, devno, ATA_UDMA2);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -378,15 +379,23 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004367f3, 4);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
|
||||
promise_timing(scp, devno, ATA_WDMA2);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_WDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
|
||||
ata_pio2mode(apiomode),
|
||||
ATA_C_F_SETXFER, ATA_WAIT_READY);
|
||||
if (bootverbose)
|
||||
printf("ata%d-%s: setting PIO mode on Promise chip\n",
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave");
|
||||
pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004fe924, 4);
|
||||
printf("ata%d-%s: %s setting up PIO%d mode on Promise chip\n",
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success",
|
||||
(apiomode >= 0) ? apiomode : 0);
|
||||
if (!error) {
|
||||
promise_timing(scp, devno, ata_pio2mode(apiomode));
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x00041103: /* HighPoint HPT366 controller */
|
||||
@ -403,21 +412,8 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
hpt366_timing(scp, device, ATA_MODE_UDMA4);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (udmamode >=3 && !(pci_read_config(scp->dev, 0x5a, 1) & 0x2)) {
|
||||
error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
|
||||
ATA_UDMA3, ATA_C_F_SETXFER, ATA_WAIT_READY);
|
||||
if (bootverbose)
|
||||
printf("ata%d-%s: %s setting up UDMA3 mode on HPT366 chip\n",
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
hpt366_timing(scp, device, ATA_MODE_UDMA3);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA3;
|
||||
hpt366_timing(scp, devno, ATA_UDMA4);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA4;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -429,8 +425,8 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
hpt366_timing(scp, device, ATA_MODE_UDMA2);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
|
||||
hpt366_timing(scp, devno, ATA_UDMA2);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -442,15 +438,23 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
hpt366_timing(scp, device, ATA_MODE_WDMA2);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
|
||||
hpt366_timing(scp, devno, ATA_WDMA2);
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_WDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
|
||||
ata_pio2mode(apiomode),
|
||||
ATA_C_F_SETXFER, ATA_WAIT_READY);
|
||||
if (bootverbose)
|
||||
printf("ata%d-%s: setting PIO mode on HPT366 chip\n",
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave");
|
||||
hpt366_timing(scp, device, ATA_MODE_PIO);
|
||||
printf("ata%d-%s: %s setting up PIO%d mode on HPT366 chip\n",
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success",
|
||||
(apiomode >= 0) ? apiomode : 0);
|
||||
if (!error) {
|
||||
hpt366_timing(scp, devno, ata_pio2mode(apiomode));
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default: /* unknown controller chip */
|
||||
@ -462,7 +466,7 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
/* well, we have no support for this, but try anyways */
|
||||
if ((wdmamode >= 2 && apiomode >= 4) && scp->bmaddr) {
|
||||
#if MAYBE_NOT
|
||||
&& (inb(scp->bmaddr + ATA_BMSTAT_PORT) &
|
||||
&& (inb(scp->bmaddr + ATA_BMSTAT_PORT) &
|
||||
((device == ATA_MASTER) ?
|
||||
ATA_BMSTAT_DMA_MASTER : ATA_BMSTAT_DMA_SLAVE))) {
|
||||
#endif
|
||||
@ -473,12 +477,20 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success");
|
||||
if (!error) {
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_WDMA2;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
free(dmatab, M_DEVBUF);
|
||||
error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
|
||||
ata_pio2mode(apiomode), ATA_C_F_SETXFER,ATA_WAIT_READY);
|
||||
if (bootverbose)
|
||||
printf("ata%d-%s: %s setting up PIO%d mode on generic chip\n",
|
||||
scp->lun, (device == ATA_MASTER) ? "master" : "slave",
|
||||
(error) ? "failed" : "success", (apiomode >= 0) ? apiomode : 0);
|
||||
if (!error)
|
||||
scp->mode[(device == ATA_MASTER) ? 0 : 1] = ata_pio2mode(apiomode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -552,43 +564,70 @@ ata_dmastatus(struct ata_softc *scp)
|
||||
}
|
||||
|
||||
static void
|
||||
hpt366_timing(struct ata_softc *scp, int32_t device, int32_t mode)
|
||||
promise_timing(struct ata_softc *scp, int32_t devno, int32_t mode)
|
||||
{
|
||||
u_int32_t timing;
|
||||
switch (mode) {
|
||||
default:
|
||||
case ATA_PIO0: timing = 0x004ff329; break;
|
||||
case ATA_PIO1: timing = 0x004fec25; break;
|
||||
case ATA_PIO2: timing = 0x004fe823; break;
|
||||
case ATA_PIO3: timing = 0x004fe622; break;
|
||||
case ATA_PIO4: timing = 0x004fe421; break;
|
||||
case ATA_WDMA2: timing = 0x004367f3; break;
|
||||
case ATA_UDMA2: timing = 0x004127f3; break;
|
||||
case ATA_UDMA4: timing = 0x004127f3; break;
|
||||
}
|
||||
pci_write_config(scp->dev, 0x60 + (devno << 2), timing, 4);
|
||||
}
|
||||
|
||||
static void
|
||||
hpt366_timing(struct ata_softc *scp, int32_t devno, int32_t mode)
|
||||
{
|
||||
u_int32_t timing;
|
||||
|
||||
switch (pci_read_config(scp->dev, (device == ATA_MASTER) ? 0x41 : 0x45, 1)){
|
||||
switch (pci_read_config(scp->dev, 0x41 + (devno << 2), 1)) {
|
||||
case 0x85: /* 25Mhz */
|
||||
switch (mode) {
|
||||
case ATA_MODE_PIO: timing = 0xc0ca8521; break;
|
||||
case ATA_MODE_WDMA2: timing = 0xa0ca8521; break;
|
||||
case ATA_MODE_UDMA2:
|
||||
case ATA_MODE_UDMA3: timing = 0x90cf8521; break;
|
||||
case ATA_MODE_UDMA4: timing = 0x90c98521; break;
|
||||
default: timing = 0x01208585;
|
||||
case ATA_PIO0: timing = 0xc0d08585; break;
|
||||
case ATA_PIO1: timing = 0xc0d08572; break;
|
||||
case ATA_PIO2: timing = 0xc0ca8542; break;
|
||||
case ATA_PIO3: timing = 0xc0ca8532; break;
|
||||
case ATA_PIO4: timing = 0xc0ca8521; break;
|
||||
case ATA_WDMA2: timing = 0xa0ca8521; break;
|
||||
case ATA_UDMA2: timing = 0x90cf8521; break;
|
||||
case ATA_UDMA4: timing = 0x90c98521; break;
|
||||
default: timing = 0x01208585;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
case 0xa7: /* 33MHz */
|
||||
switch (mode) {
|
||||
case ATA_MODE_PIO: timing = 0xc0c8a731; break;
|
||||
case ATA_MODE_WDMA2: timing = 0xa0c8a731; break;
|
||||
case ATA_MODE_UDMA2: timing = 0x90caa731; break;
|
||||
case ATA_MODE_UDMA3: timing = 0x90cfa731; break;
|
||||
case ATA_MODE_UDMA4: timing = 0x90c9a731; break;
|
||||
default: timing = 0x0120a7a7;
|
||||
case ATA_PIO0: timing = 0xc0d0a7aa; break;
|
||||
case ATA_PIO1: timing = 0xc0d0a7a3; break;
|
||||
case ATA_PIO2: timing = 0xc0d0a753; break;
|
||||
case ATA_PIO3: timing = 0xc0c8a742; break;
|
||||
case ATA_PIO4: timing = 0xc0c8a731; break;
|
||||
case ATA_WDMA2: timing = 0xa0c8a731; break;
|
||||
case ATA_UDMA2: timing = 0x90caa731; break;
|
||||
case ATA_UDMA4: timing = 0x90c9a731; break;
|
||||
default: timing = 0x0120a7a7;
|
||||
}
|
||||
break;
|
||||
case 0xd9: /* 40Mhz */
|
||||
switch (mode) {
|
||||
case ATA_MODE_PIO: timing = 0xc008d963; break;
|
||||
case ATA_MODE_WDMA2: timing = 0xa008d943; break;
|
||||
case ATA_MODE_UDMA2: timing = 0x900bd943; break;
|
||||
case ATA_MODE_UDMA3: timing = 0x900ad943; break;
|
||||
case ATA_MODE_UDMA4: timing = 0x900fd943; break;
|
||||
default: timing = 0x0120d9d9;
|
||||
case ATA_PIO0: timing = 0xc018d9d9; break;
|
||||
case ATA_PIO1: timing = 0xc010d9c7; break;
|
||||
case ATA_PIO2: timing = 0xc010d997; break;
|
||||
case ATA_PIO3: timing = 0xc010d974; break;
|
||||
case ATA_PIO4: timing = 0xc008d963; break;
|
||||
case ATA_WDMA2: timing = 0xa008d943; break;
|
||||
case ATA_UDMA2: timing = 0x900bd943; break;
|
||||
case ATA_UDMA4: timing = 0x900fd943; break;
|
||||
default: timing = 0x0120d9d9;
|
||||
}
|
||||
}
|
||||
pci_write_config(scp->dev, (device==ATA_MASTER ? 0x40 : 0x44), timing, 4);
|
||||
pci_write_config(scp->dev, 0x40 + (devno << 2) , timing, 4);
|
||||
}
|
||||
|
||||
#else /* NPCI > 0 */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 1998,1999 Søren Schmidt
|
||||
* Copyright (c) 1998,1999,2000 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
Loading…
Reference in New Issue
Block a user