Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=aa16ca307ee2da304d3a5fc0fc5e50ef8047c9e9
Commit:     aa16ca307ee2da304d3a5fc0fc5e50ef8047c9e9
Parent:     3b6fcfd0664aeac6ae2fd1231f04b3ed24723c1e
Author:     David Brownell <[EMAIL PROTECTED]>
AuthorDate: Sun Dec 30 23:45:19 2007 -0800
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Fri Feb 1 14:35:02 2008 -0800

    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 <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/usb/host/Kconfig      |    9 -------
 drivers/usb/host/ehci-sched.c |   47 ++++++++++------------------------------
 2 files changed, 12 insertions(+), 44 deletions(-)

diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index 3a42bcd..d97b16b 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -29,15 +29,6 @@ config USB_EHCI_HCD
          To compile this driver as a module, choose M here: the
          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
        bool "Root Hub Transaction Translators (EXPERIMENTAL)"
        depends on USB_EHCI_HCD && EXPERIMENTAL
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
index 1a94e6c..001b2c3 100644
--- a/drivers/usb/host/ehci-sched.c
+++ b/drivers/usb/host/ehci-sched.c
@@ -1630,16 +1630,12 @@ itd_complete (
                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;
        ehci_urb_done(ehci, urb, 0);
        retval = true;
        urb = NULL;
-
-       /* defer stopping schedule; completion can submit */
        ehci->periodic_sched--;
-       if (unlikely (!ehci->periodic_sched))
-               (void) disable_periodic (ehci);
        ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
 
        if (unlikely (list_empty (&stream->td_list))) {
@@ -1725,8 +1721,6 @@ done:
        return status;
 }
 
-#ifdef CONFIG_USB_EHCI_SPLIT_ISO
-
 /*-------------------------------------------------------------------------*/
 
 /*
@@ -2016,16 +2010,12 @@ sitd_complete (
                BUG_ON (sitd->urb == urb);
         */
 
-       /* give urb back to the driver */
+       /* give urb back to the driver; completion often (re)submits */
        dev = urb->dev;
        ehci_urb_done(ehci, urb, 0);
        retval = true;
        urb = NULL;
-
-       /* defer stopping schedule; completion can submit */
        ehci->periodic_sched--;
-       if (!ehci->periodic_sched)
-               (void) disable_periodic (ehci);
        ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
 
        if (list_empty (&stream->td_list)) {
@@ -2108,26 +2098,6 @@ done:
        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
@@ -2252,8 +2222,14 @@ restart:
                        }
 
                        /* assume completion callbacks modify the queue */
-                       if (unlikely (modified))
-                               goto restart;
+                       if (unlikely (modified)) {
+                               if (likely(ehci->periodic_sched > 0))
+                                       goto restart;
+                               /* maybe we can short-circuit this scan! */
+                               disable_periodic(ehci);
+                               now_uframe = clock;
+                               break;
+                       }
                }
 
                /* stop when we catch up to the HC */
@@ -2269,7 +2245,8 @@ restart:
                if (now_uframe == clock) {
                        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;
                        ehci->next_uframe = now_uframe;
                        now = ehci_readl(ehci, &ehci->regs->frame_index) % mod;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to