Re: [PATCH] HID: kye: Add report fixup for Genius Gx ImperatorKeyboard

From: Jiri Kosina
Date: Sun Jul 14 2013 - 17:14:37 EST


On Fri, 12 Jul 2013, Benjamin Tissoires wrote:

> Genius Gx Imperator Keyboard presents the same problem in its report
> descriptors than Genius Gila Gaming Mouse.
> Use the same fixup for both.
>
> Fixes:
> https://bugzilla.redhat.com/show_bug.cgi?id=928561
>
> Reported-and-tested-by: Honza Brazdil <jbrazdil@xxxxxxxxxx>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@xxxxxxxxxx>
> ---
>
> Hi Jiri,
>
> I have been reported this broken Genius device too.
> The patch applies on top of the branch for-3.11/upstream, but feel free to
> schedule it for 3.11 or 3.12. This time, only the multimedia (and macros) keys
> are broken. The core keyboard part is working fine without the patch.
>
> Cheers,
> Benjamin
>
> drivers/hid/hid-ids.h | 1 +
> drivers/hid/hid-kye.c | 45 ++++++++++++++++++++++++++++-----------------
> 2 files changed, 29 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> index b2b692e..1f28df9 100644
> --- a/drivers/hid/hid-ids.h
> +++ b/drivers/hid/hid-ids.h
> @@ -475,6 +475,7 @@
> #define USB_VENDOR_ID_KYE 0x0458
> #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087
> #define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE 0x0138
> +#define USB_DEVICE_ID_GENIUS_GX_IMPERATOR 0x4018
> #define USB_DEVICE_ID_KYE_GPEN_560 0x5003
> #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010
> #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011
> diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c
> index 1e2ee2aa..7384512 100644
> --- a/drivers/hid/hid-kye.c
> +++ b/drivers/hid/hid-kye.c
> @@ -268,6 +268,26 @@ static __u8 easypen_m610x_rdesc_fixed[] = {
> 0xC0 /* End Collection */
> };
>
> +static __u8 *kye_consumer_control_fixup(struct hid_device *hdev, __u8 *rdesc,
> + unsigned int *rsize, int offset, const char *device_name) {
> + /*
> + * the fixup that need to be done:
> + * - change Usage Maximum in the Comsumer Control
> + * (report ID 3) to a reasonable value
> + */
> + if (*rsize >= offset + 31 &&
> + /* Usage Page (Consumer Devices) */
> + rdesc[offset] == 0x05 && rdesc[offset + 1] == 0x0c &&
> + /* Usage (Consumer Control) */
> + rdesc[offset + 2] == 0x09 && rdesc[offset + 3] == 0x01 &&
> + /* Usage Maximum > 12287 */
> + rdesc[offset + 10] == 0x2a && rdesc[offset + 12] > 0x2f) {
> + hid_info(hdev, "fixing up %s report descriptor\n", device_name);
> + rdesc[offset + 12] = 0x2f;
> + }
> + return rdesc;
> +}
> +
> static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
> unsigned int *rsize)
> {
> @@ -315,23 +335,12 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
> }
> break;
> case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE:
> - /*
> - * the fixup that need to be done:
> - * - change Usage Maximum in the Comsumer Control
> - * (report ID 3) to a reasonable value
> - */
> - if (*rsize >= 135 &&
> - /* Usage Page (Consumer Devices) */
> - rdesc[104] == 0x05 && rdesc[105] == 0x0c &&
> - /* Usage (Consumer Control) */
> - rdesc[106] == 0x09 && rdesc[107] == 0x01 &&
> - /* Usage Maximum > 12287 */
> - rdesc[114] == 0x2a && rdesc[116] > 0x2f) {
> - hid_info(hdev,
> - "fixing up Genius Gila Gaming Mouse "
> - "report descriptor\n");
> - rdesc[116] = 0x2f;
> - }
> + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104,
> + "Genius Gila Gaming Mouse");
> + break;
> + case USB_DEVICE_ID_GENIUS_GX_IMPERATOR:
> + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83,
> + "Genius Gx Imperator Keyboard");
> break;
> }
> return rdesc;
> @@ -428,6 +437,8 @@ static const struct hid_device_id kye_devices[] = {
> USB_DEVICE_ID_KYE_EASYPEN_M610X) },
> { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
> USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
> + { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
> + USB_DEVICE_ID_GENIUS_GX_IMPERATOR) },
> { }
> };

Hi Benjamin,

I guess you are missing update of hid_have_special_driver[] list?

--
Jiri Kosina
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/