AMD64 - Refactor uio_resid and size_t assumptions.
[dragonfly.git] / sys / dev / misc / kbd / kbd.c
index 8bdcc57..2e69d3d 100644 (file)
 
 #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: