Hi Javier, On Thu, Oct 12, 2023 at 06:51:49PM +0200, Javier Carrasco wrote: > > +static bool bcm5974_ep_is_int_in(struct usb_host_interface *iface, int addr) > +{ > + struct usb_endpoint_descriptor *endpoint; > + int i; > + > + for (i = 0; i < iface->desc.bNumEndpoints; i++) { > + endpoint = &iface->endpoint[i].desc; > + if (endpoint->bEndpointAddress == addr) { > + if (usb_endpoint_is_int_in(endpoint)) > + return true; > + } > + } > + return false; > +} This essentially reimplements usb_find_endpoint() in a sense, so can we instead do: ep = usb_find_endpoint(iface, addr); if (!ep || !usb_endpoint_is_int_in(ep)) { dev_err(...); return ...; } Also it looks like the handling of button endpoint is interleaved with the trackpad endpoint, I wonder if it would not be better if we have a separate "if (cfg->tp_type == TYPE1)" where we would do the check, allocate URB, and did all the rest of set up for button transfers. Thanks. -- Dmitry