ChangeSet 1.1276.1.58, 2003/08/28 10:53:17-07:00, [EMAIL PROTECTED]

[PATCH] USB: net2280, patch dma chains

One person working on a mass-storage driver (the usb protocol
side, not the block subsystem side) ran into a bug in how a
bit of net2280 dma automagic was handled.

This patch fixes it by calling existing dma chain patchup
code when the dma engine was forced to "hiccup" by having
a not-yet-valid entry in it.  The hiccup is needed in this
case since the IN data stage mustn't terminate with a
short transfer (zero length packet); but the status stage
is always a short packet.  The "terminate with short packet"
bit is endpoint state, not request state, so IN dma queues
sometimes need this kind of fixup.


 drivers/usb/gadget/net2280.c |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+)


diff -Nru a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c
--- a/drivers/usb/gadget/net2280.c      Tue Sep  2 12:42:59 2003
+++ b/drivers/usb/gadget/net2280.c      Tue Sep  2 12:42:59 2003
@@ -2432,6 +2432,28 @@
                        if ((tmp & (1 << DMA_SCATTER_GATHER_ENABLE)) == 0
                                        || (tmp & (1 << DMA_ENABLE)) == 0)
                                restart_dma (ep);
+#ifdef USE_DMA_CHAINING
+                       else if (ep->desc->bEndpointAddress & USB_DIR_IN) {
+                               struct net2280_request  *req;
+                               u32                     dmacount;
+
+                               /* the descriptor at the head of the chain
+                                * may still have VALID_BIT clear; that's
+                                * used to trigger changing DMA_FIFO_VALIDATE
+                                * (affects automagic zlp writes).
+                                */
+                               req = list_entry (ep->queue.next,
+                                               struct net2280_request, queue);
+                               dmacount = req->td->dmacount;
+                               dmacount &= __constant_cpu_to_le32 (
+                                               (1 << VALID_BIT)
+                                               | DMA_BYTE_COUNT_MASK);
+                               if (dmacount && (dmacount & valid_bit) == 0) {
+                                       stop_dma (ep->dma);
+                                       restart_dma (ep);
+                               }
+                       }
+#endif
                }
                ep->irqs++;
        }



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to