V4L/DVB (10327): em28xx: Add check before call em28xx_isoc_audio_deinit()

Just call em28xx_isoc_audio_deinit() if em28xx sent a usb_submit().

Signed-off-by: Douglas Schilling Landgraf <dougsland@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c
index 7a62c77..43e8d7d 100644
--- a/drivers/media/video/em28xx/em28xx-audio.c
+++ b/drivers/media/video/em28xx/em28xx-audio.c
@@ -61,7 +61,7 @@
 	int i;
 
 	dprintk("Stopping isoc\n");
-	for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
+	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
 		if (!irqs_disabled())
 			usb_kill_urb(dev->adev.urb[i]);
 		else
@@ -73,6 +73,7 @@
 		dev->adev.transfer_buffer[i] = NULL;
 	}
 
+	dev->isoc_ctl.num_bufs = 0;
 	return 0;
 }
 
@@ -156,6 +157,8 @@
 
 	dprintk("Starting isoc transfers\n");
 
+	dev->isoc_ctl.num_bufs = 0;
+
 	for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
 		struct urb *urb;
 		int j, k;
@@ -197,10 +200,19 @@
 	for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
 		errCode = usb_submit_urb(dev->adev.urb[i], GFP_ATOMIC);
 		if (errCode) {
-			em28xx_isoc_audio_deinit(dev);
+			if (dev->isoc_ctl.num_bufs == 0) {
+				usb_free_urb(dev->adev.urb[i]);
+				dev->adev.urb[i] = NULL;
+				kfree(dev->adev.transfer_buffer[i]);
+				dev->adev.transfer_buffer[i] = NULL;
+			} else
+				em28xx_isoc_audio_deinit(dev);
 
 			return errCode;
 		}
+		mutex_lock(&dev->lock);
+		dev->isoc_ctl.num_bufs++;
+		mutex_unlock(&dev->lock);
 	}
 
 	return 0;