Mailing List Archive

[PATCH] fsldma: fix incorrect exit path for initialization
Signed-off-by: Li Yang <leoli@freescale.com>
Cc: Zhang Wei <zw@zh-kernel.org>
---
drivers/dma/fsldma.c | 31 ++++++++++++++++---------------
1 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 054eabf..724f6fd 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -809,8 +809,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
if (!src) {
dev_err(fsl_chan->dev,
"selftest: Cannot alloc memory for test!\n");
- err = -ENOMEM;
- goto out;
+ return -ENOMEM;
}

dest = src + test_size;
@@ -842,7 +841,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) {
dev_err(fsl_chan->dev, "selftest: Time out!\n");
err = -ENODEV;
- goto out;
+ goto free_resources;
}

/* Test free and re-alloc channel resources */
@@ -927,8 +926,7 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev,
if (!new_fsl_chan) {
dev_err(&dev->dev, "No free memory for allocating "
"dma channels!\n");
- err = -ENOMEM;
- goto err;
+ return -ENOMEM;
}

/* get dma channel register base */
@@ -936,7 +934,7 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev,
if (err) {
dev_err(&dev->dev, "Can't get %s property 'reg'\n",
dev->node->full_name);
- goto err;
+ goto err_no_reg;
}

new_fsl_chan->feature = *(u32 *)match->data;
@@ -958,7 +956,7 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev,
dev_err(&dev->dev, "There is no %d channel!\n",
new_fsl_chan->id);
err = -EINVAL;
- goto err;
+ goto err_no_chan;
}
fdev->chan[new_fsl_chan->id] = new_fsl_chan;
tasklet_init(&new_fsl_chan->tasklet, dma_do_tasklet,
@@ -997,23 +995,26 @@ static int __devinit of_fsl_dma_chan_probe(struct of_device *dev,
if (err) {
dev_err(&dev->dev, "DMA channel %s request_irq error "
"with return %d\n", dev->node->full_name, err);
- goto err;
+ goto err_no_irq;
}
}

err = fsl_dma_self_test(new_fsl_chan);
if (err)
- goto err;
+ goto err_self_test;

dev_info(&dev->dev, "#%d (%s), irq %d\n", new_fsl_chan->id,
match->compatible, new_fsl_chan->irq);

return 0;
-err:
- dma_halt(new_fsl_chan);
- iounmap(new_fsl_chan->reg_base);
+
+err_self_test:
free_irq(new_fsl_chan->irq, new_fsl_chan);
+err_no_irq:
list_del(&new_fsl_chan->common.device_node);
+err_no_chan:
+ iounmap(new_fsl_chan->reg_base);
+err_no_reg:
kfree(new_fsl_chan);
return err;
}
@@ -1054,8 +1055,7 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev,
fdev = kzalloc(sizeof(struct fsl_dma_device), GFP_KERNEL);
if (!fdev) {
dev_err(&dev->dev, "No enough memory for 'priv'\n");
- err = -ENOMEM;
- goto err;
+ return -ENOMEM;
}
fdev->dev = &dev->dev;
INIT_LIST_HEAD(&fdev->common.channels);
@@ -1065,7 +1065,7 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev,
if (err) {
dev_err(&dev->dev, "Can't get %s property 'reg'\n",
dev->node->full_name);
- goto err;
+ goto err_no_reg;
}

dev_info(&dev->dev, "Probe the Freescale DMA driver for %s "
@@ -1103,6 +1103,7 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev,

err:
iounmap(fdev->reg_base);
+err_no_reg:
kfree(fdev);
return err;
}
--
1.5.5.1.248.g4b17

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
RE: [PATCH] fsldma: fix incorrect exit path for initialization [ In reply to ]
> -----Original Message-----
> From: leoli@freescale.com
>
> Signed-off-by: Li Yang <leoli@freescale.com>
> Cc: Zhang Wei <zw@zh-kernel.org>

Acked-by: Zhang Wei <zw@zh-kernel.org>

> ---
> drivers/dma/fsldma.c | 31 ++++++++++++++++---------------
> 1 files changed, 16 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
> index 054eabf..724f6fd 100644
> --- a/drivers/dma/fsldma.c
> +++ b/drivers/dma/fsldma.c
> @@ -809,8 +809,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan
> *fsl_chan)
> if (!src) {
> dev_err(fsl_chan->dev,
> "selftest: Cannot alloc memory for test!\n");
> - err = -ENOMEM;
> - goto out;
> + return -ENOMEM;
> }
>
> dest = src + test_size;
> @@ -842,7 +841,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan
> *fsl_chan)
> if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) {
> dev_err(fsl_chan->dev, "selftest: Time out!\n");
> err = -ENODEV;
> - goto out;
> + goto free_resources;
> }
>
> /* Test free and re-alloc channel resources */
> @@ -927,8 +926,7 @@ static int __devinit of_fsl_dma_chan_probe(struct
> of_device *dev,
> if (!new_fsl_chan) {
> dev_err(&dev->dev, "No free memory for allocating "
> "dma channels!\n");
> - err = -ENOMEM;
> - goto err;
> + return -ENOMEM;
> }
>
> /* get dma channel register base */
> @@ -936,7 +934,7 @@ static int __devinit of_fsl_dma_chan_probe(struct
> of_device *dev,
> if (err) {
> dev_err(&dev->dev, "Can't get %s property 'reg'\n",
> dev->node->full_name);
> - goto err;
> + goto err_no_reg;
> }
>
> new_fsl_chan->feature = *(u32 *)match->data;
> @@ -958,7 +956,7 @@ static int __devinit of_fsl_dma_chan_probe(struct
> of_device *dev,
> dev_err(&dev->dev, "There is no %d channel!\n",
> new_fsl_chan->id);
> err = -EINVAL;
> - goto err;
> + goto err_no_chan;
> }
> fdev->chan[new_fsl_chan->id] = new_fsl_chan;
> tasklet_init(&new_fsl_chan->tasklet, dma_do_tasklet,
> @@ -997,23 +995,26 @@ static int __devinit of_fsl_dma_chan_probe(struct
> of_device *dev,
> if (err) {
> dev_err(&dev->dev, "DMA channel %s request_irq error "
> "with return %d\n", dev->node->full_name, err);
> - goto err;
> + goto err_no_irq;
> }
> }
>
> err = fsl_dma_self_test(new_fsl_chan);
> if (err)
> - goto err;
> + goto err_self_test;
>
> dev_info(&dev->dev, "#%d (%s), irq %d\n", new_fsl_chan->id,
> match->compatible, new_fsl_chan->irq);
>
> return 0;
> -err:
> - dma_halt(new_fsl_chan);
> - iounmap(new_fsl_chan->reg_base);
> +
> +err_self_test:
> free_irq(new_fsl_chan->irq, new_fsl_chan);
> +err_no_irq:
> list_del(&new_fsl_chan->common.device_node);
> +err_no_chan:
> + iounmap(new_fsl_chan->reg_base);
> +err_no_reg:
> kfree(new_fsl_chan);
> return err;
> }
> @@ -1054,8 +1055,7 @@ static int __devinit of_fsl_dma_probe(struct
> of_device *dev,
> fdev = kzalloc(sizeof(struct fsl_dma_device), GFP_KERNEL);
> if (!fdev) {
> dev_err(&dev->dev, "No enough memory for 'priv'\n");
> - err = -ENOMEM;
> - goto err;
> + return -ENOMEM;
> }
> fdev->dev = &dev->dev;
> INIT_LIST_HEAD(&fdev->common.channels);
> @@ -1065,7 +1065,7 @@ static int __devinit of_fsl_dma_probe(struct
> of_device *dev,
> if (err) {
> dev_err(&dev->dev, "Can't get %s property 'reg'\n",
> dev->node->full_name);
> - goto err;
> + goto err_no_reg;
> }
>
> dev_info(&dev->dev, "Probe the Freescale DMA driver for %s "
> @@ -1103,6 +1103,7 @@ static int __devinit of_fsl_dma_probe(struct
> of_device *dev,
>
> err:
> iounmap(fdev->reg_base);
> +err_no_reg:
> kfree(fdev);
> return err;
> }
> --
> 1.5.5.1.248.g4b17

____________________________________________________________
FREE 3D MARINE AQUARIUM SCREENSAVER - Watch dolphins, sharks & orcas on your desktop!
Check it out at http://www.inbox.com/marineaquarium
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/