diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2005-04-22 13:13:20 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2005-04-22 13:13:20 +0000 |
commit | 5550ce914cbd9b52cce0ad018a8a6a0529568d7d (patch) | |
tree | d3001d2bae246ceb5b1fedf96895280a237a964e /sys/arch/hp300/dev | |
parent | 1f8aaa89a9c80f8d156c13d7a8b64570db8d4736 (diff) |
Do not process the FIFO during interrupts when we are polling.
Also, if no keyboard has been detected at initialization, correctly initialize
the state machine so that keyboard hotplug works.
Diffstat (limited to 'sys/arch/hp300/dev')
-rw-r--r-- | sys/arch/hp300/dev/dnkbd.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/sys/arch/hp300/dev/dnkbd.c b/sys/arch/hp300/dev/dnkbd.c index e6be7082f51..345ae1342d2 100644 --- a/sys/arch/hp300/dev/dnkbd.c +++ b/sys/arch/hp300/dev/dnkbd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dnkbd.c,v 1.2 2005/04/22 12:42:34 miod Exp $ */ +/* $OpenBSD: dnkbd.c,v 1.3 2005/04/22 13:13:19 miod Exp $ */ /* * Copyright (c) 2005, Miodrag Vallat @@ -315,23 +315,25 @@ dnsubmatch_mouse(struct device *parent, void *match, void *aux) int dnkbd_probe(struct dnkbd_softc *sc) { - int dat, rc; + int dat, rc, flags; u_int8_t cmdbuf[2]; char rspbuf[MAX_IDENTLEN], *word, *end; u_int i; int s; - s = splhigh(); + s = spltty(); + flags = sc->sc_flags; + SET(sc->sc_flags, SF_POLLING); + sc->sc_state = STATE_CHANNEL; + splx(s); /* * Switch keyboard to raw mode. */ cmdbuf[0] = DNCMD_RAW; rc = dnkbd_send(sc->sc_regs, cmdbuf, 1); - if (rc != 0) { - splx(s); - return (rc); - } + if (rc != 0) + goto out; /* * Send the identify command. @@ -339,10 +341,8 @@ dnkbd_probe(struct dnkbd_softc *sc) cmdbuf[0] = DNCMD_IDENT_1; cmdbuf[1] = DNCMD_IDENT_2; rc = dnkbd_send(sc->sc_regs, cmdbuf, 2); - if (rc != 0) { - splx(s); - return (rc); - } + if (rc != 0) + goto out; for (i = 0; ; i++) { dat = dnkbd_pollin(sc->sc_regs, 10000); @@ -356,8 +356,8 @@ dnkbd_probe(struct dnkbd_softc *sc) if (i >= sizeof(rspbuf)) { printf("%s: unexpected identify string length %d\n", sc->sc_dev.dv_xname, i); - splx(s); - return (ENXIO); + rc = ENXIO; + goto out; } /* @@ -388,8 +388,12 @@ dnkbd_probe(struct dnkbd_softc *sc) printf("\n"); } +out: + s = spltty(); + sc->sc_flags = flags; splx(s); - return (0); + + return (rc); } /* @@ -698,8 +702,13 @@ dnkbd_intr(void *v) case IIR_RXRDY: case IIR_RXTOUT: /* - * Data available. We process it byte by byte. + * Data available. We process it byte by byte, + * unless we are doing polling work... */ + if (ISSET(sc->sc_flags, SF_POLLING)) { + return (1); + } + for (;;) { c = apci->ap_data; switch (dnkbd_input(sc, c)) { |