ChangeSet 1.1243.50.12, 2003/06/10 14:49:35-07:00, [EMAIL PROTECTED]

[PATCH] USB: Make hub.c DMA-aware

This patch makes the hub status irq DMA-aware, by pre-allocating the
transfer buffer in consistent memory.  Unfortunately, there doesn't seem
to be an easy way to do the same for the status report buffers.


 drivers/usb/core/hub.c |   11 ++++++++---
 drivers/usb/core/hub.h |    1 +
 2 files changed, 9 insertions(+), 3 deletions(-)


diff -Nru a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
--- a/drivers/usb/core/hub.c    Tue Jun 10 17:11:23 2003
+++ b/drivers/usb/core/hub.c    Tue Jun 10 17:11:23 2003
@@ -302,9 +302,10 @@
        int maxp, ret;
        char *message;
 
-       hub->buffer = kmalloc(sizeof(*hub->buffer), GFP_KERNEL);
+       hub->buffer = usb_buffer_alloc(dev, sizeof(*hub->buffer), GFP_KERNEL,
+                       &hub->buffer_dma);
        if (!hub->buffer) {
-               message = "can't kmalloc hub irq buffer";
+               message = "can't allocate hub irq buffer";
                ret = -ENOMEM;
                goto fail;
        }
@@ -459,6 +460,8 @@
 
        usb_fill_int_urb(hub->urb, dev, pipe, *hub->buffer, maxp, hub_irq,
                hub, endpoint->bInterval);
+       hub->urb->transfer_dma = hub->buffer_dma;
+       hub->urb->transfer_flags |= URB_NO_DMA_MAP;
        ret = usb_submit_urb(hub->urb, GFP_KERNEL);
        if (ret) {
                message = "couldn't submit status urb";
@@ -522,7 +525,9 @@
        }
 
        if (hub->buffer) {
-               kfree(hub->buffer);
+               usb_buffer_free(interface_to_usbdev(intf),
+                               sizeof(*hub->buffer), hub->buffer,
+                               hub->buffer_dma);
                hub->buffer = NULL;
        }
 
diff -Nru a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
--- a/drivers/usb/core/hub.h    Tue Jun 10 17:11:23 2003
+++ b/drivers/usb/core/hub.h    Tue Jun 10 17:11:23 2003
@@ -175,6 +175,7 @@
 
        /* buffer for urb ... 1 bit each for hub and children, rounded up */
        char                    (*buffer)[(USB_MAXCHILDREN + 1 + 7) / 8];
+       dma_addr_t              buffer_dma;     /* DMA address for buffer */
        union {
                struct usb_hub_status   hub;
                struct usb_port_status  port;



-------------------------------------------------------
This SF.net email is sponsored by:  Etnus, makers of TotalView, The best
thread debugger on the planet. Designed with thread debugging features
you've never dreamed of, try TotalView 6 free at www.etnus.com.
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to