static void efx_set_channels(struct efx_nic *efx)
 {
-       struct efx_channel *channel;
-       struct efx_tx_queue *tx_queue;
-
        efx->tx_channel_offset =
                separate_tx_channels ? efx->n_channels - efx->n_tx_channels : 0;
-
-       /* Channel pointers were set in efx_init_struct() but we now
-        * need to clear them for TX queues in any RX-only channels. */
-       efx_for_each_channel(channel, efx) {
-               if (channel->channel - efx->tx_channel_offset >=
-                   efx->n_tx_channels) {
-                       efx_for_each_channel_tx_queue(tx_queue, channel)
-                               tx_queue->channel = NULL;
-               }
-       }
 }
 
 static int efx_probe_nic(struct efx_nic *efx)
        efx->irq_rx_adaptive = rx_adaptive;
        efx->irq_rx_moderation = rx_ticks;
        efx_for_each_channel(channel, efx) {
-               if (efx_channel_get_rx_queue(channel))
+               if (efx_channel_has_rx_queue(channel))
                        channel->irq_moderation = rx_ticks;
-               else if (efx_channel_get_tx_queue(channel, 0))
+               else if (efx_channel_has_tx_queues(channel))
                        channel->irq_moderation = tx_ticks;
        }
 }
 
        /* Find lowest IRQ moderation across all used TX queues */
        coalesce->tx_coalesce_usecs_irq = ~((u32) 0);
        efx_for_each_channel(channel, efx) {
-               if (!efx_channel_get_tx_queue(channel, 0))
+               if (!efx_channel_has_tx_queues(channel))
                        continue;
                if (channel->irq_moderation < coalesce->tx_coalesce_usecs_irq) {
                        if (channel->channel < efx->n_rx_channels)
 
        /* If the channel is shared only allow RX parameters to be set */
        efx_for_each_channel(channel, efx) {
-               if (efx_channel_get_rx_queue(channel) &&
-                   efx_channel_get_tx_queue(channel, 0) &&
+               if (efx_channel_has_rx_queue(channel) &&
+                   efx_channel_has_tx_queues(channel) &&
                    tx_usecs) {
                        netif_err(efx, drv, efx->net_dev, "Channel is shared. "
                                  "Only RX coalescing may be set\n");
 
        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)
        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)