mirror of https://gitee.com/openkylin/linux.git
sfc: move event queue management code
Signed-off-by: Alexandru-Mihai Maftei <amaftei@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
37c45a4e33
commit
5f99925632
|
@ -128,98 +128,6 @@ static int efx_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **xdpfs,
|
||||||
ASSERT_RTNL(); \
|
ASSERT_RTNL(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
*
|
|
||||||
* Event queue processing
|
|
||||||
*
|
|
||||||
*************************************************************************/
|
|
||||||
|
|
||||||
/* Create event queue
|
|
||||||
* Event queue memory allocations are done only once. If the channel
|
|
||||||
* is reset, the memory buffer will be reused; this guards against
|
|
||||||
* errors during channel reset and also simplifies interrupt handling.
|
|
||||||
*/
|
|
||||||
int efx_probe_eventq(struct efx_channel *channel)
|
|
||||||
{
|
|
||||||
struct efx_nic *efx = channel->efx;
|
|
||||||
unsigned long entries;
|
|
||||||
|
|
||||||
netif_dbg(efx, probe, efx->net_dev,
|
|
||||||
"chan %d create event queue\n", channel->channel);
|
|
||||||
|
|
||||||
/* Build an event queue with room for one event per tx and rx buffer,
|
|
||||||
* plus some extra for link state events and MCDI completions. */
|
|
||||||
entries = roundup_pow_of_two(efx->rxq_entries + efx->txq_entries + 128);
|
|
||||||
EFX_WARN_ON_PARANOID(entries > EFX_MAX_EVQ_SIZE);
|
|
||||||
channel->eventq_mask = max(entries, EFX_MIN_EVQ_SIZE) - 1;
|
|
||||||
|
|
||||||
return efx_nic_probe_eventq(channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prepare channel's event queue */
|
|
||||||
int efx_init_eventq(struct efx_channel *channel)
|
|
||||||
{
|
|
||||||
struct efx_nic *efx = channel->efx;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
EFX_WARN_ON_PARANOID(channel->eventq_init);
|
|
||||||
|
|
||||||
netif_dbg(efx, drv, efx->net_dev,
|
|
||||||
"chan %d init event queue\n", channel->channel);
|
|
||||||
|
|
||||||
rc = efx_nic_init_eventq(channel);
|
|
||||||
if (rc == 0) {
|
|
||||||
efx->type->push_irq_moderation(channel);
|
|
||||||
channel->eventq_read_ptr = 0;
|
|
||||||
channel->eventq_init = true;
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enable event queue processing and NAPI */
|
|
||||||
void efx_start_eventq(struct efx_channel *channel)
|
|
||||||
{
|
|
||||||
netif_dbg(channel->efx, ifup, channel->efx->net_dev,
|
|
||||||
"chan %d start event queue\n", channel->channel);
|
|
||||||
|
|
||||||
/* Make sure the NAPI handler sees the enabled flag set */
|
|
||||||
channel->enabled = true;
|
|
||||||
smp_wmb();
|
|
||||||
|
|
||||||
napi_enable(&channel->napi_str);
|
|
||||||
efx_nic_eventq_read_ack(channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable event queue processing and NAPI */
|
|
||||||
void efx_stop_eventq(struct efx_channel *channel)
|
|
||||||
{
|
|
||||||
if (!channel->enabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
napi_disable(&channel->napi_str);
|
|
||||||
channel->enabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void efx_fini_eventq(struct efx_channel *channel)
|
|
||||||
{
|
|
||||||
if (!channel->eventq_init)
|
|
||||||
return;
|
|
||||||
|
|
||||||
netif_dbg(channel->efx, drv, channel->efx->net_dev,
|
|
||||||
"chan %d fini event queue\n", channel->channel);
|
|
||||||
|
|
||||||
efx_nic_fini_eventq(channel);
|
|
||||||
channel->eventq_init = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void efx_remove_eventq(struct efx_channel *channel)
|
|
||||||
{
|
|
||||||
netif_dbg(channel->efx, drv, channel->efx->net_dev,
|
|
||||||
"chan %d remove event queue\n", channel->channel);
|
|
||||||
|
|
||||||
efx_nic_remove_eventq(channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
*
|
*
|
||||||
* Channel handling
|
* Channel handling
|
||||||
|
|
|
@ -388,6 +388,97 @@ void efx_remove_interrupts(struct efx_nic *efx)
|
||||||
efx->legacy_irq = 0;
|
efx->legacy_irq = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************
|
||||||
|
* EVENT QUEUES
|
||||||
|
***************/
|
||||||
|
|
||||||
|
/* Create event queue
|
||||||
|
* Event queue memory allocations are done only once. If the channel
|
||||||
|
* is reset, the memory buffer will be reused; this guards against
|
||||||
|
* errors during channel reset and also simplifies interrupt handling.
|
||||||
|
*/
|
||||||
|
int efx_probe_eventq(struct efx_channel *channel)
|
||||||
|
{
|
||||||
|
struct efx_nic *efx = channel->efx;
|
||||||
|
unsigned long entries;
|
||||||
|
|
||||||
|
netif_dbg(efx, probe, efx->net_dev,
|
||||||
|
"chan %d create event queue\n", channel->channel);
|
||||||
|
|
||||||
|
/* Build an event queue with room for one event per tx and rx buffer,
|
||||||
|
* plus some extra for link state events and MCDI completions.
|
||||||
|
*/
|
||||||
|
entries = roundup_pow_of_two(efx->rxq_entries + efx->txq_entries + 128);
|
||||||
|
EFX_WARN_ON_PARANOID(entries > EFX_MAX_EVQ_SIZE);
|
||||||
|
channel->eventq_mask = max(entries, EFX_MIN_EVQ_SIZE) - 1;
|
||||||
|
|
||||||
|
return efx_nic_probe_eventq(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prepare channel's event queue */
|
||||||
|
int efx_init_eventq(struct efx_channel *channel)
|
||||||
|
{
|
||||||
|
struct efx_nic *efx = channel->efx;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
EFX_WARN_ON_PARANOID(channel->eventq_init);
|
||||||
|
|
||||||
|
netif_dbg(efx, drv, efx->net_dev,
|
||||||
|
"chan %d init event queue\n", channel->channel);
|
||||||
|
|
||||||
|
rc = efx_nic_init_eventq(channel);
|
||||||
|
if (rc == 0) {
|
||||||
|
efx->type->push_irq_moderation(channel);
|
||||||
|
channel->eventq_read_ptr = 0;
|
||||||
|
channel->eventq_init = true;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable event queue processing and NAPI */
|
||||||
|
void efx_start_eventq(struct efx_channel *channel)
|
||||||
|
{
|
||||||
|
netif_dbg(channel->efx, ifup, channel->efx->net_dev,
|
||||||
|
"chan %d start event queue\n", channel->channel);
|
||||||
|
|
||||||
|
/* Make sure the NAPI handler sees the enabled flag set */
|
||||||
|
channel->enabled = true;
|
||||||
|
smp_wmb();
|
||||||
|
|
||||||
|
napi_enable(&channel->napi_str);
|
||||||
|
efx_nic_eventq_read_ack(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable event queue processing and NAPI */
|
||||||
|
void efx_stop_eventq(struct efx_channel *channel)
|
||||||
|
{
|
||||||
|
if (!channel->enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
napi_disable(&channel->napi_str);
|
||||||
|
channel->enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void efx_fini_eventq(struct efx_channel *channel)
|
||||||
|
{
|
||||||
|
if (!channel->eventq_init)
|
||||||
|
return;
|
||||||
|
|
||||||
|
netif_dbg(channel->efx, drv, channel->efx->net_dev,
|
||||||
|
"chan %d fini event queue\n", channel->channel);
|
||||||
|
|
||||||
|
efx_nic_fini_eventq(channel);
|
||||||
|
channel->eventq_init = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void efx_remove_eventq(struct efx_channel *channel)
|
||||||
|
{
|
||||||
|
netif_dbg(channel->efx, drv, channel->efx->net_dev,
|
||||||
|
"chan %d remove event queue\n", channel->channel);
|
||||||
|
|
||||||
|
efx_nic_remove_eventq(channel);
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
*
|
*
|
||||||
* Channel handling
|
* Channel handling
|
||||||
|
|
Loading…
Reference in New Issue