Commit 5731d7b3 authored by Robert Stonehouse's avatar Robert Stonehouse Committed by Ben Hutchings

sfc: Refactor efx_mcdi_poll() by introducing efx_mcdi_poll_once()

Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent 2ec03014
...@@ -50,6 +50,7 @@ struct efx_mcdi_async_param { ...@@ -50,6 +50,7 @@ struct efx_mcdi_async_param {
static void efx_mcdi_timeout_async(unsigned long context); static void efx_mcdi_timeout_async(unsigned long context);
static int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating, static int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating,
bool *was_attached_out); bool *was_attached_out);
static bool efx_mcdi_poll_once(struct efx_nic *efx);
static inline struct efx_mcdi_iface *efx_mcdi(struct efx_nic *efx) static inline struct efx_mcdi_iface *efx_mcdi(struct efx_nic *efx)
{ {
...@@ -237,6 +238,21 @@ static void efx_mcdi_read_response_header(struct efx_nic *efx) ...@@ -237,6 +238,21 @@ static void efx_mcdi_read_response_header(struct efx_nic *efx)
} }
} }
static bool efx_mcdi_poll_once(struct efx_nic *efx)
{
struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
rmb();
if (!efx->type->mcdi_poll_response(efx))
return false;
spin_lock_bh(&mcdi->iface_lock);
efx_mcdi_read_response_header(efx);
spin_unlock_bh(&mcdi->iface_lock);
return true;
}
static int efx_mcdi_poll(struct efx_nic *efx) static int efx_mcdi_poll(struct efx_nic *efx)
{ {
struct efx_mcdi_iface *mcdi = efx_mcdi(efx); struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
...@@ -272,18 +288,13 @@ static int efx_mcdi_poll(struct efx_nic *efx) ...@@ -272,18 +288,13 @@ static int efx_mcdi_poll(struct efx_nic *efx)
time = jiffies; time = jiffies;
rmb(); if (efx_mcdi_poll_once(efx))
if (efx->type->mcdi_poll_response(efx))
break; break;
if (time_after(time, finish)) if (time_after(time, finish))
return -ETIMEDOUT; return -ETIMEDOUT;
} }
spin_lock_bh(&mcdi->iface_lock);
efx_mcdi_read_response_header(efx);
spin_unlock_bh(&mcdi->iface_lock);
/* Return rc=0 like wait_event_timeout() */ /* Return rc=0 like wait_event_timeout() */
return 0; return 0;
} }
......
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