Hi,

And here's a patch against 2.5.3-pre2 that makes the devio code use
usb_alloc_urb().  I tested this out with the pencam user space program
(it uses libusb.)

Any objections?

thanks,

greg k-h


diff -Nru a/drivers/usb/devio.c b/drivers/usb/devio.c
--- a/drivers/usb/devio.c       Mon Jan 21 17:06:59 2002
+++ b/drivers/usb/devio.c       Mon Jan 21 17:06:59 2002
@@ -53,7 +53,7 @@
        unsigned int signr;
        void *userbuffer;
         void *userurb;
-        struct urb urb;
+        struct urb *urb;
 };
 
 static loff_t usbdev_lseek(struct file *file, loff_t offset, int orig)
@@ -175,17 +175,21 @@
         if (!as)
                 return NULL;
         memset(as, 0, assize);
-        as->urb.number_of_packets = numisoframes;
-        spin_lock_init(&as->urb.lock);
+       as->urb = usb_alloc_urb(numisoframes);
+       if (!as->urb) {
+               kfree(as);
+               return NULL;
+       }
         return as;
 }
 
 static void free_async(struct async *as)
 {
-        if (as->urb.transfer_buffer)
-                kfree(as->urb.transfer_buffer);
-        if (as->urb.setup_packet)
-                kfree(as->urb.setup_packet);
+        if (as->urb->transfer_buffer)
+                kfree(as->urb->transfer_buffer);
+        if (as->urb->setup_packet)
+                kfree(as->urb->setup_packet);
+       usb_free_urb(as->urb);
         kfree(as);
 }
 
@@ -259,7 +263,7 @@
         wake_up(&ps->wait);
        if (as->signr) {
                sinfo.si_signo = as->signr;
-               sinfo.si_errno = as->urb.status;
+               sinfo.si_errno = as->urb->status;
                sinfo.si_code = SI_ASYNCIO;
                sinfo.si_addr = as->userurb;
                send_sig_info(as->signr, &sinfo, as->task);
@@ -278,7 +282,7 @@
                 INIT_LIST_HEAD(&as->asynclist);
                 spin_unlock_irqrestore(&ps->lock, flags);
                 /* usb_unlink_urb calls the completion handler with status == -ENOENT 
*/
-                usb_unlink_urb(&as->urb);
+                usb_unlink_urb(as->urb);
                 spin_lock_irqsave(&ps->lock, flags);
         }
         spin_unlock_irqrestore(&ps->lock, flags);
@@ -862,7 +866,7 @@
                        kfree(dr);
                return -ENOMEM;
        }
-       if (!(as->urb.transfer_buffer = kmalloc(uurb.buffer_length, GFP_KERNEL))) {
+       if (!(as->urb->transfer_buffer = kmalloc(uurb.buffer_length, GFP_KERNEL))) {
                if (isopkt)
                        kfree(isopkt);
                if (dr)
@@ -870,19 +874,19 @@
                free_async(as);
                return -ENOMEM;
        }
-        as->urb.next = NULL;
-        as->urb.dev = ps->dev;
-        as->urb.pipe = (uurb.type << 30) | __create_pipe(ps->dev, uurb.endpoint & 
0xf) | (uurb.endpoint & USB_DIR_IN);
-        as->urb.transfer_flags = uurb.flags;
-       as->urb.transfer_buffer_length = uurb.buffer_length;
-       as->urb.setup_packet = (unsigned char*)dr;
-       as->urb.start_frame = uurb.start_frame;
-       as->urb.number_of_packets = uurb.number_of_packets;
-        as->urb.context = as;
-        as->urb.complete = async_completed;
+        as->urb->next = NULL;
+        as->urb->dev = ps->dev;
+        as->urb->pipe = (uurb.type << 30) | __create_pipe(ps->dev, uurb.endpoint & 
+0xf) | (uurb.endpoint & USB_DIR_IN);
+        as->urb->transfer_flags = uurb.flags;
+       as->urb->transfer_buffer_length = uurb.buffer_length;
+       as->urb->setup_packet = (unsigned char*)dr;
+       as->urb->start_frame = uurb.start_frame;
+       as->urb->number_of_packets = uurb.number_of_packets;
+        as->urb->context = as;
+        as->urb->complete = async_completed;
        for (totlen = u = 0; u < uurb.number_of_packets; u++) {
-               as->urb.iso_frame_desc[u].offset = totlen;
-               as->urb.iso_frame_desc[u].length = isopkt[u].length;
+               as->urb->iso_frame_desc[u].offset = totlen;
+               as->urb->iso_frame_desc[u].length = isopkt[u].length;
                totlen += isopkt[u].length;
        }
        if (isopkt)
@@ -896,13 +900,13 @@
        as->signr = uurb.signr;
        as->task = current;
        if (!(uurb.endpoint & USB_DIR_IN)) {
-               if (copy_from_user(as->urb.transfer_buffer, uurb.buffer, 
as->urb.transfer_buffer_length)) {
+               if (copy_from_user(as->urb->transfer_buffer, uurb.buffer, 
+as->urb->transfer_buffer_length)) {
                        free_async(as);
                        return -EFAULT;
                }
        }
         async_newpending(as);
-        if ((ret = usb_submit_urb(&as->urb))) {
+        if ((ret = usb_submit_urb(as->urb))) {
                printk(KERN_DEBUG "usbdevfs: usb_submit_urb returned %d\n", ret);
                 async_removepending(as);
                 free_async(as);
@@ -918,34 +922,35 @@
        as = async_getpending(ps, arg);
        if (!as)
                return -EINVAL;
-       usb_unlink_urb(&as->urb);
+       usb_unlink_urb(as->urb);
        return 0;
 }
 
 static int processcompl(struct async *as)
 {
+       struct urb *urb = as->urb;
        unsigned int i;
 
        if (as->userbuffer)
-               if (copy_to_user(as->userbuffer, as->urb.transfer_buffer, 
as->urb.transfer_buffer_length))
+               if (copy_to_user(as->userbuffer, urb->transfer_buffer, 
+urb->transfer_buffer_length))
                        return -EFAULT;
-       if (put_user(as->urb.status,
+       if (put_user(urb->status,
                     &((struct usbdevfs_urb *)as->userurb)->status))
                return -EFAULT;
-       if (put_user(as->urb.actual_length,
+       if (put_user(urb->actual_length,
                     &((struct usbdevfs_urb *)as->userurb)->actual_length))
                return -EFAULT;
-       if (put_user(as->urb.error_count,
+       if (put_user(urb->error_count,
                     &((struct usbdevfs_urb *)as->userurb)->error_count))
                return -EFAULT;
 
-       if (!(usb_pipeisoc(as->urb.pipe)))
+       if (!(usb_pipeisoc(urb->pipe)))
                return 0;
-       for (i = 0; i < as->urb.number_of_packets; i++) {
-               if (put_user(as->urb.iso_frame_desc[i].actual_length, 
+       for (i = 0; i < urb->number_of_packets; i++) {
+               if (put_user(urb->iso_frame_desc[i].actual_length, 
                             &((struct usbdevfs_urb 
*)as->userurb)->iso_frame_desc[i].actual_length))
                        return -EFAULT;
-               if (put_user(as->urb.iso_frame_desc[i].status, 
+               if (put_user(urb->iso_frame_desc[i].status, 
                             &((struct usbdevfs_urb 
*)as->userurb)->iso_frame_desc[i].status))
                        return -EFAULT;
        }

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

Reply via email to