|
@@ -1032,7 +1032,7 @@ static struct hid_report *hid_get_report(struct hid_report_enum *report_enum,
|
|
|
return report;
|
|
|
}
|
|
|
|
|
|
-void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
|
|
|
+int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
|
|
|
int interrupt)
|
|
|
{
|
|
|
struct hid_report_enum *report_enum = hid->report_enum + type;
|
|
@@ -1040,10 +1040,11 @@ void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
|
|
|
unsigned int a;
|
|
|
int rsize, csize = size;
|
|
|
u8 *cdata = data;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
report = hid_get_report(report_enum, data);
|
|
|
if (!report)
|
|
|
- return;
|
|
|
+ goto out;
|
|
|
|
|
|
if (report_enum->numbered) {
|
|
|
cdata++;
|
|
@@ -1063,14 +1064,19 @@ void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
|
|
|
|
|
|
if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event)
|
|
|
hid->hiddev_report_event(hid, report);
|
|
|
- if (hid->claimed & HID_CLAIMED_HIDRAW)
|
|
|
- hidraw_report_event(hid, data, size);
|
|
|
+ if (hid->claimed & HID_CLAIMED_HIDRAW) {
|
|
|
+ ret = hidraw_report_event(hid, data, size);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
for (a = 0; a < report->maxfield; a++)
|
|
|
hid_input_field(hid, report->field[a], cdata, interrupt);
|
|
|
|
|
|
if (hid->claimed & HID_CLAIMED_INPUT)
|
|
|
hidinput_report_event(hid, report);
|
|
|
+out:
|
|
|
+ return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(hid_report_raw_event);
|
|
|
|
|
@@ -1147,7 +1153,7 @@ nomem:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- hid_report_raw_event(hid, type, data, size, interrupt);
|
|
|
+ ret = hid_report_raw_event(hid, type, data, size, interrupt);
|
|
|
|
|
|
unlock:
|
|
|
up(&hid->driver_lock);
|