|
@@ -938,19 +938,28 @@ efx_get_tx_queue(struct efx_nic *efx, unsigned index, unsigned type)
|
|
|
return &efx->channel[efx->tx_channel_offset + index]->tx_queue[type];
|
|
|
}
|
|
|
|
|
|
+static inline bool efx_channel_has_tx_queues(struct efx_channel *channel)
|
|
|
+{
|
|
|
+ return channel->channel - channel->efx->tx_channel_offset <
|
|
|
+ channel->efx->n_tx_channels;
|
|
|
+}
|
|
|
+
|
|
|
static inline struct efx_tx_queue *
|
|
|
efx_channel_get_tx_queue(struct efx_channel *channel, unsigned type)
|
|
|
{
|
|
|
- struct efx_tx_queue *tx_queue = channel->tx_queue;
|
|
|
- EFX_BUG_ON_PARANOID(type >= EFX_TXQ_TYPES);
|
|
|
- return tx_queue->channel ? tx_queue + type : NULL;
|
|
|
+ EFX_BUG_ON_PARANOID(!efx_channel_has_tx_queues(channel) ||
|
|
|
+ type >= EFX_TXQ_TYPES);
|
|
|
+ return &channel->tx_queue[type];
|
|
|
}
|
|
|
|
|
|
/* Iterate over all TX queues belonging to a channel */
|
|
|
#define efx_for_each_channel_tx_queue(_tx_queue, _channel) \
|
|
|
- for (_tx_queue = efx_channel_get_tx_queue(channel, 0); \
|
|
|
- _tx_queue && _tx_queue < (_channel)->tx_queue + EFX_TXQ_TYPES; \
|
|
|
- _tx_queue++)
|
|
|
+ if (!efx_channel_has_tx_queues(_channel)) \
|
|
|
+ ; \
|
|
|
+ else \
|
|
|
+ for (_tx_queue = (_channel)->tx_queue; \
|
|
|
+ _tx_queue < (_channel)->tx_queue + EFX_TXQ_TYPES; \
|
|
|
+ _tx_queue++)
|
|
|
|
|
|
static inline struct efx_rx_queue *
|
|
|
efx_get_rx_queue(struct efx_nic *efx, unsigned index)
|
|
@@ -959,18 +968,26 @@ efx_get_rx_queue(struct efx_nic *efx, unsigned index)
|
|
|
return &efx->channel[index]->rx_queue;
|
|
|
}
|
|
|
|
|
|
+static inline bool efx_channel_has_rx_queue(struct efx_channel *channel)
|
|
|
+{
|
|
|
+ return channel->channel < channel->efx->n_rx_channels;
|
|
|
+}
|
|
|
+
|
|
|
static inline struct efx_rx_queue *
|
|
|
efx_channel_get_rx_queue(struct efx_channel *channel)
|
|
|
{
|
|
|
- return channel->channel < channel->efx->n_rx_channels ?
|
|
|
- &channel->rx_queue : NULL;
|
|
|
+ EFX_BUG_ON_PARANOID(!efx_channel_has_rx_queue(channel));
|
|
|
+ return &channel->rx_queue;
|
|
|
}
|
|
|
|
|
|
/* Iterate over all RX queues belonging to a channel */
|
|
|
#define efx_for_each_channel_rx_queue(_rx_queue, _channel) \
|
|
|
- for (_rx_queue = efx_channel_get_rx_queue(channel); \
|
|
|
- _rx_queue; \
|
|
|
- _rx_queue = NULL)
|
|
|
+ if (!efx_channel_has_rx_queue(_channel)) \
|
|
|
+ ; \
|
|
|
+ else \
|
|
|
+ for (_rx_queue = &(_channel)->rx_queue; \
|
|
|
+ _rx_queue; \
|
|
|
+ _rx_queue = NULL)
|
|
|
|
|
|
static inline struct efx_channel *
|
|
|
efx_rx_queue_channel(struct efx_rx_queue *rx_queue)
|