diff options
author | danice <none@none> | 2006-06-19 17:43:34 -0700 |
---|---|---|
committer | danice <none@none> | 2006-06-19 17:43:34 -0700 |
commit | aa01ff85b2ccc8b310d7efd5dce6464f28033ce5 (patch) | |
tree | 7f50410baee35e49f437b1b4ae308deb94a95009 | |
parent | 9bb6917b385e76d9b21605dc56cd595aa5b8a307 (diff) | |
download | illumos-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.c | 11 |
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); } |