aboutsummaryrefslogtreecommitdiff
path: root/sys/arm
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2010-09-18 13:44:39 +0000
committerAlexander Motin <mav@FreeBSD.org>2010-09-18 13:44:39 +0000
commitafc1cdb92d63c49ea0e50bd57957b0bd0e28a6fb (patch)
treeb7991e66397dddbcd54a258f7daacf5fcf599574 /sys/arm
parentadb6aa9ab982e7554b40be4b28dbb9eacd5556f2 (diff)
downloadsrc-afc1cdb92d63c49ea0e50bd57957b0bd0e28a6fb.tar.gz
src-afc1cdb92d63c49ea0e50bd57957b0bd0e28a6fb.zip
Clear timer interrupt status before calling callback, not after it,
This fixes timer interrupt losses, fatal in one-shot mode.
Notes
Notes: svn path=/head/; revision=212823
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/mv/timer.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/arm/mv/timer.c b/sys/arm/mv/timer.c
index bcc4e81d1d8e..fb3b321a689f 100644
--- a/sys/arm/mv/timer.c
+++ b/sys/arm/mv/timer.c
@@ -178,14 +178,14 @@ mv_hardclock(void *arg)
struct mv_timer_softc *sc;
uint32_t irq_cause;
- sc = (struct mv_timer_softc *)arg;
- if (sc->et.et_active)
- sc->et.et_event_cb(&sc->et, sc->et.et_arg);
-
irq_cause = read_cpu_ctrl(BRIDGE_IRQ_CAUSE);
irq_cause &= ~(IRQ_TIMER0);
write_cpu_ctrl(BRIDGE_IRQ_CAUSE, irq_cause);
+ sc = (struct mv_timer_softc *)arg;
+ if (sc->et.et_active)
+ sc->et.et_event_cb(&sc->et, sc->et.et_arg);
+
return (FILTER_HANDLED);
}
@@ -394,6 +394,8 @@ mv_timer_start(struct eventtimer *et,
val |= CPU_TIMER0_EN;
if (period != NULL)
val |= CPU_TIMER0_AUTO;
+ else
+ val &= ~CPU_TIMER0_AUTO;
mv_set_timer_control(val);
return (0);
}