lkml.org 
[lkml]   [2012]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 052/117] USB: ohci-at91: add a reset function to fix race condition
    3.2-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Nicolas Ferre <nicolas.ferre@atmel.com>

    commit 07e4e556eff4938eb2edf2591de3aa7d7fb82b52 upstream.

    A possible race condition appears because we are not initializing
    the ohci->regs before calling usb_hcd_request_irqs().
    We move the call to ohci_init() in hcd->driver->reset() instead of
    hcd->driver->start() to fix this.
    This was experienced when we share the same IRQ line between OHCI and EHCI
    controllers.

    Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
    Tested-by: Christian Eggers <christian.eggers@kathrein.de>
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/usb/host/ohci-at91.c | 11 ++++++++++-
    1 file changed, 10 insertions(+), 1 deletion(-)

    --- a/drivers/usb/host/ohci-at91.c
    +++ b/drivers/usb/host/ohci-at91.c
    @@ -199,7 +199,7 @@
    /*-------------------------------------------------------------------------*/

    static int __devinit
    -ohci_at91_start (struct usb_hcd *hcd)
    +ohci_at91_reset (struct usb_hcd *hcd)
    {
    struct at91_usbh_data *board = hcd->self.controller->platform_data;
    struct ohci_hcd *ohci = hcd_to_ohci (hcd);
    @@ -209,6 +209,14 @@
    return ret;

    ohci->num_ports = board->ports;
    + return 0;
    +}
    +
    +static int __devinit
    +ohci_at91_start (struct usb_hcd *hcd)
    +{
    + struct ohci_hcd *ohci = hcd_to_ohci (hcd);
    + int ret;

    if ((ret = ohci_run(ohci)) < 0) {
    err("can't start %s", hcd->self.bus_name);
    @@ -390,6 +398,7 @@
    /*
    * basic lifecycle operations
    */
    + .reset = ohci_at91_reset,
    .start = ohci_at91_start,
    .stop = ohci_stop,
    .shutdown = ohci_shutdown,



    \
     
     \ /
      Last update: 2012-05-28 06:01    [W:6.470 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site