aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/ehci-lpm.c
diff options
context:
space:
mode:
authorSupriya Karanth <supriya.karanth@stericsson.com>2012-02-17 14:54:52 +0530
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-04-02 09:26:52 -0700
commit46070382f1745a7ada312fd0db4dff722eb4f52d (patch)
treedd21cf31e5f758657acdd69d24c4f8f5499b680c /drivers/usb/host/ehci-lpm.c
parentbb94787e6293df177cffec3f83bdb3cb2c93f39e (diff)
downloadkernel_samsung_espresso10-46070382f1745a7ada312fd0db4dff722eb4f52d.zip
kernel_samsung_espresso10-46070382f1745a7ada312fd0db4dff722eb4f52d.tar.gz
kernel_samsung_espresso10-46070382f1745a7ada312fd0db4dff722eb4f52d.tar.bz2
usb: musb: Reselect index reg in interrupt context
commit 39287076e46d2c19aaceaa6f0a44168ae4d257ec upstream. musb INDEX register is getting modified/corrupted during temporary un-locking in a SMP system. Set this register with proper value after re-acquiring the lock Scenario: --------- CPU1 is handling a data transfer completion interrupt received for the CLASS1 EP CPU2 is handling a CLASS2 thread which is queuing data to musb for transfer Below is the error sequence: CPU1 | CPU2 -------------------------------------------------------------------- Data transfer completion inter- | rupt recieved. | | musb INDEX reg set to CLASS1 EP | | musb LOCK is acquired. | | | CLASS2 thread queues data. | | CLASS2 thread tries to acquire musb | LOCK but lock is already taken by | CLASS1, so CLASS2 thread is | spinning. | From Interrupt Context musb | giveback function is called | | The giveback function releases | CLASS2 thread now acquires LOCK LOCK | | ClASS1 Request's completion cal-| ClASS2 schedules the data transfer and lback is called | sets the MUSB INDEX to Class2 EP number | Interrupt handler for CLASS1 EP | tries to acquire LOCK and is | spinning | | Interrupt for Class1 EP acquires| Class2 completes the scheduling etc and the MUSB LOCK | releases the musb LOCK | Interrupt for Class1 EP schedul-| es the next data transfer | but musb INDEX register is still| set to CLASS2 EP | Since the MUSB INDEX register is set to a different endpoint, we read and modify the wrong registers. Hence data transfer will not happen properly. This results in unpredictable behavior So, the MUSB INDEX register is set to proper value again when interrupt re-acquires the lock Signed-off-by: Supriya Karanth <supriya.karanth@stericsson.com> Signed-off-by: Praveena Nadahally <praveen.nadahally@stericsson.com> Reviewed-by: srinidhi kasagar <srinidhi.kasagar@stericsson.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/host/ehci-lpm.c')
0 files changed, 0 insertions, 0 deletions