/*******************************************************************************
 
   Intel 10 Gigabit PCI Express Linux driver
-  Copyright(c) 1999 - 2013 Intel Corporation.
+  Copyright(c) 1999 - 2016 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
        board_X550EM_x,
 };
 
-extern struct ixgbe_info ixgbe_82598_info;
-extern struct ixgbe_info ixgbe_82599_info;
-extern struct ixgbe_info ixgbe_X540_info;
-extern struct ixgbe_info ixgbe_X550_info;
-extern struct ixgbe_info ixgbe_X550EM_x_info;
+extern const struct ixgbe_info ixgbe_82598_info;
+extern const struct ixgbe_info ixgbe_82599_info;
+extern const struct ixgbe_info ixgbe_X540_info;
+extern const struct ixgbe_info ixgbe_X550_info;
+extern const struct ixgbe_info ixgbe_X550EM_x_info;
 #ifdef CONFIG_IXGBE_DCB
 extern const struct dcbnl_rtnl_ops dcbnl_ops;
 #endif
 
 /*******************************************************************************
 
   Intel 10 Gigabit PCI Express Linux driver
-  Copyright(c) 1999 - 2015 Intel Corporation.
+  Copyright(c) 1999 - 2016 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
                IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), IXGBE_TXPBSIZE_40KB);
 }
 
-static struct ixgbe_mac_operations mac_ops_82598 = {
+static const struct ixgbe_mac_operations mac_ops_82598 = {
        .init_hw                = &ixgbe_init_hw_generic,
        .reset_hw               = &ixgbe_reset_hw_82598,
        .start_hw               = &ixgbe_start_hw_82598,
        .disable_rx             = &ixgbe_disable_rx_generic,
 };
 
-static struct ixgbe_eeprom_operations eeprom_ops_82598 = {
+static const struct ixgbe_eeprom_operations eeprom_ops_82598 = {
        .init_params            = &ixgbe_init_eeprom_params_generic,
        .read                   = &ixgbe_read_eerd_generic,
        .write                  = &ixgbe_write_eeprom_generic,
        .update_checksum        = &ixgbe_update_eeprom_checksum_generic,
 };
 
-static struct ixgbe_phy_operations phy_ops_82598 = {
+static const struct ixgbe_phy_operations phy_ops_82598 = {
        .identify               = &ixgbe_identify_phy_generic,
        .identify_sfp           = &ixgbe_identify_module_generic,
        .init                   = &ixgbe_init_phy_ops_82598,
        .check_overtemp         = &ixgbe_tn_check_overtemp,
 };
 
-struct ixgbe_info ixgbe_82598_info = {
+const struct ixgbe_info ixgbe_82598_info = {
        .mac                    = ixgbe_mac_82598EB,
        .get_invariants         = &ixgbe_get_invariants_82598,
        .mac_ops                = &mac_ops_82598,
 
 /*******************************************************************************
 
   Intel 10 Gigabit PCI Express Linux driver
-  Copyright(c) 1999 - 2015 Intel Corporation.
+  Copyright(c) 1999 - 2016 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
        return status;
 }
 
-static struct ixgbe_mac_operations mac_ops_82599 = {
+static const struct ixgbe_mac_operations mac_ops_82599 = {
        .init_hw                = &ixgbe_init_hw_generic,
        .reset_hw               = &ixgbe_reset_hw_82599,
        .start_hw               = &ixgbe_start_hw_82599,
        .disable_rx             = &ixgbe_disable_rx_generic,
 };
 
-static struct ixgbe_eeprom_operations eeprom_ops_82599 = {
+static const struct ixgbe_eeprom_operations eeprom_ops_82599 = {
        .init_params            = &ixgbe_init_eeprom_params_generic,
        .read                   = &ixgbe_read_eeprom_82599,
        .read_buffer            = &ixgbe_read_eeprom_buffer_82599,
        .update_checksum        = &ixgbe_update_eeprom_checksum_generic,
 };
 
-static struct ixgbe_phy_operations phy_ops_82599 = {
+static const struct ixgbe_phy_operations phy_ops_82599 = {
        .identify               = &ixgbe_identify_phy_82599,
        .identify_sfp           = &ixgbe_identify_module_generic,
        .init                   = &ixgbe_init_phy_ops_82599,
        .check_overtemp         = &ixgbe_tn_check_overtemp,
 };
 
-struct ixgbe_info ixgbe_82599_info = {
+const struct ixgbe_info ixgbe_82599_info = {
        .mac                    = ixgbe_mac_82599EB,
        .get_invariants         = &ixgbe_get_invariants_82599,
        .mac_ops                = &mac_ops_82599,
 
 /*******************************************************************************
 
   Intel 10 Gigabit PCI Express Linux driver
-  Copyright(c) 1999 - 2015 Intel Corporation.
+  Copyright(c) 1999 - 2016 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
        strlcpy(netdev->name, pci_name(pdev), sizeof(netdev->name));
 
        /* Setup hw api */
-       memcpy(&hw->mac.ops, ii->mac_ops, sizeof(hw->mac.ops));
+       hw->mac.ops   = *ii->mac_ops;
        hw->mac.type  = ii->mac;
        hw->mvals     = ii->mvals;
 
        /* EEPROM */
-       memcpy(&hw->eeprom.ops, ii->eeprom_ops, sizeof(hw->eeprom.ops));
+       hw->eeprom.ops = *ii->eeprom_ops;
        eec = IXGBE_READ_REG(hw, IXGBE_EEC(hw));
        if (ixgbe_removed(hw->hw_addr)) {
                err = -EIO;
                hw->eeprom.ops.read = &ixgbe_read_eeprom_bit_bang_generic;
 
        /* PHY */
-       memcpy(&hw->phy.ops, ii->phy_ops, sizeof(hw->phy.ops));
+       hw->phy.ops = *ii->phy_ops;
        hw->phy.sfp_type = ixgbe_sfp_type_unknown;
        /* ixgbe_identify_phy_generic will set prtad and mmds properly */
        hw->phy.mdio.prtad = MDIO_PRTAD_NONE;
                goto skip_sriov;
        /* Mailbox */
        ixgbe_init_mbx_params_pf(hw);
-       memcpy(&hw->mbx.ops, ii->mbx_ops, sizeof(hw->mbx.ops));
+       hw->mbx.ops = ii->mbx_ops;
        pci_sriov_set_totalvfs(pdev, IXGBE_MAX_VFS_DRV_LIMIT);
        ixgbe_enable_sriov(adapter);
 skip_sriov:
 
 /*******************************************************************************
 
   Intel 10 Gigabit PCI Express Linux driver
-  Copyright(c) 1999 - 2014 Intel Corporation.
+  Copyright(c) 1999 - 2016 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
        if (size > mbx->size)
                size = mbx->size;
 
-       if (!mbx->ops.read)
+       if (!mbx->ops)
                return IXGBE_ERR_MBX;
 
-       return mbx->ops.read(hw, msg, size, mbx_id);
+       return mbx->ops->read(hw, msg, size, mbx_id);
 }
 
 /**
        if (size > mbx->size)
                return IXGBE_ERR_MBX;
 
-       if (!mbx->ops.write)
+       if (!mbx->ops)
                return IXGBE_ERR_MBX;
 
-       return mbx->ops.write(hw, msg, size, mbx_id);
+       return mbx->ops->write(hw, msg, size, mbx_id);
 }
 
 /**
 {
        struct ixgbe_mbx_info *mbx = &hw->mbx;
 
-       if (!mbx->ops.check_for_msg)
+       if (!mbx->ops)
                return IXGBE_ERR_MBX;
 
-       return mbx->ops.check_for_msg(hw, mbx_id);
+       return mbx->ops->check_for_msg(hw, mbx_id);
 }
 
 /**
 {
        struct ixgbe_mbx_info *mbx = &hw->mbx;
 
-       if (!mbx->ops.check_for_ack)
+       if (!mbx->ops)
                return IXGBE_ERR_MBX;
 
-       return mbx->ops.check_for_ack(hw, mbx_id);
+       return mbx->ops->check_for_ack(hw, mbx_id);
 }
 
 /**
 {
        struct ixgbe_mbx_info *mbx = &hw->mbx;
 
-       if (!mbx->ops.check_for_rst)
+       if (!mbx->ops)
                return IXGBE_ERR_MBX;
 
-       return mbx->ops.check_for_rst(hw, mbx_id);
+       return mbx->ops->check_for_rst(hw, mbx_id);
 }
 
 /**
        struct ixgbe_mbx_info *mbx = &hw->mbx;
        int countdown = mbx->timeout;
 
-       if (!countdown || !mbx->ops.check_for_msg)
+       if (!countdown || !mbx->ops)
                return IXGBE_ERR_MBX;
 
-       while (mbx->ops.check_for_msg(hw, mbx_id)) {
+       while (mbx->ops->check_for_msg(hw, mbx_id)) {
                countdown--;
                if (!countdown)
                        return IXGBE_ERR_MBX;
        struct ixgbe_mbx_info *mbx = &hw->mbx;
        int countdown = mbx->timeout;
 
-       if (!countdown || !mbx->ops.check_for_ack)
+       if (!countdown || !mbx->ops)
                return IXGBE_ERR_MBX;
 
-       while (mbx->ops.check_for_ack(hw, mbx_id)) {
+       while (mbx->ops->check_for_ack(hw, mbx_id)) {
                countdown--;
                if (!countdown)
                        return IXGBE_ERR_MBX;
        struct ixgbe_mbx_info *mbx = &hw->mbx;
        s32 ret_val;
 
-       if (!mbx->ops.read)
+       if (!mbx->ops)
                return IXGBE_ERR_MBX;
 
        ret_val = ixgbe_poll_for_msg(hw, mbx_id);
                return ret_val;
 
        /* if ack received read message */
-       return mbx->ops.read(hw, msg, size, mbx_id);
+       return mbx->ops->read(hw, msg, size, mbx_id);
 }
 
 /**
        s32 ret_val;
 
        /* exit if either we can't write or there isn't a defined timeout */
-       if (!mbx->ops.write || !mbx->timeout)
+       if (!mbx->ops || !mbx->timeout)
                return IXGBE_ERR_MBX;
 
        /* send msg */
-       ret_val = mbx->ops.write(hw, msg, size, mbx_id);
+       ret_val = mbx->ops->write(hw, msg, size, mbx_id);
        if (ret_val)
                return ret_val;
 
 }
 #endif /* CONFIG_PCI_IOV */
 
-struct ixgbe_mbx_operations mbx_ops_generic = {
+const struct ixgbe_mbx_operations mbx_ops_generic = {
        .read                   = ixgbe_read_mbx_pf,
        .write                  = ixgbe_write_mbx_pf,
        .read_posted            = ixgbe_read_posted_mbx,
 
 /*******************************************************************************
 
   Intel 10 Gigabit PCI Express Linux driver
-  Copyright(c) 1999 - 2013 Intel Corporation.
+  Copyright(c) 1999 - 2016 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
 void ixgbe_init_mbx_params_pf(struct ixgbe_hw *);
 #endif /* CONFIG_PCI_IOV */
 
-extern struct ixgbe_mbx_operations mbx_ops_generic;
+extern const struct ixgbe_mbx_operations mbx_ops_generic;
 
 #endif /* _IXGBE_MBX_H_ */
 
 /*******************************************************************************
 
   Intel 10 Gigabit PCI Express Linux driver
-  Copyright(c) 1999 - 2015 Intel Corporation.
+  Copyright(c) 1999 - 2016 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
 };
 
 struct ixgbe_mbx_info {
-       struct ixgbe_mbx_operations ops;
+       const struct ixgbe_mbx_operations *ops;
        struct ixgbe_mbx_stats stats;
        u32 timeout;
        u32 usec_delay;
 struct ixgbe_info {
        enum ixgbe_mac_type             mac;
        s32                             (*get_invariants)(struct ixgbe_hw *);
-       struct ixgbe_mac_operations     *mac_ops;
-       struct ixgbe_eeprom_operations  *eeprom_ops;
-       struct ixgbe_phy_operations     *phy_ops;
-       struct ixgbe_mbx_operations     *mbx_ops;
+       const struct ixgbe_mac_operations       *mac_ops;
+       const struct ixgbe_eeprom_operations    *eeprom_ops;
+       const struct ixgbe_phy_operations       *phy_ops;
+       const struct ixgbe_mbx_operations       *mbx_ops;
        const u32                       *mvals;
 };
 
 
 /*******************************************************************************
 
   Intel 10 Gigabit PCI Express Linux driver
-  Copyright(c) 1999 - 2014 Intel Corporation.
+  Copyright(c) 1999 - 2016 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
 
        return 0;
 }
-static struct ixgbe_mac_operations mac_ops_X540 = {
+static const struct ixgbe_mac_operations mac_ops_X540 = {
        .init_hw                = &ixgbe_init_hw_generic,
        .reset_hw               = &ixgbe_reset_hw_X540,
        .start_hw               = &ixgbe_start_hw_X540,
        .disable_rx             = &ixgbe_disable_rx_generic,
 };
 
-static struct ixgbe_eeprom_operations eeprom_ops_X540 = {
+static const struct ixgbe_eeprom_operations eeprom_ops_X540 = {
        .init_params            = &ixgbe_init_eeprom_params_X540,
        .read                   = &ixgbe_read_eerd_X540,
        .read_buffer            = &ixgbe_read_eerd_buffer_X540,
        .update_checksum        = &ixgbe_update_eeprom_checksum_X540,
 };
 
-static struct ixgbe_phy_operations phy_ops_X540 = {
+static const struct ixgbe_phy_operations phy_ops_X540 = {
        .identify               = &ixgbe_identify_phy_generic,
        .identify_sfp           = &ixgbe_identify_sfp_module_generic,
        .init                   = NULL,
        IXGBE_MVALS_INIT(X540)
 };
 
-struct ixgbe_info ixgbe_X540_info = {
+const struct ixgbe_info ixgbe_X540_info = {
        .mac                    = ixgbe_mac_X540,
        .get_invariants         = &ixgbe_get_invariants_X540,
        .mac_ops                = &mac_ops_X540,
 
 /*******************************************************************************
  *
  *  Intel 10 Gigabit PCI Express Linux driver
- *  Copyright(c) 1999 - 2015 Intel Corporation.
+ *  Copyright(c) 1999 - 2016 Intel Corporation.
  *
  *  This program is free software; you can redistribute it and/or modify it
  *  under the terms and conditions of the GNU General Public License,
        .enable_rx                      = &ixgbe_enable_rx_generic, \
        .disable_rx                     = &ixgbe_disable_rx_x550, \
 
-static struct ixgbe_mac_operations mac_ops_X550 = {
+static const struct ixgbe_mac_operations mac_ops_X550 = {
        X550_COMMON_MAC
        .reset_hw               = &ixgbe_reset_hw_X540,
        .get_media_type         = &ixgbe_get_media_type_X540,
        .release_swfw_sync      = &ixgbe_release_swfw_sync_X540,
 };
 
-static struct ixgbe_mac_operations mac_ops_X550EM_x = {
+static const struct ixgbe_mac_operations mac_ops_X550EM_x = {
        X550_COMMON_MAC
        .reset_hw               = &ixgbe_reset_hw_X550em,
        .get_media_type         = &ixgbe_get_media_type_X550em,
        .update_checksum        = &ixgbe_update_eeprom_checksum_X550, \
        .calc_checksum          = &ixgbe_calc_eeprom_checksum_X550, \
 
-static struct ixgbe_eeprom_operations eeprom_ops_X550 = {
+static const struct ixgbe_eeprom_operations eeprom_ops_X550 = {
        X550_COMMON_EEP
        .init_params            = &ixgbe_init_eeprom_params_X550,
 };
 
-static struct ixgbe_eeprom_operations eeprom_ops_X550EM_x = {
+static const struct ixgbe_eeprom_operations eeprom_ops_X550EM_x = {
        X550_COMMON_EEP
        .init_params            = &ixgbe_init_eeprom_params_X540,
 };
        .check_overtemp         = &ixgbe_tn_check_overtemp, \
        .get_firmware_version   = &ixgbe_get_phy_firmware_version_generic,
 
-static struct ixgbe_phy_operations phy_ops_X550 = {
+static const struct ixgbe_phy_operations phy_ops_X550 = {
        X550_COMMON_PHY
        .init                   = NULL,
        .identify               = &ixgbe_identify_phy_generic,
 };
 
-static struct ixgbe_phy_operations phy_ops_X550EM_x = {
+static const struct ixgbe_phy_operations phy_ops_X550EM_x = {
        X550_COMMON_PHY
        .init                   = &ixgbe_init_phy_ops_X550em,
        .identify               = &ixgbe_identify_phy_x550em,
        IXGBE_MVALS_INIT(X550EM_x)
 };
 
-struct ixgbe_info ixgbe_X550_info = {
+const struct ixgbe_info ixgbe_X550_info = {
        .mac                    = ixgbe_mac_X550,
        .get_invariants         = &ixgbe_get_invariants_X540,
        .mac_ops                = &mac_ops_X550,
        .mvals                  = ixgbe_mvals_X550,
 };
 
-struct ixgbe_info ixgbe_X550EM_x_info = {
+const struct ixgbe_info ixgbe_X550EM_x_info = {
        .mac                    = ixgbe_mac_X550EM_x,
        .get_invariants         = &ixgbe_get_invariants_X550_x,
        .mac_ops                = &mac_ops_X550EM_x,