brcm2708: update against latest rpi-3.10.y branch
[openwrt.git] / target / linux / brcm2708 / patches-3.10 / 0083-dwc_otg-prevent-BUG-in-TT-allocation-if-hub-address-.patch
1 From 3c3c5a15a17649092ecf4c128478b267676c3353 Mon Sep 17 00:00:00 2001
2 From: P33M <P33M@github.com>
3 Date: Mon, 22 Jul 2013 14:08:26 +0100
4 Subject: [PATCH 083/174] dwc_otg: prevent BUG() in TT allocation if hub
5  address is > 16
6
7 A fixed-size array is used to track TT allocation. This was
8 previously set to 16 which caused a crash because
9 dwc_otg_hcd_allocate_port would read past the end of the array.
10
11 This was hit if a hub was plugged in which enumerated as addr > 16,
12 due to previous device resets or unplugs.
13
14 Also add #ifdef FIQ_DEBUG around hcd->hub_port_alloc[], which grows
15 to a large size if 128 hub addresses are supported. This field is
16 for debug only for tracking which frame an allocate happened in.
17 ---
18  drivers/usb/host/dwc_otg/dwc_otg_hcd.c      | 7 ++++++-
19  drivers/usb/host/dwc_otg/dwc_otg_hcd.h      | 6 ++++--
20  drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c | 3 ++-
21  3 files changed, 12 insertions(+), 4 deletions(-)
22
23 --- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
24 +++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c
25 @@ -983,7 +983,9 @@ int dwc_otg_hcd_init(dwc_otg_hcd_t * hcd
26         hcd->periodic_qh_count = 0;
27  
28         DWC_MEMSET(hcd->hub_port, 0, sizeof(hcd->hub_port));
29 +#ifdef FIQ_DEBUG
30         DWC_MEMSET(hcd->hub_port_alloc, -1, sizeof(hcd->hub_port_alloc));
31 +#endif
32  
33  out:
34         return retval;
35 @@ -1317,7 +1319,9 @@ int dwc_otg_hcd_allocate_port(dwc_otg_hc
36                 qh->skip_count = 0;
37                 hcd->hub_port[hub_addr] |= 1 << port_addr;
38                 fiq_print(FIQDBG_PORTHUB, "H%dP%d:A %d", hub_addr, port_addr, DWC_CIRCLEQ_FIRST(&qh->qtd_list)->urb->pipe_info.ep_num);
39 +#ifdef FIQ_DEBUG
40                 hcd->hub_port_alloc[hub_addr * 16 + port_addr] = dwc_otg_hcd_get_frame_number(hcd);
41 +#endif
42                 return 0;
43         }
44  }
45 @@ -1331,8 +1335,9 @@ void dwc_otg_hcd_release_port(dwc_otg_hc
46         hcd->fops->hub_info(hcd, DWC_CIRCLEQ_FIRST(&qh->qtd_list)->urb->priv, &hub_addr, &port_addr);
47  
48         hcd->hub_port[hub_addr] &= ~(1 << port_addr);
49 +#ifdef FIQ_DEBUG
50         hcd->hub_port_alloc[hub_addr * 16 + port_addr] = -1;
51 -
52 +#endif
53         fiq_print(FIQDBG_PORTHUB, "H%dP%d:RO%d", hub_addr, port_addr, DWC_CIRCLEQ_FIRST(&qh->qtd_list)->urb->pipe_info.ep_num);
54  
55  }
56 --- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
57 +++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.h
58 @@ -577,8 +577,10 @@ struct dwc_otg_hcd {
59         uint32_t *frame_list;
60  
61         /** Hub - Port assignment */
62 -       int hub_port[16];
63 -       int hub_port_alloc[256];
64 +       int hub_port[128];
65 +#ifdef FIQ_DEBUG
66 +       int hub_port_alloc[2048];
67 +#endif
68  
69         /** Frame List DMA address */
70         dma_addr_t frame_list_dma;
71 --- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c
72 +++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c
73 @@ -1419,8 +1419,9 @@ cleanup:
74                 }
75  
76                 hcd->hub_port[hc->hub_addr] &= ~(1 << hc->port_addr);
77 +#ifdef FIQ_DEBUG
78                 hcd->hub_port_alloc[hc->hub_addr * 16 + hc->port_addr] = -1;
79 -
80 +#endif
81                 fiq_print(FIQDBG_PORTHUB, "H%dP%d:RR%d", hc->hub_addr, hc->port_addr, endp);
82         }
83