From: David Herrmann Date: Mon, 2 Sep 2013 11:58:09 +0000 (+0200) Subject: hog: ignore UHID-setup events and document why X-Git-Tag: android-x86-4.4-r3~7680 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=8a8a49941e2112f538904e9e6ed828f37e966013;p=android-x86%2Fexternal-bluetooth-bluez.git hog: ignore UHID-setup events and document why The UHID_{START,STOP,OPEN,CLOSE} events should be ignored by us to avoid triggering the warn(). It is safe to do that. Add few comments that explain why we don't have to handle these. --- diff --git a/profiles/input/hog.c b/profiles/input/hog.c index 91c2802f4..4647fefba 100644 --- a/profiles/input/hog.c +++ b/profiles/input/hog.c @@ -621,12 +621,43 @@ static gboolean uhid_event_cb(GIOChannel *io, GIOCondition cond, DBG("uHID event type %d received", ev.type); switch (ev.type) { + case UHID_START: + case UHID_STOP: + /* These are called to start and stop the underlying hardware. + * For HoG we open the channels before creating the device so + * the hardware is always ready. No need to handle these. + * Note that these are also called when the kernel switches + * between device-drivers loaded on the HID device. But we can + * simply keep the hardware alive during transitions and it + * works just fine. + * The kernel never destroys a device itself! Only an explicit + * UHID_DESTROY request can remove a device. */ + break; + case UHID_OPEN: + case UHID_CLOSE: + /* OPEN/CLOSE are sent whenever user-space opens any interface + * provided by the kernel HID device. Whenever the open-count + * is non-zero we must be ready for I/O. As long as it is zero, + * we can decide to drop all I/O and put the device + * asleep This is optional, though. Moreover, some + * special device drivers are buggy in that regard, so + * maybe we just keep I/O always awake like HIDP in the + * kernel does. */ + break; case UHID_OUTPUT: case UHID_FEATURE: forward_report(hogdev, &ev); break; case UHID_OUTPUT_EV: - DBG("uHID output event: type %d code %d value %d", + /* This is only sent by kernels prior to linux-3.11. It + * requires us to parse HID-descriptors in user-space to + * properly handle it. This is redundant as the kernel + * does it already. That's why newer kernels assemble + * the output-reports and send it to us via UHID_OUTPUT. + * We never implemented this, so we rely on users to use + * recent-enough kernels if they want this feature. No reason + * to implement this for older kernels. */ + DBG("Unsupported uHID output event: type %d code %d value %d", ev.u.output_ev.type, ev.u.output_ev.code, ev.u.output_ev.value); break;