Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / intel / igb / igb_ethtool.c
index a3830a8ba4c18a7558bc1177bb6f8c97b248cd67..48b594701efa7f51f5b975ec37aac3e70602b1f1 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/slab.h>
 #include <linux/pm_runtime.h>
 #include <linux/highmem.h>
+#include <linux/mdio.h>
 
 #include "igb.h"
 
@@ -178,44 +179,67 @@ static int igb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
 
                ecmd->port = PORT_TP;
                ecmd->phy_address = hw->phy.addr;
+               ecmd->transceiver = XCVR_INTERNAL;
        } else {
-               ecmd->supported   = (SUPPORTED_1000baseT_Full |
-                                    SUPPORTED_FIBRE |
-                                    SUPPORTED_Autoneg);
+               ecmd->supported = (SUPPORTED_1000baseT_Full |
+                                  SUPPORTED_100baseT_Full |
+                                  SUPPORTED_FIBRE |
+                                  SUPPORTED_Autoneg |
+                                  SUPPORTED_Pause);
+               if (hw->mac.type == e1000_i354)
+                               ecmd->supported |= SUPPORTED_2500baseX_Full;
 
-               ecmd->advertising = (ADVERTISED_1000baseT_Full |
-                                    ADVERTISED_FIBRE |
-                                    ADVERTISED_Autoneg |
-                                    ADVERTISED_Pause);
+               ecmd->advertising = ADVERTISED_FIBRE;
+
+               switch (adapter->link_speed) {
+               case SPEED_2500:
+                       ecmd->advertising = ADVERTISED_2500baseX_Full;
+                       break;
+               case SPEED_1000:
+                       ecmd->advertising = ADVERTISED_1000baseT_Full;
+                       break;
+               case SPEED_100:
+                       ecmd->advertising = ADVERTISED_100baseT_Full;
+                       break;
+               default:
+                       break;
+               }
+
+               if (hw->mac.autoneg == 1)
+                       ecmd->advertising |= ADVERTISED_Autoneg;
 
                ecmd->port = PORT_FIBRE;
+               ecmd->transceiver = XCVR_EXTERNAL;
        }
 
-       ecmd->transceiver = XCVR_INTERNAL;
-
        status = rd32(E1000_STATUS);
 
        if (status & E1000_STATUS_LU) {
-
-               if ((status & E1000_STATUS_SPEED_1000) ||
-                   hw->phy.media_type != e1000_media_type_copper)
-                       ethtool_cmd_speed_set(ecmd, SPEED_1000);
+               if ((hw->mac.type == e1000_i354) &&
+                   (status & E1000_STATUS_2P5_SKU) &&
+                   !(status & E1000_STATUS_2P5_SKU_OVER))
+                       ecmd->speed = SPEED_2500;
+               else if (status & E1000_STATUS_SPEED_1000)
+                       ecmd->speed = SPEED_1000;
                else if (status & E1000_STATUS_SPEED_100)
-                       ethtool_cmd_speed_set(ecmd, SPEED_100);
+                       ecmd->speed = SPEED_100;
                else
-                       ethtool_cmd_speed_set(ecmd, SPEED_10);
-
+                       ecmd->speed = SPEED_10;
                if ((status & E1000_STATUS_FD) ||
                    hw->phy.media_type != e1000_media_type_copper)
                        ecmd->duplex = DUPLEX_FULL;
                else
                        ecmd->duplex = DUPLEX_HALF;
        } else {
-               ethtool_cmd_speed_set(ecmd, -1);
+               ecmd->speed = -1;
                ecmd->duplex = -1;
        }
 
-       ecmd->autoneg = hw->mac.autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE;
+       if ((hw->phy.media_type == e1000_media_type_fiber) ||
+           hw->mac.autoneg)
+               ecmd->autoneg = AUTONEG_ENABLE;
+       else
+               ecmd->autoneg = AUTONEG_DISABLE;
 
        /* MDI-X => 2; MDI =>1; Invalid =>0 */
        if (hw->phy.media_type == e1000_media_type_copper)
@@ -238,15 +262,15 @@ static int igb_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
        struct e1000_hw *hw = &adapter->hw;
 
        /* When SoL/IDER sessions are active, autoneg/speed/duplex
-        * cannot be changed */
+        * cannot be changed
+        */
        if (igb_check_reset_block(hw)) {
                dev_err(&adapter->pdev->dev,
                        "Cannot change link characteristics when SoL/IDER is active.\n");
                return -EINVAL;
        }
 
-       /*
-        * MDI setting is only allowed when autoneg enabled because
+       /* MDI setting is only allowed when autoneg enabled because
         * some hardware doesn't allow MDI setting when speed or
         * duplex is forced.
         */
@@ -266,9 +290,31 @@ static int igb_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
 
        if (ecmd->autoneg == AUTONEG_ENABLE) {
                hw->mac.autoneg = 1;
-               hw->phy.autoneg_advertised = ecmd->advertising |
-                                            ADVERTISED_TP |
-                                            ADVERTISED_Autoneg;
+               if (hw->phy.media_type == e1000_media_type_fiber) {
+                       hw->phy.autoneg_advertised = ecmd->advertising |
+                                                    ADVERTISED_FIBRE |
+                                                    ADVERTISED_Autoneg;
+                       switch (adapter->link_speed) {
+                       case SPEED_2500:
+                               hw->phy.autoneg_advertised =
+                                       ADVERTISED_2500baseX_Full;
+                               break;
+                       case SPEED_1000:
+                               hw->phy.autoneg_advertised =
+                                       ADVERTISED_1000baseT_Full;
+                               break;
+                       case SPEED_100:
+                               hw->phy.autoneg_advertised =
+                                       ADVERTISED_100baseT_Full;
+                               break;
+                       default:
+                               break;
+                       }
+               } else {
+                       hw->phy.autoneg_advertised = ecmd->advertising |
+                                                    ADVERTISED_TP |
+                                                    ADVERTISED_Autoneg;
+               }
                ecmd->advertising = hw->phy.autoneg_advertised;
                if (adapter->fc_autoneg)
                        hw->fc.requested_mode = e1000_fc_default;
@@ -283,8 +329,7 @@ static int igb_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
 
        /* MDI-X => 2; MDI => 1; Auto => 3 */
        if (ecmd->eth_tp_mdix_ctrl) {
-               /*
-                * fix up the value for auto (3 => 0) as zero is mapped
+               /* fix up the value for auto (3 => 0) as zero is mapped
                 * internally to auto
                 */
                if (ecmd->eth_tp_mdix_ctrl == ETH_TP_MDI_AUTO)
@@ -309,8 +354,7 @@ static u32 igb_get_link(struct net_device *netdev)
        struct igb_adapter *adapter = netdev_priv(netdev);
        struct e1000_mac_info *mac = &adapter->hw.mac;
 
-       /*
-        * If the link is not reported up to netdev, interrupts are disabled,
+       /* If the link is not reported up to netdev, interrupts are disabled,
         * and so the physical link state may have changed since we last
         * looked. Set get_link_status to make sure that the true link
         * state is interrogated, rather than pulling a cached and possibly
@@ -430,7 +474,8 @@ static void igb_get_regs(struct net_device *netdev,
 
        /* Interrupt */
        /* Reading EICS for EICR because they read the
-        * same but EICS does not clear on read */
+        * same but EICS does not clear on read
+        */
        regs_buff[13] = rd32(E1000_EICS);
        regs_buff[14] = rd32(E1000_EICS);
        regs_buff[15] = rd32(E1000_EIMS);
@@ -438,7 +483,8 @@ static void igb_get_regs(struct net_device *netdev,
        regs_buff[17] = rd32(E1000_EIAC);
        regs_buff[18] = rd32(E1000_EIAM);
        /* Reading ICS for ICR because they read the
-        * same but ICS does not clear on read */
+        * same but ICS does not clear on read
+        */
        regs_buff[19] = rd32(E1000_ICS);
        regs_buff[20] = rd32(E1000_ICS);
        regs_buff[21] = rd32(E1000_IMS);
@@ -688,12 +734,12 @@ static int igb_get_eeprom(struct net_device *netdev,
 
        if (hw->nvm.type == e1000_nvm_eeprom_spi)
                ret_val = hw->nvm.ops.read(hw, first_word,
-                                           last_word - first_word + 1,
-                                           eeprom_buff);
+                                          last_word - first_word + 1,
+                                          eeprom_buff);
        else {
                for (i = 0; i < last_word - first_word + 1; i++) {
                        ret_val = hw->nvm.ops.read(hw, first_word + i, 1,
-                                                   &eeprom_buff[i]);
+                                                  &eeprom_buff[i]);
                        if (ret_val)
                                break;
                }
@@ -740,15 +786,17 @@ static int igb_set_eeprom(struct net_device *netdev,
        ptr = (void *)eeprom_buff;
 
        if (eeprom->offset & 1) {
-               /* need read/modify/write of first changed EEPROM word */
-               /* only the second byte of the word is being modified */
+               /* need read/modify/write of first changed EEPROM word
+                * only the second byte of the word is being modified
+                */
                ret_val = hw->nvm.ops.read(hw, first_word, 1,
                                            &eeprom_buff[0]);
                ptr++;
        }
        if (((eeprom->offset + eeprom->len) & 1) && (ret_val == 0)) {
-               /* need read/modify/write of last changed EEPROM word */
-               /* only the first byte of the word is being modified */
+               /* need read/modify/write of last changed EEPROM word
+                * only the first byte of the word is being modified
+                */
                ret_val = hw->nvm.ops.read(hw, last_word, 1,
                                   &eeprom_buff[last_word - first_word]);
        }
@@ -763,10 +811,11 @@ static int igb_set_eeprom(struct net_device *netdev,
                eeprom_buff[i] = cpu_to_le16(eeprom_buff[i]);
 
        ret_val = hw->nvm.ops.write(hw, first_word,
-                                    last_word - first_word + 1, eeprom_buff);
+                                   last_word - first_word + 1, eeprom_buff);
 
        /* Update the checksum over the first part of the EEPROM if needed
-        * and flush shadow RAM for 82573 controllers */
+        * and flush shadow RAM for 82573 controllers
+        */
        if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG)))
                hw->nvm.ops.update(hw);
 
@@ -783,8 +832,7 @@ static void igb_get_drvinfo(struct net_device *netdev,
        strlcpy(drvinfo->driver,  igb_driver_name, sizeof(drvinfo->driver));
        strlcpy(drvinfo->version, igb_driver_version, sizeof(drvinfo->version));
 
-       /*
-        * EEPROM image version # is reported as firmware version # for
+       /* EEPROM image version # is reported as firmware version # for
         * 82575 controllers
         */
        strlcpy(drvinfo->fw_version, adapter->fw_version,
@@ -847,9 +895,11 @@ static int igb_set_ringparam(struct net_device *netdev,
        }
 
        if (adapter->num_tx_queues > adapter->num_rx_queues)
-               temp_ring = vmalloc(adapter->num_tx_queues * sizeof(struct igb_ring));
+               temp_ring = vmalloc(adapter->num_tx_queues *
+                                   sizeof(struct igb_ring));
        else
-               temp_ring = vmalloc(adapter->num_rx_queues * sizeof(struct igb_ring));
+               temp_ring = vmalloc(adapter->num_rx_queues *
+                                   sizeof(struct igb_ring));
 
        if (!temp_ring) {
                err = -ENOMEM;
@@ -858,10 +908,9 @@ static int igb_set_ringparam(struct net_device *netdev,
 
        igb_down(adapter);
 
-       /*
-        * We can't just free everything and then setup again,
+       /* We can't just free everything and then setup again,
         * because the ISRs in MSI-X mode get passed pointers
-        * to the tx and rx ring structs.
+        * to the Tx and Rx ring structs.
         */
        if (new_tx_count != adapter->tx_ring_count) {
                for (i = 0; i < adapter->num_tx_queues; i++) {
@@ -1199,6 +1248,7 @@ static int igb_reg_test(struct igb_adapter *adapter, u64 *data)
 
        switch (adapter->hw.mac.type) {
        case e1000_i350:
+       case e1000_i354:
                test = reg_test_i350;
                toggle = 0x7FEFF3FF;
                break;
@@ -1361,6 +1411,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data)
                ics_mask = 0x77DCFED5;
                break;
        case e1000_i350:
+       case e1000_i354:
        case e1000_i210:
        case e1000_i211:
                ics_mask = 0x77DCFED5;
@@ -1723,8 +1774,8 @@ static int igb_check_lbtest_frame(struct igb_rx_buffer *rx_buffer,
 }
 
 static int igb_clean_test_rings(struct igb_ring *rx_ring,
-                                struct igb_ring *tx_ring,
-                                unsigned int size)
+                               struct igb_ring *tx_ring,
+                               unsigned int size)
 {
        union e1000_adv_rx_desc *rx_desc;
        struct igb_rx_buffer *rx_buffer_info;
@@ -1737,7 +1788,7 @@ static int igb_clean_test_rings(struct igb_ring *rx_ring,
        rx_desc = IGB_RX_DESC(rx_ring, rx_ntc);
 
        while (igb_test_staterr(rx_desc, E1000_RXD_STAT_DD)) {
-               /* check rx buffer */
+               /* check Rx buffer */
                rx_buffer_info = &rx_ring->rx_buffer_info[rx_ntc];
 
                /* sync Rx buffer for CPU read */
@@ -1756,11 +1807,11 @@ static int igb_clean_test_rings(struct igb_ring *rx_ring,
                                           IGB_RX_BUFSZ,
                                           DMA_FROM_DEVICE);
 
-               /* unmap buffer on tx side */
+               /* unmap buffer on Tx side */
                tx_buffer_info = &tx_ring->tx_buffer_info[tx_ntc];
                igb_unmap_and_free_tx_resource(tx_ring, tx_buffer_info);
 
-               /* increment rx/tx next to clean counters */
+               /* increment Rx/Tx next to clean counters */
                rx_ntc++;
                if (rx_ntc == rx_ring->count)
                        rx_ntc = 0;
@@ -1801,8 +1852,7 @@ static int igb_run_loopback_test(struct igb_adapter *adapter)
        igb_create_lbtest_frame(skb, size);
        skb_put(skb, size);
 
-       /*
-        * Calculate the loop count based on the largest descriptor ring
+       /* Calculate the loop count based on the largest descriptor ring
         * The idea is to wrap the largest ring a number of times using 64
         * send/receive pairs during each loop
         */
@@ -1829,7 +1879,7 @@ static int igb_run_loopback_test(struct igb_adapter *adapter)
                        break;
                }
 
-               /* allow 200 milliseconds for packets to go from tx to rx */
+               /* allow 200 milliseconds for packets to go from Tx to Rx */
                msleep(200);
 
                good_cnt = igb_clean_test_rings(rx_ring, tx_ring, size);
@@ -1848,13 +1898,21 @@ static int igb_run_loopback_test(struct igb_adapter *adapter)
 static int igb_loopback_test(struct igb_adapter *adapter, u64 *data)
 {
        /* PHY loopback cannot be performed if SoL/IDER
-        * sessions are active */
+        * sessions are active
+        */
        if (igb_check_reset_block(&adapter->hw)) {
                dev_err(&adapter->pdev->dev,
                        "Cannot do PHY loopback test when SoL/IDER is active.\n");
                *data = 0;
                goto out;
        }
+
+       if (adapter->hw.mac.type == e1000_i354) {
+               dev_info(&adapter->pdev->dev,
+                       "Loopback test not supported on i354.\n");
+               *data = 0;
+               goto out;
+       }
        *data = igb_setup_desc_rings(adapter);
        if (*data)
                goto out;
@@ -1879,7 +1937,8 @@ static int igb_link_test(struct igb_adapter *adapter, u64 *data)
                hw->mac.serdes_has_link = false;
 
                /* On some blade server designs, link establishment
-                * could take as long as 2-3 minutes */
+                * could take as long as 2-3 minutes
+                */
                do {
                        hw->mac.ops.check_for_link(&adapter->hw);
                        if (hw->mac.serdes_has_link)
@@ -1922,7 +1981,8 @@ static void igb_diag_test(struct net_device *netdev,
                igb_power_up_link(adapter);
 
                /* Link test performed before hardware reset so autoneg doesn't
-                * interfere with test result */
+                * interfere with test result
+                */
                if (igb_link_test(adapter, &data[4]))
                        eth_test->flags |= ETH_TEST_FL_FAILED;
 
@@ -1987,8 +2047,8 @@ static void igb_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
        struct igb_adapter *adapter = netdev_priv(netdev);
 
        wol->supported = WAKE_UCAST | WAKE_MCAST |
-                        WAKE_BCAST | WAKE_MAGIC |
-                        WAKE_PHY;
+                        WAKE_BCAST | WAKE_MAGIC |
+                        WAKE_PHY;
        wol->wolopts = 0;
 
        if (!(adapter->flags & IGB_FLAG_WOL_SUPPORTED))
@@ -2263,7 +2323,7 @@ static void igb_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
                        sprintf(p, "rx_queue_%u_alloc_failed", i);
                        p += ETH_GSTRING_LEN;
                }
-/*             BUG_ON(p - data != IGB_STATS_LEN * ETH_GSTRING_LEN); */
+               /* BUG_ON(p - data != IGB_STATS_LEN * ETH_GSTRING_LEN); */
                break;
        }
 }
@@ -2283,6 +2343,7 @@ static int igb_get_ts_info(struct net_device *dev,
        case e1000_82576:
        case e1000_82580:
        case e1000_i350:
+       case e1000_i354:
        case e1000_i210:
        case e1000_i211:
                info->so_timestamping =
@@ -2362,7 +2423,7 @@ static int igb_get_rss_hash_opts(struct igb_adapter *adapter,
 }
 
 static int igb_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
-                          u32 *rule_locs)
+                        u32 *rule_locs)
 {
        struct igb_adapter *adapter = netdev_priv(dev);
        int ret = -EOPNOTSUPP;
@@ -2506,7 +2567,8 @@ static int igb_get_eee(struct net_device *netdev, struct ethtool_eee *edata)
 {
        struct igb_adapter *adapter = netdev_priv(netdev);
        struct e1000_hw *hw = &adapter->hw;
-       u32 ipcnfg, eeer;
+       u32 ipcnfg, eeer, ret_val;
+       u16 phy_data;
 
        if ((hw->mac.type < e1000_i350) ||
            (hw->phy.media_type != e1000_media_type_copper))
@@ -2525,6 +2587,32 @@ static int igb_get_eee(struct net_device *netdev, struct ethtool_eee *edata)
        if (ipcnfg & E1000_IPCNFG_EEE_100M_AN)
                edata->advertised |= ADVERTISED_100baseT_Full;
 
+       /* EEE Link Partner Advertised */
+       switch (hw->mac.type) {
+       case e1000_i350:
+               ret_val = igb_read_emi_reg(hw, E1000_EEE_LP_ADV_ADDR_I350,
+                                          &phy_data);
+               if (ret_val)
+                       return -ENODATA;
+
+               edata->lp_advertised = mmd_eee_adv_to_ethtool_adv_t(phy_data);
+
+               break;
+       case e1000_i210:
+       case e1000_i211:
+               ret_val = igb_read_xmdio_reg(hw, E1000_EEE_LP_ADV_ADDR_I210,
+                                            E1000_EEE_LP_ADV_DEV_I210,
+                                            &phy_data);
+               if (ret_val)
+                       return -ENODATA;
+
+               edata->lp_advertised = mmd_eee_adv_to_ethtool_adv_t(phy_data);
+
+               break;
+       default:
+               break;
+       }
+
        if (eeer & E1000_EEER_EEE_NEG)
                edata->eee_active = true;
 
@@ -2600,6 +2688,85 @@ static int igb_set_eee(struct net_device *netdev,
        return 0;
 }
 
+static int igb_get_module_info(struct net_device *netdev,
+                              struct ethtool_modinfo *modinfo)
+{
+       struct igb_adapter *adapter = netdev_priv(netdev);
+       struct e1000_hw *hw = &adapter->hw;
+       u32 status = E1000_SUCCESS;
+       u16 sff8472_rev, addr_mode;
+       bool page_swap = false;
+
+       if ((hw->phy.media_type == e1000_media_type_copper) ||
+           (hw->phy.media_type == e1000_media_type_unknown))
+               return -EOPNOTSUPP;
+
+       /* Check whether we support SFF-8472 or not */
+       status = igb_read_phy_reg_i2c(hw, IGB_SFF_8472_COMP, &sff8472_rev);
+       if (status != E1000_SUCCESS)
+               return -EIO;
+
+       /* addressing mode is not supported */
+       status = igb_read_phy_reg_i2c(hw, IGB_SFF_8472_SWAP, &addr_mode);
+       if (status != E1000_SUCCESS)
+               return -EIO;
+
+       /* addressing mode is not supported */
+       if ((addr_mode & 0xFF) & IGB_SFF_ADDRESSING_MODE) {
+               hw_dbg("Address change required to access page 0xA2, but not supported. Please report the module type to the driver maintainers.\n");
+               page_swap = true;
+       }
+
+       if ((sff8472_rev & 0xFF) == IGB_SFF_8472_UNSUP || page_swap) {
+               /* We have an SFP, but it does not support SFF-8472 */
+               modinfo->type = ETH_MODULE_SFF_8079;
+               modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN;
+       } else {
+               /* We have an SFP which supports a revision of SFF-8472 */
+               modinfo->type = ETH_MODULE_SFF_8472;
+               modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
+       }
+
+       return 0;
+}
+
+static int igb_get_module_eeprom(struct net_device *netdev,
+                                struct ethtool_eeprom *ee, u8 *data)
+{
+       struct igb_adapter *adapter = netdev_priv(netdev);
+       struct e1000_hw *hw = &adapter->hw;
+       u32 status = E1000_SUCCESS;
+       u16 *dataword;
+       u16 first_word, last_word;
+       int i = 0;
+
+       if (ee->len == 0)
+               return -EINVAL;
+
+       first_word = ee->offset >> 1;
+       last_word = (ee->offset + ee->len - 1) >> 1;
+
+       dataword = kmalloc(sizeof(u16) * (last_word - first_word + 1),
+                          GFP_KERNEL);
+       if (!dataword)
+               return -ENOMEM;
+
+       /* Read EEPROM block, SFF-8079/SFF-8472, word at a time */
+       for (i = 0; i < last_word - first_word + 1; i++) {
+               status = igb_read_phy_reg_i2c(hw, first_word + i, &dataword[i]);
+               if (status != E1000_SUCCESS)
+                       /* Error occurred while reading module */
+                       return -EIO;
+
+               be16_to_cpus(&dataword[i]);
+       }
+
+       memcpy(data, (u8 *)dataword + (ee->offset & 1), ee->len);
+       kfree(dataword);
+
+       return 0;
+}
+
 static int igb_ethtool_begin(struct net_device *netdev)
 {
        struct igb_adapter *adapter = netdev_priv(netdev);
@@ -2614,36 +2781,38 @@ static void igb_ethtool_complete(struct net_device *netdev)
 }
 
 static const struct ethtool_ops igb_ethtool_ops = {
-       .get_settings           = igb_get_settings,
-       .set_settings           = igb_set_settings,
-       .get_drvinfo            = igb_get_drvinfo,
-       .get_regs_len           = igb_get_regs_len,
-       .get_regs               = igb_get_regs,
-       .get_wol                = igb_get_wol,
-       .set_wol                = igb_set_wol,
-       .get_msglevel           = igb_get_msglevel,
-       .set_msglevel           = igb_set_msglevel,
-       .nway_reset             = igb_nway_reset,
-       .get_link               = igb_get_link,
-       .get_eeprom_len         = igb_get_eeprom_len,
-       .get_eeprom             = igb_get_eeprom,
-       .set_eeprom             = igb_set_eeprom,
-       .get_ringparam          = igb_get_ringparam,
-       .set_ringparam          = igb_set_ringparam,
-       .get_pauseparam         = igb_get_pauseparam,
-       .set_pauseparam         = igb_set_pauseparam,
-       .self_test              = igb_diag_test,
-       .get_strings            = igb_get_strings,
-       .set_phys_id            = igb_set_phys_id,
-       .get_sset_count         = igb_get_sset_count,
-       .get_ethtool_stats      = igb_get_ethtool_stats,
-       .get_coalesce           = igb_get_coalesce,
-       .set_coalesce           = igb_set_coalesce,
-       .get_ts_info            = igb_get_ts_info,
+       .get_settings           = igb_get_settings,
+       .set_settings           = igb_set_settings,
+       .get_drvinfo            = igb_get_drvinfo,
+       .get_regs_len           = igb_get_regs_len,
+       .get_regs               = igb_get_regs,
+       .get_wol                = igb_get_wol,
+       .set_wol                = igb_set_wol,
+       .get_msglevel           = igb_get_msglevel,
+       .set_msglevel           = igb_set_msglevel,
+       .nway_reset             = igb_nway_reset,
+       .get_link               = igb_get_link,
+       .get_eeprom_len         = igb_get_eeprom_len,
+       .get_eeprom             = igb_get_eeprom,
+       .set_eeprom             = igb_set_eeprom,
+       .get_ringparam          = igb_get_ringparam,
+       .set_ringparam          = igb_set_ringparam,
+       .get_pauseparam         = igb_get_pauseparam,
+       .set_pauseparam         = igb_set_pauseparam,
+       .self_test              = igb_diag_test,
+       .get_strings            = igb_get_strings,
+       .set_phys_id            = igb_set_phys_id,
+       .get_sset_count         = igb_get_sset_count,
+       .get_ethtool_stats      = igb_get_ethtool_stats,
+       .get_coalesce           = igb_get_coalesce,
+       .set_coalesce           = igb_set_coalesce,
+       .get_ts_info            = igb_get_ts_info,
        .get_rxnfc              = igb_get_rxnfc,
        .set_rxnfc              = igb_set_rxnfc,
        .get_eee                = igb_get_eee,
        .set_eee                = igb_set_eee,
+       .get_module_info        = igb_get_module_info,
+       .get_module_eeprom      = igb_get_module_eeprom,
        .begin                  = igb_ethtool_begin,
        .complete               = igb_ethtool_complete,
 };