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]

 



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.

-- 
balbi

Attachment: signature.asc
Description: PGP signature


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

  Powered by Linux