V4L/DVB (10518): em28xx: Fix for em28xx memory leak and function rename
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>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
3e099baff4
commit
aa5a182185
@@ -56,7 +56,7 @@ MODULE_PARM_DESC(debug, "activates debug info");
|
|||||||
|
|
||||||
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
|
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;
|
int i;
|
||||||
|
|
||||||
@@ -66,6 +66,7 @@ static int em28xx_isoc_audio_deinit(struct em28xx *dev)
|
|||||||
usb_kill_urb(dev->adev.urb[i]);
|
usb_kill_urb(dev->adev.urb[i]);
|
||||||
else
|
else
|
||||||
usb_unlink_urb(dev->adev.urb[i]);
|
usb_unlink_urb(dev->adev.urb[i]);
|
||||||
|
|
||||||
usb_free_urb(dev->adev.urb[i]);
|
usb_free_urb(dev->adev.urb[i]);
|
||||||
dev->adev.urb[i] = NULL;
|
dev->adev.urb[i] = NULL;
|
||||||
|
|
||||||
@@ -87,6 +88,20 @@ static void em28xx_audio_isocirq(struct urb *urb)
|
|||||||
unsigned int stride;
|
unsigned int stride;
|
||||||
struct snd_pcm_substream *substream;
|
struct snd_pcm_substream *substream;
|
||||||
struct snd_pcm_runtime *runtime;
|
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) {
|
if (dev->adev.capture_pcm_substream) {
|
||||||
substream = dev->adev.capture_pcm_substream;
|
substream = dev->adev.capture_pcm_substream;
|
||||||
runtime = substream->runtime;
|
runtime = substream->runtime;
|
||||||
@@ -197,8 +212,7 @@ static int em28xx_init_audio_isoc(struct em28xx *dev)
|
|||||||
for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
|
for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
|
||||||
errCode = usb_submit_urb(dev->adev.urb[i], GFP_ATOMIC);
|
errCode = usb_submit_urb(dev->adev.urb[i], GFP_ATOMIC);
|
||||||
if (errCode) {
|
if (errCode) {
|
||||||
em28xx_isoc_audio_deinit(dev);
|
em28xx_deinit_isoc_audio(dev);
|
||||||
|
|
||||||
return errCode;
|
return errCode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -218,7 +232,7 @@ static int em28xx_cmd(struct em28xx *dev, int cmd, int arg)
|
|||||||
em28xx_init_audio_isoc(dev);
|
em28xx_init_audio_isoc(dev);
|
||||||
} else if (dev->adev.capture_stream == STREAM_ON && arg == 0) {
|
} else if (dev->adev.capture_stream == STREAM_ON && arg == 0) {
|
||||||
dev->adev.capture_stream = STREAM_OFF;
|
dev->adev.capture_stream = STREAM_OFF;
|
||||||
em28xx_isoc_audio_deinit(dev);
|
em28xx_deinit_isoc_audio(dev);
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_ERR "An underrun very likely occurred. "
|
printk(KERN_ERR "An underrun very likely occurred. "
|
||||||
"Ignoring it.\n");
|
"Ignoring it.\n");
|
||||||
|
@@ -827,6 +827,19 @@ static void em28xx_irq_callback(struct urb *urb)
|
|||||||
struct em28xx *dev = container_of(dma_q, struct em28xx, vidq);
|
struct em28xx *dev = container_of(dma_q, struct em28xx, vidq);
|
||||||
int rc, i;
|
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 */
|
/* Copy data from URB */
|
||||||
spin_lock(&dev->slock);
|
spin_lock(&dev->slock);
|
||||||
rc = dev->isoc_ctl.isoc_copy(dev, urb);
|
rc = dev->isoc_ctl.isoc_copy(dev, urb);
|
||||||
|
Reference in New Issue
Block a user