diff options
Diffstat (limited to 'drivers/usb/host/ohci-q.c')
-rw-r--r-- | drivers/usb/host/ohci-q.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c index 9c9f3b59186f..6a9b4c557953 100644 --- a/drivers/usb/host/ohci-q.c +++ b/drivers/usb/host/ohci-q.c | |||
@@ -159,9 +159,6 @@ static int ed_schedule (struct ohci_hcd *ohci, struct ed *ed) | |||
159 | { | 159 | { |
160 | int branch; | 160 | int branch; |
161 | 161 | ||
162 | if (ohci_to_hcd(ohci)->state == HC_STATE_QUIESCING) | ||
163 | return -EAGAIN; | ||
164 | |||
165 | ed->state = ED_OPER; | 162 | ed->state = ED_OPER; |
166 | ed->ed_prev = NULL; | 163 | ed->ed_prev = NULL; |
167 | ed->ed_next = NULL; | 164 | ed->ed_next = NULL; |
@@ -952,6 +949,7 @@ rescan_this: | |||
952 | struct urb *urb; | 949 | struct urb *urb; |
953 | urb_priv_t *urb_priv; | 950 | urb_priv_t *urb_priv; |
954 | __hc32 savebits; | 951 | __hc32 savebits; |
952 | u32 tdINFO; | ||
955 | 953 | ||
956 | td = list_entry (entry, struct td, td_list); | 954 | td = list_entry (entry, struct td, td_list); |
957 | urb = td->urb; | 955 | urb = td->urb; |
@@ -966,6 +964,17 @@ rescan_this: | |||
966 | savebits = *prev & ~cpu_to_hc32 (ohci, TD_MASK); | 964 | savebits = *prev & ~cpu_to_hc32 (ohci, TD_MASK); |
967 | *prev = td->hwNextTD | savebits; | 965 | *prev = td->hwNextTD | savebits; |
968 | 966 | ||
967 | /* If this was unlinked, the TD may not have been | ||
968 | * retired ... so manually save the data toggle. | ||
969 | * The controller ignores the value we save for | ||
970 | * control and ISO endpoints. | ||
971 | */ | ||
972 | tdINFO = hc32_to_cpup(ohci, &td->hwINFO); | ||
973 | if ((tdINFO & TD_T) == TD_T_DATA0) | ||
974 | ed->hwHeadP &= ~cpu_to_hc32(ohci, ED_C); | ||
975 | else if ((tdINFO & TD_T) == TD_T_DATA1) | ||
976 | ed->hwHeadP |= cpu_to_hc32(ohci, ED_C); | ||
977 | |||
969 | /* HC may have partly processed this TD */ | 978 | /* HC may have partly processed this TD */ |
970 | td_done (ohci, urb, td); | 979 | td_done (ohci, urb, td); |
971 | urb_priv->td_cnt++; | 980 | urb_priv->td_cnt++; |