diff options
-rw-r--r-- | sys/dev/pci/hifn7751.c | 21 | ||||
-rw-r--r-- | sys/dev/pci/hifn7751reg.h | 10 | ||||
-rw-r--r-- | sys/dev/pci/hifn7751var.h | 4 |
3 files changed, 29 insertions, 6 deletions
diff --git a/sys/dev/pci/hifn7751.c b/sys/dev/pci/hifn7751.c index 30ca41f298c..7b34a367722 100644 --- a/sys/dev/pci/hifn7751.c +++ b/sys/dev/pci/hifn7751.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hifn7751.c,v 1.103 2001/09/06 03:31:34 jason Exp $ */ +/* $OpenBSD: hifn7751.c,v 1.104 2001/11/04 18:31:42 jason Exp $ */ /* * Invertex AEON / Hifn 7751 driver @@ -154,6 +154,9 @@ hifn_attach(parent, self, aux) int rseg; caddr_t kva; + sc->sc_pci_pc = pa->pa_pc; + sc->sc_pci_tag = pa->pa_tag; + if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_HIFN && PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_HIFN_7951) sc->sc_flags = HIFN_HAS_RNG | HIFN_HAS_PUBLIC; @@ -185,6 +188,10 @@ hifn_attach(parent, self, aux) goto fail_io0; } + cmd = pci_conf_read(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT); + cmd &= 0xffff0000; + pci_conf_write(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT, cmd); + sc->sc_dmat = pa->pa_dmat; if (bus_dmamap_create(sc->sc_dmat, sizeof(*sc->sc_dma), 1, sizeof(*sc->sc_dma), 0, BUS_DMA_NOWAIT, &sc->sc_dmamap)) { @@ -438,6 +445,8 @@ hifn_reset_board(sc, full) struct hifn_softc *sc; int full; { + u_int32_t reg; + /* * Set polling in the DMA configuration register to zero. 0x7 avoids * resetting the board and zeros out the other fields. @@ -468,6 +477,10 @@ hifn_reset_board(sc, full) HIFN_DMACNFG_DMARESET | HIFN_DMACNFG_MODE); hifn_puc_wait(sc); + + reg = pci_conf_read(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT); + reg &= 0xffff0000; + pci_conf_write(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT, reg); } u_int32_t @@ -956,8 +969,13 @@ hifn_init_dma(sc) struct hifn_softc *sc; { struct hifn_dma *dma = sc->sc_dma; + u_int32_t reg; int i; + reg = pci_conf_read(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT); + reg &= 0xffff0000; + pci_conf_write(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT, reg); + /* initialize static pointer values */ for (i = 0; i < HIFN_D_CMD_RSIZE; i++) dma->cmdr[i].p = sc->sc_dmamap->dm_segs[0].ds_addr + @@ -1539,6 +1557,7 @@ hifn_intr(arg) restart = dmacsr & (HIFN_DMACSR_C_ABORT | HIFN_DMACSR_S_ABORT | HIFN_DMACSR_D_ABORT | HIFN_DMACSR_R_ABORT); if (restart) { + printf("%s: abort, resetting.\n"); hifnstats.hst_abort++; hifn_abort(sc); return (1); diff --git a/sys/dev/pci/hifn7751reg.h b/sys/dev/pci/hifn7751reg.h index a84a30000d2..a21d5dd33fe 100644 --- a/sys/dev/pci/hifn7751reg.h +++ b/sys/dev/pci/hifn7751reg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: hifn7751reg.h,v 1.30 2001/08/27 18:54:56 jason Exp $ */ +/* $OpenBSD: hifn7751reg.h,v 1.31 2001/11/04 18:31:42 jason Exp $ */ /* * Invertex AEON / Hifn 7751 driver @@ -35,7 +35,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __HIFN_H__ -#define __HIFN_H__ +#define __HIFN_H__ #include <machine/endian.h> @@ -43,8 +43,10 @@ * Some PCI configuration space offset defines. The names were made * identical to the names used by the Linux kernel. */ -#define HIFN_BAR0 (PCI_MAPREG_START + 0) /* PUC register map */ -#define HIFN_BAR1 (PCI_MAPREG_START + 4) /* DMA register map */ +#define HIFN_BAR0 (PCI_MAPREG_START + 0) /* PUC register map */ +#define HIFN_BAR1 (PCI_MAPREG_START + 4) /* DMA register map */ +#define HIFN_RETRY_TIMEOUT 0x40 +#define HIFN_TRDY_TIMEOUT 0x41 /* * The values below should multiple of 4 -- and be large enough to handle diff --git a/sys/dev/pci/hifn7751var.h b/sys/dev/pci/hifn7751var.h index 235136d5d4c..5daeae657f0 100644 --- a/sys/dev/pci/hifn7751var.h +++ b/sys/dev/pci/hifn7751var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: hifn7751var.h,v 1.37 2001/08/28 21:40:54 jason Exp $ */ +/* $OpenBSD: hifn7751var.h,v 1.38 2001/11/04 18:31:42 jason Exp $ */ /* * Invertex AEON / Hifn 7751 driver @@ -153,6 +153,8 @@ struct hifn_softc { int sc_rnghz; int sc_c_busy, sc_s_busy, sc_d_busy, sc_r_busy, sc_active; struct hifn_session sc_sessions[2048]; + pci_chipset_tag_t sc_pci_pc; + pcitag_t sc_pci_tag; }; #define WRITE_REG_0(sc,reg,val) \ |