| From 881a8863ea168c60e037ef687cadb87e3bbe9c4b Mon Sep 17 00:00:00 2001 |
| From: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Date: Mon, 26 Sep 2016 10:51:18 +0300 |
| Subject: [PATCH 271/299] 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 <felipe.balbi@linux.intel.com> |
| (cherry picked from commit 541b6fe63023f3059cf85d47ff2767a3e42a8e44) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| include/uapi/linux/usb/ch9.h | 19 +++++++++++++++++++ |
| 1 file changed, 19 insertions(+) |
| |
| --- 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(cons |
| 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; |
| +} |
| + |
| static inline int usb_endpoint_interrupt_type( |
| const struct usb_endpoint_descriptor *epd) |
| { |