On Thu, Jun 17, 2021 at 02:58:15AM -0700, Wesley Cheng wrote: > Ensure that the USB gadget is able to support the configuration being > added based on the number of endpoints required from all interfaces. This > is for accounting for any bandwidth or space limitations. > > Signed-off-by: Wesley Cheng <wcheng@xxxxxxxxxxxxxx> > --- > drivers/usb/gadget/configfs.c | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c > index 15a607c..76b9983 100644 > --- a/drivers/usb/gadget/configfs.c > +++ b/drivers/usb/gadget/configfs.c > @@ -1374,6 +1374,7 @@ static int configfs_composite_bind(struct usb_gadget *gadget, > struct usb_function *f; > struct usb_function *tmp; > struct gadget_config_name *cn; > + unsigned long ep_map = 0; > > if (gadget_is_otg(gadget)) > c->descriptors = otg_desc; > @@ -1403,7 +1404,28 @@ static int configfs_composite_bind(struct usb_gadget *gadget, > list_add(&f->list, &cfg->func_list); > goto err_purge_funcs; > } > + if (f->fs_descriptors) { > + struct usb_descriptor_header **d; > + > + d = f->fs_descriptors; > + for (; *d; ++d) { With this check, there really is not a need to check for f->fs_descriptors above in the if statement, right? > + struct usb_endpoint_descriptor *ep; > + int addr; > + > + if ((*d)->bDescriptorType != USB_DT_ENDPOINT) > + continue; > + > + ep = (struct usb_endpoint_descriptor *)*d; > + addr = ((ep->bEndpointAddress & 0x80) >> 3) | > + (ep->bEndpointAddress & 0x0f); Don't we have direction macros for this type of check? > + set_bit(addr, &ep_map); > + } What is this loop trying to do? Please document it as I can not figure it out at all. thanks, greg k-h