| From f97e96c303d689708f7f713d8f3afcc31f1237e9 Mon Sep 17 00:00:00 2001 |
| From: Oliver Neukum <oneukum@suse.com> |
| Date: Tue, 17 Mar 2026 09:41:10 +0100 |
| Subject: cdc-acm: new quirk for EPSON HMD |
| |
| From: Oliver Neukum <oneukum@suse.com> |
| |
| commit f97e96c303d689708f7f713d8f3afcc31f1237e9 upstream. |
| |
| This device has a union descriptor that is just garbage |
| and needs a custom descriptor. |
| In principle this could be done with a (conditionally |
| activated) heuristic. That would match more devices |
| without a need for defining a new quirk. However, |
| this always carries the risk that the heuristics |
| does the wrong thing and leads to more breakage. |
| Defining the quirk and telling it exactly what to do |
| is the safe and conservative approach. |
| |
| Signed-off-by: Oliver Neukum <oneukum@suse.com> |
| Cc: stable <stable@kernel.org> |
| Link: https://patch.msgid.link/20260317084139.1461008-1-oneukum@suse.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/usb/class/cdc-acm.c | 9 +++++++++ |
| drivers/usb/class/cdc-acm.h | 1 + |
| 2 files changed, 10 insertions(+) |
| |
| --- a/drivers/usb/class/cdc-acm.c |
| +++ b/drivers/usb/class/cdc-acm.c |
| @@ -1218,6 +1218,12 @@ static int acm_probe(struct usb_interfac |
| if (!data_interface || !control_interface) |
| return -ENODEV; |
| goto skip_normal_probe; |
| + } else if (quirks == NO_UNION_12) { |
| + data_interface = usb_ifnum_to_if(usb_dev, 2); |
| + control_interface = usb_ifnum_to_if(usb_dev, 1); |
| + if (!data_interface || !control_interface) |
| + return -ENODEV; |
| + goto skip_normal_probe; |
| } |
| |
| /* normal probing*/ |
| @@ -1749,6 +1755,9 @@ static const struct usb_device_id acm_id |
| { USB_DEVICE(0x045b, 0x024D), /* Renesas R-Car E3 USB Download mode */ |
| .driver_info = DISABLE_ECHO, /* Don't echo banner */ |
| }, |
| + { USB_DEVICE(0x04b8, 0x0d12), /* EPSON HMD Com&Sens */ |
| + .driver_info = NO_UNION_12, /* union descriptor is garbage */ |
| + }, |
| { USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; andrey.arapov@gmail.com */ |
| .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ |
| }, |
| --- a/drivers/usb/class/cdc-acm.h |
| +++ b/drivers/usb/class/cdc-acm.h |
| @@ -142,3 +142,4 @@ struct acm { |
| #define SEND_ZERO_PACKET BIT(6) |
| #define DISABLE_ECHO BIT(7) |
| #define MISSING_CAP_BRK BIT(8) |
| +#define NO_UNION_12 BIT(9) |