On Mon, 4 Nov 2013, David Cohen wrote: > Due to USB controllers may have different restrictions, usb gadget layer > needs to provide a generic way to inform gadget functions to complain > with non-standard requirements. > > This patch adds 'quirk_ep_out_aligned_size' field to struct usb_gadget > to inform when controller's epout requires buffer size to be aligned to > MaxPacketSize. A helper is also provided to align buffer size when > necessary. > > Signed-off-by: David Cohen <david.a.cohen@xxxxxxxxxxxxxxx> > --- > include/linux/usb/gadget.h | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h > index 23b3bfd0a842..260d972489bd 100644 > --- a/include/linux/usb/gadget.h > +++ b/include/linux/usb/gadget.h > @@ -442,6 +442,22 @@ static inline void usb_ep_fifo_flush(struct usb_ep *ep) > } > > > +static inline size_t usb_ep_align_maxpacketsize(struct usb_ep *ep, size_t len) > +{ > + int aligned; > + > + if (ep->desc->bmAttributes & USB_ENDPOINT_XFER_INT) > + /* > + * Interrupt eps don't need max packet size to be power of 2, > + * so can't use cheap IS_ALIGNED() macro. > + */ > + aligned = !(len % ep->desc->wMaxPacketSize); > + else > + aligned = IS_ALIGNED(len, ep->desc->wMaxPacketSize); This isn't on a hot path, and I suspect that the extra "if" will require nearly as much time as you save by not doing the division. You might as well always use the % operation. Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html