From 8ecec9ff1c681d93533cd4008f6e08aba68da8ca Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 12 Jan 2017 10:54:42 +0100 Subject: [PATCH] 4.9-stable patches added patches: usb-gadget-composite-always-set-ep-mult-to-a-sensible-value.patch --- queue-4.9/series | 1 + ...ways-set-ep-mult-to-a-sensible-value.patch | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 queue-4.9/usb-gadget-composite-always-set-ep-mult-to-a-sensible-value.patch diff --git a/queue-4.9/series b/queue-4.9/series index 23fca3d3335..4ef8500a87d 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -206,3 +206,4 @@ clocksource-dummy_timer-move-hotplug-callback-after-the-real-timers.patch tick-broadcast-prevent-null-pointer-dereference.patch revert-rtlwifi-fix-enter-exit-power_save.patch revert-usb-gadget-composite-always-set-ep-mult-to-a.patch +usb-gadget-composite-always-set-ep-mult-to-a-sensible-value.patch diff --git a/queue-4.9/usb-gadget-composite-always-set-ep-mult-to-a-sensible-value.patch b/queue-4.9/usb-gadget-composite-always-set-ep-mult-to-a-sensible-value.patch new file mode 100644 index 00000000000..dc6e5bf777d --- /dev/null +++ b/queue-4.9/usb-gadget-composite-always-set-ep-mult-to-a-sensible-value.patch @@ -0,0 +1,66 @@ +From eaa496ffaaf19591fe471a36cef366146eeb9153 Mon Sep 17 00:00:00 2001 +From: Felipe Balbi +Date: Wed, 28 Sep 2016 12:33:31 +0300 +Subject: usb: gadget: composite: always set ep->mult to a sensible value + +From: Felipe Balbi + +commit eaa496ffaaf19591fe471a36cef366146eeb9153 upstream. + +ep->mult is supposed to be set to Isochronous and +Interrupt Endapoint's multiplier value. This value +is computed from different places depending on the +link speed. + +If we're dealing with HighSpeed, then it's part of +bits [12:11] of wMaxPacketSize. This case wasn't +taken into consideration before. + +While at that, also make sure the ep->mult defaults +to one so drivers can use it unconditionally and +assume they'll never multiply ep->maxpacket to zero. + +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/gadget/composite.c | 9 +++++++-- + drivers/usb/gadget/function/uvc_video.c | 2 +- + 2 files changed, 8 insertions(+), 3 deletions(-) + +--- a/drivers/usb/gadget/composite.c ++++ b/drivers/usb/gadget/composite.c +@@ -201,7 +201,12 @@ ep_found: + _ep->desc = chosen_desc; + _ep->comp_desc = NULL; + _ep->maxburst = 0; +- _ep->mult = 0; ++ _ep->mult = 1; ++ ++ if (g->speed == USB_SPEED_HIGH && (usb_endpoint_xfer_isoc(_ep->desc) || ++ usb_endpoint_xfer_int(_ep->desc))) ++ _ep->mult = ((usb_endpoint_maxp(_ep->desc) & 0x1800) >> 11) + 1; ++ + if (!want_comp_desc) + return 0; + +@@ -218,7 +223,7 @@ ep_found: + switch (usb_endpoint_type(_ep->desc)) { + case USB_ENDPOINT_XFER_ISOC: + /* mult: bits 1:0 of bmAttributes */ +- _ep->mult = comp_desc->bmAttributes & 0x3; ++ _ep->mult = (comp_desc->bmAttributes & 0x3) + 1; + case USB_ENDPOINT_XFER_BULK: + case USB_ENDPOINT_XFER_INT: + _ep->maxburst = comp_desc->bMaxBurst + 1; +--- a/drivers/usb/gadget/function/uvc_video.c ++++ b/drivers/usb/gadget/function/uvc_video.c +@@ -243,7 +243,7 @@ uvc_video_alloc_requests(struct uvc_vide + + req_size = video->ep->maxpacket + * max_t(unsigned int, video->ep->maxburst, 1) +- * (video->ep->mult + 1); ++ * (video->ep->mult); + + for (i = 0; i < UVC_NUM_REQUESTS; ++i) { + video->req_buffer[i] = kmalloc(req_size, GFP_KERNEL); -- 2.47.3