Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci The OPTi controller supports a 32-bit dataport a...
details: https://anonhg.NetBSD.org/src/rev/7909e629e5da
branches: trunk
changeset: 487441:7909e629e5da
user: scw <scw%NetBSD.org@localhost>
date: Wed Jun 07 20:42:52 2000 +0000
description:
The OPTi controller supports a 32-bit dataport after all.
Also detect when the chip is sitting on a 25MHz PCIbus and
set the timing registers accordingly.
diffstat:
sys/dev/pci/pciide.c | 23 ++++++++++++++---------
sys/dev/pci/pciide_opti_reg.h | 27 +++++++++++++++++++++------
2 files changed, 35 insertions(+), 15 deletions(-)
diffs (113 lines):
diff -r 508931872ee1 -r 7909e629e5da sys/dev/pci/pciide.c
--- a/sys/dev/pci/pciide.c Wed Jun 07 20:42:19 2000 +0000
+++ b/sys/dev/pci/pciide.c Wed Jun 07 20:42:52 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pciide.c,v 1.65 2000/06/07 04:31:49 thorpej Exp $ */
+/* $NetBSD: pciide.c,v 1.66 2000/06/07 20:42:52 scw Exp $ */
/*
@@ -2940,7 +2940,8 @@
pciide_mapreg_dma(sc, pa);
printf("\n");
- sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_MODE;
+ sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
+ WDC_CAPABILITY_MODE;
sc->sc_wdcdev.PIO_cap = 4;
if (sc->sc_dma_ok) {
sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA;
@@ -2985,7 +2986,7 @@
struct ata_drive_datas *drvp;
struct pciide_channel *cp = (struct pciide_channel*)chp;
struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
- int drive;
+ int drive, spd;
int mode[2];
u_int8_t rv, mr;
@@ -3001,6 +3002,10 @@
/* Prime the control register before setting timing values */
opti_write_config(chp, OPTI_REG_CONTROL, OPTI_CONTROL_DISABLE);
+ /* Determine the clockrate of the PCIbus the chip is attached to */
+ spd = (int) opti_read_config(chp, OPTI_REG_STRAP);
+ spd &= OPTI_STRAP_PCI_SPEED_MASK;
+
/* setup DMA if needed */
pciide_channel_dma_setup(cp);
@@ -3030,14 +3035,14 @@
mode[drive] = drvp->PIO_mode;
if (drive && mode[0] >= 0 &&
- (opti_tim_as[mode[0]] != opti_tim_as[mode[1]])) {
+ (opti_tim_as[spd][mode[0]] != opti_tim_as[spd][mode[1]])) {
/*
* Can't have two drives using different values
* for `Address Setup Time'.
* Slow down the faster drive to compensate.
*/
- int d;
- d = (opti_tim_as[mode[0]] > opti_tim_as[mode[1]])?0:1;
+ int d = (opti_tim_as[spd][mode[0]] >
+ opti_tim_as[spd][mode[1]]) ? 0 : 1;
mode[d] = mode[1-d];
chp->ch_drive[d].PIO_mode = chp->ch_drive[1-d].PIO_mode;
@@ -3052,13 +3057,13 @@
continue;
/* Set the Address Setup Time and select appropriate index */
- rv = opti_tim_as[m] << OPTI_MISC_ADDR_SETUP_SHIFT;
+ rv = opti_tim_as[spd][m] << OPTI_MISC_ADDR_SETUP_SHIFT;
rv |= OPTI_MISC_INDEX(drive);
opti_write_config(chp, OPTI_REG_MISC, mr | rv);
/* Set the pulse width and recovery timing parameters */
- rv = opti_tim_cp[m] << OPTI_PULSE_WIDTH_SHIFT;
- rv |= opti_tim_rt[m] << OPTI_RECOVERY_TIME_SHIFT;
+ rv = opti_tim_cp[spd][m] << OPTI_PULSE_WIDTH_SHIFT;
+ rv |= opti_tim_rt[spd][m] << OPTI_RECOVERY_TIME_SHIFT;
opti_write_config(chp, OPTI_REG_READ_CYCLE_TIMING, rv);
opti_write_config(chp, OPTI_REG_WRITE_CYCLE_TIMING, rv);
diff -r 508931872ee1 -r 7909e629e5da sys/dev/pci/pciide_opti_reg.h
--- a/sys/dev/pci/pciide_opti_reg.h Wed Jun 07 20:42:19 2000 +0000
+++ b/sys/dev/pci/pciide_opti_reg.h Wed Jun 07 20:42:52 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pciide_opti_reg.h,v 1.1 2000/05/27 17:18:41 scw Exp $ */
+/* $NetBSD: pciide_opti_reg.h,v 1.2 2000/06/07 20:42:53 scw Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -159,9 +159,24 @@
/*
* These are the timing register values for the various IDE modes
- * supported by the OPTi chip when the PCIbus is running at 33MHz.
+ * supported by the OPTi chip. The first index of the two-dimensional
+ * arrays is used for a 33MHz PCIbus, the second for a 25MHz PCIbus.
*/
-static u_int8_t opti_tim_cp[] = {5, 4, 3, 2, 2, 7, 2, 2}; /* Command Pulse */
-static u_int8_t opti_tim_rt[] = {9, 4, 0, 0, 0, 6, 0, 0}; /* Recovery Time */
-static u_int8_t opti_tim_em[] = {0, 0, 0, 1, 2, 0, 1 ,2}; /* Enhanced Mode */
-static u_int8_t opti_tim_as[] = {2, 1, 1, 1, 0, 0, 0, 0}; /* Address Setup */
+static u_int8_t opti_tim_cp[2][8] = { /* Command Pulse */
+ {5, 4, 3, 2, 2, 7, 2, 2},
+ {4, 3, 2, 2, 1, 5, 2, 1}
+};
+
+static u_int8_t opti_tim_rt[2][8] = { /* Recovery Time */
+ {9, 4, 0, 0, 0, 6, 0, 0},
+ {6, 2, 0, 0, 0, 4, 0, 0}
+};
+
+static u_int8_t opti_tim_as[2][8] = { /* Address Setup */
+ {2, 1, 1, 1, 0, 0, 0, 0},
+ {1, 1, 0, 0, 0, 0, 0, 0}
+};
+
+static u_int8_t opti_tim_em[8] = { /* Enhanced Mode */
+ 0, 0, 0, 1, 2, 0, 1 ,2
+};
Home |
Main Index |
Thread Index |
Old Index