]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: gadget: f_hid: fix SuperSpeed descriptors
authorJohn Keeping <jkeeping@inmusicbrands.com>
Fri, 27 Feb 2026 11:15:39 +0000 (11:15 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 11 Mar 2026 15:17:29 +0000 (16:17 +0100)
When adding dynamic configuration for bInterval, the value was removed
from the static SuperSpeed endpoint descriptors but was not set from the
configured value in hidg_bind().  Thus at SuperSpeed the interrupt
endpoints have bInterval as zero which is not valid per the USB
specification.

Add the missing setting for SuperSpeed endpoints.

Fixes: ea34925f5b2ee ("usb: gadget: hid: allow dynamic interval configuration via configfs")
Cc: stable <stable@kernel.org>
Signed-off-by: John Keeping <jkeeping@inmusicbrands.com>
Acked-by: Peter Korsgaard <peter@korsgaard.com>
Link: https://patch.msgid.link/20260227111540.431521-1-jkeeping@inmusicbrands.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/function/f_hid.c

index 8c855c00b8876d885d52266ade8348945247da76..8812ebf33d14bcd86f8c3990035353d884b2a0f8 100644 (file)
@@ -1207,9 +1207,11 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
        if (!hidg->interval_user_set) {
                hidg_fs_in_ep_desc.bInterval = 10;
                hidg_hs_in_ep_desc.bInterval = 4;
+               hidg_ss_in_ep_desc.bInterval = 4;
        } else {
                hidg_fs_in_ep_desc.bInterval = hidg->interval;
                hidg_hs_in_ep_desc.bInterval = hidg->interval;
+               hidg_ss_in_ep_desc.bInterval = hidg->interval;
        }
 
        hidg_ss_out_comp_desc.wBytesPerInterval =
@@ -1239,9 +1241,11 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
                if (!hidg->interval_user_set) {
                        hidg_fs_out_ep_desc.bInterval = 10;
                        hidg_hs_out_ep_desc.bInterval = 4;
+                       hidg_ss_out_ep_desc.bInterval = 4;
                } else {
                        hidg_fs_out_ep_desc.bInterval = hidg->interval;
                        hidg_hs_out_ep_desc.bInterval = hidg->interval;
+                       hidg_ss_out_ep_desc.bInterval = hidg->interval;
                }
                status = usb_assign_descriptors(f,
                            hidg_fs_descriptors_intout,