HID: wacom: Ensure bootloader PID is usable in hidraw mode
authorJason Gerecke <killertofu@gmail.com>
Thu, 1 Dec 2022 23:11:41 +0000 (15:11 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 7 Jan 2023 11:07:34 +0000 (12:07 +0100)
commit 1db1f392591aff13fd643f0ec7c1d5e27391d700 upstream.

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: Jason Gerecke <jason.gerecke@wacom.com>
Tested-by: Tatsunosuke Tobita <tatsunosuke.tobita@wacom.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hid/wacom_sys.c
drivers/hid/wacom_wac.c
drivers/hid/wacom_wac.h

index b74fcda49a2232249f2ad0d197ea046c514d86c2..9b7195283268b2901fa32d0eb72908a48f4e6886 100644 (file)
@@ -69,6 +69,9 @@ static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
 {
        struct wacom *wacom = hid_get_drvdata(hdev);
 
+       if (wacom->wacom_wac.features.type == BOOTLOADER)
+               return 0;
+
        if (size > WACOM_PKGLEN_MAX)
                return 1;
 
@@ -2409,6 +2412,11 @@ static int wacom_probe(struct hid_device *hdev,
                goto fail;
        }
 
+       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);
        if (error)
                goto fail;
index bfce62dbe0acee13b92a05177504a12b2fad500a..2d9800edda92c562f9d37835231aeeef5ca5f0d0 100644 (file)
@@ -3550,6 +3550,9 @@ static const struct wacom_features wacom_features_0x343 =
 static const struct wacom_features wacom_features_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)                                         \
        HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
        .driver_data = (kernel_ulong_t)&wacom_features_##prod
@@ -3623,6 +3626,7 @@ const struct hid_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0x84) },
        { USB_DEVICE_WACOM(0x90) },
        { USB_DEVICE_WACOM(0x93) },
+       { USB_DEVICE_WACOM(0x94) },
        { USB_DEVICE_WACOM(0x97) },
        { USB_DEVICE_WACOM(0x9A) },
        { USB_DEVICE_WACOM(0x9F) },
index 324c40b0c1194acd58310df39679a176d9011bb3..ccdfe3c4070812acfe37981b482d16b1304a2573 100644 (file)
@@ -154,6 +154,7 @@ enum {
        MTTPC,
        MTTPC_B,
        HID_GENERIC,
+       BOOTLOADER,
        MAX_TYPE
 };