summaryrefslogtreecommitdiffstats
path: root/sys/dev/twa
diff options
context:
space:
mode:
authorvkashyap <vkashyap@FreeBSD.org>2005-04-29 20:03:20 +0000
committervkashyap <vkashyap@FreeBSD.org>2005-04-29 20:03:20 +0000
commita8688612688a696439137cf2f259bb664452af9f (patch)
tree03f4e160314a098c13db0b37d9520f6fe4e0cfac /sys/dev/twa
parent5acac5def141d4709680819f06b1a8c4fb8c641a (diff)
downloadFreeBSD-src-a8688612688a696439137cf2f259bb664452af9f.zip
FreeBSD-src-a8688612688a696439137cf2f259bb664452af9f.tar.gz
Make call to tw_cl_deferred_interrupt in twa_poll, not dependent on the
return value from tw_cl_interrupt.
Diffstat (limited to 'sys/dev/twa')
-rw-r--r--sys/dev/twa/tw_osl_cam.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/sys/dev/twa/tw_osl_cam.c b/sys/dev/twa/tw_osl_cam.c
index 39277bd..1480cd0 100644
--- a/sys/dev/twa/tw_osl_cam.c
+++ b/sys/dev/twa/tw_osl_cam.c
@@ -482,8 +482,18 @@ twa_poll(struct cam_sim *sim)
struct twa_softc *sc = (struct twa_softc *)(cam_sim_softc(sim));
tw_osli_dbg_dprintf(3, sc, "entering; sc = %p", sc);
- if (tw_cl_interrupt(&(sc->ctlr_handle)))
- tw_cl_deferred_interrupt(&(sc->ctlr_handle));
+ /*
+ * It's been observed that twa_poll can get called (from
+ * dashutdown --> xpt_polled_action) even when interrupts are
+ * active, in which case, the ISR might clear the interrupt,
+ * leaving the call to tw_cl_interrupt below, no way of determining
+ * that the response from firmware is ready, resulting in
+ * tw_cl_deferred_interrupt never getting called. To cover this case,
+ * we will make the call to tw_cl_deferred_interrupt not dependent
+ * on the return value from tw_cl_interrupt.
+ */
+ tw_cl_interrupt(&(sc->ctlr_handle));
+ tw_cl_deferred_interrupt(&(sc->ctlr_handle));
tw_osli_dbg_dprintf(3, sc, "exiting; sc = %p", sc);
}
OpenPOWER on IntegriCloud