|
@@ -491,131 +491,6 @@ struct efx_channel {
|
|
|
u32 sync_timestamp_minor;
|
|
|
};
|
|
|
|
|
|
-#ifdef CONFIG_NET_RX_BUSY_POLL
|
|
|
-enum efx_channel_busy_poll_state {
|
|
|
- EFX_CHANNEL_STATE_IDLE = 0,
|
|
|
- EFX_CHANNEL_STATE_NAPI = BIT(0),
|
|
|
- EFX_CHANNEL_STATE_NAPI_REQ_BIT = 1,
|
|
|
- EFX_CHANNEL_STATE_NAPI_REQ = BIT(1),
|
|
|
- EFX_CHANNEL_STATE_POLL_BIT = 2,
|
|
|
- EFX_CHANNEL_STATE_POLL = BIT(2),
|
|
|
- EFX_CHANNEL_STATE_DISABLE_BIT = 3,
|
|
|
-};
|
|
|
-
|
|
|
-static inline void efx_channel_busy_poll_init(struct efx_channel *channel)
|
|
|
-{
|
|
|
- WRITE_ONCE(channel->busy_poll_state, EFX_CHANNEL_STATE_IDLE);
|
|
|
-}
|
|
|
-
|
|
|
-/* Called from the device poll routine to get ownership of a channel. */
|
|
|
-static inline bool efx_channel_lock_napi(struct efx_channel *channel)
|
|
|
-{
|
|
|
- unsigned long prev, old = READ_ONCE(channel->busy_poll_state);
|
|
|
-
|
|
|
- while (1) {
|
|
|
- switch (old) {
|
|
|
- case EFX_CHANNEL_STATE_POLL:
|
|
|
- /* Ensure efx_channel_try_lock_poll() wont starve us */
|
|
|
- set_bit(EFX_CHANNEL_STATE_NAPI_REQ_BIT,
|
|
|
- &channel->busy_poll_state);
|
|
|
- /* fallthrough */
|
|
|
- case EFX_CHANNEL_STATE_POLL | EFX_CHANNEL_STATE_NAPI_REQ:
|
|
|
- return false;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- prev = cmpxchg(&channel->busy_poll_state, old,
|
|
|
- EFX_CHANNEL_STATE_NAPI);
|
|
|
- if (unlikely(prev != old)) {
|
|
|
- /* This is likely to mean we've just entered polling
|
|
|
- * state. Go back round to set the REQ bit.
|
|
|
- */
|
|
|
- old = prev;
|
|
|
- continue;
|
|
|
- }
|
|
|
- return true;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static inline void efx_channel_unlock_napi(struct efx_channel *channel)
|
|
|
-{
|
|
|
- /* Make sure write has completed from efx_channel_lock_napi() */
|
|
|
- smp_wmb();
|
|
|
- WRITE_ONCE(channel->busy_poll_state, EFX_CHANNEL_STATE_IDLE);
|
|
|
-}
|
|
|
-
|
|
|
-/* Called from efx_busy_poll(). */
|
|
|
-static inline bool efx_channel_try_lock_poll(struct efx_channel *channel)
|
|
|
-{
|
|
|
- return cmpxchg(&channel->busy_poll_state, EFX_CHANNEL_STATE_IDLE,
|
|
|
- EFX_CHANNEL_STATE_POLL) == EFX_CHANNEL_STATE_IDLE;
|
|
|
-}
|
|
|
-
|
|
|
-static inline void efx_channel_unlock_poll(struct efx_channel *channel)
|
|
|
-{
|
|
|
- clear_bit_unlock(EFX_CHANNEL_STATE_POLL_BIT, &channel->busy_poll_state);
|
|
|
-}
|
|
|
-
|
|
|
-static inline bool efx_channel_busy_polling(struct efx_channel *channel)
|
|
|
-{
|
|
|
- return test_bit(EFX_CHANNEL_STATE_POLL_BIT, &channel->busy_poll_state);
|
|
|
-}
|
|
|
-
|
|
|
-static inline void efx_channel_enable(struct efx_channel *channel)
|
|
|
-{
|
|
|
- clear_bit_unlock(EFX_CHANNEL_STATE_DISABLE_BIT,
|
|
|
- &channel->busy_poll_state);
|
|
|
-}
|
|
|
-
|
|
|
-/* Stop further polling or napi access.
|
|
|
- * Returns false if the channel is currently busy polling.
|
|
|
- */
|
|
|
-static inline bool efx_channel_disable(struct efx_channel *channel)
|
|
|
-{
|
|
|
- set_bit(EFX_CHANNEL_STATE_DISABLE_BIT, &channel->busy_poll_state);
|
|
|
- /* Implicit barrier in efx_channel_busy_polling() */
|
|
|
- return !efx_channel_busy_polling(channel);
|
|
|
-}
|
|
|
-
|
|
|
-#else /* CONFIG_NET_RX_BUSY_POLL */
|
|
|
-
|
|
|
-static inline void efx_channel_busy_poll_init(struct efx_channel *channel)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
-static inline bool efx_channel_lock_napi(struct efx_channel *channel)
|
|
|
-{
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-static inline void efx_channel_unlock_napi(struct efx_channel *channel)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
-static inline bool efx_channel_try_lock_poll(struct efx_channel *channel)
|
|
|
-{
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-static inline void efx_channel_unlock_poll(struct efx_channel *channel)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
-static inline bool efx_channel_busy_polling(struct efx_channel *channel)
|
|
|
-{
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-static inline void efx_channel_enable(struct efx_channel *channel)
|
|
|
-{
|
|
|
-}
|
|
|
-
|
|
|
-static inline bool efx_channel_disable(struct efx_channel *channel)
|
|
|
-{
|
|
|
- return true;
|
|
|
-}
|
|
|
-#endif /* CONFIG_NET_RX_BUSY_POLL */
|
|
|
-
|
|
|
/**
|
|
|
* struct efx_msi_context - Context for each MSI
|
|
|
* @efx: The associated NIC
|