summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanice <none@none>2006-06-19 17:43:34 -0700
committerdanice <none@none>2006-06-19 17:43:34 -0700
commitaa01ff85b2ccc8b310d7efd5dce6464f28033ce5 (patch)
tree7f50410baee35e49f437b1b4ae308deb94a95009
parent9bb6917b385e76d9b21605dc56cd595aa5b8a307 (diff)
downloadillumos-joyent-aa01ff85b2ccc8b310d7efd5dce6464f28033ce5.tar.gz
6352843 alignment error panic during DR detach when pci spurious interrupt happened
-rw-r--r--usr/src/uts/sun4u/io/pci/pci_intr.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/usr/src/uts/sun4u/io/pci/pci_intr.c b/usr/src/uts/sun4u/io/pci/pci_intr.c
index 06216f9d94..f2fb39dabb 100644
--- a/usr/src/uts/sun4u/io/pci/pci_intr.c
+++ b/usr/src/uts/sun4u/io/pci/pci_intr.c
@@ -225,6 +225,7 @@ pci_spurintr(ib_ino_info_t *ino_p) {
ih_t *ih_p = ino_p->ino_ih_start;
pci_t *pci_p = ino_p->ino_ib_p->ib_pci_p;
char *err_fmt_str;
+ boolean_t blocked = B_FALSE;
if (ino_p->ino_unclaimed > pci_unclaimed_intr_max)
return (DDI_INTR_CLAIMED);
@@ -243,11 +244,14 @@ pci_spurintr(ib_ino_info_t *ino_p) {
goto clear;
}
err_fmt_str = "%s%d: ino 0x%x blocked";
+ blocked = B_TRUE;
goto warn;
clear:
- IB_INO_INTR_CLEAR(ino_p->ino_clr_reg); /* clear the pending state */
- if (!pci_spurintr_msgs) /* tomatillo errata #71 spurious mondo */
+ if (!pci_spurintr_msgs) { /* tomatillo errata #71 spurious mondo */
+ /* clear the pending state */
+ IB_INO_INTR_CLEAR(ino_p->ino_clr_reg);
return (DDI_INTR_CLAIMED);
+ }
err_fmt_str = "!%s%d: spurious interrupt from ino 0x%x";
warn:
@@ -256,6 +260,9 @@ warn:
cmn_err(CE_CONT, "!%s-%d#%x ", NAMEINST(ih_p->ih_dip),
ih_p->ih_inum);
cmn_err(CE_CONT, "!\n");
+ if (blocked == B_FALSE) /* clear the pending state */
+ IB_INO_INTR_CLEAR(ino_p->ino_clr_reg);
+
return (DDI_INTR_CLAIMED);
}