diff options
author | gibbs <gibbs@FreeBSD.org> | 2005-09-22 05:11:35 +0000 |
---|---|---|
committer | gibbs <gibbs@FreeBSD.org> | 2005-09-22 05:11:35 +0000 |
commit | 362978b3c45f088265068cec2523dc91c8c88b20 (patch) | |
tree | 50628182d720c522a4a0715a8e0663ba7bc6e596 | |
parent | c66156998d36a14de7d7f7f5fea3035eb0e921a1 (diff) | |
download | FreeBSD-src-362978b3c45f088265068cec2523dc91c8c88b20.zip FreeBSD-src-362978b3c45f088265068cec2523dc91c8c88b20.tar.gz |
Use the AHC_DISABLE_PCI_PERR flag to silence parity error reporting on
chips where setting the FAILDIS bit is not effective. While here,
try again to make it clear that reported parity errors indicate
a failure of some PCI device *other than* the aic7xxx controller.
-rw-r--r-- | sys/dev/aic7xxx/aic7xxx_pci.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/sys/dev/aic7xxx/aic7xxx_pci.c b/sys/dev/aic7xxx/aic7xxx_pci.c index d37607d..25c24ea 100644 --- a/sys/dev/aic7xxx/aic7xxx_pci.c +++ b/sys/dev/aic7xxx/aic7xxx_pci.c @@ -2023,11 +2023,15 @@ ahc_pci_intr(struct ahc_softc *ahc) status1 = aic_pci_read_config(ahc->dev_softc, PCIR_STATUS + 1, /*bytes*/1); - printf("%s: PCI error Interrupt at seqaddr = 0x%x\n", - ahc_name(ahc), - ahc_inb(ahc, SEQADDR0) | (ahc_inb(ahc, SEQADDR1) << 8)); + if ((status1 & ~DPE) != 0 + || (ahc->flags & AHC_DISABLE_PCI_PERR) == 0) { + printf("%s: PCI error Interrupt at seqaddr = 0x%x\n", + ahc_name(ahc), + ahc_inb(ahc, SEQADDR0) | (ahc_inb(ahc, SEQADDR1) << 8)); + } - if (status1 & DPE) { + if (status1 & DPE + && (ahc->flags & AHC_DISABLE_PCI_PERR) == 0) { ahc->pci_target_perr_count++; printf("%s: Data Parity Error Detected during address " "or write data phase\n", ahc_name(ahc)); @@ -2060,17 +2064,20 @@ ahc_pci_intr(struct ahc_softc *ahc) ahc_outb(ahc, CLRINT, CLRPARERR); } - if (ahc->pci_target_perr_count > AHC_PCI_TARGET_PERR_THRESH) { + if (ahc->pci_target_perr_count > AHC_PCI_TARGET_PERR_THRESH + && (ahc->flags & AHC_DISABLE_PCI_PERR) == 0) { printf( "%s: WARNING WARNING WARNING WARNING\n" "%s: Too many PCI parity errors observed as a target.\n" -"%s: Some device on this bus is generating bad parity.\n" -"%s: This is an error *observed by*, not *generated by*, this controller.\n" +"%s: Some device on this PCI bus is generating bad parity.\n" +"%s: This is an error *observed by*, not *generated by*, %s.\n" "%s: PCI parity error checking has been disabled.\n" "%s: WARNING WARNING WARNING WARNING\n", ahc_name(ahc), ahc_name(ahc), ahc_name(ahc), - ahc_name(ahc), ahc_name(ahc), ahc_name(ahc)); + ahc_name(ahc), ahc_name(ahc), ahc_name(ahc), + ahc_name(ahc)); ahc->seqctl |= FAILDIS; + ahc->flags |= AHC_DISABLE_PCI_PERR; ahc_outb(ahc, SEQCTL, ahc->seqctl); } ahc_unpause(ahc); |