On Wed, Sep 28, 2016 at 04:05:10PM +0300, Felipe Balbi wrote: > According to USB Specification 2.0 table 9-4, At my 2.0 spec, it is "Table 9-13. Standard Endpoint Descriptor", different revision? > 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, %s/transfers/transactions/ > 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; > +} > + You may update kernel-doc for entry mult at struct usb_ep, it is the transaction number now, not the 'mult' defined at spec. And it is for both HS and SS. -- Best Regards, Peter Chen -- 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