Hi Ben,
In answer to your logging request, this is the output after running
echo 'file drivers/hid/usbhid/hid-core.c +p' | sudo tee
/sys/kernel/debug/dynamic_debug/control
and plugging in the device (with the debian kernel, not my patched one)
[ 371.897694] usb 1-2: new full-speed USB device number 8 using xhci_hcd
[ 372.036133] usb 1-2: New USB device found, idVendor=03c3,
idProduct=1f01, bcdDevice= 0.00
[ 372.036145] usb 1-2: New USB device strings: Mfr=1, Product=2,
SerialNumber=0
[ 372.036149] usb 1-2: Product: ZWO EFW
[ 372.036152] usb 1-2: Manufacturer: ZW0
[ 372.043375] drivers/hid/usbhid/hid-core.c: HID probe called for ifnum 0
[ 372.043404] drivers/hid/usbhid/hid-core.c: hid descriptor invalid,
bLen=9 bNum=2
[ 372.043409] usbhid 1-2:1.0: can't add hid device: -22
[ 372.043422] usbhid 1-2:1.0: probe with driver usbhid failed with error
-22
Also here is a more detailed lsusb output
Bus 001 Device 008: ID 03c3:1f01 ZWO ZWO EFW
Negotiated speed: Full Speed (12Mbps)
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 [unknown]
bDeviceSubClass 0 [unknown]
bDeviceProtocol 0
bMaxPacketSize0 16
idVendor 0x03c3 ZWO
idProduct 0x1f01 ZWO EFW
bcdDevice 0.00
iManufacturer 1 ZW0
iProduct 2 ZWO EFW
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0029
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 64mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0 [unknown]
bInterfaceProtocol 0
iInterface 0
Warning: Descriptor too short
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.01
bCountryCode 0 Not supported
bNumDescriptors 2
bDescriptorType 34 (null)
wDescriptorLength 68
bDescriptorType 0 (null)
wDescriptorLength 0
Report Descriptor: (length is 68)
Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
(null)
Item(Local ): (null), data= [ 0x01 ] 1
(null)
Item(Main ): (null), data= [ 0x01 ] 1
Application
Item(Global): (null), data= [ 0x01 ] 1
Item(Global): (null), data= [ 0x0f ] 15
Item(Global): (null), data= [ 0x08 ] 8
Item(Global): (null), data= [ 0xff 0x00 ] 255
Item(Global): (null), data= [ 0x00 ] 0
Item(Local ): (null), data= [ 0x01 ] 1
(null)
Item(Main ): (null), data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile
Bitfield
Item(Global): (null), data= [ 0x02 ] 2
Item(Global): (null), data= [ 0x0f ] 15
Item(Global): (null), data= [ 0x08 ] 8
Item(Global): (null), data= [ 0xff 0x00 ] 255
Item(Global): (null), data= [ 0x00 ] 0
Item(Local ): (null), data= [ 0x01 ] 1
(null)
Item(Main ): (null), data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile
Bitfield
Item(Global): (null), data= [ 0x03 ] 3
Item(Global): (null), data= [ 0x0f ] 15
Item(Global): (null), data= [ 0x08 ] 8
Item(Global): (null), data= [ 0xff 0x00 ] 255
Item(Global): (null), data= [ 0x00 ] 0
Item(Local ): (null), data= [ 0x01 ] 1
(null)
Item(Main ): (null), data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile
Bitfield
Item(Global): (null), data= [ 0x04 ] 4
Item(Global): (null), data= [ 0x0f ] 15
Item(Global): (null), data= [ 0x08 ] 8
Item(Global): (null), data= [ 0xff 0x00 ] 255
Item(Global): (null), data= [ 0x00 ] 0
Item(Local ): (null), data= [ 0x01 ] 1
(null)
Item(Main ): (null), data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile
Bitfield
Item(Main ): (null), data=none
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 10
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 10
Device Status: 0x0000
(Bus Powered)
On Mon, 15 Dec 2025 at 10:11, Benjamin Tissoires <[email protected]> wrote:
> On Dec 14 2025, Salvatore Bonaccorso wrote:
> > Hi Sam,
> >
> > Jiri, Benjamin, this is about a report originally done in Debian as
> > https://bugs.debian.org/1122193 where Sam's device, a ZWO EFWmini with
> > vendor and product id's as 03c3:1f01 is not working, usbhid not
> > loaded.
> >
> > On Mon, Dec 08, 2025 at 03:03:49PM +0000, Sam Halliday wrote:
> > > Package: linux-image-amd64
> > > Version: 6.12.57-1
> > > Severity: normal
> > > Tags: patch
> > > X-Debbugs-Cc: [email protected]
> > > User: [email protected]
> > > Usertags: amd64
> > >
> > > Dear Maintainer,
> > >
> > > I propose a patch to workaround USB HID descriptor requirements that
> > > are stopping users from being able to use astrophotography
> > > equipment.
> > >
> > > I have a usb device (an ZWO EFWmini, used for astronomy) which has
> > > the following vendor information: 03c3:1f01 ZWO ZWO EFW
> > >
> > > This device is known to offer a suboptimal descriptor, e.g. see the
> lsusb output
> > >
> > > Warning: Descriptor too short
> > > HID Device Descriptor:
> > > bLength 9
> > > bDescriptorType 33
> > > bcdHID 1.01
> > > bCountryCode 0 Not supported
> > > bNumDescriptors 2
> > > bDescriptorType 34 (null)
> > > wDescriptorLength 68
> > > bDescriptorType 0 (null)
> > > wDescriptorLength 0
> > > Report Descriptors:
> > > ** UNAVAILABLE **
> > >
> > > My software (I write it, it is GPLv3, I'm the only user, but it isn't
> particularly relevant...) runs primarilly on a raspberry pi, which accepts
> this with kernel 6.12.25-1+rpt1, and I've also done some desktop
> development on archlinux (unknown kernel versions but up to at least 6
> months ago). I only access the hardware for development from a debian
> desktop computer.
> > >
> > > Since moving to Debian 13, my hardware no longer works, with dmesg
> showing the following error:
> > >
> > > [ 14.182522] usb 1-2.2: new full-speed USB device number 10 using
> xhci_hcd
> > > [ 14.276921] usb 1-2.2: New USB device found, idVendor=03c3,
> idProduct=1f01, bcdDevice= 0.00
> > > [ 14.276930] usb 1-2.2: New USB device strings: Mfr=1, Product=2,
> SerialNumber=0
> > > [ 14.276933] usb 1-2.2: Product: ZWO EFW
> > > [ 14.276935] usb 1-2.2: Manufacturer: ZW0
> > > [ 14.282951] usbhid 1-2.2:1.0: can't add hid device: -22
> > > [ 14.282963] usbhid 1-2.2:1.0: probe with driver usbhid failed with
> error -22
> > >
> > > I have tried going back as far as debian's kernel from bullseye
> (5.10), bookworm (6.1), trixie (6.12) and backports (6.17) but it's the
> same error every time.
> > >
> > > Communicating with the ZWO (the device manufacturer) support team,
> they recommended patching the kernel, which I did, and it now works.
> > >
> > > I applied the following patch and built my own kernel
> > >
> > >
> ===========================================================================
> > > --- drivers/hid/usbhid/hid-core.c.orig 2025-12-08
> 13:15:08.657917762 +0000
> > > +++ drivers/hid/usbhid/hid-core.c 2025-12-08 13:16:24.293959487 +0000
> > > @@ -1015,7 +1015,7 @@
> > > (hdesc->bNumDescriptors - 1) *
> sizeof(*hcdesc)) {
> > > dbg_hid("hid descriptor invalid, bLen=%hhu bNum=%hhu\n",
> > > hdesc->bLength, hdesc->bNumDescriptors);
> > > - return -EINVAL;
> > > + // return -EINVAL;
>
> That looks like the wrong thing to do, especialy because the 2 previous
> commits introducing that check are to protect against out of bound
> errors:
> See fe7f7ac8e0c7 ("HID: usbhid: Eliminate recurrent out-of-bounds bug in
> usbhid_parse()")
>
> Can we get the debug output from the line above (or just add plain
> printks in the running kernel)? I suspect we might losen the test with a
> '<' instead of an '!='.
>
> > > }
> > >
> > > hid->version = le16_to_cpu(hdesc->bcdHID);
> > >
> ===========================================================================
> > >
> > > The new dmesg output is
> > >
> > > [ 366.477628] usbhid 1-2:1.0: 1 unsupported optional hid class
> descriptors
> > > [ 366.478327] hid-generic 0003:03C3:1F01.0006: hiddev1,hidraw4: USB
> HID v1.01 Device [ZW0 ZWO EFW] on usb-000
> > >
> > >
> > > Apologies but I don't think I'm giving you a particularly good patch
> > > because the author of this code clearly intended for a -EINVAL
> > > failure. A kernel dev may prefer to create a hardware quirk (which
> > > ideally should be enabled for 03c3:1f01 by default) to exit if the
> > > descriptor isn't valid. I'm not a kernel developer so that's beyond
> > > me.
> > >
> > > The device works perfectly fine despite the descriptor not meeting
> > > the kernel's current requirements. And I don't believe a firmware
> > > upgrade is possible... it's just a little motor that turns a wheel
> > > containing photographic filters.
> >
> > I suspect your case can be a candidate for HID-BPF, cf.
> > https://docs.kernel.org/hid/hid-bpf.html and you might try to fixup
> > the required descriptors.
>
> Unfortunatelly no. HID-BPF works for fixing HID protocol errors, but in
> this case the device is not presented by the transport layer, so we can
> not do anything there :(
>
> >
> > But I'm not entirely sure. Jiri and Benjamin is that something we
> > could have quirk for the device or the problem tackled in some other
> > way?
>
> Quirking seems the wrong approach. I would be curious to know the length
> of the binary descriptor. I suspect there is some mismatch and the end
> is filled with 0. If the length is shorter, that's going to be a bigger
> problem to solve.
>
> Cheers,
> Benjamin
>
> >
> > Regards,
> > Salvatore
>