|
@@ -462,8 +462,8 @@ static struct dma_async_tx_descriptor *fsl_dma_prep_memcpy(
|
|
{
|
|
{
|
|
struct fsl_dma_chan *fsl_chan;
|
|
struct fsl_dma_chan *fsl_chan;
|
|
struct fsl_desc_sw *first = NULL, *prev = NULL, *new;
|
|
struct fsl_desc_sw *first = NULL, *prev = NULL, *new;
|
|
|
|
+ struct list_head *list;
|
|
size_t copy;
|
|
size_t copy;
|
|
- LIST_HEAD(link_chain);
|
|
|
|
|
|
|
|
if (!chan)
|
|
if (!chan)
|
|
return NULL;
|
|
return NULL;
|
|
@@ -480,7 +480,7 @@ static struct dma_async_tx_descriptor *fsl_dma_prep_memcpy(
|
|
if (!new) {
|
|
if (!new) {
|
|
dev_err(fsl_chan->dev,
|
|
dev_err(fsl_chan->dev,
|
|
"No free memory for link descriptor\n");
|
|
"No free memory for link descriptor\n");
|
|
- return NULL;
|
|
|
|
|
|
+ goto fail;
|
|
}
|
|
}
|
|
#ifdef FSL_DMA_LD_DEBUG
|
|
#ifdef FSL_DMA_LD_DEBUG
|
|
dev_dbg(fsl_chan->dev, "new link desc alloc %p\n", new);
|
|
dev_dbg(fsl_chan->dev, "new link desc alloc %p\n", new);
|
|
@@ -515,7 +515,19 @@ static struct dma_async_tx_descriptor *fsl_dma_prep_memcpy(
|
|
/* Set End-of-link to the last link descriptor of new list*/
|
|
/* Set End-of-link to the last link descriptor of new list*/
|
|
set_ld_eol(fsl_chan, new);
|
|
set_ld_eol(fsl_chan, new);
|
|
|
|
|
|
- return first ? &first->async_tx : NULL;
|
|
|
|
|
|
+ return &first->async_tx;
|
|
|
|
+
|
|
|
|
+fail:
|
|
|
|
+ if (!first)
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ list = &first->async_tx.tx_list;
|
|
|
|
+ list_for_each_entry_safe_reverse(new, prev, list, node) {
|
|
|
|
+ list_del(&new->node);
|
|
|
|
+ dma_pool_free(fsl_chan->desc_pool, new, new->async_tx.phys);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|