Raise IPL to splsoftnet() before calling callback functions registered
via (atari specific) add_sicallback(), as a workaround hack. Many drivers which use the MD sicallback depend on BASEPRI() macro defined in <machine/cpu.h> to check nested interrupts, but functions invoked from MI softint(9) won't run at IPL_SOFT any longer and the BASEPRI() macro doesn't return expected value as the past. Fixes lost interrupt problem on Falcon wdc(4) reported by Tuomo Makinen on port-atari, and also confirmed by him. Should be pulled up to netbsd-5.
This commit is contained in:
parent
a2c38ed82e
commit
c61c988be5
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: machdep.c,v 1.154 2008/11/30 18:21:32 martin Exp $ */
|
/* $NetBSD: machdep.c,v 1.155 2009/01/03 06:36:58 tsutsui Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
|
* Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
|
||||||
|
@ -77,7 +77,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.154 2008/11/30 18:21:32 martin Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.155 2009/01/03 06:36:58 tsutsui Exp $");
|
||||||
|
|
||||||
#include "opt_ddb.h"
|
#include "opt_ddb.h"
|
||||||
#include "opt_compat_netbsd.h"
|
#include "opt_compat_netbsd.h"
|
||||||
|
@ -810,7 +810,20 @@ call_sicallbacks(void)
|
||||||
si->next = si_free;
|
si->next = si_free;
|
||||||
si_free = si;
|
si_free = si;
|
||||||
splx(s);
|
splx(s);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Raise spl for BASEPRI() checks to see
|
||||||
|
* nested interrupts in some drivers using callbacks
|
||||||
|
* since modern MI softint(9) doesn't seem to do it
|
||||||
|
* in !__HAVE_FAST_SOFTINTS case.
|
||||||
|
*
|
||||||
|
* XXX: This is just a workaround hack.
|
||||||
|
* Each driver should raise spl in its handler
|
||||||
|
* to avoid nested interrupts if necessary.
|
||||||
|
*/
|
||||||
|
s = splsoftnet(); /* XXX */
|
||||||
function(rock1, rock2);
|
function(rock1, rock2);
|
||||||
|
splx(s);
|
||||||
}
|
}
|
||||||
} while (si);
|
} while (si);
|
||||||
#ifdef DIAGNOSTIC
|
#ifdef DIAGNOSTIC
|
||||||
|
|
Loading…
Reference in New Issue