diff options
author | tmm <tmm@FreeBSD.org> | 2002-12-01 23:21:15 +0000 |
---|---|---|
committer | tmm <tmm@FreeBSD.org> | 2002-12-01 23:21:15 +0000 |
commit | 7ed7cdac580b034966a8b7e8ba9e0d8b51cab854 (patch) | |
tree | b7ecad9693b413af933ff0367d9a4cbe203029d1 /sys/sparc64/pci/psycho.c | |
parent | 65cd973056bcc0b476db5420de32032ca938a291 (diff) | |
download | FreeBSD-src-7ed7cdac580b034966a8b7e8ba9e0d8b51cab854.zip FreeBSD-src-7ed7cdac580b034966a8b7e8ba9e0d8b51cab854.tar.gz |
1.) Do not look for PCI INOs in the FFB interrupt mapping registers; they
are nevers used for PCI interrupts, but can cause false matches since
they are fully programmable.
2.) Skip the mapping registers for slot a2 and a3 on "psycho" bridges,
since they are not present there. Again, this could cause false matches,
which would result in the interrupt being delivered at most once.
Submitted by: jake (2)
Approved by: re
Diffstat (limited to 'sys/sparc64/pci/psycho.c')
-rw-r--r-- | sys/sparc64/pci/psycho.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/sparc64/pci/psycho.c b/sys/sparc64/pci/psycho.c index 89c6364..33b3faf 100644 --- a/sys/sparc64/pci/psycho.c +++ b/sys/sparc64/pci/psycho.c @@ -579,7 +579,7 @@ psycho_attach(device_t dev) PSYCHO_WRITE8(sc, map, mr | INTMAP_V); } for (map = PSR_SCSI_INT_MAP, clr = PSR_SCSI_INT_CLR, n = 0; - map <= PSR_FFB1_INT_MAP; map += 8, clr += 8, n++) { + map < PSR_FFB0_INT_MAP; map += 8, clr += 8, n++) { mr = PSYCHO_READ8(sc, map); #ifdef PSYCHO_DEBUG device_printf(dev, "intr map (obio) %d: %#lx, clr: %#lx\n", n, @@ -673,7 +673,7 @@ psycho_find_intrmap(struct psycho_softc *sc, int ino, bus_addr_t *intrmapptr, /* Hunt thru obio first */ diag = PSYCHO_READ8(sc, PSR_OBIO_INT_DIAG); for (intrmap = PSR_SCSI_INT_MAP, intrclr = PSR_SCSI_INT_CLR; - intrmap <= PSR_FFB1_INT_MAP; intrmap += 8, intrclr += 8, + intrmap < PSR_FFB0_INT_MAP; intrmap += 8, intrclr += 8, diag >>= 2) { im = PSYCHO_READ8(sc, intrmap); if (INTINO(im) == ino) { @@ -689,6 +689,10 @@ psycho_find_intrmap(struct psycho_softc *sc, int ino, bus_addr_t *intrmapptr, for (intrmap = PSR_PCIA0_INT_MAP, intrclr = PSR_PCIA0_INT_CLR; intrmap <= PSR_PCIB3_INT_MAP; intrmap += 8, intrclr += 32, diag >>= 8) { + if (sc->sc_mode == PSYCHO_MODE_PSYCHO && + (intrmap == PSR_PCIA2_INT_MAP || + intrmap == PSR_PCIA3_INT_MAP)) + continue; im = PSYCHO_READ8(sc, intrmap); if (((im ^ ino) & 0x3c) == 0) { intrclr += 8 * (ino & 3); |