> 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