diff options
Diffstat (limited to 'target/linux/brcm2708/patches-3.10/0082-dwc_otg-prevent-OOPSes-during-device-disconnects.patch')
-rw-r--r-- | target/linux/brcm2708/patches-3.10/0082-dwc_otg-prevent-OOPSes-during-device-disconnects.patch | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/target/linux/brcm2708/patches-3.10/0082-dwc_otg-prevent-OOPSes-during-device-disconnects.patch b/target/linux/brcm2708/patches-3.10/0082-dwc_otg-prevent-OOPSes-during-device-disconnects.patch index 5cfc919344..129dc0894b 100644 --- a/target/linux/brcm2708/patches-3.10/0082-dwc_otg-prevent-OOPSes-during-device-disconnects.patch +++ b/target/linux/brcm2708/patches-3.10/0082-dwc_otg-prevent-OOPSes-during-device-disconnects.patch @@ -1,7 +1,7 @@ -From dc570a70493daf0ec548ff57f1a1a9fb31caccb7 Mon Sep 17 00:00:00 2001 +From 2e2f1ef719a2fa55fd1d95d9536fa8cca94459a4 Mon Sep 17 00:00:00 2001 From: P33M <P33M@github.com> Date: Thu, 18 Jul 2013 17:07:26 +0100 -Subject: [PATCH 082/174] dwc_otg: prevent OOPSes during device disconnects +Subject: [PATCH 082/196] dwc_otg: prevent OOPSes during device disconnects The dwc_otg_urb_enqueue function is thread-unsafe. In particular the access of urb->hcpriv, usb_hcd_link_urb_to_ep, dwc_otg_urb->qtd and @@ -20,9 +20,11 @@ critical section. drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c | 6 +----- 3 files changed, 6 insertions(+), 17 deletions(-) +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c +index af9108c..a1970dc 100644 --- a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c +++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c -@@ -464,7 +464,6 @@ int dwc_otg_hcd_urb_enqueue(dwc_otg_hcd_ +@@ -464,7 +464,6 @@ int dwc_otg_hcd_urb_enqueue(dwc_otg_hcd_t * hcd, dwc_otg_hcd_urb_t * dwc_otg_urb, void **ep_handle, int atomic_alloc) { @@ -30,7 +32,7 @@ critical section. int retval = 0; uint8_t needs_scheduling = 0; dwc_otg_transaction_type_e tr_type; -@@ -515,12 +514,10 @@ int dwc_otg_hcd_urb_enqueue(dwc_otg_hcd_ +@@ -515,12 +514,10 @@ int dwc_otg_hcd_urb_enqueue(dwc_otg_hcd_t * hcd, } if(needs_scheduling) { @@ -43,9 +45,11 @@ critical section. } return retval; } +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c +index 0f72bd5..ad03ff1 100644 --- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c +++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c -@@ -679,9 +679,7 @@ static int dwc_otg_urb_enqueue(struct us +@@ -679,9 +679,7 @@ static int dwc_otg_urb_enqueue(struct usb_hcd *hcd, #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28) struct usb_host_endpoint *ep = urb->ep; #endif @@ -55,7 +59,7 @@ critical section. void **ref_ep_hcpriv = &ep->hcpriv; dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd); dwc_otg_hcd_urb_t *dwc_otg_urb; -@@ -733,7 +731,6 @@ static int dwc_otg_urb_enqueue(struct us +@@ -733,7 +731,6 @@ static int dwc_otg_urb_enqueue(struct usb_hcd *hcd, if(dwc_otg_urb == NULL) return -ENOMEM; @@ -63,7 +67,7 @@ critical section. if (!dwc_otg_urb && urb->number_of_packets) return -ENOMEM; -@@ -775,10 +772,10 @@ static int dwc_otg_urb_enqueue(struct us +@@ -775,10 +772,10 @@ static int dwc_otg_urb_enqueue(struct usb_hcd *hcd, iso_frame_desc[i].length); } @@ -76,7 +80,7 @@ critical section. if (0 == retval) #endif { -@@ -794,17 +791,16 @@ static int dwc_otg_urb_enqueue(struct us +@@ -794,17 +791,16 @@ static int dwc_otg_urb_enqueue(struct usb_hcd *hcd, urb); } } else { @@ -97,9 +101,11 @@ critical section. return retval; } +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c +index 8125307..5aed416 100644 --- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c +++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c -@@ -919,6 +919,7 @@ void dwc_otg_hcd_qtd_init(dwc_otg_qtd_t +@@ -919,6 +919,7 @@ void dwc_otg_hcd_qtd_init(dwc_otg_qtd_t * qtd, dwc_otg_hcd_urb_t * urb) * QH to place the QTD into. If it does not find a QH, then it will create a * new QH. If the QH to which the QTD is added is not currently scheduled, it * is placed into the proper schedule based on its EP type. @@ -107,7 +113,7 @@ critical section. * * @param[in] qtd The QTD to add * @param[in] hcd The DWC HCD structure -@@ -931,8 +932,6 @@ int dwc_otg_hcd_qtd_add(dwc_otg_qtd_t * +@@ -931,8 +932,6 @@ int dwc_otg_hcd_qtd_add(dwc_otg_qtd_t * qtd, dwc_otg_hcd_t * hcd, dwc_otg_qh_t ** qh, int atomic_alloc) { int retval = 0; @@ -116,7 +122,7 @@ critical section. dwc_otg_hcd_urb_t *urb = qtd->urb; /* -@@ -946,15 +945,12 @@ int dwc_otg_hcd_qtd_add(dwc_otg_qtd_t * +@@ -946,15 +945,12 @@ int dwc_otg_hcd_qtd_add(dwc_otg_qtd_t * qtd, goto done; } } @@ -132,3 +138,6 @@ critical section. done: return retval; +-- +1.9.1 + |