Re: [PATCH 1/2] usb: add helper to extract bits 12:11 of wMaxPacketSize

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

 



On Mon, Sep 26, 2016 at 01:15:57PM +0300, Felipe Balbi wrote:
> 
> Hi,
> 
> yfw <nh26223@xxxxxxxxx> writes:
> > Hi Felipe,
> >
> > On 2016/9/26 16:12, 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..73bcb24d4077 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_ISOC_MAXP_MULT_SHIFT	11
> >> +#define USB_EP_ISOC_MAXP_MULT_MASK	(3 << USB_EP_ISOC_MAXP_MULT_SHIFT)
> >> +#define USB_EP_ISOC_MAXP_MULT(m) \
> >> +	(((m) & USB_EP_ISOC_MAXP_MULT_MASK) >> USB_EP_ISOC_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_isoc_maxp_mult - get endpoint's transactional opportunities
> >> + * @epd: endpoint to be checked
> >> + *
> >> + * Return @epd's wMaxPacketSize[12:11] + 1
> >> + */
> >> +static inline int
> >> +usb_endpoint_isoc_maxp_mult(const struct usb_endpoint_descriptor *epd)
> >> +{
> >> +	int maxp = __le16_to_cpu(epd->wMaxPacketSize);
> >> +
> >> +	return USB_EP_ISOC_MAXP_MULT(maxp) + 1;
> >> +}
> >> +
> >>  static inline int usb_endpoint_interrupt_type(
> >>  		const struct usb_endpoint_descriptor *epd)
> >>  {
> >>
> > Does this mean the issue of isoc high bandwidth transfer was fixed by
> > this patchset per your test?
> 
> No, I couldn't get g_webcam to work yet.

In mainline, g_webcam is broken with DWC3. Also these two patches don't
fix the issue on v4.4.21.

Regards,
-Bin.
--
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