> From: David Brownell <david-b@pacbell.net>
> Subject: Re: USB Serial device disconnect causes IRQ disable after using ehci controller halted
> To: "Alan Stern" <stern@rowland.harvard.edu>
> Cc: "Karsten Wiese" <fzu@wemgehoertderstaat.de>, "amruth" <amruth_pv@yahoo.com>, "Oliver Neukum" <oliver@neukum.org>, "USB list" <linux-usb@vger.kernel.org>, "Kernel development list" <linux-kernel@vger.kernel.org>, "Greg KH" <greg@kroah.com>
> Date: Tuesday, August 26, 2008, 4:43 PM
> 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/