Commit 73e902b5 authored by Antoine Kaufmann's avatar Antoine Kaufmann
Browse files

i40e: fix descriptor queue hangs (hopefully)

parent be75ba68
...@@ -177,6 +177,7 @@ class queue_base { ...@@ -177,6 +177,7 @@ class queue_base {
void trigger_fetch(); void trigger_fetch();
void trigger_process(); void trigger_process();
void trigger_writeback(); void trigger_writeback();
void trigger();
// returns how many descriptors the queue can fetch max during the next // returns how many descriptors the queue can fetch max during the next
// fetch: default UINT32_MAX, but can be overriden by child classes // fetch: default UINT32_MAX, but can be overriden by child classes
......
...@@ -524,5 +524,6 @@ void lan_queue_tx::dma_hwb::done() ...@@ -524,5 +524,6 @@ void lan_queue_tx::dma_hwb::done()
queue.log << " tx head written back" << logger::endl; queue.log << " tx head written back" << logger::endl;
#endif #endif
queue.writeback_done(pos, cnt); queue.writeback_done(pos, cnt);
queue.trigger();
delete this; delete this;
} }
...@@ -138,6 +138,13 @@ void queue_base::trigger_writeback() ...@@ -138,6 +138,13 @@ void queue_base::trigger_writeback()
do_writeback(active_first_idx, active_first_pos, cnt); do_writeback(active_first_idx, active_first_pos, cnt);
} }
void queue_base::trigger()
{
trigger_fetch();
trigger_process();
trigger_writeback();
}
void queue_base::reset() void queue_base::reset()
{ {
#ifdef DEBUG_QUEUES #ifdef DEBUG_QUEUES
...@@ -159,7 +166,7 @@ void queue_base::reg_updated() ...@@ -159,7 +166,7 @@ void queue_base::reg_updated()
if (!enabled) if (!enabled)
return; return;
trigger_fetch(); trigger();
} }
bool queue_base::is_enabled() bool queue_base::is_enabled()
...@@ -243,9 +250,6 @@ void queue_base::writeback_done(uint32_t first_pos, uint32_t cnt) ...@@ -243,9 +250,6 @@ void queue_base::writeback_done(uint32_t first_pos, uint32_t cnt)
reg_head = active_first_idx; reg_head = active_first_idx;
interrupt(); interrupt();
trigger_fetch();
trigger_writeback();
} }
queue_base::desc_ctx::desc_ctx(queue_base &queue_) queue_base::desc_ctx::desc_ctx(queue_base &queue_)
...@@ -274,7 +278,6 @@ void queue_base::desc_ctx::prepared() ...@@ -274,7 +278,6 @@ void queue_base::desc_ctx::prepared()
#endif #endif
assert(state == DESC_PREPARING); assert(state == DESC_PREPARING);
state = DESC_PREPARED; state = DESC_PREPARED;
queue.trigger_process();
} }
void queue_base::desc_ctx::processed() void queue_base::desc_ctx::processed()
...@@ -284,7 +287,6 @@ void queue_base::desc_ctx::processed() ...@@ -284,7 +287,6 @@ void queue_base::desc_ctx::processed()
#endif #endif
assert(state == DESC_PROCESSING); assert(state == DESC_PROCESSING);
state = DESC_PROCESSED; state = DESC_PROCESSED;
queue.trigger_writeback();
} }
void queue_base::desc_ctx::data_fetch(uint64_t addr, size_t data_len) void queue_base::desc_ctx::data_fetch(uint64_t addr, size_t data_len)
...@@ -367,6 +369,7 @@ void queue_base::dma_fetch::done() ...@@ -367,6 +369,7 @@ void queue_base::dma_fetch::done()
ctx.state = desc_ctx::DESC_PREPARING; ctx.state = desc_ctx::DESC_PREPARING;
ctx.prepare(); ctx.prepare();
} }
queue.trigger();
delete this; delete this;
} }
...@@ -385,6 +388,7 @@ queue_base::dma_data_fetch::~dma_data_fetch() ...@@ -385,6 +388,7 @@ queue_base::dma_data_fetch::~dma_data_fetch()
void queue_base::dma_data_fetch::done() void queue_base::dma_data_fetch::done()
{ {
ctx.data_fetched(dma_addr, len); ctx.data_fetched(dma_addr, len);
ctx.queue.trigger();
delete this; delete this;
} }
...@@ -403,6 +407,7 @@ queue_base::dma_wb::~dma_wb() ...@@ -403,6 +407,7 @@ queue_base::dma_wb::~dma_wb()
void queue_base::dma_wb::done() void queue_base::dma_wb::done()
{ {
queue.writeback_done(pos, len / queue.desc_len); queue.writeback_done(pos, len / queue.desc_len);
queue.trigger();
delete this; delete this;
} }
...@@ -422,5 +427,6 @@ queue_base::dma_data_wb::~dma_data_wb() ...@@ -422,5 +427,6 @@ queue_base::dma_data_wb::~dma_data_wb()
void queue_base::dma_data_wb::done() void queue_base::dma_data_wb::done()
{ {
ctx.data_written(dma_addr, len); ctx.data_written(dma_addr, len);
ctx.queue.trigger();
delete this; delete this;
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment