OK, here's a version that's trimmed down even more ... no reformatting, it
only sets the transfer_buffer, uses #ifdef not #ifndef.  Comments slimmed.

Greg, this would be nice to have in 2.6.21 (just to make the N800 patchset
simpler) but I can't say it's essential.

- Dave


=============   CUT HERE
From: Tony Lindgren <[EMAIL PROTECTED]>
Subject: USB: Allow transfer_buffer with transfer_dma

Some host controller drivers may need a PIO fallback when a DMA channel
is temporarily unavailable.  This patch provides an address that such
drivers can use for PIO in those cases, and nulls that field out when
no such address is available (highmem) which should help usbmon.

Signed-off-by: Tony Lindgren <[EMAIL PROTECTED]>
Signed-off-by: David Brownell <[EMAIL PROTECTED]>

--- g26.orig/drivers/usb/core/message.c 2007-03-12 00:59:52.000000000 -0700
+++ g26/drivers/usb/core/message.c      2007-03-31 18:06:02.000000000 -0700
@@ -412,10 +412,24 @@ int usb_sg_init (
                io->urbs [i]->status = -EINPROGRESS;
                io->urbs [i]->actual_length = 0;
 
+               /*
+                * Some systems need to revert to PIO when DMA is temporarily
+                * unavailable.  For their sakes, both transfer_buffer and
+                * transfer_dma are set when possible.  However this can only
+                * work on systems without HIGHMEM, since DMA buffers located
+                * in high memory are not directly addressable by the CPU for
+                * PIO ... so when HIGHMEM is in use, transfer_buffer is NULL
+                * to prevent stale pointers and to help spot bugs.
+                */
                if (dma) {
-                       /* hc may use _only_ transfer_dma */
                        io->urbs [i]->transfer_dma = sg_dma_address (sg + i);
                        len = sg_dma_len (sg + i);
+#ifdef CONFIG_HIGHMEM
+                       io->urbs[i]->transfer_buffer = NULL;
+#else
+                       io->urbs[i]->transfer_buffer =
+                               page_address(sg[i].page) + sg[i].offset;
+#endif
                } else {
                        /* hc may use _only_ transfer_buffer */
                        io->urbs [i]->transfer_buffer =

-------------------------------------------------------------------------
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