0f17918d36f1ad1ac8bd558a97a6bc289e9d266f
[openwrt/openwrt.git] / target / linux / ipq806x / patches-4.4 / 096-03-usb-dwc3-Validate-the-maximum_speed-parameter.patch
1 From 77966eb85e6d988a6daaf8ac14ac33026ceb3ab7 Mon Sep 17 00:00:00 2001
2 From: John Youn <John.Youn@synopsys.com>
3 Date: Fri, 19 Feb 2016 17:31:01 -0800
4 Subject: usb: dwc3: Validate the maximum_speed parameter
5
6 Check that dwc->maximum_speed is set to a valid value. Also add an error
7 when we use it later if we encounter an invalid value.
8
9 Signed-off-by: John Youn <johnyoun@synopsys.com>
10 Signed-off-by: Felipe Balbi <balbi@kernel.org>
11 ---
12 drivers/usb/dwc3/core.c | 18 ++++++++++++++++--
13 drivers/usb/dwc3/gadget.c | 9 ++++++---
14 2 files changed, 22 insertions(+), 5 deletions(-)
15
16 --- a/drivers/usb/dwc3/core.c
17 +++ b/drivers/usb/dwc3/core.c
18 @@ -1012,8 +1012,20 @@ static int dwc3_probe(struct platform_de
19 goto err1;
20 }
21
22 - /* default to superspeed if no maximum_speed passed */
23 - if (dwc->maximum_speed == USB_SPEED_UNKNOWN) {
24 + /* Check the maximum_speed parameter */
25 + switch (dwc->maximum_speed) {
26 + case USB_SPEED_LOW:
27 + case USB_SPEED_FULL:
28 + case USB_SPEED_HIGH:
29 + case USB_SPEED_SUPER:
30 + case USB_SPEED_SUPER_PLUS:
31 + break;
32 + default:
33 + dev_err(dev, "invalid maximum_speed parameter %d\n",
34 + dwc->maximum_speed);
35 + /* fall through */
36 + case USB_SPEED_UNKNOWN:
37 + /* default to superspeed */
38 dwc->maximum_speed = USB_SPEED_SUPER;
39
40 /*
41 @@ -1023,6 +1035,8 @@ static int dwc3_probe(struct platform_de
42 (DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3) ==
43 DWC3_GHWPARAMS3_SSPHY_IFC_GEN2))
44 dwc->maximum_speed = USB_SPEED_SUPER_PLUS;
45 +
46 + break;
47 }
48
49 /* Adjust Frame Length */
50 --- a/drivers/usb/dwc3/gadget.c
51 +++ b/drivers/usb/dwc3/gadget.c
52 @@ -1634,10 +1634,13 @@ static int dwc3_gadget_start(struct usb_
53 case USB_SPEED_HIGH:
54 reg |= DWC3_DSTS_HIGHSPEED;
55 break;
56 - case USB_SPEED_SUPER: /* FALLTHROUGH */
57 - case USB_SPEED_UNKNOWN: /* FALTHROUGH */
58 default:
59 - reg |= DWC3_DSTS_SUPERSPEED;
60 + dev_err(dwc->dev, "invalid dwc->maximum_speed (%d)\n",
61 + dwc->maximum_speed);
62 + /* fall through */
63 + case USB_SPEED_SUPER:
64 + reg |= DWC3_DCFG_SUPERSPEED;
65 + break;
66 }
67 }
68 dwc3_writel(dwc->regs, DWC3_DCFG, reg);