|
@@ -168,6 +168,11 @@ static inline int stream_idle(struct Stream *s)
|
|
return !!(s->regs[R_DMASR] & DMASR_IDLE);
|
|
return !!(s->regs[R_DMASR] & DMASR_IDLE);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline int stream_halted(struct Stream *s)
|
|
|
|
+{
|
|
|
|
+ return !!(s->regs[R_DMASR] & DMASR_HALTED);
|
|
|
|
+}
|
|
|
|
+
|
|
static void stream_reset(struct Stream *s)
|
|
static void stream_reset(struct Stream *s)
|
|
{
|
|
{
|
|
s->regs[R_DMASR] = DMASR_HALTED; /* starts up halted. */
|
|
s->regs[R_DMASR] = DMASR_HALTED; /* starts up halted. */
|
|
@@ -269,7 +274,7 @@ static void stream_process_mem2s(struct Stream *s, StreamSink *tx_data_dev,
|
|
uint64_t addr;
|
|
uint64_t addr;
|
|
bool eop;
|
|
bool eop;
|
|
|
|
|
|
- if (!stream_running(s) || stream_idle(s)) {
|
|
|
|
|
|
+ if (!stream_running(s) || stream_idle(s) || stream_halted(s)) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -326,7 +331,7 @@ static size_t stream_process_s2mem(struct Stream *s, unsigned char *buf,
|
|
unsigned int rxlen;
|
|
unsigned int rxlen;
|
|
size_t pos = 0;
|
|
size_t pos = 0;
|
|
|
|
|
|
- if (!stream_running(s) || stream_idle(s)) {
|
|
|
|
|
|
+ if (!stream_running(s) || stream_idle(s) || stream_halted(s)) {
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -407,7 +412,7 @@ xilinx_axidma_data_stream_can_push(StreamSink *obj,
|
|
XilinxAXIDMAStreamSink *ds = XILINX_AXI_DMA_DATA_STREAM(obj);
|
|
XilinxAXIDMAStreamSink *ds = XILINX_AXI_DMA_DATA_STREAM(obj);
|
|
struct Stream *s = &ds->dma->streams[1];
|
|
struct Stream *s = &ds->dma->streams[1];
|
|
|
|
|
|
- if (!stream_running(s) || stream_idle(s)) {
|
|
|
|
|
|
+ if (!stream_running(s) || stream_idle(s) || stream_halted(s)) {
|
|
ds->dma->notify = notify;
|
|
ds->dma->notify = notify;
|
|
ds->dma->notify_opaque = notify_opaque;
|
|
ds->dma->notify_opaque = notify_opaque;
|
|
return false;
|
|
return false;
|