USB: ehci: minor ISO updates, always support split ISO
Small updates to the EHCI driver's ISO support: - Get rid of the Kconfig option for full speed ISO. It may not be perfect yet, but it hasn't appeared to be dangerous and pretty much every configuration wants it. - Instead of two places to disable an empty periodic schedule after an ISO transfer completes, just have one. - After the periodic schedule is disabled, we can short-circuit the schedule scan ... it can't possibly have more work to do. Assuming a typical config with split iso enabled, the only change in behavior should be almost unobservable: quicker termination of periodic scans when the schedule gets emptied. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
3b6fcfd066
commit
aa16ca307e
@ -29,15 +29,6 @@ config USB_EHCI_HCD
|
|||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called ehci-hcd.
|
module will be called ehci-hcd.
|
||||||
|
|
||||||
config USB_EHCI_SPLIT_ISO
|
|
||||||
bool "Full speed ISO transactions (EXPERIMENTAL)"
|
|
||||||
depends on USB_EHCI_HCD && EXPERIMENTAL
|
|
||||||
default n
|
|
||||||
---help---
|
|
||||||
This code is new and hasn't been used with many different
|
|
||||||
EHCI or USB 2.0 transaction translator implementations.
|
|
||||||
It should work for ISO-OUT transfers, like audio.
|
|
||||||
|
|
||||||
config USB_EHCI_ROOT_HUB_TT
|
config USB_EHCI_ROOT_HUB_TT
|
||||||
bool "Root Hub Transaction Translators (EXPERIMENTAL)"
|
bool "Root Hub Transaction Translators (EXPERIMENTAL)"
|
||||||
depends on USB_EHCI_HCD && EXPERIMENTAL
|
depends on USB_EHCI_HCD && EXPERIMENTAL
|
||||||
|
@ -1630,16 +1630,12 @@ itd_complete (
|
|||||||
BUG_ON (itd->urb == urb);
|
BUG_ON (itd->urb == urb);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* give urb back to the driver ... can be out-of-order */
|
/* give urb back to the driver; completion often (re)submits */
|
||||||
dev = urb->dev;
|
dev = urb->dev;
|
||||||
ehci_urb_done(ehci, urb, 0);
|
ehci_urb_done(ehci, urb, 0);
|
||||||
retval = true;
|
retval = true;
|
||||||
urb = NULL;
|
urb = NULL;
|
||||||
|
|
||||||
/* defer stopping schedule; completion can submit */
|
|
||||||
ehci->periodic_sched--;
|
ehci->periodic_sched--;
|
||||||
if (unlikely (!ehci->periodic_sched))
|
|
||||||
(void) disable_periodic (ehci);
|
|
||||||
ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
|
ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
|
||||||
|
|
||||||
if (unlikely (list_empty (&stream->td_list))) {
|
if (unlikely (list_empty (&stream->td_list))) {
|
||||||
@ -1725,8 +1721,6 @@ done:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_USB_EHCI_SPLIT_ISO
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2016,16 +2010,12 @@ sitd_complete (
|
|||||||
BUG_ON (sitd->urb == urb);
|
BUG_ON (sitd->urb == urb);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* give urb back to the driver */
|
/* give urb back to the driver; completion often (re)submits */
|
||||||
dev = urb->dev;
|
dev = urb->dev;
|
||||||
ehci_urb_done(ehci, urb, 0);
|
ehci_urb_done(ehci, urb, 0);
|
||||||
retval = true;
|
retval = true;
|
||||||
urb = NULL;
|
urb = NULL;
|
||||||
|
|
||||||
/* defer stopping schedule; completion can submit */
|
|
||||||
ehci->periodic_sched--;
|
ehci->periodic_sched--;
|
||||||
if (!ehci->periodic_sched)
|
|
||||||
(void) disable_periodic (ehci);
|
|
||||||
ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
|
ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
|
||||||
|
|
||||||
if (list_empty (&stream->td_list)) {
|
if (list_empty (&stream->td_list)) {
|
||||||
@ -2108,26 +2098,6 @@ done:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
sitd_submit (struct ehci_hcd *ehci, struct urb *urb, gfp_t mem_flags)
|
|
||||||
{
|
|
||||||
ehci_dbg (ehci, "split iso support is disabled\n");
|
|
||||||
return -ENOSYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned
|
|
||||||
sitd_complete (
|
|
||||||
struct ehci_hcd *ehci,
|
|
||||||
struct ehci_sitd *sitd
|
|
||||||
) {
|
|
||||||
ehci_err (ehci, "sitd_complete %p?\n", sitd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* USB_EHCI_SPLIT_ISO */
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -2252,8 +2222,14 @@ restart:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* assume completion callbacks modify the queue */
|
/* assume completion callbacks modify the queue */
|
||||||
if (unlikely (modified))
|
if (unlikely (modified)) {
|
||||||
|
if (likely(ehci->periodic_sched > 0))
|
||||||
goto restart;
|
goto restart;
|
||||||
|
/* maybe we can short-circuit this scan! */
|
||||||
|
disable_periodic(ehci);
|
||||||
|
now_uframe = clock;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* stop when we catch up to the HC */
|
/* stop when we catch up to the HC */
|
||||||
@ -2269,7 +2245,8 @@ restart:
|
|||||||
if (now_uframe == clock) {
|
if (now_uframe == clock) {
|
||||||
unsigned now;
|
unsigned now;
|
||||||
|
|
||||||
if (!HC_IS_RUNNING (ehci_to_hcd(ehci)->state))
|
if (!HC_IS_RUNNING (ehci_to_hcd(ehci)->state)
|
||||||
|
|| ehci->periodic_sched == 0)
|
||||||
break;
|
break;
|
||||||
ehci->next_uframe = now_uframe;
|
ehci->next_uframe = now_uframe;
|
||||||
now = ehci_readl(ehci, &ehci->regs->frame_index) % mod;
|
now = ehci_readl(ehci, &ehci->regs->frame_index) % mod;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user