Lines 25-56
Link Here
|
25 |
#define MS_HIDINPUT 0x01 |
25 |
#define MS_HIDINPUT 0x01 |
26 |
#define MS_ERGONOMY 0x02 |
26 |
#define MS_ERGONOMY 0x02 |
27 |
#define MS_PRESENTER 0x04 |
27 |
#define MS_PRESENTER 0x04 |
28 |
#define MS_RDESC 0x08 |
28 |
#define _MS_RDESC 0x08 |
|
|
29 |
#define _MS_RDESC_OFFSET_MASK 0x000fff00 |
30 |
#define _MS_RDESC_OFFSET_SHIFT 8 |
31 |
#define _MS_RDESC_SIZE_MASK 0xfff00000 |
32 |
#define _MS_RDESC_SIZE_SHIFT 20 |
33 |
#define MS_RDESC(size, offset) (_MS_RDESC | ((offset) << _MS_RDESC_OFFSET_SHIFT) | ((size) << _MS_RDESC_SIZE_SHIFT)) |
29 |
#define MS_NOGET 0x10 |
34 |
#define MS_NOGET 0x10 |
30 |
#define MS_DUPLICATE_USAGES 0x20 |
35 |
#define MS_DUPLICATE_USAGES 0x20 |
31 |
#define MS_RDESC_3K 0x40 |
|
|
32 |
|
36 |
|
33 |
static __u8 *ms_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
37 |
static __u8 *ms_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
34 |
unsigned int *rsize) |
38 |
unsigned int *rsize) |
35 |
{ |
39 |
{ |
36 |
unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); |
40 |
unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); |
|
|
41 |
unsigned long offset = (quirks & _MS_RDESC_OFFSET_MASK) >> _MS_RDESC_OFFSET_SHIFT; |
42 |
unsigned long size = (quirks & _MS_RDESC_SIZE_MASK) >> _MS_RDESC_SIZE_SHIFT; |
37 |
|
43 |
|
38 |
/* |
44 |
/* |
39 |
* Microsoft Wireless Desktop Receiver (Model 1028) has |
45 |
* A bunch of Microsoft devices has 'Usage Min/Max' where it ought to have |
40 |
* 'Usage Min/Max' where it ought to have 'Physical Min/Max' |
46 |
* 'Physical Min/Max' |
41 |
*/ |
47 |
*/ |
42 |
if ((quirks & MS_RDESC) && *rsize == 571 && rdesc[557] == 0x19 && |
48 |
if ((quirks & _MS_RDESC) && *rsize == size && |
43 |
rdesc[559] == 0x29) { |
49 |
rdesc[offset + 0] == 0x19 && rdesc[offset + 1] == 0x00 && |
44 |
hid_info(hdev, "fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n"); |
50 |
rdesc[offset + 2] == 0x29 && rdesc[offset + 3] == 0xff) { |
45 |
rdesc[557] = 0x35; |
51 |
hid_info(hdev, "fixing up %s report descriptor\n", hdev->name); |
46 |
rdesc[559] = 0x45; |
52 |
rdesc[offset + 0] = 0x35; |
47 |
} |
53 |
rdesc[offset + 2] = 0x45; |
48 |
/* the same as above (s/usage/physical/) */ |
|
|
49 |
if ((quirks & MS_RDESC_3K) && *rsize == 106 && rdesc[94] == 0x19 && |
50 |
rdesc[95] == 0x00 && rdesc[96] == 0x29 && |
51 |
rdesc[97] == 0xff) { |
52 |
rdesc[94] = 0x35; |
53 |
rdesc[96] = 0x45; |
54 |
} |
54 |
} |
55 |
return rdesc; |
55 |
return rdesc; |
56 |
} |
56 |
} |
Lines 267-281
static const struct hid_device_id ms_devices[] = {
Link Here
|
267 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE7K), |
267 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE7K), |
268 |
.driver_data = MS_ERGONOMY }, |
268 |
.driver_data = MS_ERGONOMY }, |
269 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K), |
269 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K), |
270 |
.driver_data = MS_ERGONOMY | MS_RDESC }, |
270 |
.driver_data = MS_ERGONOMY | MS_RDESC(571, 557) }, |
271 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB), |
271 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB), |
272 |
.driver_data = MS_PRESENTER }, |
272 |
.driver_data = MS_PRESENTER }, |
273 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K), |
273 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K), |
274 |
.driver_data = MS_ERGONOMY | MS_RDESC_3K }, |
274 |
.driver_data = MS_ERGONOMY | MS_RDESC(106, 94) }, |
275 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_7K), |
275 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_7K), |
276 |
.driver_data = MS_ERGONOMY }, |
276 |
.driver_data = MS_ERGONOMY | MS_RDESC(106, 94) }, |
277 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_600), |
277 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_600), |
278 |
.driver_data = MS_ERGONOMY }, |
278 |
.driver_data = MS_ERGONOMY | MS_RDESC(106, 94) }, |
279 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1), |
279 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1), |
280 |
.driver_data = MS_ERGONOMY }, |
280 |
.driver_data = MS_ERGONOMY }, |
281 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0), |
281 |
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0), |
282 |
- |
|
|