Recent modifications to admin command queue polling logic did not support 32-bit applications. Updated the driver to work for 32 or 64 bit applications as well as avoiding roll-over possibility.
Fixes: 3adcba9a89 ("net/ena: update HAL to the newer version") Signed-off-by: David Harton <dhar...@cisco.com> --- drivers/net/ena/base/ena_com.c | 10 +++++++--- drivers/net/ena/base/ena_plat_dpdk.h | 6 +----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/net/ena/base/ena_com.c b/drivers/net/ena/base/ena_com.c index b688067f7..b96adde3c 100644 --- a/drivers/net/ena/base/ena_com.c +++ b/drivers/net/ena/base/ena_com.c @@ -547,10 +547,13 @@ static int ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx *comp_c struct ena_com_admin_queue *admin_queue) { unsigned long flags = 0; - unsigned long timeout; + u32 timeout_ms; int ret; - timeout = ENA_GET_SYSTEM_TIMEOUT(admin_queue->completion_timeout); + /* Calculate ms granularity timeout from us completion_timeout + * making sure we retry once if we have at least 1ms + */ + timeout_ms = (admin_queue->completion_timeout / 1000) + (ENA_POLL_MS - 1); while (1) { ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags); @@ -560,7 +563,7 @@ static int ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx *comp_c if (comp_ctx->status != ENA_CMD_SUBMITTED) break; - if (ENA_TIME_EXPIRE(timeout)) { + if (timeout_ms < ENA_POLL_MS) { ena_trc_err("Wait for completion (polling) timeout\n"); /* ENA didn't have any completion */ ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags); @@ -573,6 +576,7 @@ static int ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx *comp_c } ENA_MSLEEP(ENA_POLL_MS); + timeout_ms -= ENA_POLL_MS; } if (unlikely(comp_ctx->status == ENA_CMD_ABORTED)) { diff --git a/drivers/net/ena/base/ena_plat_dpdk.h b/drivers/net/ena/base/ena_plat_dpdk.h index 902d91efb..0cb837e4f 100644 --- a/drivers/net/ena/base/ena_plat_dpdk.h +++ b/drivers/net/ena/base/ena_plat_dpdk.h @@ -178,7 +178,7 @@ do { \ do { \ struct timespec wait; \ struct timeval now; \ - unsigned long timeout_us; \ + uint64_t timeout_us; \ gettimeofday(&now, NULL); \ wait.tv_sec = now.tv_sec + timeout / 1000000UL; \ timeout_us = timeout % 1000000UL; \ @@ -196,10 +196,6 @@ do { \ #define ena_wait_event_t ena_wait_queue_t #define ENA_MIGHT_SLEEP() -#define ENA_TIME_EXPIRE(timeout) (timeout < rte_get_timer_cycles()) -#define ENA_GET_SYSTEM_TIMEOUT(timeout_us) \ - (timeout_us * rte_get_timer_hz() / 1000000 + rte_get_timer_cycles()) - /* * Each rte_memzone should have unique name. * To satisfy it, count number of allocations and add it to name. -- 2.19.1