Re: [RFC/PATCH 01/45] usb: add helper to extract bits 12:11 of wMaxPacketSize

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux