On Wed, Sep 28, 2016 at 04:05:10PM +0300, Felipe Balbi wrote: > According to USB Specification 2.0 table 9-4, > wMaxPacketSize is a bitfield. Endpoint's maxpacket > is laid out in bits 10:0. For high-speed, > high-bandwidth isochronous endpoints, bits 12:11 > contain a multiplier to tell us how many > transactions we want to try per uframe. > > This means that if we want an isochronous endpoint > to issue 3 transfers of 1024 bytes per uframe, > wMaxPacketSize should contain the value: > > 1024 | (2 << 11) > > or 5120 (0x1400). In order to make Host and > Peripheral controller drivers' life easier, we're > adding a helper which returns bits 12:11. Note that > no care is made WRT to checking endpoint type and > gadget's speed. That's left for drivers to handle. > > Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx> > --- > include/uapi/linux/usb/ch9.h | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h > index a8acc24765fe..7628dff5fac3 100644 > --- a/include/uapi/linux/usb/ch9.h > +++ b/include/uapi/linux/usb/ch9.h > @@ -423,6 +423,11 @@ struct usb_endpoint_descriptor { > #define USB_ENDPOINT_XFER_INT 3 > #define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 > > +#define USB_EP_MAXP_MULT_SHIFT 11 > +#define USB_EP_MAXP_MULT_MASK (3 << USB_EP_MAXP_MULT_SHIFT) > +#define USB_EP_MAXP_MULT(m) \ > + (((m) & USB_EP_MAXP_MULT_MASK) >> USB_EP_MAXP_MULT_SHIFT) > + > /* The USB 3.0 spec redefines bits 5:4 of bmAttributes as interrupt ep type. */ > #define USB_ENDPOINT_INTRTYPE 0x30 > #define USB_ENDPOINT_INTR_PERIODIC (0 << 4) > @@ -630,6 +635,20 @@ static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd) > return __le16_to_cpu(epd->wMaxPacketSize); > } > > +/** > + * usb_endpoint_maxp_mult - get endpoint's transactional opportunities > + * @epd: endpoint to be checked > + * > + * Return @epd's wMaxPacketSize[12:11] + 1 > + */ > +static inline int > +usb_endpoint_maxp_mult(const struct usb_endpoint_descriptor *epd) > +{ > + int maxp = __le16_to_cpu(epd->wMaxPacketSize); > + > + return USB_EP_MAXP_MULT(maxp) + 1; It seems the instances which use 1 based value is less than those use 0 based. To me it seems make sense to just return 0 based value here. Some controllers like musb writes the 0 based value to a register. Regards, -Bin. > +} > + > static inline int usb_endpoint_interrupt_type( > const struct usb_endpoint_descriptor *epd) > { > -- > 2.10.0.440.g21f862b > > -- > 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 -- 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