|
@@ -924,7 +924,7 @@ static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
|
|
|
|
|
|
/*
|
|
|
* If the mutex is locked then we have a pending answer from a
|
|
|
- * previoulsly sent command
|
|
|
+ * previously sent command.
|
|
|
*/
|
|
|
if (unlikely(mutex_is_locked(&hidpp->send_mutex))) {
|
|
|
/*
|
|
@@ -955,9 +955,6 @@ static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
- if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
|
|
|
- return wtp_raw_event(hidpp->hid_dev, data, size);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -965,7 +962,9 @@ static int hidpp_raw_event(struct hid_device *hdev, struct hid_report *report,
|
|
|
u8 *data, int size)
|
|
|
{
|
|
|
struct hidpp_device *hidpp = hid_get_drvdata(hdev);
|
|
|
+ int ret = 0;
|
|
|
|
|
|
+ /* Generic HID++ processing. */
|
|
|
switch (data[0]) {
|
|
|
case REPORT_ID_HIDPP_LONG:
|
|
|
if (size != HIDPP_REPORT_LONG_LENGTH) {
|
|
@@ -973,16 +972,23 @@ static int hidpp_raw_event(struct hid_device *hdev, struct hid_report *report,
|
|
|
size);
|
|
|
return 1;
|
|
|
}
|
|
|
- return hidpp_raw_hidpp_event(hidpp, data, size);
|
|
|
+ ret = hidpp_raw_hidpp_event(hidpp, data, size);
|
|
|
+ break;
|
|
|
case REPORT_ID_HIDPP_SHORT:
|
|
|
if (size != HIDPP_REPORT_SHORT_LENGTH) {
|
|
|
hid_err(hdev, "received hid++ report of bad size (%d)",
|
|
|
size);
|
|
|
return 1;
|
|
|
}
|
|
|
- return hidpp_raw_hidpp_event(hidpp, data, size);
|
|
|
+ ret = hidpp_raw_hidpp_event(hidpp, data, size);
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
+ /* If no report is available for further processing, skip calling
|
|
|
+ * raw_event of subclasses. */
|
|
|
+ if (ret != 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)
|
|
|
return wtp_raw_event(hdev, data, size);
|
|
|
|