diff options
author | Paul Irofti <pirofti@cvs.openbsd.org> | 2013-11-15 08:17:45 +0000 |
---|---|---|
committer | Paul Irofti <pirofti@cvs.openbsd.org> | 2013-11-15 08:17:45 +0000 |
commit | 19f5dcfcec57bffc7080845213bea362120f4c04 (patch) | |
tree | c48ce2da25e3b357e4a829e56484a794511ea632 /sys/dev | |
parent | 80011e638a8bbb60eb459e6a794a4cd538b05883 (diff) |
Clean-up the HID environment.
This set of drivers were very very dirty.
i/ Clean-up the match/attach multi-casting hackjob
- stop casting aux to every attach arg in existance
- be consistent about casting it only to uhidev_attach_arg
- fetch the usb_attach_arg from above where needed
ii/ Sort out the activate routines
- leave the deactivation to the parent (uhidev(4))
- ditch the sc_dying flag in favour of usbd_is_dying()
iii/ Get closer to keeping all the usb hid information in the uhidev
structure (one uhidev per reportID)
- store the usbd_device in the uhidev
- use it consistently instead of always peaking at the parent's
soft state
Okay mpi@
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/usb/uhid.c | 41 | ||||
-rw-r--r-- | sys/dev/usb/uhidev.h | 3 | ||||
-rw-r--r-- | sys/dev/usb/ukbd.c | 24 | ||||
-rw-r--r-- | sys/dev/usb/ums.c | 16 | ||||
-rw-r--r-- | sys/dev/usb/utpms.c | 13 |
5 files changed, 36 insertions, 61 deletions
diff --git a/sys/dev/usb/uhid.c b/sys/dev/usb/uhid.c index 31d8e9f18dd..d7beed1f209 100644 --- a/sys/dev/usb/uhid.c +++ b/sys/dev/usb/uhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uhid.c,v 1.53 2011/07/03 15:47:17 matthew Exp $ */ +/* $OpenBSD: uhid.c,v 1.54 2013/11/15 08:17:44 pirofti Exp $ */ /* $NetBSD: uhid.c,v 1.57 2003/03/11 16:44:00 augustss Exp $ */ /* @@ -83,7 +83,6 @@ struct uhid_softc { #define UHID_IMMED 0x02 /* return read data immediately */ int sc_refcnt; - u_char sc_dying; }; #define UHIDUNIT(dev) (minor(dev)) @@ -100,7 +99,6 @@ int uhid_do_ioctl(struct uhid_softc*, u_long, caddr_t, int, int uhid_match(struct device *, void *, void *); void uhid_attach(struct device *, struct device *, void *); int uhid_detach(struct device *, int); -int uhid_activate(struct device *, int); struct cfdriver uhid_cd = { NULL, "uhid", DV_DULL @@ -111,14 +109,12 @@ const struct cfattach uhid_ca = { uhid_match, uhid_attach, uhid_detach, - uhid_activate, }; int uhid_match(struct device *parent, void *match, void *aux) { - struct usb_attach_arg *uaa = aux; - struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)uaa; + struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)aux; DPRINTF(("uhid_match: report=%d\n", uha->reportid)); @@ -131,13 +127,13 @@ void uhid_attach(struct device *parent, struct device *self, void *aux) { struct uhid_softc *sc = (struct uhid_softc *)self; - struct usb_attach_arg *uaa = aux; - struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)uaa; + struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)aux; int size, repid; void *desc; sc->sc_hdev.sc_intr = uhid_intr; sc->sc_hdev.sc_parent = uha->parent; + sc->sc_hdev.sc_udev = uha->uaa->device; sc->sc_hdev.sc_report_id = uha->reportid; uhidev_get_report_desc(uha->parent, &desc, &size); @@ -151,19 +147,6 @@ uhid_attach(struct device *parent, struct device *self, void *aux) } int -uhid_activate(struct device *self, int act) -{ - struct uhid_softc *sc = (struct uhid_softc *)self; - - switch (act) { - case DVACT_DEACTIVATE: - sc->sc_dying = 1; - break; - } - return (0); -} - -int uhid_detach(struct device *self, int flags) { struct uhid_softc *sc = (struct uhid_softc *)self; @@ -239,7 +222,7 @@ uhidopen(dev_t dev, int flag, int mode, struct proc *p) DPRINTF(("uhidopen: sc=%p\n", sc)); - if (sc->sc_dying) + if (usbd_is_dying(sc->sc_hdev.sc_udev)) return (ENXIO); error = uhidev_open(&sc->sc_hdev); @@ -303,7 +286,7 @@ uhid_do_read(struct uhid_softc *sc, struct uio *uio, int flag) DPRINTFN(5, ("uhidread: sleep on %p\n", &sc->sc_q)); error = tsleep(&sc->sc_q, PZERO | PCATCH, "uhidrea", 0); DPRINTFN(5, ("uhidread: woke, error=%d\n", error)); - if (sc->sc_dying) + if (usbd_is_dying(sc->sc_hdev.sc_udev)) error = EIO; if (error) { sc->sc_state &= ~UHID_ASLP; @@ -354,7 +337,7 @@ uhid_do_write(struct uhid_softc *sc, struct uio *uio, int flag) DPRINTFN(1, ("uhidwrite\n")); - if (sc->sc_dying) + if (usbd_is_dying(sc->sc_hdev.sc_udev)) return (EIO); size = sc->sc_hdev.sc_osize; @@ -398,7 +381,7 @@ uhid_do_ioctl(struct uhid_softc *sc, u_long cmd, caddr_t addr, DPRINTFN(2, ("uhidioctl: cmd=%lx\n", cmd)); - if (sc->sc_dying) + if (usbd_is_dying(sc->sc_hdev.sc_udev)) return (EIO); switch (cmd) { @@ -438,14 +421,14 @@ uhid_do_ioctl(struct uhid_softc *sc, u_long cmd, caddr_t addr, break; case USB_GET_DEVICEINFO: - usbd_fill_deviceinfo(sc->sc_hdev.sc_parent->sc_udev, + usbd_fill_deviceinfo(sc->sc_hdev.sc_udev, (struct usb_device_info *)addr, 1); break; case USB_GET_STRING_DESC: { struct usb_string_desc *si = (struct usb_string_desc *)addr; - err = usbd_get_string_desc(sc->sc_hdev.sc_parent->sc_udev, + err = usbd_get_string_desc(sc->sc_hdev.sc_udev, si->usd_string_index, si->usd_language_id, &si->usd_desc, &size); if (err) @@ -490,7 +473,7 @@ uhidpoll(dev_t dev, int events, struct proc *p) sc = uhid_cd.cd_devs[UHIDUNIT(dev)]; - if (sc->sc_dying) + if (usbd_is_dying(sc->sc_hdev.sc_udev)) return (POLLERR); s = splusb(); @@ -546,7 +529,7 @@ uhidkqfilter(dev_t dev, struct knote *kn) sc = uhid_cd.cd_devs[UHIDUNIT(dev)]; - if (sc->sc_dying) + if (usbd_is_dying(sc->sc_hdev.sc_udev)) return (EIO); switch (kn->kn_filter) { diff --git a/sys/dev/usb/uhidev.h b/sys/dev/usb/uhidev.h index cbffaa744e8..dfe5c6488bf 100644 --- a/sys/dev/usb/uhidev.h +++ b/sys/dev/usb/uhidev.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uhidev.h,v 1.14 2013/11/01 12:05:26 mpi Exp $ */ +/* $OpenBSD: uhidev.h,v 1.15 2013/11/15 08:17:44 pirofti Exp $ */ /* $NetBSD: uhidev.h,v 1.3 2002/10/08 09:56:17 dan Exp $ */ /* @@ -64,6 +64,7 @@ struct uhidev_softc { struct uhidev { struct device sc_dev; /* base device */ + struct usbd_device *sc_udev; /* USB device */ struct uhidev_softc *sc_parent; uByte sc_report_id; u_int8_t sc_state; diff --git a/sys/dev/usb/ukbd.c b/sys/dev/usb/ukbd.c index 59e271f7ab0..07b5e6f697c 100644 --- a/sys/dev/usb/ukbd.c +++ b/sys/dev/usb/ukbd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ukbd.c,v 1.61 2013/11/13 13:48:08 pirofti Exp $ */ +/* $OpenBSD: ukbd.c,v 1.62 2013/11/15 08:17:44 pirofti Exp $ */ /* $NetBSD: ukbd.c,v 1.85 2003/03/11 16:44:00 augustss Exp $ */ /* @@ -132,8 +132,6 @@ struct ukbd_softc { int sc_spl; - u_char sc_dying; - struct hid_location sc_apple_fn; void (*sc_munge)(void *, uint8_t *, u_int); @@ -193,8 +191,7 @@ uint8_t ukbd_translate(const struct ukbd_translation *, size_t, uint8_t); int ukbd_match(struct device *parent, void *match, void *aux) { - struct usb_attach_arg *uaa = aux; - struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)uaa; + struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)aux; int size; void *desc; @@ -211,8 +208,7 @@ ukbd_attach(struct device *parent, struct device *self, void *aux) { struct ukbd_softc *sc = (struct ukbd_softc *)self; struct hidkbd *kbd = &sc->sc_kbd; - struct usb_attach_arg *uaa = aux; - struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)uaa; + struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)aux; struct usb_hid_descriptor *hid; u_int32_t qflags; int dlen, repid; @@ -221,6 +217,7 @@ ukbd_attach(struct device *parent, struct device *self, void *aux) sc->sc_hdev.sc_intr = ukbd_intr; sc->sc_hdev.sc_parent = uha->parent; + sc->sc_hdev.sc_udev = uha->uaa->device; sc->sc_hdev.sc_report_id = uha->reportid; uhidev_get_report_desc(uha->parent, &desc, &dlen); @@ -229,7 +226,7 @@ ukbd_attach(struct device *parent, struct device *self, void *aux) sc->sc_hdev.sc_osize = hid_report_size(desc, dlen, hid_output, repid); sc->sc_hdev.sc_fsize = hid_report_size(desc, dlen, hid_feature, repid); - qflags = usbd_get_quirks(uha->parent->sc_udev)->uq_flags; + qflags = usbd_get_quirks(sc->sc_hdev.sc_udev)->uq_flags; if (hidkbd_attach(self, kbd, 1, qflags, repid, desc, dlen) != 0) return; @@ -292,7 +289,7 @@ ukbd_attach(struct device *parent, struct device *self, void *aux) /* Flash the leds; no real purpose, just shows we're alive. */ ukbd_set_leds(sc, WSKBD_LED_SCROLL | WSKBD_LED_NUM | WSKBD_LED_CAPS | WSKBD_LED_COMPOSE); - usbd_delay_ms(uha->parent->sc_udev, 400); + usbd_delay_ms(sc->sc_hdev.sc_udev, 400); ukbd_set_leds(sc, 0); hidkbd_attach_wskbd(kbd, layout, &ukbd_accessops); @@ -309,7 +306,6 @@ ukbd_activate(struct device *self, int act) case DVACT_DEACTIVATE: if (kbd->sc_wskbddev != NULL) rv = config_deactivate(kbd->sc_wskbddev); - sc->sc_dying = 1; break; } return (rv); @@ -351,7 +347,7 @@ ukbd_enable(void *v, int on) struct hidkbd *kbd = &sc->sc_kbd; int rv; - if (on && sc->sc_dying) + if (on && usbd_is_dying(sc->sc_hdev.sc_udev)) return EIO; if ((rv = hidkbd_enable(kbd, on)) != 0) @@ -372,7 +368,7 @@ ukbd_set_leds(void *v, int leds) struct hidkbd *kbd = &sc->sc_kbd; u_int8_t res; - if (sc->sc_dying) + if (usbd_is_dying(sc->sc_hdev.sc_udev)) return; if (sc->sc_ledsize && hidkbd_set_leds(kbd, leds, &res) != 0) @@ -413,7 +409,7 @@ ukbd_cngetc(void *v, u_int *type, int *data) DPRINTFN(0,("ukbd_cngetc: enter\n")); kbd->sc_polling = 1; while (kbd->sc_npollchar <= 0) - usbd_dopoll(sc->sc_hdev.sc_parent->sc_udev); + usbd_dopoll(sc->sc_hdev.sc_udev); kbd->sc_polling = 0; hidkbd_cngetc(kbd, type, data); DPRINTFN(0,("ukbd_cngetc: return 0x%02x\n", *data)); @@ -430,7 +426,7 @@ ukbd_cnpollc(void *v, int on) sc->sc_spl = splusb(); else splx(sc->sc_spl); - usbd_set_polling(sc->sc_hdev.sc_parent->sc_udev, on); + usbd_set_polling(sc->sc_hdev.sc_udev, on); } void diff --git a/sys/dev/usb/ums.c b/sys/dev/usb/ums.c index edec275ce2b..8e6c2add007 100644 --- a/sys/dev/usb/ums.c +++ b/sys/dev/usb/ums.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ums.c,v 1.37 2013/08/15 15:01:48 edd Exp $ */ +/* $OpenBSD: ums.c,v 1.38 2013/11/15 08:17:44 pirofti Exp $ */ /* $NetBSD: ums.c,v 1.60 2003/03/11 16:44:00 augustss Exp $ */ /* @@ -59,7 +59,6 @@ struct ums_softc { struct uhidev sc_hdev; struct hidms sc_ms; - char sc_dying; }; void ums_intr(struct uhidev *addr, void *ibuf, u_int len); @@ -94,8 +93,7 @@ const struct cfattach ums_ca = { int ums_match(struct device *parent, void *match, void *aux) { - struct usb_attach_arg *uaa = aux; - struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)uaa; + struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)aux; int size; void *desc; @@ -121,17 +119,18 @@ ums_attach(struct device *parent, struct device *self, void *aux) { struct ums_softc *sc = (struct ums_softc *)self; struct hidms *ms = &sc->sc_ms; - struct usb_attach_arg *uaa = aux; - struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)uaa; + struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)aux; + struct usb_attach_arg *uaa = uha->uaa; int size, repid; void *desc; u_int32_t quirks; sc->sc_hdev.sc_intr = ums_intr; sc->sc_hdev.sc_parent = uha->parent; + sc->sc_hdev.sc_udev = uaa->device; sc->sc_hdev.sc_report_id = uha->reportid; - quirks = usbd_get_quirks(uha->parent->sc_udev)->uq_flags; + quirks = usbd_get_quirks(sc->sc_hdev.sc_udev)->uq_flags; uhidev_get_report_desc(uha->parent, &desc, &size); repid = uha->reportid; sc->sc_hdev.sc_isize = hid_report_size(desc, size, hid_input, repid); @@ -175,7 +174,6 @@ ums_activate(struct device *self, int act) case DVACT_DEACTIVATE: if (ms->sc_wsmousedev != NULL) rv = config_deactivate(ms->sc_wsmousedev); - sc->sc_dying = 1; break; } return (rv); @@ -207,7 +205,7 @@ ums_enable(void *v) struct hidms *ms = &sc->sc_ms; int rv; - if (sc->sc_dying) + if (usbd_is_dying(sc->sc_hdev.sc_udev)) return EIO; if ((rv = hidms_enable(ms)) != 0) diff --git a/sys/dev/usb/utpms.c b/sys/dev/usb/utpms.c index 16a1321428c..09b34b91b59 100644 --- a/sys/dev/usb/utpms.c +++ b/sys/dev/usb/utpms.c @@ -1,4 +1,4 @@ -/* $OpenBSD: utpms.c,v 1.2 2013/07/06 14:42:38 mpi Exp $ */ +/* $OpenBSD: utpms.c,v 1.3 2013/11/15 08:17:44 pirofti Exp $ */ /* * Copyright (c) 2005, Johan Wallén @@ -229,7 +229,6 @@ struct utpms_softc { uint32_t sc_buttons; /* Button state. */ uint32_t sc_status; /* Status flags. */ #define UTPMS_ENABLED 1 /* Is the device enabled? */ -#define UTPMS_DYING 2 /* Is the device dying? */ #define UTPMS_VALID 4 /* Is the previous sample valid? */ }; @@ -265,8 +264,7 @@ const struct cfattach utpms_ca = { int utpms_match(struct device *parent, void *match, void *aux) { - struct usb_attach_arg *uaa = aux; - struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)uaa; + struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)aux; usb_device_descriptor_t *udd; int i; uint16_t vendor, product; @@ -292,8 +290,7 @@ void utpms_attach(struct device *parent, struct device *self, void *aux) { struct utpms_softc *sc = (struct utpms_softc *)self; - struct usb_attach_arg *uaa = aux; - struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)uaa; + struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)aux; struct wsmousedev_attach_args a; struct utpms_dev *pd; usb_device_descriptor_t *udd; @@ -301,6 +298,7 @@ utpms_attach(struct device *parent, struct device *self, void *aux) uint16_t vendor, product; sc->sc_datalen = UTPMS_DATA_LEN; + sc->sc_hdev.sc_udev = uha->uaa->device; /* Fill in device-specific parameters. */ if ((udd = usbd_get_device_descriptor(uha->parent->sc_udev)) != NULL) { @@ -375,7 +373,6 @@ utpms_activate(struct device *self, int act) ret = 0; if (sc->sc_wsmousedev != NULL) ret = config_deactivate(sc->sc_wsmousedev); - sc->sc_status |= UTPMS_DYING; return (ret); } return (EOPNOTSUPP); @@ -387,7 +384,7 @@ utpms_enable(void *v) struct utpms_softc *sc = v; /* Check that we are not detaching or already enabled. */ - if (sc->sc_status & UTPMS_DYING) + if (sc->sc_status & usbd_is_dying(sc->sc_hdev.sc_udev)) return (EIO); if (sc->sc_status & UTPMS_ENABLED) return (EBUSY); |