patch-2.4.0-test10 linux/drivers/usb/audio.c

Next file: linux/drivers/usb/bluetooth.c
Previous file: linux/drivers/usb/acm.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test9/linux/drivers/usb/audio.c linux/drivers/usb/audio.c
@@ -879,6 +879,7 @@
 		mask = 0;
 		printk(KERN_ERR "usbin_completed: panic: unknown URB\n");
 	}
+	urb->dev = as->state->usbdev;
 	spin_lock_irqsave(&as->lock, flags);
 	if (!usbin_retire_desc(u, urb) &&
 	    u->flags & FLG_RUNNING &&
@@ -943,6 +944,7 @@
 		mask = 0;
 		printk(KERN_ERR "usbin_sync_completed: panic: unknown URB\n");
 	}
+	urb->dev = as->state->usbdev;
 	spin_lock_irqsave(&as->lock, flags);
 	if (!usbin_sync_retire_desc(u, urb) &&
 	    u->flags & FLG_RUNNING &&
@@ -1007,8 +1009,10 @@
 		}
 		spin_lock_irqsave(&as->lock, flags);
 	}
-	if (u->dma.count >= u->dma.dmasize && !u->dma.mapped)
+	if (u->dma.count >= u->dma.dmasize && !u->dma.mapped) {
+		spin_unlock_irqrestore(&as->lock, flags);
 		return 0;
+	}
 	u->flags |= FLG_RUNNING;
 	if (!(u->flags & FLG_URB0RUNNING)) {
 		urb = &u->durb[0].urb;
@@ -1233,6 +1237,7 @@
 		mask = 0;
 		printk(KERN_ERR "usbout_completed: panic: unknown URB\n");
 	}
+	urb->dev = as->state->usbdev;
 	spin_lock_irqsave(&as->lock, flags);
 	if (!usbout_retire_desc(u, urb) &&
 	    u->flags & FLG_RUNNING &&
@@ -1304,6 +1309,7 @@
 		mask = 0;
 		printk(KERN_ERR "usbout_sync_completed: panic: unknown URB\n");
 	}
+	urb->dev = as->state->usbdev;
 	spin_lock_irqsave(&as->lock, flags);
 	if (!usbout_sync_retire_desc(u, urb) &&
 	    u->flags & FLG_RUNNING &&
@@ -1368,8 +1374,10 @@
 		}
 		spin_lock_irqsave(&as->lock, flags);
 	}
-	if (u->dma.count <= 0 && !u->dma.mapped)
+	if (u->dma.count <= 0 && !u->dma.mapped) {
+		spin_unlock_irqrestore(&as->lock, flags);
 		return 0;
+	}
        	u->flags |= FLG_RUNNING;
 	if (!(u->flags & FLG_URB0RUNNING)) {
 		urb = &u->durb[0].urb;
@@ -2768,6 +2776,14 @@
 	init_waitqueue_head(&as->usbin.dma.wait);
 	init_waitqueue_head(&as->usbout.dma.wait);
 	spin_lock_init(&as->lock);
+	spin_lock_init(&as->usbin.durb[0].urb.lock);
+	spin_lock_init(&as->usbin.durb[1].urb.lock);
+	spin_lock_init(&as->usbin.surb[0].urb.lock);
+	spin_lock_init(&as->usbin.surb[1].urb.lock);
+	spin_lock_init(&as->usbout.durb[0].urb.lock);
+	spin_lock_init(&as->usbout.durb[1].urb.lock);
+	spin_lock_init(&as->usbout.surb[0].urb.lock);
+	spin_lock_init(&as->usbout.surb[1].urb.lock);
 	as->state = s;
 	as->usbin.interface = asifin;
 	as->usbout.interface = asifout;

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)