X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/blobdiff_plain/fd9e470e763ba12c4c4d4f43b0c4cae5d21b282d..e54488bbec5c9f80e95cedd395b0e3d31fde253d:/sys/dev/misc/kbd/kbd.c diff --git a/sys/dev/misc/kbd/kbd.c b/sys/dev/misc/kbd/kbd.c index 8bdcc57813..2e69d3dcc4 100644 --- a/sys/dev/misc/kbd/kbd.c +++ b/sys/dev/misc/kbd/kbd.c @@ -55,12 +55,14 @@ #define KBD_INDEX(dev) minor(dev) -typedef struct genkbd_softc { +struct genkbd_softc { int gkb_flags; /* flag/status bits */ #define KB_ASLEEP (1 << 0) struct clist gkb_q; /* input queue */ struct selinfo gkb_rsel; -} genkbd_softc_t; +}; + +typedef struct genkbd_softc *genkbd_softc_t; static SLIST_HEAD(, keyboard_driver) keyboard_drivers = SLIST_HEAD_INITIALIZER(keyboard_drivers); @@ -456,6 +458,12 @@ static struct dev_ops kbd_ops = { .d_poll = genkbdpoll, }; +/* + * Attach a keyboard. + * + * NOTE: The usb driver does not detach the default keyboard if it is + * unplugged, but calls kbd_attach() when it is plugged back in. + */ int kbd_attach(keyboard_t *kbd) { @@ -466,13 +474,17 @@ kbd_attach(keyboard_t *kbd) if (keyboard[kbd->kb_index] != kbd) return EINVAL; - dev_ops_add(&kbd_ops, -1, kbd->kb_index); - dev = make_dev(&kbd_ops, kbd->kb_index, UID_ROOT, GID_WHEEL, 0600, - "kbd%r", kbd->kb_index); - if (dev->si_drv1 == NULL) - dev->si_drv1 = kmalloc(sizeof(genkbd_softc_t), M_DEVBUF, - M_WAITOK); - bzero(dev->si_drv1, sizeof(genkbd_softc_t)); + if (kbd->kb_dev == NULL) { + kbd->kb_dev = make_dev(&kbd_ops, kbd->kb_index, + UID_ROOT, GID_WHEEL, 0600, + "kbd%r", kbd->kb_index); + } + dev = kbd->kb_dev; + if (dev->si_drv1 == NULL) { + dev->si_drv1 = kmalloc(sizeof(struct genkbd_softc), M_DEVBUF, + M_WAITOK); + } + bzero(dev->si_drv1, sizeof(struct genkbd_softc)); kprintf("kbd%d at %s%d\n", kbd->kb_index, kbd->kb_name, kbd->kb_unit); return 0; @@ -488,17 +500,14 @@ kbd_detach(keyboard_t *kbd) if (keyboard[kbd->kb_index] != kbd) return EINVAL; - /* - * Deal with refs properly. The KBD driver really ought to have - * recorded the cdev_t separately. - */ - if ((dev = make_adhoc_dev(&kbd_ops, kbd->kb_index)) != NULL) { + if ((dev = kbd->kb_dev) != NULL) { if (dev->si_drv1) { kfree(dev->si_drv1, M_DEVBUF); dev->si_drv1 = NULL; } + kbd->kb_dev = NULL; } - dev_ops_remove(&kbd_ops, -1, kbd->kb_index); + dev_ops_remove_minor(&kbd_ops, kbd->kb_index); return 0; } @@ -518,7 +527,7 @@ genkbdopen(struct dev_open_args *ap) { cdev_t dev = ap->a_head.a_dev; keyboard_t *kbd; - genkbd_softc_t *sc; + genkbd_softc_t sc; int i; crit_enter(); @@ -558,7 +567,7 @@ genkbdclose(struct dev_close_args *ap) { cdev_t dev = ap->a_head.a_dev; keyboard_t *kbd; - genkbd_softc_t *sc; + genkbd_softc_t sc; /* * NOTE: the device may have already become invalid. @@ -585,7 +594,7 @@ genkbdread(struct dev_read_args *ap) cdev_t dev = ap->a_head.a_dev; struct uio *uio = ap->a_uio; keyboard_t *kbd; - genkbd_softc_t *sc; + genkbd_softc_t sc; u_char buffer[KB_BUFSIZE]; int len; int error; @@ -621,11 +630,11 @@ genkbdread(struct dev_read_args *ap) /* copy as much input as possible */ error = 0; while (uio->uio_resid > 0) { - len = imin(uio->uio_resid, sizeof(buffer)); + len = (int)szmin(uio->uio_resid, sizeof(buffer)); len = q_to_b(&sc->gkb_q, buffer, len); - if (len <= 0) + if (len == 0) break; - error = uiomove(buffer, len, uio); + error = uiomove(buffer, (size_t)len, uio); if (error) break; } @@ -666,7 +675,7 @@ genkbdpoll(struct dev_poll_args *ap) { cdev_t dev = ap->a_head.a_dev; keyboard_t *kbd; - genkbd_softc_t *sc; + genkbd_softc_t sc; int revents; revents = 0; @@ -689,14 +698,14 @@ genkbdpoll(struct dev_poll_args *ap) static int genkbd_event(keyboard_t *kbd, int event, void *arg) { - genkbd_softc_t *sc; + genkbd_softc_t sc; size_t len; u_char *cp; int mode; int c; /* assert(KBD_IS_VALID(kbd)) */ - sc = (genkbd_softc_t *)arg; + sc = (genkbd_softc_t)arg; switch (event) { case KBDIO_KEYINPUT: