V4L/DVB (10518): em28xx: Fix for em28xx memory leak and function rename
authorRobert Krakora <rob.krakora@messagenetsystems.com>
Sun, 8 Feb 2009 16:09:11 +0000 (13:09 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:42:44 +0000 (12:42 -0300)
Fix for em28xx memory leak and function rename

Signed-off-by: Robert Krakora <rob.krakora@messagenetsystems.com>
Signed-off-by: Douglas Schilling Landgraf <dougsland@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/em28xx/em28xx-audio.c
drivers/media/video/em28xx/em28xx-core.c

index 7a62c77b84858776e41199ba9b7f37de8f63fcf6..c698d3c9690fc13942e5360074d118ef4e5a439a 100644 (file)
@@ -56,7 +56,7 @@ MODULE_PARM_DESC(debug, "activates debug info");
 
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
 
-static int em28xx_isoc_audio_deinit(struct em28xx *dev)
+static int em28xx_deinit_isoc_audio(struct em28xx *dev)
 {
        int i;
 
@@ -66,6 +66,7 @@ static int em28xx_isoc_audio_deinit(struct em28xx *dev)
                        usb_kill_urb(dev->adev.urb[i]);
                else
                        usb_unlink_urb(dev->adev.urb[i]);
+
                usb_free_urb(dev->adev.urb[i]);
                dev->adev.urb[i] = NULL;
 
@@ -87,6 +88,20 @@ static void em28xx_audio_isocirq(struct urb *urb)
        unsigned int             stride;
        struct snd_pcm_substream *substream;
        struct snd_pcm_runtime   *runtime;
+
+       switch (urb->status) {
+       case 0:             /* success */
+       case -ETIMEDOUT:    /* NAK */
+               break;
+       case -ECONNRESET:   /* kill */
+       case -ENOENT:
+       case -ESHUTDOWN:
+               return;
+       default:            /* error */
+               dprintk("urb completition error %d.\n", urb->status);
+               break;
+       }
+
        if (dev->adev.capture_pcm_substream) {
                substream = dev->adev.capture_pcm_substream;
                runtime = substream->runtime;
@@ -197,8 +212,7 @@ static int em28xx_init_audio_isoc(struct em28xx *dev)
        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);
-
+                       em28xx_deinit_isoc_audio(dev);
                        return errCode;
                }
        }
@@ -218,7 +232,7 @@ static int em28xx_cmd(struct em28xx *dev, int cmd, int arg)
                        em28xx_init_audio_isoc(dev);
                } else if (dev->adev.capture_stream == STREAM_ON && arg == 0) {
                        dev->adev.capture_stream = STREAM_OFF;
-                       em28xx_isoc_audio_deinit(dev);
+                       em28xx_deinit_isoc_audio(dev);
                } else {
                        printk(KERN_ERR "An underrun very likely occurred. "
                                        "Ignoring it.\n");
index 3ac8ce0adec3a15f8d47502b9889953f7f01e352..43f1d0e4c5495b22a4f9f9b175d0adc56a37475e 100644 (file)
@@ -827,6 +827,19 @@ static void em28xx_irq_callback(struct urb *urb)
        struct em28xx *dev = container_of(dma_q, struct em28xx, vidq);
        int rc, i;
 
+       switch (urb->status) {
+       case 0:             /* success */
+       case -ETIMEDOUT:    /* NAK */
+               break;
+       case -ECONNRESET:   /* kill */
+       case -ENOENT:
+       case -ESHUTDOWN:
+               return;
+       default:            /* error */
+               em28xx_isocdbg("urb completition error %d.\n", urb->status);
+               break;
+       }
+
        /* Copy data from URB */
        spin_lock(&dev->slock);
        rc = dev->isoc_ctl.isoc_copy(dev, urb);