View | Details | Raw Unified | Return to bug 37982 | Differences between
and this patch

Collapse All | Expand All

(-)a/drivers/hid/hid-microsoft.c (-21 / +20 lines)
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
- 

Return to bug 37982