mutex_lock(&efx->mac_lock);
        if (efx->port_enabled) {
                efx->type->push_multicast_hash(efx);
-               efx->mac_op->reconfigure(efx);
+               efx->type->reconfigure_mac(efx);
        }
        mutex_unlock(&efx->mac_lock);
 }
 
        /* Reconfigure the MAC before creating dma queues (required for
         * Falcon/A1 where RX_INGR_EN/TX_DRAIN_EN isn't supported) */
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
 
        /* Ensure the PHY advertises the correct flow control settings */
        rc = efx->phy_op->reconfigure(efx);
        /* efx_mac_work() might have been scheduled after efx_stop_port(),
         * and then cancelled by efx_flush_all() */
        efx->type->push_multicast_hash(efx);
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
 
        mutex_unlock(&efx->mac_lock);
 }
        /* Reconfigure the MAC before enabling the dma queues so that
         * the RX buffers don't overflow */
        net_dev->mtu = new_mtu;
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
        mutex_unlock(&efx->mac_lock);
 
        efx_init_channels(efx);
 
        /* Reconfigure the MAC */
        mutex_lock(&efx->mac_lock);
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
        mutex_unlock(&efx->mac_lock);
 
        return 0;
        net_dev->netdev_ops = &efx_netdev_ops;
        SET_ETHTOOL_OPS(net_dev, &efx_ethtool_ops);
 
-       /* Clear MAC statistics */
-       efx->mac_op->update_stats(efx);
-       memset(&efx->mac_stats, 0, sizeof(efx->mac_stats));
-
        rtnl_lock();
 
        rc = dev_alloc_name(net_dev, net_dev->name);
                                  "could not restore PHY settings\n");
        }
 
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
 
        efx_init_channels(efx);
        efx_restore_filters(efx);
        efx->net_dev = net_dev;
        spin_lock_init(&efx->stats_lock);
        mutex_init(&efx->mac_lock);
-       efx->mac_op = type->default_mac_ops;
        efx->phy_op = &efx_dummy_phy_operations;
        efx->mdio.dev = net_dev;
        INIT_WORK(&efx->mac_work, efx_mac_work);
 
                        /* Recover by resetting the EM block */
                        falcon_stop_nic_stats(efx);
                        falcon_drain_tx_fifo(efx);
-                       efx->mac_op->reconfigure(efx);
+                       falcon_reconfigure_xmac(efx);
                        falcon_start_nic_stats(efx);
                } else {
                        /* Schedule a reset to recover */
        /* Reconfigure the MAC. The PHY *may* generate a link state change event
         * if the user just changed the advertised capabilities, but there's no
         * harm doing this twice */
-       efx->mac_op->reconfigure(efx);
+       efx->type->reconfigure_mac(efx);
 
 out:
        mutex_unlock(&efx->mac_lock);
 
 #include "net_driver.h"
 #include "bitfield.h"
 #include "efx.h"
-#include "mac.h"
 #include "spi.h"
 #include "nic.h"
 #include "regs.h"
        nic_data->stats_pending = false;
        if (*nic_data->stats_dma_done == FALCON_STATS_DONE) {
                rmb(); /* read the done flag before the stats */
-               efx->mac_op->update_stats(efx);
+               falcon_update_stats_xmac(efx);
        } else {
                netif_err(efx, hw, efx->net_dev,
                          "timed out waiting for statistics\n");
        falcon_reset_macs(efx);
 
        efx->phy_op->reconfigure(efx);
-       rc = efx->mac_op->reconfigure(efx);
+       rc = falcon_reconfigure_xmac(efx);
        BUG_ON(rc);
 
        falcon_start_nic_stats(efx);
                falcon_deconfigure_mac_wrapper(efx);
 
                falcon_reset_macs(efx);
-               rc = efx->mac_op->reconfigure(efx);
+               rc = falcon_reconfigure_xmac(efx);
                BUG_ON(rc);
 
                falcon_start_nic_stats(efx);
            *nic_data->stats_dma_done == FALCON_STATS_DONE) {
                nic_data->stats_pending = false;
                rmb(); /* read the done flag before the stats */
-               efx->mac_op->update_stats(efx);
+               falcon_update_stats_xmac(efx);
        }
 }
 
        .push_irq_moderation = falcon_push_irq_moderation,
        .push_multicast_hash = falcon_push_multicast_hash,
        .reconfigure_port = falcon_reconfigure_port,
+       .reconfigure_mac = falcon_reconfigure_xmac,
+       .check_mac_fault = falcon_xmac_check_fault,
        .get_wol = falcon_get_wol,
        .set_wol = falcon_set_wol,
        .resume_wol = efx_port_dummy_op_void,
        .test_nvram = falcon_test_nvram,
-       .default_mac_ops = &falcon_xmac_operations,
 
        .revision = EFX_REV_FALCON_A1,
        .mem_map_size = 0x20000,
        .push_irq_moderation = falcon_push_irq_moderation,
        .push_multicast_hash = falcon_push_multicast_hash,
        .reconfigure_port = falcon_reconfigure_port,
+       .reconfigure_mac = falcon_reconfigure_xmac,
+       .check_mac_fault = falcon_xmac_check_fault,
        .get_wol = falcon_get_wol,
        .set_wol = falcon_set_wol,
        .resume_wol = efx_port_dummy_op_void,
        .test_registers = falcon_b0_test_registers,
        .test_nvram = falcon_test_nvram,
-       .default_mac_ops = &falcon_xmac_operations,
 
        .revision = EFX_REV_FALCON_B0,
        /* Map everything up to and including the RSS indirection
 
 #include "nic.h"
 #include "regs.h"
 #include "io.h"
-#include "mac.h"
 #include "mdio_10g.h"
 #include "workarounds.h"
 
        return mac_up;
 }
 
-static bool falcon_xmac_check_fault(struct efx_nic *efx)
+bool falcon_xmac_check_fault(struct efx_nic *efx)
 {
        return !falcon_xmac_link_ok_retry(efx, 5);
 }
 
-static int falcon_reconfigure_xmac(struct efx_nic *efx)
+int falcon_reconfigure_xmac(struct efx_nic *efx)
 {
        struct falcon_nic_data *nic_data = efx->nic_data;
 
        return 0;
 }
 
-static void falcon_update_stats_xmac(struct efx_nic *efx)
+void falcon_update_stats_xmac(struct efx_nic *efx)
 {
        struct efx_mac_stats *mac_stats = &efx->mac_stats;
 
        nic_data->xmac_poll_required = !falcon_xmac_link_ok_retry(efx, 1);
        falcon_ack_status_intr(efx);
 }
-
-const struct efx_mac_operations falcon_xmac_operations = {
-       .reconfigure    = falcon_reconfigure_xmac,
-       .update_stats   = falcon_update_stats_xmac,
-       .check_fault    = falcon_xmac_check_fault,
-};
 
+++ /dev/null
-/****************************************************************************
- * Driver for Solarflare Solarstorm network controllers and boards
- * Copyright 2005-2006 Fen Systems Ltd.
- * Copyright 2006-2009 Solarflare Communications Inc.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation, incorporated herein by reference.
- */
-
-#ifndef EFX_MAC_H
-#define EFX_MAC_H
-
-#include "net_driver.h"
-
-extern const struct efx_mac_operations falcon_xmac_operations;
-extern const struct efx_mac_operations efx_mcdi_mac_operations;
-extern int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr,
-                             u32 dma_len, int enable, int clear);
-
-#endif
 
 extern int efx_mcdi_wol_filter_get_magic(struct efx_nic *efx, int *id_out);
 extern int efx_mcdi_wol_filter_remove(struct efx_nic *efx, int id);
 extern int efx_mcdi_wol_filter_reset(struct efx_nic *efx);
+extern int efx_mcdi_mac_stats(struct efx_nic *efx, dma_addr_t dma_addr,
+                             u32 dma_len, int enable, int clear);
+extern int efx_mcdi_mac_reconfigure(struct efx_nic *efx);
+extern bool efx_mcdi_mac_check_fault(struct efx_nic *efx);
 
 #endif /* EFX_MCDI_H */
 
 
 #include "net_driver.h"
 #include "efx.h"
-#include "mac.h"
 #include "mcdi.h"
 #include "mcdi_pcol.h"
 
        return rc;
 }
 
-static int efx_mcdi_mac_reconfigure(struct efx_nic *efx)
+int efx_mcdi_mac_reconfigure(struct efx_nic *efx)
 {
        int rc;
 
 }
 
 
-static bool efx_mcdi_mac_check_fault(struct efx_nic *efx)
+bool efx_mcdi_mac_check_fault(struct efx_nic *efx)
 {
        u32 faults;
        int rc = efx_mcdi_get_mac_faults(efx, &faults);
        return (rc != 0) || (faults != 0);
 }
-
-
-const struct efx_mac_operations efx_mcdi_mac_operations = {
-       .reconfigure    = efx_mcdi_mac_reconfigure,
-       .update_stats   = efx_port_dummy_op_void,
-       .check_fault    = efx_mcdi_mac_check_fault,
-};
 
                left->fc == right->fc && left->speed == right->speed;
 }
 
-/**
- * struct efx_mac_operations - Efx MAC operations table
- * @reconfigure: Reconfigure MAC. Serialised by the mac_lock
- * @update_stats: Update statistics
- * @check_fault: Check fault state. True if fault present.
- */
-struct efx_mac_operations {
-       int (*reconfigure) (struct efx_nic *efx);
-       void (*update_stats) (struct efx_nic *efx);
-       bool (*check_fault)(struct efx_nic *efx);
-};
-
 /**
  * struct efx_phy_operations - Efx PHY operations table
  * @probe: Probe PHY and initialise efx->mdio.mode_support, efx->mdio.mmds,
  * @port_initialized: Port initialized?
  * @net_dev: Operating system network device. Consider holding the rtnl lock
  * @stats_buffer: DMA buffer for statistics
- * @mac_op: MAC interface
  * @phy_type: PHY type
  * @phy_op: PHY interface
  * @phy_data: PHY private data (including PHY-specific stats)
 
        struct efx_buffer stats_buffer;
 
-       const struct efx_mac_operations *mac_op;
-
        unsigned int phy_type;
        const struct efx_phy_operations *phy_op;
        void *phy_data;
  * @push_irq_moderation: Apply interrupt moderation value
  * @push_multicast_hash: Apply multicast hash table
  * @reconfigure_port: Push loopback/power/txdis changes to the MAC and PHY
+ * @reconfigure_mac: Reconfigure MAC only. Serialised by the mac_lock
+ * @check_mac_fault: Check MAC fault state. True if fault present.
  * @get_wol: Get WoL configuration from driver state
  * @set_wol: Push WoL configuration to the NIC
  * @resume_wol: Synchronise WoL state between driver and MC (e.g. after resume)
  * @test_registers: Test read/write functionality of control registers
  * @test_nvram: Test validity of NVRAM contents
- * @default_mac_ops: efx_mac_operations to set at startup
  * @revision: Hardware architecture revision
  * @mem_map_size: Memory BAR mapped size
  * @txd_ptr_tbl_base: TX descriptor ring base address
        void (*push_irq_moderation)(struct efx_channel *channel);
        void (*push_multicast_hash)(struct efx_nic *efx);
        int (*reconfigure_port)(struct efx_nic *efx);
+       int (*reconfigure_mac)(struct efx_nic *efx);
+       bool (*check_mac_fault)(struct efx_nic *efx);
        void (*get_wol)(struct efx_nic *efx, struct ethtool_wolinfo *wol);
        int (*set_wol)(struct efx_nic *efx, u32 type);
        void (*resume_wol)(struct efx_nic *efx);
        int (*test_registers)(struct efx_nic *efx);
        int (*test_nvram)(struct efx_nic *efx);
-       const struct efx_mac_operations *default_mac_ops;
 
        int revision;
        unsigned int mem_map_size;
 
 /* MAC/PHY */
 extern void falcon_drain_tx_fifo(struct efx_nic *efx);
 extern void falcon_reconfigure_mac_wrapper(struct efx_nic *efx);
+extern bool falcon_xmac_check_fault(struct efx_nic *efx);
+extern int falcon_reconfigure_xmac(struct efx_nic *efx);
+extern void falcon_update_stats_xmac(struct efx_nic *efx);
 
 /* Interrupts and test events */
 extern int efx_nic_init_interrupt(struct efx_nic *efx);
 
                mutex_lock(&efx->mac_lock);
                link_up = link_state->up;
                if (link_up)
-                       link_up = !efx->mac_op->check_fault(efx);
+                       link_up = !efx->type->check_mac_fault(efx);
                mutex_unlock(&efx->mac_lock);
 
                if (link_up) {
 
 #include "bitfield.h"
 #include "efx.h"
 #include "nic.h"
-#include "mac.h"
 #include "spi.h"
 #include "regs.h"
 #include "io.h"
        .set_id_led = efx_mcdi_set_id_led,
        .push_irq_moderation = siena_push_irq_moderation,
        .push_multicast_hash = siena_push_multicast_hash,
+       .reconfigure_mac = efx_mcdi_mac_reconfigure,
+       .check_mac_fault = efx_mcdi_mac_check_fault,
        .reconfigure_port = efx_mcdi_phy_reconfigure,
        .get_wol = siena_get_wol,
        .set_wol = siena_set_wol,
        .resume_wol = siena_init_wol,
        .test_registers = siena_test_registers,
        .test_nvram = efx_mcdi_nvram_test_all,
-       .default_mac_ops = &efx_mcdi_mac_operations,
 
        .revision = EFX_REV_SIENA_A0,
        .mem_map_size = (FR_CZ_MC_TREG_SMEM +