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 <jbraz...@redhat.com>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoi...@redhat.com>
> ---
> 
> 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-input" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to