svn commit: r214231 - stable/8/sys/dev/sis
Pyun YongHyeon
yongari at FreeBSD.org
Sat Oct 23 00:41:27 UTC 2010
Author: yongari
Date: Sat Oct 23 00:41:26 2010
New Revision: 214231
URL: http://svn.freebsd.org/changeset/base/214231
Log:
MFC r214089:
Correct handling of shared interrupt in sis_intr(). r212116 incorrectly
released a drver lock for shared interrupt case such that it caused
panic. While I'm here check whether driver is still running before
serving TX/RX handler.
Reported by: Jerahmy Pocott < QUAKENET1 <> optusnet dot com dot au >
Tested by: Jerahmy Pocott < QUAKENET1 <> optusnet dot com dot au >
Modified:
stable/8/sys/dev/sis/if_sis.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
Modified: stable/8/sys/dev/sis/if_sis.c
==============================================================================
--- stable/8/sys/dev/sis/if_sis.c Fri Oct 22 23:12:45 2010 (r214230)
+++ stable/8/sys/dev/sis/if_sis.c Sat Oct 23 00:41:26 2010 (r214231)
@@ -1795,12 +1795,15 @@ sis_intr(void *arg)
if ((status & SIS_INTRS) == 0) {
/* Not ours. */
SIS_UNLOCK(sc);
+ return;
}
/* Disable interrupts. */
CSR_WRITE_4(sc, SIS_IER, 0);
for (;(status & SIS_INTRS) != 0;) {
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+ break;
if (status &
(SIS_ISR_TX_DESC_OK | SIS_ISR_TX_ERR |
SIS_ISR_TX_OK | SIS_ISR_TX_IDLE) )
@@ -1825,11 +1828,13 @@ sis_intr(void *arg)
status = CSR_READ_4(sc, SIS_ISR);
}
- /* Re-enable interrupts. */
- CSR_WRITE_4(sc, SIS_IER, 1);
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
+ /* Re-enable interrupts. */
+ CSR_WRITE_4(sc, SIS_IER, 1);
- if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
- sis_startl(ifp);
+ if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+ sis_startl(ifp);
+ }
SIS_UNLOCK(sc);
}
More information about the svn-src-stable-8
mailing list