Skip to content

Commit 541b6fe

Browse files
author
Felipe Balbi
committed
usb: add helper to extract bits 12:11 of wMaxPacketSize
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 <[email protected]>
1 parent a909d3e commit 541b6fe

File tree

1 file changed

+19
-0
lines changed
  • include/uapi/linux/usb

1 file changed

+19
-0
lines changed

include/uapi/linux/usb/ch9.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,11 @@ struct usb_endpoint_descriptor {
423423
#define USB_ENDPOINT_XFER_INT 3
424424
#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80
425425

426+
#define USB_EP_MAXP_MULT_SHIFT 11
427+
#define USB_EP_MAXP_MULT_MASK (3 << USB_EP_MAXP_MULT_SHIFT)
428+
#define USB_EP_MAXP_MULT(m) \
429+
(((m) & USB_EP_MAXP_MULT_MASK) >> USB_EP_MAXP_MULT_SHIFT)
430+
426431
/* The USB 3.0 spec redefines bits 5:4 of bmAttributes as interrupt ep type. */
427432
#define USB_ENDPOINT_INTRTYPE 0x30
428433
#define USB_ENDPOINT_INTR_PERIODIC (0 << 4)
@@ -630,6 +635,20 @@ static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd)
630635
return __le16_to_cpu(epd->wMaxPacketSize);
631636
}
632637

638+
/**
639+
* usb_endpoint_maxp_mult - get endpoint's transactional opportunities
640+
* @epd: endpoint to be checked
641+
*
642+
* Return @epd's wMaxPacketSize[12:11] + 1
643+
*/
644+
static inline int
645+
usb_endpoint_maxp_mult(const struct usb_endpoint_descriptor *epd)
646+
{
647+
int maxp = __le16_to_cpu(epd->wMaxPacketSize);
648+
649+
return USB_EP_MAXP_MULT(maxp) + 1;
650+
}
651+
633652
static inline int usb_endpoint_interrupt_type(
634653
const struct usb_endpoint_descriptor *epd)
635654
{

0 commit comments

Comments
 (0)