sfc: Use netif_set_real_num_{rx,tx}_queues()
[pandora-kernel.git] / drivers / net / sfc / nic.c
index f595d92..394dd92 100644 (file)
@@ -104,7 +104,7 @@ static inline void efx_write_buf_tbl(struct efx_nic *efx, efx_qword_t *value,
 static inline efx_qword_t *efx_event(struct efx_channel *channel,
                                     unsigned int index)
 {
-       return (((efx_qword_t *) (channel->eventq.addr)) + index);
+       return ((efx_qword_t *) (channel->eventq.addr)) + index;
 }
 
 /* See if an event is present
@@ -119,8 +119,8 @@ static inline efx_qword_t *efx_event(struct efx_channel *channel,
  */
 static inline int efx_event_present(efx_qword_t *event)
 {
-       return (!(EFX_DWORD_IS_ALL_ONES(event->dword[0]) |
-                 EFX_DWORD_IS_ALL_ONES(event->dword[1])));
+       return !(EFX_DWORD_IS_ALL_ONES(event->dword[0]) |
+                 EFX_DWORD_IS_ALL_ONES(event->dword[1]));
 }
 
 static bool efx_masked_compare_oword(const efx_oword_t *a, const efx_oword_t *b,
@@ -263,8 +263,8 @@ static int efx_alloc_special_buffer(struct efx_nic *efx,
 {
        len = ALIGN(len, EFX_BUF_SIZE);
 
-       buffer->addr = pci_alloc_consistent(efx->pci_dev, len,
-                                           &buffer->dma_addr);
+       buffer->addr = dma_alloc_coherent(&efx->pci_dev->dev, len,
+                                         &buffer->dma_addr, GFP_KERNEL);
        if (!buffer->addr)
                return -ENOMEM;
        buffer->len = len;
@@ -301,8 +301,8 @@ efx_free_special_buffer(struct efx_nic *efx, struct efx_special_buffer *buffer)
                  (u64)buffer->dma_addr, buffer->len,
                  buffer->addr, (u64)virt_to_phys(buffer->addr));
 
-       pci_free_consistent(efx->pci_dev, buffer->len, buffer->addr,
-                           buffer->dma_addr);
+       dma_free_coherent(&efx->pci_dev->dev, buffer->len, buffer->addr,
+                         buffer->dma_addr);
        buffer->addr = NULL;
        buffer->entries = 0;
 }
@@ -347,7 +347,7 @@ void efx_nic_free_buffer(struct efx_nic *efx, struct efx_buffer *buffer)
 static inline efx_qword_t *
 efx_tx_desc(struct efx_tx_queue *tx_queue, unsigned int index)
 {
-       return (((efx_qword_t *) (tx_queue->txd.addr)) + index);
+       return ((efx_qword_t *) (tx_queue->txd.addr)) + index;
 }
 
 /* This writes to the TX_DESC_WPTR; write pointer for TX descriptor ring */
@@ -356,7 +356,7 @@ static inline void efx_notify_tx_desc(struct efx_tx_queue *tx_queue)
        unsigned write_ptr;
        efx_dword_t reg;
 
-       write_ptr = tx_queue->write_count & EFX_TXQ_MASK;
+       write_ptr = tx_queue->write_count & tx_queue->ptr_mask;
        EFX_POPULATE_DWORD_1(reg, FRF_AZ_TX_DESC_WPTR_DWORD, write_ptr);
        efx_writed_page(tx_queue->efx, &reg,
                        FR_AZ_TX_DESC_UPD_DWORD_P0, tx_queue->queue);
@@ -377,7 +377,7 @@ void efx_nic_push_buffers(struct efx_tx_queue *tx_queue)
        BUG_ON(tx_queue->write_count == tx_queue->insert_count);
 
        do {
-               write_ptr = tx_queue->write_count & EFX_TXQ_MASK;
+               write_ptr = tx_queue->write_count & tx_queue->ptr_mask;
                buffer = &tx_queue->buffer[write_ptr];
                txd = efx_tx_desc(tx_queue, write_ptr);
                ++tx_queue->write_count;
@@ -398,10 +398,11 @@ void efx_nic_push_buffers(struct efx_tx_queue *tx_queue)
 int efx_nic_probe_tx(struct efx_tx_queue *tx_queue)
 {
        struct efx_nic *efx = tx_queue->efx;
-       BUILD_BUG_ON(EFX_TXQ_SIZE < 512 || EFX_TXQ_SIZE > 4096 ||
-                    EFX_TXQ_SIZE & EFX_TXQ_MASK);
+       unsigned entries;
+
+       entries = tx_queue->ptr_mask + 1;
        return efx_alloc_special_buffer(efx, &tx_queue->txd,
-                                       EFX_TXQ_SIZE * sizeof(efx_qword_t));
+                                       entries * sizeof(efx_qword_t));
 }
 
 void efx_nic_init_tx(struct efx_tx_queue *tx_queue)
@@ -501,7 +502,7 @@ void efx_nic_remove_tx(struct efx_tx_queue *tx_queue)
 static inline efx_qword_t *
 efx_rx_desc(struct efx_rx_queue *rx_queue, unsigned int index)
 {
-       return (((efx_qword_t *) (rx_queue->rxd.addr)) + index);
+       return ((efx_qword_t *) (rx_queue->rxd.addr)) + index;
 }
 
 /* This creates an entry in the RX descriptor queue */
@@ -526,30 +527,32 @@ efx_build_rx_desc(struct efx_rx_queue *rx_queue, unsigned index)
  */
 void efx_nic_notify_rx_desc(struct efx_rx_queue *rx_queue)
 {
+       struct efx_nic *efx = rx_queue->efx;
        efx_dword_t reg;
        unsigned write_ptr;
 
        while (rx_queue->notified_count != rx_queue->added_count) {
-               efx_build_rx_desc(rx_queue,
-                                 rx_queue->notified_count &
-                                 EFX_RXQ_MASK);
+               efx_build_rx_desc(
+                       rx_queue,
+                       rx_queue->notified_count & rx_queue->ptr_mask);
                ++rx_queue->notified_count;
        }
 
        wmb();
-       write_ptr = rx_queue->added_count & EFX_RXQ_MASK;
+       write_ptr = rx_queue->added_count & rx_queue->ptr_mask;
        EFX_POPULATE_DWORD_1(reg, FRF_AZ_RX_DESC_WPTR_DWORD, write_ptr);
-       efx_writed_page(rx_queue->efx, &reg,
-                       FR_AZ_RX_DESC_UPD_DWORD_P0, rx_queue->queue);
+       efx_writed_page(efx, &reg, FR_AZ_RX_DESC_UPD_DWORD_P0,
+                       efx_rx_queue_index(rx_queue));
 }
 
 int efx_nic_probe_rx(struct efx_rx_queue *rx_queue)
 {
        struct efx_nic *efx = rx_queue->efx;
-       BUILD_BUG_ON(EFX_RXQ_SIZE < 512 || EFX_RXQ_SIZE > 4096 ||
-                    EFX_RXQ_SIZE & EFX_RXQ_MASK);
+       unsigned entries;
+
+       entries = rx_queue->ptr_mask + 1;
        return efx_alloc_special_buffer(efx, &rx_queue->rxd,
-                                       EFX_RXQ_SIZE * sizeof(efx_qword_t));
+                                       entries * sizeof(efx_qword_t));
 }
 
 void efx_nic_init_rx(struct efx_rx_queue *rx_queue)
@@ -561,7 +564,7 @@ void efx_nic_init_rx(struct efx_rx_queue *rx_queue)
 
        netif_dbg(efx, hw, efx->net_dev,
                  "RX queue %d ring in special buffers %d-%d\n",
-                 rx_queue->queue, rx_queue->rxd.index,
+                 efx_rx_queue_index(rx_queue), rx_queue->rxd.index,
                  rx_queue->rxd.index + rx_queue->rxd.entries - 1);
 
        rx_queue->flushed = FLUSH_NONE;
@@ -575,9 +578,10 @@ void efx_nic_init_rx(struct efx_rx_queue *rx_queue)
                              FRF_AZ_RX_ISCSI_HDIG_EN, iscsi_digest_en,
                              FRF_AZ_RX_DESCQ_BUF_BASE_ID, rx_queue->rxd.index,
                              FRF_AZ_RX_DESCQ_EVQ_ID,
-                             rx_queue->channel->channel,
+                             efx_rx_queue_channel(rx_queue)->channel,
                              FRF_AZ_RX_DESCQ_OWNER_ID, 0,
-                             FRF_AZ_RX_DESCQ_LABEL, rx_queue->queue,
+                             FRF_AZ_RX_DESCQ_LABEL,
+                             efx_rx_queue_index(rx_queue),
                              FRF_AZ_RX_DESCQ_SIZE,
                              __ffs(rx_queue->rxd.entries),
                              FRF_AZ_RX_DESCQ_TYPE, 0 /* kernel queue */ ,
@@ -585,7 +589,7 @@ void efx_nic_init_rx(struct efx_rx_queue *rx_queue)
                              FRF_AZ_RX_DESCQ_JUMBO, !is_b0,
                              FRF_AZ_RX_DESCQ_EN, 1);
        efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base,
-                        rx_queue->queue);
+                        efx_rx_queue_index(rx_queue));
 }
 
 static void efx_flush_rx_queue(struct efx_rx_queue *rx_queue)
@@ -598,7 +602,8 @@ static void efx_flush_rx_queue(struct efx_rx_queue *rx_queue)
        /* Post a flush command */
        EFX_POPULATE_OWORD_2(rx_flush_descq,
                             FRF_AZ_RX_FLUSH_DESCQ_CMD, 1,
-                            FRF_AZ_RX_FLUSH_DESCQ, rx_queue->queue);
+                            FRF_AZ_RX_FLUSH_DESCQ,
+                            efx_rx_queue_index(rx_queue));
        efx_writeo(efx, &rx_flush_descq, FR_AZ_RX_FLUSH_DESCQ);
 }
 
@@ -613,7 +618,7 @@ void efx_nic_fini_rx(struct efx_rx_queue *rx_queue)
        /* Remove RX descriptor ring from card */
        EFX_ZERO_OWORD(rx_desc_ptr);
        efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base,
-                        rx_queue->queue);
+                        efx_rx_queue_index(rx_queue));
 
        /* Unpin RX descriptor ring */
        efx_fini_special_buffer(efx, &rx_queue->rxd);
@@ -680,15 +685,17 @@ efx_handle_tx_event(struct efx_channel *channel, efx_qword_t *event)
                /* Transmit completion */
                tx_ev_desc_ptr = EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_DESC_PTR);
                tx_ev_q_label = EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_Q_LABEL);
-               tx_queue = &efx->tx_queue[tx_ev_q_label];
+               tx_queue = efx_channel_get_tx_queue(
+                       channel, tx_ev_q_label % EFX_TXQ_TYPES);
                tx_packets = ((tx_ev_desc_ptr - tx_queue->read_count) &
-                             EFX_TXQ_MASK);
+                             tx_queue->ptr_mask);
                channel->irq_mod_score += tx_packets;
                efx_xmit_done(tx_queue, tx_ev_desc_ptr);
        } else if (EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_WQ_FF_FULL)) {
                /* Rewrite the FIFO write pointer */
                tx_ev_q_label = EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_Q_LABEL);
-               tx_queue = &efx->tx_queue[tx_ev_q_label];
+               tx_queue = efx_channel_get_tx_queue(
+                       channel, tx_ev_q_label % EFX_TXQ_TYPES);
 
                if (efx_dev_registered(efx))
                        netif_tx_lock(efx->net_dev);
@@ -714,6 +721,7 @@ static void efx_handle_rx_not_ok(struct efx_rx_queue *rx_queue,
                                 bool *rx_ev_pkt_ok,
                                 bool *discard)
 {
+       struct efx_channel *channel = efx_rx_queue_channel(rx_queue);
        struct efx_nic *efx = rx_queue->efx;
        bool rx_ev_buf_owner_id_err, rx_ev_ip_hdr_chksum_err;
        bool rx_ev_tcp_udp_chksum_err, rx_ev_eth_crc_err;
@@ -746,14 +754,14 @@ static void efx_handle_rx_not_ok(struct efx_rx_queue *rx_queue,
        /* Count errors that are not in MAC stats.  Ignore expected
         * checksum errors during self-test. */
        if (rx_ev_frm_trunc)
-               ++rx_queue->channel->n_rx_frm_trunc;
+               ++channel->n_rx_frm_trunc;
        else if (rx_ev_tobe_disc)
-               ++rx_queue->channel->n_rx_tobe_disc;
+               ++channel->n_rx_tobe_disc;
        else if (!efx->loopback_selftest) {
                if (rx_ev_ip_hdr_chksum_err)
-                       ++rx_queue->channel->n_rx_ip_hdr_chksum_err;
+                       ++channel->n_rx_ip_hdr_chksum_err;
                else if (rx_ev_tcp_udp_chksum_err)
-                       ++rx_queue->channel->n_rx_tcp_udp_chksum_err;
+                       ++channel->n_rx_tcp_udp_chksum_err;
        }
 
        /* The frame must be discarded if any of these are true. */
@@ -769,7 +777,7 @@ static void efx_handle_rx_not_ok(struct efx_rx_queue *rx_queue,
                netif_dbg(efx, rx_err, efx->net_dev,
                          " RX queue %d unexpected RX event "
                          EFX_QWORD_FMT "%s%s%s%s%s%s%s%s\n",
-                         rx_queue->queue, EFX_QWORD_VAL(*event),
+                         efx_rx_queue_index(rx_queue), EFX_QWORD_VAL(*event),
                          rx_ev_buf_owner_id_err ? " [OWNER_ID_ERR]" : "",
                          rx_ev_ip_hdr_chksum_err ?
                          " [IP_HDR_CHKSUM_ERR]" : "",
@@ -791,8 +799,8 @@ efx_handle_rx_bad_index(struct efx_rx_queue *rx_queue, unsigned index)
        struct efx_nic *efx = rx_queue->efx;
        unsigned expected, dropped;
 
-       expected = rx_queue->removed_count & EFX_RXQ_MASK;
-       dropped = (index - expected) & EFX_RXQ_MASK;
+       expected = rx_queue->removed_count & rx_queue->ptr_mask;
+       dropped = (index - expected) & rx_queue->ptr_mask;
        netif_info(efx, rx_err, efx->net_dev,
                   "dropped %d events (index=%d expected=%d)\n",
                   dropped, index, expected);
@@ -827,10 +835,10 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)
        WARN_ON(EFX_QWORD_FIELD(*event, FSF_AZ_RX_EV_Q_LABEL) !=
                channel->channel);
 
-       rx_queue = &efx->rx_queue[channel->channel];
+       rx_queue = efx_channel_get_rx_queue(channel);
 
        rx_ev_desc_ptr = EFX_QWORD_FIELD(*event, FSF_AZ_RX_EV_DESC_PTR);
-       expected_ptr = rx_queue->removed_count & EFX_RXQ_MASK;
+       expected_ptr = rx_queue->removed_count & rx_queue->ptr_mask;
        if (unlikely(rx_ev_desc_ptr != expected_ptr))
                efx_handle_rx_bad_index(rx_queue, rx_ev_desc_ptr);
 
@@ -879,7 +887,7 @@ efx_handle_generated_event(struct efx_channel *channel, efx_qword_t *event)
                /* The queue must be empty, so we won't receive any rx
                 * events, so efx_process_channel() won't refill the
                 * queue. Refill it here */
-               efx_fast_push_rx_descriptors(&efx->rx_queue[channel->channel]);
+               efx_fast_push_rx_descriptors(efx_channel_get_rx_queue(channel));
        else
                netif_dbg(efx, hw, efx->net_dev, "channel %d received "
                          "generated event "EFX_QWORD_FMT"\n",
@@ -997,6 +1005,7 @@ efx_handle_driver_event(struct efx_channel *channel, efx_qword_t *event)
 
 int efx_nic_process_eventq(struct efx_channel *channel, int budget)
 {
+       struct efx_nic *efx = channel->efx;
        unsigned int read_ptr;
        efx_qword_t event, *p_event;
        int ev_code;
@@ -1021,7 +1030,7 @@ int efx_nic_process_eventq(struct efx_channel *channel, int budget)
                EFX_SET_QWORD(*p_event);
 
                /* Increment read pointer */
-               read_ptr = (read_ptr + 1) & EFX_EVQ_MASK;
+               read_ptr = (read_ptr + 1) & channel->eventq_mask;
 
                ev_code = EFX_QWORD_FIELD(event, FSF_AZ_EV_CODE);
 
@@ -1033,7 +1042,7 @@ int efx_nic_process_eventq(struct efx_channel *channel, int budget)
                        break;
                case FSE_AZ_EV_CODE_TX_EV:
                        tx_packets += efx_handle_tx_event(channel, &event);
-                       if (tx_packets >= EFX_TXQ_SIZE) {
+                       if (tx_packets > efx->txq_entries) {
                                spent = budget;
                                goto out;
                        }
@@ -1068,10 +1077,11 @@ out:
 int efx_nic_probe_eventq(struct efx_channel *channel)
 {
        struct efx_nic *efx = channel->efx;
-       BUILD_BUG_ON(EFX_EVQ_SIZE < 512 || EFX_EVQ_SIZE > 32768 ||
-                    EFX_EVQ_SIZE & EFX_EVQ_MASK);
+       unsigned entries;
+
+       entries = channel->eventq_mask + 1;
        return efx_alloc_special_buffer(efx, &channel->eventq,
-                                       EFX_EVQ_SIZE * sizeof(efx_qword_t));
+                                       entries * sizeof(efx_qword_t));
 }
 
 void efx_nic_init_eventq(struct efx_channel *channel)
@@ -1163,11 +1173,11 @@ void efx_nic_generate_fill_event(struct efx_channel *channel)
 
 static void efx_poll_flush_events(struct efx_nic *efx)
 {
-       struct efx_channel *channel = &efx->channel[0];
+       struct efx_channel *channel = efx_get_channel(efx, 0);
        struct efx_tx_queue *tx_queue;
        struct efx_rx_queue *rx_queue;
        unsigned int read_ptr = channel->eventq_read_ptr;
-       unsigned int end_ptr = (read_ptr - 1) & EFX_EVQ_MASK;
+       unsigned int end_ptr = (read_ptr - 1) & channel->eventq_mask;
 
        do {
                efx_qword_t *event = efx_event(channel, read_ptr);
@@ -1185,7 +1195,9 @@ static void efx_poll_flush_events(struct efx_nic *efx)
                        ev_queue = EFX_QWORD_FIELD(*event,
                                                   FSF_AZ_DRIVER_EV_SUBDATA);
                        if (ev_queue < EFX_TXQ_TYPES * efx->n_tx_channels) {
-                               tx_queue = efx->tx_queue + ev_queue;
+                               tx_queue = efx_get_tx_queue(
+                                       efx, ev_queue / EFX_TXQ_TYPES,
+                                       ev_queue % EFX_TXQ_TYPES);
                                tx_queue->flushed = FLUSH_DONE;
                        }
                } else if (ev_code == FSE_AZ_EV_CODE_DRIVER_EV &&
@@ -1195,7 +1207,7 @@ static void efx_poll_flush_events(struct efx_nic *efx)
                        ev_failed = EFX_QWORD_FIELD(
                                *event, FSF_AZ_DRIVER_EV_RX_FLUSH_FAIL);
                        if (ev_queue < efx->n_rx_channels) {
-                               rx_queue = efx->rx_queue + ev_queue;
+                               rx_queue = efx_get_rx_queue(efx, ev_queue);
                                rx_queue->flushed =
                                        ev_failed ? FLUSH_FAILED : FLUSH_DONE;
                        }
@@ -1205,7 +1217,7 @@ static void efx_poll_flush_events(struct efx_nic *efx)
                 * it's ok to throw away every non-flush event */
                EFX_SET_QWORD(*event);
 
-               read_ptr = (read_ptr + 1) & EFX_EVQ_MASK;
+               read_ptr = (read_ptr + 1) & channel->eventq_mask;
        } while (read_ptr != end_ptr);
 
        channel->eventq_read_ptr = read_ptr;
@@ -1216,6 +1228,7 @@ static void efx_poll_flush_events(struct efx_nic *efx)
  * serialise them */
 int efx_nic_flush_queues(struct efx_nic *efx)
 {
+       struct efx_channel *channel;
        struct efx_rx_queue *rx_queue;
        struct efx_tx_queue *tx_queue;
        int i, tx_pending, rx_pending;
@@ -1224,29 +1237,35 @@ int efx_nic_flush_queues(struct efx_nic *efx)
        efx->type->prepare_flush(efx);
 
        /* Flush all tx queues in parallel */
-       efx_for_each_tx_queue(tx_queue, efx)
-               efx_flush_tx_queue(tx_queue);
+       efx_for_each_channel(channel, efx) {
+               efx_for_each_channel_tx_queue(tx_queue, channel)
+                       efx_flush_tx_queue(tx_queue);
+       }
 
        /* The hardware supports four concurrent rx flushes, each of which may
         * need to be retried if there is an outstanding descriptor fetch */
        for (i = 0; i < EFX_FLUSH_POLL_COUNT; ++i) {
                rx_pending = tx_pending = 0;
-               efx_for_each_rx_queue(rx_queue, efx) {
-                       if (rx_queue->flushed == FLUSH_PENDING)
-                               ++rx_pending;
-               }
-               efx_for_each_rx_queue(rx_queue, efx) {
-                       if (rx_pending == EFX_RX_FLUSH_COUNT)
-                               break;
-                       if (rx_queue->flushed == FLUSH_FAILED ||
-                           rx_queue->flushed == FLUSH_NONE) {
-                               efx_flush_rx_queue(rx_queue);
-                               ++rx_pending;
+               efx_for_each_channel(channel, efx) {
+                       efx_for_each_channel_rx_queue(rx_queue, channel) {
+                               if (rx_queue->flushed == FLUSH_PENDING)
+                                       ++rx_pending;
                        }
                }
-               efx_for_each_tx_queue(tx_queue, efx) {
-                       if (tx_queue->flushed != FLUSH_DONE)
-                               ++tx_pending;
+               efx_for_each_channel(channel, efx) {
+                       efx_for_each_channel_rx_queue(rx_queue, channel) {
+                               if (rx_pending == EFX_RX_FLUSH_COUNT)
+                                       break;
+                               if (rx_queue->flushed == FLUSH_FAILED ||
+                                   rx_queue->flushed == FLUSH_NONE) {
+                                       efx_flush_rx_queue(rx_queue);
+                                       ++rx_pending;
+                               }
+                       }
+                       efx_for_each_channel_tx_queue(tx_queue, channel) {
+                               if (tx_queue->flushed != FLUSH_DONE)
+                                       ++tx_pending;
+                       }
                }
 
                if (rx_pending == 0 && tx_pending == 0)
@@ -1258,19 +1277,21 @@ int efx_nic_flush_queues(struct efx_nic *efx)
 
        /* Mark the queues as all flushed. We're going to return failure
         * leading to a reset, or fake up success anyway */
-       efx_for_each_tx_queue(tx_queue, efx) {
-               if (tx_queue->flushed != FLUSH_DONE)
-                       netif_err(efx, hw, efx->net_dev,
-                                 "tx queue %d flush command timed out\n",
-                                 tx_queue->queue);
-               tx_queue->flushed = FLUSH_DONE;
-       }
-       efx_for_each_rx_queue(rx_queue, efx) {
-               if (rx_queue->flushed != FLUSH_DONE)
-                       netif_err(efx, hw, efx->net_dev,
-                                 "rx queue %d flush command timed out\n",
-                                 rx_queue->queue);
-               rx_queue->flushed = FLUSH_DONE;
+       efx_for_each_channel(channel, efx) {
+               efx_for_each_channel_tx_queue(tx_queue, channel) {
+                       if (tx_queue->flushed != FLUSH_DONE)
+                               netif_err(efx, hw, efx->net_dev,
+                                         "tx queue %d flush command timed out\n",
+                                         tx_queue->queue);
+                       tx_queue->flushed = FLUSH_DONE;
+               }
+               efx_for_each_channel_rx_queue(rx_queue, channel) {
+                       if (rx_queue->flushed != FLUSH_DONE)
+                               netif_err(efx, hw, efx->net_dev,
+                                         "rx queue %d flush command timed out\n",
+                                         efx_rx_queue_index(rx_queue));
+                       rx_queue->flushed = FLUSH_DONE;
+               }
        }
 
        return -ETIMEDOUT;
@@ -1457,7 +1478,7 @@ static irqreturn_t efx_legacy_interrupt(int irq, void *dev_id)
  */
 static irqreturn_t efx_msi_interrupt(int irq, void *dev_id)
 {
-       struct efx_channel *channel = dev_id;
+       struct efx_channel *channel = *(struct efx_channel **)dev_id;
        struct efx_nic *efx = channel->efx;
        efx_oword_t *int_ker = efx->irq_status.addr;
        int syserr;
@@ -1532,7 +1553,8 @@ int efx_nic_init_interrupt(struct efx_nic *efx)
        efx_for_each_channel(channel, efx) {
                rc = request_irq(channel->irq, efx_msi_interrupt,
                                 IRQF_PROBE_SHARED, /* Not shared */
-                                channel->name, channel);
+                                efx->channel_name[channel->channel],
+                                &efx->channel[channel->channel]);
                if (rc) {
                        netif_err(efx, drv, efx->net_dev,
                                  "failed to hook IRQ %d\n", channel->irq);
@@ -1544,7 +1566,7 @@ int efx_nic_init_interrupt(struct efx_nic *efx)
 
  fail2:
        efx_for_each_channel(channel, efx)
-               free_irq(channel->irq, channel);
+               free_irq(channel->irq, &efx->channel[channel->channel]);
  fail1:
        return rc;
 }
@@ -1557,7 +1579,7 @@ void efx_nic_fini_interrupt(struct efx_nic *efx)
        /* Disable MSI/MSI-X interrupts */
        efx_for_each_channel(channel, efx) {
                if (channel->irq)
-                       free_irq(channel->irq, channel);
+                       free_irq(channel->irq, &efx->channel[channel->channel]);
        }
 
        /* ACK legacy interrupt */
@@ -1827,8 +1849,7 @@ static const struct efx_nic_reg_table efx_nic_reg_tables[] = {
        REGISTER_TABLE_BB_CZ(TX_DESC_PTR_TBL),
        REGISTER_TABLE_AA(EVQ_PTR_TBL_KER),
        REGISTER_TABLE_BB_CZ(EVQ_PTR_TBL),
-       /* The register buffer is allocated with slab, so we can't
-        * reasonably read all of the buffer table (up to 8MB!).
+       /* We can't reasonably read all of the buffer table (up to 8MB!).
         * However this driver will only use a few entries.  Reading
         * 1K entries allows for some expansion of queue count and
         * size before we need to change the version. */
@@ -1836,7 +1857,6 @@ static const struct efx_nic_reg_table efx_nic_reg_tables[] = {
                                  A, A, 8, 1024),
        REGISTER_TABLE_DIMENSIONS(BUF_FULL_TBL, FR_BZ_BUF_FULL_TBL,
                                  B, Z, 8, 1024),
-       /* RX_FILTER_TBL{0,1} is huge and not used by this driver */
        REGISTER_TABLE_CZ(RX_MAC_FILTER_TBL0),
        REGISTER_TABLE_BB_CZ(TIMER_TBL),
        REGISTER_TABLE_BB_CZ(TX_PACE_TBL),
@@ -1846,6 +1866,7 @@ static const struct efx_nic_reg_table efx_nic_reg_tables[] = {
        REGISTER_TABLE_CZ(MC_TREG_SMEM),
        /* MSIX_PBA_TABLE is not mapped */
        /* SRM_DBG is not mapped (and is redundant with BUF_FLL_TBL) */
+       REGISTER_TABLE_BZ(RX_FILTER_TBL0),
 };
 
 size_t efx_nic_get_regs_len(struct efx_nic *efx)