diff options
Diffstat (limited to 'drivers/usb/host/ehci.h')
-rw-r--r-- | drivers/usb/host/ehci.h | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index bf92d209a1a9..90245fd8bac4 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -97,6 +97,8 @@ struct ehci_hcd { /* one per controller */ | |||
97 | dedicated to the companion controller */ | 97 | dedicated to the companion controller */ |
98 | unsigned long owned_ports; /* which ports are | 98 | unsigned long owned_ports; /* which ports are |
99 | owned by the companion during a bus suspend */ | 99 | owned by the companion during a bus suspend */ |
100 | unsigned long port_c_suspend; /* which ports have | ||
101 | the change-suspend feature turned on */ | ||
100 | 102 | ||
101 | /* per-HC memory pools (could be per-bus, but ...) */ | 103 | /* per-HC memory pools (could be per-bus, but ...) */ |
102 | struct dma_pool *qh_pool; /* qh per active urb */ | 104 | struct dma_pool *qh_pool; /* qh per active urb */ |
@@ -112,7 +114,6 @@ struct ehci_hcd { /* one per controller */ | |||
112 | u32 command; | 114 | u32 command; |
113 | 115 | ||
114 | /* SILICON QUIRKS */ | 116 | /* SILICON QUIRKS */ |
115 | unsigned is_tdi_rh_tt:1; /* TDI roothub with TT */ | ||
116 | unsigned no_selective_suspend:1; | 117 | unsigned no_selective_suspend:1; |
117 | unsigned has_fsl_port_bug:1; /* FreeScale */ | 118 | unsigned has_fsl_port_bug:1; /* FreeScale */ |
118 | unsigned big_endian_mmio:1; | 119 | unsigned big_endian_mmio:1; |
@@ -176,6 +177,15 @@ timer_action_done (struct ehci_hcd *ehci, enum ehci_timer_action action) | |||
176 | static inline void | 177 | static inline void |
177 | timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) | 178 | timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) |
178 | { | 179 | { |
180 | /* Don't override timeouts which shrink or (later) disable | ||
181 | * the async ring; just the I/O watchdog. Note that if a | ||
182 | * SHRINK were pending, OFF would never be requested. | ||
183 | */ | ||
184 | if (timer_pending(&ehci->watchdog) | ||
185 | && ((BIT(TIMER_ASYNC_SHRINK) | BIT(TIMER_ASYNC_OFF)) | ||
186 | & ehci->actions)) | ||
187 | return; | ||
188 | |||
179 | if (!test_and_set_bit (action, &ehci->actions)) { | 189 | if (!test_and_set_bit (action, &ehci->actions)) { |
180 | unsigned long t; | 190 | unsigned long t; |
181 | 191 | ||
@@ -191,15 +201,7 @@ timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action) | |||
191 | t = EHCI_SHRINK_JIFFIES; | 201 | t = EHCI_SHRINK_JIFFIES; |
192 | break; | 202 | break; |
193 | } | 203 | } |
194 | t += jiffies; | 204 | mod_timer(&ehci->watchdog, t + jiffies); |
195 | // all timings except IAA watchdog can be overridden. | ||
196 | // async queue SHRINK often precedes IAA. while it's ready | ||
197 | // to go OFF neither can matter, and afterwards the IO | ||
198 | // watchdog stops unless there's still periodic traffic. | ||
199 | if (time_before_eq(t, ehci->watchdog.expires) | ||
200 | && timer_pending (&ehci->watchdog)) | ||
201 | return; | ||
202 | mod_timer (&ehci->watchdog, t); | ||
203 | } | 205 | } |
204 | } | 206 | } |
205 | 207 | ||
@@ -678,7 +680,7 @@ struct ehci_fstn { | |||
678 | * needed (mostly in root hub code). | 680 | * needed (mostly in root hub code). |
679 | */ | 681 | */ |
680 | 682 | ||
681 | #define ehci_is_TDI(e) ((e)->is_tdi_rh_tt) | 683 | #define ehci_is_TDI(e) (ehci_to_hcd(e)->has_tt) |
682 | 684 | ||
683 | /* Returns the speed of a device attached to a port on the root hub. */ | 685 | /* Returns the speed of a device attached to a port on the root hub. */ |
684 | static inline unsigned int | 686 | static inline unsigned int |