0f17918d36f1ad1ac8bd558a97a6bc289e9d266f
[lede.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);