dmaengine: ti: k3-udma: Fix cleanup code for alloc_chan_resources
Some of the earlier errors should be sent to the error cleanup path to make sure that the uchan struct is reset, the dma_pool (if allocated) is released and memcpy channel pairs are released in a correct way. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Link: https://lore.kernel.org/r/20200527070612.636-2-peter.ujfalusi@ti.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
Родитель
9f2f3ce3da
Коммит
5a9377cc74
|
@ -1753,7 +1753,8 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|||
dev_err(ud->ddev.dev,
|
||||
"Descriptor pool allocation failed\n");
|
||||
uc->use_dma_pool = false;
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto err_cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1773,16 +1774,18 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|||
|
||||
ret = udma_get_chan_pair(uc);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_cleanup;
|
||||
|
||||
ret = udma_alloc_tx_resources(uc);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (ret) {
|
||||
udma_put_rchan(uc);
|
||||
goto err_cleanup;
|
||||
}
|
||||
|
||||
ret = udma_alloc_rx_resources(uc);
|
||||
if (ret) {
|
||||
udma_free_tx_resources(uc);
|
||||
return ret;
|
||||
goto err_cleanup;
|
||||
}
|
||||
|
||||
uc->config.src_thread = ud->psil_base + uc->tchan->id;
|
||||
|
@ -1800,10 +1803,8 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|||
uc->id);
|
||||
|
||||
ret = udma_alloc_tx_resources(uc);
|
||||
if (ret) {
|
||||
uc->config.remote_thread_id = -1;
|
||||
return ret;
|
||||
}
|
||||
if (ret)
|
||||
goto err_cleanup;
|
||||
|
||||
uc->config.src_thread = ud->psil_base + uc->tchan->id;
|
||||
uc->config.dst_thread = uc->config.remote_thread_id;
|
||||
|
@ -1820,10 +1821,8 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|||
uc->id);
|
||||
|
||||
ret = udma_alloc_rx_resources(uc);
|
||||
if (ret) {
|
||||
uc->config.remote_thread_id = -1;
|
||||
return ret;
|
||||
}
|
||||
if (ret)
|
||||
goto err_cleanup;
|
||||
|
||||
uc->config.src_thread = uc->config.remote_thread_id;
|
||||
uc->config.dst_thread = (ud->psil_base + uc->rchan->id) |
|
||||
|
@ -1838,7 +1837,9 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|||
/* Can not happen */
|
||||
dev_err(uc->ud->dev, "%s: chan%d invalid direction (%u)\n",
|
||||
__func__, uc->id, uc->config.dir);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto err_cleanup;
|
||||
|
||||
}
|
||||
|
||||
/* check if the channel configuration was successful */
|
||||
|
@ -1919,7 +1920,7 @@ err_psi_free:
|
|||
err_res_free:
|
||||
udma_free_tx_resources(uc);
|
||||
udma_free_rx_resources(uc);
|
||||
|
||||
err_cleanup:
|
||||
udma_reset_uchan(uc);
|
||||
|
||||
if (uc->use_dma_pool) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче