|
28 | 28 | #define MS_RDESC 0x08 |
29 | 29 | #define MS_NOGET 0x10 |
30 | 30 | #define MS_DUPLICATE_USAGES 0x20 |
| 31 | +#define MS_RDESC_3K 0x40 |
31 | 32 |
|
32 | | -/* |
33 | | - * Microsoft Wireless Desktop Receiver (Model 1028) has |
34 | | - * 'Usage Min/Max' where it ought to have 'Physical Min/Max' |
35 | | - */ |
36 | 33 | static __u8 *ms_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
37 | 34 | unsigned int *rsize) |
38 | 35 | { |
39 | 36 | unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); |
40 | 37 |
|
| 38 | + /* |
| 39 | + * Microsoft Wireless Desktop Receiver (Model 1028) has |
| 40 | + * 'Usage Min/Max' where it ought to have 'Physical Min/Max' |
| 41 | + */ |
41 | 42 | if ((quirks & MS_RDESC) && *rsize == 571 && rdesc[557] == 0x19 && |
42 | 43 | rdesc[559] == 0x29) { |
43 | 44 | hid_info(hdev, "fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n"); |
44 | 45 | rdesc[557] = 0x35; |
45 | 46 | rdesc[559] = 0x45; |
46 | 47 | } |
| 48 | + /* the same as above (s/usage/physical/) */ |
| 49 | + if ((quirks & MS_RDESC_3K) && *rsize == 106 && |
| 50 | + !memcmp((char []){ 0x19, 0x00, 0x29, 0xff }, |
| 51 | + &rdesc[94], 4)) { |
| 52 | + rdesc[94] = 0x35; |
| 53 | + rdesc[96] = 0x45; |
| 54 | + } |
47 | 55 | return rdesc; |
48 | 56 | } |
49 | 57 |
|
@@ -192,7 +200,7 @@ static const struct hid_device_id ms_devices[] = { |
192 | 200 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB), |
193 | 201 | .driver_data = MS_PRESENTER }, |
194 | 202 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K), |
195 | | - .driver_data = MS_ERGONOMY }, |
| 203 | + .driver_data = MS_ERGONOMY | MS_RDESC_3K }, |
196 | 204 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0), |
197 | 205 | .driver_data = MS_NOGET }, |
198 | 206 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500), |
|
0 commit comments