These patches are against kernels 2.6.18 through at least 2.6.18-git7.

patch 7: slightly rearrange sitd patching and linking code flow to
simplify addition of sITD backpointer support later. This should
result in no functional difference.

Signed-off-by: Christopher "Monty" Montgomery <[EMAIL PROTECTED]>

---

diff -X b/Documentation/dontdiff -upr a/drivers/usb/host/ehci-sched.c
b/drivers/usb/host/ehci-sched.c
--- a/drivers/usb/host/ehci-sched.c     2006-09-26 22:25:36.000000000 -0400
+++ b/drivers/usb/host/ehci-sched.c     2006-09-26 22:25:46.000000000 -0400
@@ -2030,18 +2030,15 @@ sitd_urb_transaction (
  *
  * @stream: stream into which this request will be queued
  * @sitd: New sITD that is to be added to the shadow/hardware schedule
- * @iso_sched: ehci_iso_sched holding transfer descriptors
- * @index: packet number
+ * @uf: iso stream packet
  */
 static inline void
 sitd_patch (
        struct ehci_iso_stream  *stream,
        struct ehci_sitd        *sitd,
-       struct ehci_iso_sched   *iso_sched,
-       unsigned                index
-)
+       struct ehci_iso_packet    *uf
+       )
 {
-       struct ehci_iso_packet  *uf = &iso_sched->packet [index];
        u64                     bufp = uf->bufp;

        sitd->hw_next = EHCI_LIST_END;
@@ -2050,7 +2047,6 @@ sitd_patch (
        sitd->hw_results = uf->transaction;
        sitd->hw_backpointer = EHCI_LIST_END;

-       bufp = uf->bufp;
        sitd->hw_buf [0] = cpu_to_le32 (bufp);
        sitd->hw_buf_hi [0] = cpu_to_le32 (bufp >> 32);

@@ -2058,26 +2054,47 @@ sitd_patch (
        if (uf->cross)
                bufp += 4096;
        sitd->hw_buf_hi [1] = cpu_to_le32 (bufp >> 32);
-       sitd->index = index;
 }

 /* sitd_link - fill in and link one sITD into the shadow/hardware
  * schedule
  *
  * @ehci: pointer to ehci host controller device structure
+ * @urb: new USB request
  * @frame: shadow/hardware schedule frame
- * @sitd: sitd to link
+ * @stream: stream to which ITD belongs
+ * @sched: ehci_iso_sched structure holding packets
+ * @index: index of packet to use from sched
  */
-static inline void
-sitd_link (struct ehci_hcd *ehci, unsigned frame, struct ehci_sitd *sitd)
+static inline void sitd_link (struct ehci_hcd *ehci,
+                             struct urb *urb,
+                             unsigned frame,
+                             struct ehci_iso_stream *stream,
+                             struct ehci_iso_sched *sched,
+                             int index)
 {
+       struct ehci_sitd      *sitd;
+
+       /* get SITD from already allocated list */
+       BUG_ON (list_empty (&sched->td_list));
+       sitd = list_entry (sched->td_list.next,
+                          struct ehci_sitd, sitd_list);
+       list_move_tail (&sitd->sitd_list, &stream->td_list);
+       sitd->stream = iso_stream_get (stream);
+       sitd->urb = usb_get_urb (urb);
+
+       /* set the sitd fields */
+       sitd_patch (stream, sitd, &sched->packet [index]);
+
        /* note: sitd ordering could matter (CSPLIT then SSPLIT) */
+       sitd->frame = frame;
+       sitd->index = index;
        sitd->sitd_next = ehci->pshadow [frame];
        sitd->hw_next = ehci->periodic [frame];
        ehci->pshadow [frame].sitd = sitd;
-       sitd->frame = frame;
        wmb ();
        ehci->periodic [frame] = cpu_to_le32 (sitd->sitd_dma) | Q_TYPE_SITD;
+
 }

 /* sitd_link_urb - link urb's sITDs into the hardware schedule
@@ -2094,12 +2111,11 @@ sitd_link_urb (
        struct urb              *urb,
        unsigned                mod,
        struct ehci_iso_stream  *stream
-)
+       )
 {
        int                     packet;
        unsigned                next_uframe;
        struct ehci_iso_sched   *sched = urb->hcpriv;
-       struct ehci_sitd        *sitd;

        next_uframe = stream->next_uframe;

@@ -2107,42 +2123,21 @@ sitd_link_urb (
                /* usbfs ignores TT bandwidth */
                ehci_to_hcd(ehci)->self.bandwidth_allocated
                                += stream->bandwidth;
-               ehci_vdbg (ehci,
-                       "sched devp %s ep%d%s-iso [%d] %dms/%04x\n",
-                       urb->dev->devpath, stream->bEndpointAddress & 0x0f,
-                       (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out",
-                       (next_uframe >> 3) % ehci->periodic_size,
-                       stream->interval, le32_to_cpu (stream->splits));
-               stream->start = jiffies;
        }
        ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs++;

        /* fill sITDs frame by frame */
-       for (packet = 0, sitd = NULL;
-                       packet < urb->number_of_packets;
-                       packet++) {
-
-               /* ASSERT:  we have all necessary sitds */
-               BUG_ON (list_empty (&sched->td_list));
-
-               /* ASSERT:  no itds for this endpoint in this frame */
-
-               sitd = list_entry (sched->td_list.next,
-                               struct ehci_sitd, sitd_list);
-               list_move_tail (&sitd->sitd_list, &stream->td_list);
-               sitd->stream = iso_stream_get (stream);
-               sitd->urb = usb_get_urb (urb);
-
-               sitd_patch (stream, sitd, sched, packet);
-               sitd_link (ehci, (next_uframe >> 3) % ehci->periodic_size,
-                               sitd);
-
+       for (packet = 0; packet < urb->number_of_packets; packet++) {
+         sitd_link (ehci, urb, ((next_uframe & (mod-1)) >> 3),
+                    stream, sched, packet);
                next_uframe += stream->interval << 3;
                stream->depth += stream->interval << 3;
        }
+       
        stream->next_uframe = next_uframe % mod;

        /* don't need that schedule data any more */
+       /* also releases unused sITDs that weren't needed for spanning */
        iso_sched_free (stream, sched);
        urb->hcpriv = NULL;

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to