Keep a reference count on USB keyboard polling to allow recursive

cngrab() during a panic for example, similar to what the AT-keyboard
driver is doing.

Found by:	Bruce Evans <brde@optusnet.com.au>
MFC after:	1 week
This commit is contained in:
hselasky 2016-08-05 08:58:00 +00:00
parent eb3942a343
commit 369d07a5cd

View File

@ -198,6 +198,7 @@ struct ukbd_softc {
int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
int sc_state; /* shift/lock key state */
int sc_accents; /* accent key index (> 0) */
int sc_polling; /* polling recursion count */
int sc_led_size;
int sc_kbd_size;
@ -1983,7 +1984,16 @@ ukbd_poll(keyboard_t *kbd, int on)
struct ukbd_softc *sc = kbd->kb_data;
UKBD_LOCK();
if (on) {
/*
* Keep a reference count on polling to allow recursive
* cngrab() during a panic for example.
*/
if (on)
sc->sc_polling++;
else
sc->sc_polling--;
if (sc->sc_polling != 0) {
sc->sc_flags |= UKBD_FLAG_POLLING;
sc->sc_poll_thread = curthread;
} else {