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.ba...@linux.intel.com>
> ---
>  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 majord...@vger.kernel.org
> 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to