> So can you send this again, for just usb_submit_urb() with the sum of
> the changes that you and David agreed on?

Sure. Here's the most basic patch.
Much thanks to Dave who had prepared the hcd layer already.
Dave, do you like it ?
Of course, it'll break all drivers except hub and all hcds not using the hcd layer ;-)
It's against 2.5.3.

        Regards
                Oliver

--- drivers/usb/usb.c.alt       Mon Feb  4 13:39:59 2002
+++ drivers/usb/usb.c   Mon Feb  4 13:43:33 2002
@@ -1199,10 +1199,10 @@
  * the periodic request, and bandwidth reservation is being done for
  * this controller, submitting such a periodic request will fail. 
  */
-int usb_submit_urb(struct urb *urb)
+int usb_submit_urb(struct urb *urb, int mem_flags)
 {
        if (urb && urb->dev && urb->dev->bus && urb->dev->bus->op)
-               return urb->dev->bus->op->submit_urb(urb);
+               return urb->dev->bus->op->submit_urb(urb, mem_flags);
        else
                return -ENODEV;
 }
@@ -1272,7 +1272,7 @@
        add_wait_queue(&awd.wqh, &wait);
 
        urb->context = &awd;
-       status = usb_submit_urb(urb);
+       status = usb_submit_urb(urb, GFP_KERNEL);
        if (status) {
                // something went wrong
                usb_free_urb(urb);
--- drivers/usb/hub.c.alt       Mon Feb  4 13:39:50 2002
+++ drivers/usb/hub.c   Mon Feb  4 13:41:15 2002
@@ -312,7 +312,7 @@
 
        FILL_INT_URB(hub->urb, dev, pipe, hub->buffer, maxp, hub_irq,
                hub, endpoint->bInterval);
-       ret = usb_submit_urb(hub->urb);
+       ret = usb_submit_urb(hub->urb, GFP_KERNEL);
        if (ret) {
                err("usb_submit_urb failed (%d)", ret);
                kfree(hub->descriptor);
@@ -498,7 +498,7 @@
                return -1;
 
        hub->urb->dev = dev;                                                    
-       if (usb_submit_urb(hub->urb))
+       if (usb_submit_urb(hub->urb, GFP_KERNEL))
                return -1;
 
        usb_hub_power_on(hub);
--- drivers/usb/hcd.c.alt       Mon Feb  4 13:40:08 2002
+++ drivers/usb/hcd.c   Mon Feb  4 13:45:30 2002
@@ -916,14 +916,13 @@
 /* may be called in any context with a valid urb->dev usecount */
 /* caller surrenders "ownership" of urb (and chain at urb->next).  */
 
-static int hcd_submit_urb (struct urb *urb)
+static int hcd_submit_urb (struct urb *urb, int mem_flags)
 {
        int                     status;
        struct usb_hcd          *hcd;
        struct hcd_dev          *dev;
        unsigned long           flags;
        int                     pipe;
-       int                     mem_flags;
 
        if (!urb || urb->hcpriv || !urb->complete)
                return -EINVAL;
@@ -947,11 +946,6 @@
                        usb_pipeout (pipe)))
                return -EPIPE;
 
-       // FIXME paging/swapping requests over USB should not use GFP_KERNEL
-       // and might even need to use GFP_NOIO ... that flag actually needs
-       // to be passed from the higher level.
-       mem_flags = in_interrupt () ? GFP_ATOMIC : GFP_KERNEL;
-
 #ifdef DEBUG
        {
        unsigned int    orig_flags = urb->transfer_flags;
@@ -1316,7 +1310,7 @@
        else if (urb->next) {
                int     status;
 
-               status = usb_submit_urb (urb->next);
+               status = usb_submit_urb (urb->next, GFP_ATOMIC);
                if (status) {
                        dbg ("urb %p chain fail, %d", urb->next, status);
                        urb->next->status = -ENOTCONN;
--- include/linux/usb.h.alt     Mon Feb  4 13:47:44 2002
+++ include/linux/usb.h Mon Feb  4 13:48:40 2002
@@ -857,7 +857,7 @@
 extern void usb_free_urb(struct urb *urb);
 #define usb_put_urb usb_free_urb
 extern struct urb *usb_get_urb(struct urb *urb);
-extern int usb_submit_urb(struct urb *urb);
+extern int usb_submit_urb(struct urb *urb, int mem_flags);
 extern int usb_unlink_urb(struct urb *urb);
 
 /*-------------------------------------------------------------------*
@@ -906,7 +906,7 @@
        int (*allocate)(struct usb_device *);
        int (*deallocate)(struct usb_device *);
        int (*get_frame_number) (struct usb_device *usb_dev);
-       int (*submit_urb) (struct urb *urb);
+       int (*submit_urb) (struct urb *urb, int mem_flags);
        int (*unlink_urb) (struct urb *urb);
 };
 

_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to