diff options
author | David Brownell <david-b@pacbell.net> | 2006-09-18 20:03:16 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-09-27 14:59:00 -0400 |
commit | 26f953fd884ea4879585287917f855c63c6b2666 (patch) | |
tree | 78e6bd71dc1bb4089bc8589eb995765d64d4797d /drivers/usb/host/ehci-q.c | |
parent | 353a4098c61272b33a02ec5802fb3859fec91a0e (diff) |
USB: EHCI update VIA workaround
This revamps handling of the hardware "async advance" IRQ, and its watchdog
timer. Basically it dis-entangles that important timeout from the others,
simplifying the associated state and code to make it more robust.
This reportedly improves behavior of EHCI on some systems with VIA chips,
and AFAIK won't affect non-VIA hardware. VIA systems need this code to
recover from silcon bugs whereby the "async advance" IRQ isn't issued.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/ehci-q.c')
-rw-r--r-- | drivers/usb/host/ehci-q.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index c0da40bbfa35..7fc25b6bd7d2 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
@@ -967,7 +967,7 @@ static void end_unlink_async (struct ehci_hcd *ehci, struct pt_regs *regs) | |||
967 | struct ehci_qh *qh = ehci->reclaim; | 967 | struct ehci_qh *qh = ehci->reclaim; |
968 | struct ehci_qh *next; | 968 | struct ehci_qh *next; |
969 | 969 | ||
970 | timer_action_done (ehci, TIMER_IAA_WATCHDOG); | 970 | iaa_watchdog_done (ehci); |
971 | 971 | ||
972 | // qh->hw_next = cpu_to_le32 (qh->qh_dma); | 972 | // qh->hw_next = cpu_to_le32 (qh->qh_dma); |
973 | qh->qh_state = QH_STATE_IDLE; | 973 | qh->qh_state = QH_STATE_IDLE; |
@@ -977,7 +977,6 @@ static void end_unlink_async (struct ehci_hcd *ehci, struct pt_regs *regs) | |||
977 | /* other unlink(s) may be pending (in QH_STATE_UNLINK_WAIT) */ | 977 | /* other unlink(s) may be pending (in QH_STATE_UNLINK_WAIT) */ |
978 | next = qh->reclaim; | 978 | next = qh->reclaim; |
979 | ehci->reclaim = next; | 979 | ehci->reclaim = next; |
980 | ehci->reclaim_ready = 0; | ||
981 | qh->reclaim = NULL; | 980 | qh->reclaim = NULL; |
982 | 981 | ||
983 | qh_completions (ehci, qh, regs); | 982 | qh_completions (ehci, qh, regs); |
@@ -1052,11 +1051,10 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
1052 | return; | 1051 | return; |
1053 | } | 1052 | } |
1054 | 1053 | ||
1055 | ehci->reclaim_ready = 0; | ||
1056 | cmd |= CMD_IAAD; | 1054 | cmd |= CMD_IAAD; |
1057 | writel (cmd, &ehci->regs->command); | 1055 | writel (cmd, &ehci->regs->command); |
1058 | (void) readl (&ehci->regs->command); | 1056 | (void) readl (&ehci->regs->command); |
1059 | timer_action (ehci, TIMER_IAA_WATCHDOG); | 1057 | iaa_watchdog_start (ehci); |
1060 | } | 1058 | } |
1061 | 1059 | ||
1062 | /*-------------------------------------------------------------------------*/ | 1060 | /*-------------------------------------------------------------------------*/ |