dmaengine_pause函数源代码
时间: 2023-06-25 21:08:26 浏览: 51
以下是 dmaengine_pause 函数的伪代码:
```c
int dmaengine_pause(struct dma_chan *chan)
{
int err;
if (!chan || !chan->device || !chan->device->device_pause)
return -EINVAL;
err = chan->device->device_pause(chan);
if (err)
return err;
dma_chan_pause(chan);
return 0;
}
```
该函数是 DMA 引擎中的一个通用函数,用于暂停 DMA 通道的传输。其参数 `chan` 是一个指向 DMA 通道结构体的指针。
首先,函数会检查传入的参数是否有效。如果 `chan` 或者 `device` 或者 `device_pause` 为空指针,则返回 `-EINVAL`,表示参数无效。
然后,函数会调用设备驱动程序的 `device_pause` 函数,该函数用于暂停设备正在进行的 DMA 传输。如果该函数返回非零值,则表示操作失败,函数会返回该错误码。
最后,函数调用 `dma_chan_pause` 函数,将 DMA 通道状态设置为暂停状态,并返回 0,表示操作成功。
相关问题
dmaengine_terminate_sync函数源代码
dmaengine_terminate_sync函数是Linux内核中DMA引擎驱动中的一个函数,用于停止DMA传输并等待所有传输完成。以下是该函数的源代码:
```
void dmaengine_terminate_sync(struct dma_chan *chan)
{
struct dma_tx_state state;
bool pending;
dmaengine_pause(chan);
do {
dmaengine_tx_status(chan, NULL, &state);
pending = state.residue || state.completed < state.cookie;
if (pending)
usleep_range(1000, 2000);
} while (pending);
dma_async_issue_pending(chan);
}
```
该函数首先调用dmaengine_pause函数暂停DMA传输,然后循环查询DMA传输状态,直到所有传输完成。在每次检查状态时,如果仍有未完成的传输,则等待一段时间后再进行下一次检查。最后,该函数使用dma_async_issue_pending函数重新启动DMA传输。
dma_chan_pause的源代码
下面是dma_chan_pause函数的源代码,该函数的作用是暂停DMA传输通道:
```c
/**
* dma_chan_pause - pause the DMA channel
* @chan: dma channel to be paused
*
* This function pauses a DMA channel. If the channel is already paused,
* this function has no effect.
*/
void dma_chan_pause(struct dma_chan *chan)
{
unsigned long flags;
spin_lock_irqsave(&chan->lock, flags);
if (chan->paused) {
spin_unlock_irqrestore(&chan->lock, flags);
return;
}
if (chan->device->device_prep_dma_pause) {
chan->device->device_prep_dma_pause(chan);
chan->paused = true;
}
spin_unlock_irqrestore(&chan->lock, flags);
}
```
该函数首先使用自旋锁来保护DMA通道,然后检查通道是否已经暂停,如果已经暂停,则直接返回。如果没有暂停,则调用设备特定的device_prep_dma_pause函数并将通道标记为已暂停。最后,释放锁并返回。