Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
Pull HID updates from Jiri Kosina: - i2c-hid race condition fix from Jean-Baptiste Maneyrol - Logitech driver now supports vendor-specific HID++ protocol, allowing us to deliver a full multitouch support on wider range of Logitech touchpads. Written by Benjamin Tissoires - MS Surface Pro 3 Type Cover support added by Alan Wu - RMI touchpad support improvements from Andrew Duggan - a lot of updates to Wacom driver from Jason Gerecke and Ping Cheng - various small fixes all over the place * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: (56 commits) HID: rmi: The address of query8 must be calculated based on which query registers are present HID: rmi: Check for additional ACM registers appended to F11 data report HID: i2c-hid: prevent buffer overflow in early IRQ HID: logitech-hidpp: disable io in probe error path HID: logitech-hidpp: add boundary check for name retrieval HID: logitech-hidpp: check name retrieval return code HID: logitech-hidpp: do not return the name length HID: wacom: Report input events for each finger on generic devices HID: wacom: Initialize MT slots for generic devices at post_parse_hid HID: wacom: Update maximum X/Y accounding to outbound offset HID: wacom: Add support for DTU-1031X HID: wacom: add defines for new Cintiq and DTU outbound tracking HID: wacom: fix freeze on open when autosuspend is on HID: wacom: re-add accidentally dropped Lenovo PID HID: make hid_report_len as a static inline function in hid.h HID: wacom: Consult the application usage when determining field type HID: wacom: PAD is independent with pen/touch HID: multitouch: Add quirk for VTL touch panels HID: i2c-hid: fix race condition reading reports HID: wacom: Add angular resolution data to some ABS axes ...
This commit is contained in:
@@ -137,6 +137,7 @@ struct i2c_hid {
|
||||
* descriptor. */
|
||||
unsigned int bufsize; /* i2c buffer size */
|
||||
char *inbuf; /* Input buffer */
|
||||
char *rawbuf; /* Raw Input buffer */
|
||||
char *cmdbuf; /* Command buffer */
|
||||
char *argsbuf; /* Command arguments buffer */
|
||||
|
||||
@@ -369,7 +370,7 @@ static int i2c_hid_hwreset(struct i2c_client *client)
|
||||
static void i2c_hid_get_input(struct i2c_hid *ihid)
|
||||
{
|
||||
int ret, ret_size;
|
||||
int size = le16_to_cpu(ihid->hdesc.wMaxInputLength);
|
||||
int size = ihid->bufsize;
|
||||
|
||||
ret = i2c_master_recv(ihid->client, ihid->inbuf, size);
|
||||
if (ret != size) {
|
||||
@@ -437,7 +438,7 @@ static void i2c_hid_init_report(struct hid_report *report, u8 *buffer,
|
||||
report->id, buffer, size))
|
||||
return;
|
||||
|
||||
i2c_hid_dbg(ihid, "report (len=%d): %*ph\n", size, size, ihid->inbuf);
|
||||
i2c_hid_dbg(ihid, "report (len=%d): %*ph\n", size, size, buffer);
|
||||
|
||||
ret_size = buffer[0] | (buffer[1] << 8);
|
||||
|
||||
@@ -504,9 +505,11 @@ static void i2c_hid_find_max_report(struct hid_device *hid, unsigned int type,
|
||||
static void i2c_hid_free_buffers(struct i2c_hid *ihid)
|
||||
{
|
||||
kfree(ihid->inbuf);
|
||||
kfree(ihid->rawbuf);
|
||||
kfree(ihid->argsbuf);
|
||||
kfree(ihid->cmdbuf);
|
||||
ihid->inbuf = NULL;
|
||||
ihid->rawbuf = NULL;
|
||||
ihid->cmdbuf = NULL;
|
||||
ihid->argsbuf = NULL;
|
||||
ihid->bufsize = 0;
|
||||
@@ -522,10 +525,11 @@ static int i2c_hid_alloc_buffers(struct i2c_hid *ihid, size_t report_size)
|
||||
report_size; /* report */
|
||||
|
||||
ihid->inbuf = kzalloc(report_size, GFP_KERNEL);
|
||||
ihid->rawbuf = kzalloc(report_size, GFP_KERNEL);
|
||||
ihid->argsbuf = kzalloc(args_len, GFP_KERNEL);
|
||||
ihid->cmdbuf = kzalloc(sizeof(union command) + args_len, GFP_KERNEL);
|
||||
|
||||
if (!ihid->inbuf || !ihid->argsbuf || !ihid->cmdbuf) {
|
||||
if (!ihid->inbuf || !ihid->rawbuf || !ihid->argsbuf || !ihid->cmdbuf) {
|
||||
i2c_hid_free_buffers(ihid);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -552,12 +556,12 @@ static int i2c_hid_get_raw_report(struct hid_device *hid,
|
||||
|
||||
ret = i2c_hid_get_report(client,
|
||||
report_type == HID_FEATURE_REPORT ? 0x03 : 0x01,
|
||||
report_number, ihid->inbuf, ask_count);
|
||||
report_number, ihid->rawbuf, ask_count);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret_count = ihid->inbuf[0] | (ihid->inbuf[1] << 8);
|
||||
ret_count = ihid->rawbuf[0] | (ihid->rawbuf[1] << 8);
|
||||
|
||||
if (ret_count <= 2)
|
||||
return 0;
|
||||
@@ -566,7 +570,7 @@ static int i2c_hid_get_raw_report(struct hid_device *hid,
|
||||
|
||||
/* The query buffer contains the size, dropping it in the reply */
|
||||
count = min(count, ret_count - 2);
|
||||
memcpy(buf, ihid->inbuf + 2, count);
|
||||
memcpy(buf, ihid->rawbuf + 2, count);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
Reference in New Issue
Block a user