lkml.org 
[lkml]   [2008]   [Aug]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: USB Serial device disconnect causes IRQ disable after using ehci controller halted
    Date
    On Tuesday 26 August 2008, Alan Stern wrote:
    > While it certainly would be a good idea to prevent the handshake
    > failures from occurring in the first place -- Dave, aren't you working
    > on a patch for that? -- we should also make sure that when they do
    > occur, the controller gets reset properly.  And an error message should
    > be printed in the log.

    Like this?

    Greg, please queue for 2.6.27 unless someone finds a
    problem with this patch.


    ========= SNIP! SNIP! SNIPPITY SNIP!
    From: David Brownell <dbrownell@users.sourceforge.net>

    I noticed that the "Refactor "if (handshake()) state = HC_STATE_HALT"
    patch from earlier this year perpetuated a potential problem: it can
    mark the controller as halted when it's still running (but not acting
    as, perhaps wrongly, expected).

    That caused some hangs and crashes, rather than more polite failure
    modes of a truly halted controller. This patch forces a true halt,
    and emits a (previously missing) diagnostic.

    Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
    ---
    drivers/usb/host/ehci-hcd.c | 26 ++++++++++++++++----------
    1 file changed, 16 insertions(+), 10 deletions(-)

    --- a/drivers/usb/host/ehci-hcd.c 2008-08-15 14:04:27.000000000 -0700
    +++ b/drivers/usb/host/ehci-hcd.c 2008-08-15 14:04:36.000000000 -0700
    @@ -145,16 +145,6 @@ static int handshake (struct ehci_hcd *e
    return -ETIMEDOUT;
    }

    -static int handshake_on_error_set_halt(struct ehci_hcd *ehci, void __iomem *ptr,
    - u32 mask, u32 done, int usec)
    -{
    - int error = handshake(ehci, ptr, mask, done, usec);
    - if (error)
    - ehci_to_hcd(ehci)->state = HC_STATE_HALT;
    -
    - return error;
    -}
    -
    /* force HC to halt state from unknown (EHCI spec section 2.3) */
    static int ehci_halt (struct ehci_hcd *ehci)
    {
    @@ -173,6 +163,22 @@ static int ehci_halt (struct ehci_hcd *e
    STS_HALT, STS_HALT, 16 * 125);
    }

    +static int handshake_on_error_set_halt(struct ehci_hcd *ehci, void __iomem *ptr,
    + u32 mask, u32 done, int usec)
    +{
    + int error;
    +
    + error = handshake(ehci, ptr, mask, done, usec);
    + if (error) {
    + ehci_halt(ehci);
    + ehci_to_hcd(ehci)->state = HC_STATE_HALT;
    + ehci_err(ehci, "force halt; handhake %p %08x %08x -> %d\n",
    + ptr, mask, done, error);
    + }
    +
    + return error;
    +}
    +
    /* put TDI/ARC silicon into EHCI mode */
    static void tdi_reset (struct ehci_hcd *ehci)
    {

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2008-08-26 23:47    [W:0.028 / U:29.972 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site