diff options
author | 2011-07-29 16:21:57 +0530 | |
---|---|---|
committer | 2011-08-08 19:32:01 +0530 | |
commit | 9704efaa52ab18eb3504c4e0bc421c1d01b7981a (patch) | |
tree | a6bc4e37cef1bd805e45a40804dd11ef9493a4c3 /drivers/dma/dmatest.c | |
parent | dmaengine: add helper function for slave_single (diff) | |
download | linux-9704efaa52ab18eb3504c4e0bc421c1d01b7981a.tar.gz linux-9704efaa52ab18eb3504c4e0bc421c1d01b7981a.tar.bz2 linux-9704efaa52ab18eb3504c4e0bc421c1d01b7981a.zip |
dmaengine/dmatest: Terminate transfers on all channels in case of error or exit
In case, some error occurs while doing memcpy transfers, we must terminate all
transfers physically too. This is achieved by calling device_control() routine
with TERMINATE_ALL as parameter.
This is also required to be done in case module is removed while we are in
middle of some transfers.
Signed-off-by: Viresh Kumar <viresh.kumar@st.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma/dmatest.c')
-rw-r--r-- | drivers/dma/dmatest.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index 765f5ff22304..accc18441b16 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c @@ -477,6 +477,8 @@ err_srcs: pr_notice("%s: terminating after %u tests, %u failures (status %d)\n", thread_name, total_tests, failed_tests, ret); + /* terminate all transfers on specified channels */ + chan->device->device_control(chan, DMA_TERMINATE_ALL, 0); if (iterations > 0) while (!kthread_should_stop()) { DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wait_dmatest_exit); @@ -499,6 +501,10 @@ static void dmatest_cleanup_channel(struct dmatest_chan *dtc) list_del(&thread->node); kfree(thread); } + + /* terminate all transfers on specified channels */ + dtc->chan->device->device_control(dtc->chan, DMA_TERMINATE_ALL, 0); + kfree(dtc); } |