Date: Wed, 4 Jul 2007 01:33:39 GMT From: Rui Paulo <rpaulo@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 122821 for review Message-ID: <200707040133.l641XdlB062429@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=122821 Change 122821 by rpaulo@rpaulo_epsilon on 2007/07/04 01:33:12 When an interrupt from the Sudden Motion Sensor occurs call devctl_notify() so that we can turn off (standby, suspend) the disks. This is useful because it allows you to prevent disk damage. A taskqueue is now created to handle this (devctl_notify() can't be called directly from an interrupt handler). Reviewed by: attilio Affected files ... .. //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#15 edit .. //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmcvar.h#6 edit Differences ... ==== //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#15 (text+ko) ==== @@ -23,7 +23,7 @@ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#14 $ + * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmc.c#15 $ * */ @@ -42,10 +42,12 @@ #include <sys/conf.h> #include <sys/kernel.h> #include <sys/lock.h> +#include <sys/malloc.h> #include <sys/module.h> #include <sys/mutex.h> #include <sys/sysctl.h> #include <sys/systm.h> +#include <sys/taskqueue.h> #include <isa/isavar.h> @@ -80,7 +82,7 @@ static int asmc_sms_intr(void *); static void asmc_sms_fastintr(void *); static void asmc_sms_printintr(device_t, uint8_t); - +static void asmc_sms_task(void *, int); /* * Model functions. */ @@ -365,6 +367,22 @@ "Sudden Motion Sensor Z value"); /* + * Need a taskqueue to send devctl_notify() events + * when the SMS interrupt us. + * + * PI_REALTIME is used due to the sensitivity of the + * interrupt. An interrupt from the SMS means that the + * disk heads should be turned off as quickly as possible. + */ + TASK_INIT(&sc->sms_task, 0, asmc_sms_task, sc); + sc->sms_tq = taskqueue_create_fast("asmc_taskq", M_WAITOK, + taskqueue_thread_enqueue, + &sc->sms_tq); + taskqueue_start_threads(&sc->sms_tq, 1, PI_REALTIME, "%s sms taskq", + device_get_nameunit(dev)); + + + /* * Allocate an IRQ for the SMS. */ sc->sc_rid = 0; @@ -372,6 +390,7 @@ ASMC_IRQ, ASMC_IRQ, 1, RF_ACTIVE); if (sc->sc_res == NULL) { device_printf(dev, "unable to allocate IRQ resource\n"); + taskqueue_free(sc->sms_tq); goto out; } @@ -406,6 +425,11 @@ sysctl_ctx_free(&sc->sc_sysctl_ctx); + if (sc->sms_tq) { + taskqueue_drain(sc->sms_tq, &sc->sms_task); + taskqueue_free(sc->sms_tq); + } + if (sc->sc_cookie) bus_teardown_intr(dev, sc->sc_res, sc->sc_cookie); if (sc->sc_res) @@ -773,7 +797,9 @@ type = inb(ASMC_INTPORT); mtx_unlock_spin(&sc->sc_mtx); + sc->sms_intrtype = type; asmc_sms_printintr(dev, type); + taskqueue_enqueue(sc->sms_tq, &sc->sms_task); return (FILTER_HANDLED); } @@ -789,7 +815,9 @@ type = inb(ASMC_INTPORT); mtx_unlock_spin(&sc->sc_mtx); + sc->sms_intrtype = type; asmc_sms_printintr(dev, type); + taskqueue_enqueue_fast(sc->sms_tq, &sc->sms_task); } @@ -812,6 +840,32 @@ } } +static void +asmc_sms_task(void *arg, int pending) +{ + struct asmc_softc *sc = (struct asmc_softc *)arg; + char notify[16]; + int type; + + switch (sc->sms_intrtype) { + case ASMC_SMS_INTFF: + type = 0; + break; + case ASMC_SMS_INTHA: + type = 1; + break; + case ASMC_SMS_INTSH: + type = 2; + break; + default: + type = 255; + } + + snprintf(notify, sizeof(notify) - 1, " notify=0x%x", type); + + devctl_notify("ISA", "asmc", "SMS", notify); +} + static int asmc_mb_sysctl_sms_x(SYSCTL_HANDLER_ARGS) { ==== //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmcvar.h#6 (text+ko) ==== @@ -23,7 +23,7 @@ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmcvar.h#5 $ + * $P4: //depot/projects/soc2007/rpaulo-macbook/dev/asmc/asmcvar.h#6 $ * */ @@ -50,6 +50,10 @@ int sc_rid; struct resource *sc_res; void *sc_cookie; + + int sms_intrtype; + struct taskqueue *sms_tq; + struct task sms_task; }; struct asmc_model {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707040133.l641XdlB062429>