Commit 1db1f392 authored by Jason Gerecke's avatar Jason Gerecke Committed by Jiri Kosina

HID: wacom: Ensure bootloader PID is usable in hidraw mode

Some Wacom devices have a special "bootloader" mode that is used for
firmware flashing. When operating in this mode, the device cannot be
used for input, and the HID descriptor is not able to be processed by
the driver. The driver generates an "Unknown device_type" warning and
then returns an error code from wacom_probe(). This is a problem because
userspace still needs to be able to interact with the device via hidraw
to perform the firmware flash.

This commit adds a non-generic device definition for 056a:0094 which
is used when devices are in "bootloader" mode. It marks the devices
with a special BOOTLOADER type that is recognized by wacom_probe() and
wacom_raw_event(). When we see this type we ensure a hidraw device is
created and otherwise keep our hands off so that userspace is in full
control.
Signed-off-by: default avatarJason Gerecke <jason.gerecke@wacom.com>
Tested-by: default avatarTatsunosuke Tobita <tatsunosuke.tobita@wacom.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 53ffa6a9
...@@ -155,6 +155,9 @@ static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report, ...@@ -155,6 +155,9 @@ static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
{ {
struct wacom *wacom = hid_get_drvdata(hdev); struct wacom *wacom = hid_get_drvdata(hdev);
if (wacom->wacom_wac.features.type == BOOTLOADER)
return 0;
if (size > WACOM_PKGLEN_MAX) if (size > WACOM_PKGLEN_MAX)
return 1; return 1;
...@@ -2785,6 +2788,11 @@ static int wacom_probe(struct hid_device *hdev, ...@@ -2785,6 +2788,11 @@ static int wacom_probe(struct hid_device *hdev,
return error; return error;
} }
if (features->type == BOOTLOADER) {
hid_warn(hdev, "Using device in hidraw-only mode");
return hid_hw_start(hdev, HID_CONNECT_HIDRAW);
}
error = wacom_parse_and_register(wacom, false); error = wacom_parse_and_register(wacom, false);
if (error) if (error)
return error; return error;
......
...@@ -4882,6 +4882,9 @@ static const struct wacom_features wacom_features_0x3dd = ...@@ -4882,6 +4882,9 @@ static const struct wacom_features wacom_features_0x3dd =
static const struct wacom_features wacom_features_HID_ANY_ID = static const struct wacom_features wacom_features_HID_ANY_ID =
{ "Wacom HID", .type = HID_GENERIC, .oVid = HID_ANY_ID, .oPid = HID_ANY_ID }; { "Wacom HID", .type = HID_GENERIC, .oVid = HID_ANY_ID, .oPid = HID_ANY_ID };
static const struct wacom_features wacom_features_0x94 =
{ "Wacom Bootloader", .type = BOOTLOADER };
#define USB_DEVICE_WACOM(prod) \ #define USB_DEVICE_WACOM(prod) \
HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\ HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
.driver_data = (kernel_ulong_t)&wacom_features_##prod .driver_data = (kernel_ulong_t)&wacom_features_##prod
...@@ -4955,6 +4958,7 @@ const struct hid_device_id wacom_ids[] = { ...@@ -4955,6 +4958,7 @@ const struct hid_device_id wacom_ids[] = {
{ USB_DEVICE_WACOM(0x84) }, { USB_DEVICE_WACOM(0x84) },
{ USB_DEVICE_WACOM(0x90) }, { USB_DEVICE_WACOM(0x90) },
{ USB_DEVICE_WACOM(0x93) }, { USB_DEVICE_WACOM(0x93) },
{ USB_DEVICE_WACOM(0x94) },
{ USB_DEVICE_WACOM(0x97) }, { USB_DEVICE_WACOM(0x97) },
{ USB_DEVICE_WACOM(0x9A) }, { USB_DEVICE_WACOM(0x9A) },
{ USB_DEVICE_WACOM(0x9F) }, { USB_DEVICE_WACOM(0x9F) },
......
...@@ -243,6 +243,7 @@ enum { ...@@ -243,6 +243,7 @@ enum {
MTTPC, MTTPC,
MTTPC_B, MTTPC_B,
HID_GENERIC, HID_GENERIC,
BOOTLOADER,
MAX_TYPE MAX_TYPE
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment