aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorCarolyn Wyborny <carolyn.wyborny@intel.com>2012-06-14 12:04:19 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2012-06-20 04:36:23 -0400
commitd67974f0deb1f309fc13821f45e52c63402bfb24 (patch)
tree4488f338c7559952ed0716e5e2e47f517d0a52cb /drivers
parent374a542dee0a10c5f81edc2af17a97b06805ecd9 (diff)
igb: Update firmware info output
Our NVM image creation tools have evolved over the years and there are multiple versions contained in them, depending on the tool used to create them. This patch outputs the NVM versions available in ethtool -i output. rc2: (not sure why others show in log but not in the message) Added additional call to igb_set_fw_version per Community feedback. Signed-off-by: Carolyn Wyborny <carolyn.wyborny@intel.com> Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/intel/igb/igb.h16
-rw-r--r--drivers/net/ethernet/intel/igb/igb_ethtool.c17
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c66
3 files changed, 89 insertions, 10 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h
index 3ced7b546f7f..9e572dd29ab2 100644
--- a/drivers/net/ethernet/intel/igb/igb.h
+++ b/drivers/net/ethernet/intel/igb/igb.h
@@ -75,6 +75,20 @@ struct igb_adapter;
75#define IGB_82576_VF_DEV_ID 0x10CA 75#define IGB_82576_VF_DEV_ID 0x10CA
76#define IGB_I350_VF_DEV_ID 0x1520 76#define IGB_I350_VF_DEV_ID 0x1520
77 77
78/* NVM version defines */
79#define IGB_MAJOR_MASK 0xF000
80#define IGB_MINOR_MASK 0x0FF0
81#define IGB_BUILD_MASK 0x000F
82#define IGB_COMB_VER_MASK 0x00FF
83#define IGB_MAJOR_SHIFT 12
84#define IGB_MINOR_SHIFT 4
85#define IGB_COMB_VER_SHFT 8
86#define IGB_NVM_VER_INVALID 0xFFFF
87#define IGB_ETRACK_SHIFT 16
88#define NVM_ETRACK_WORD 0x0042
89#define NVM_COMB_VER_OFF 0x0083
90#define NVM_COMB_VER_PTR 0x003d
91
78struct vf_data_storage { 92struct vf_data_storage {
79 unsigned char vf_mac_addresses[ETH_ALEN]; 93 unsigned char vf_mac_addresses[ETH_ALEN];
80 u16 vf_mc_hashes[IGB_MAX_VF_MC_ENTRIES]; 94 u16 vf_mc_hashes[IGB_MAX_VF_MC_ENTRIES];
@@ -368,6 +382,7 @@ struct igb_adapter {
368 spinlock_t tmreg_lock; 382 spinlock_t tmreg_lock;
369 struct cyclecounter cc; 383 struct cyclecounter cc;
370 struct timecounter tc; 384 struct timecounter tc;
385 char fw_version[32];
371}; 386};
372 387
373#define IGB_FLAG_HAS_MSI (1 << 0) 388#define IGB_FLAG_HAS_MSI (1 << 0)
@@ -417,6 +432,7 @@ extern void igb_update_stats(struct igb_adapter *, struct rtnl_link_stats64 *);
417extern bool igb_has_link(struct igb_adapter *adapter); 432extern bool igb_has_link(struct igb_adapter *adapter);
418extern void igb_set_ethtool_ops(struct net_device *); 433extern void igb_set_ethtool_ops(struct net_device *);
419extern void igb_power_up_link(struct igb_adapter *); 434extern void igb_power_up_link(struct igb_adapter *);
435extern void igb_set_fw_version(struct igb_adapter *);
420#ifdef CONFIG_IGB_PTP 436#ifdef CONFIG_IGB_PTP
421extern void igb_ptp_init(struct igb_adapter *adapter); 437extern void igb_ptp_init(struct igb_adapter *adapter);
422extern void igb_ptp_remove(struct igb_adapter *adapter); 438extern void igb_ptp_remove(struct igb_adapter *adapter);
diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
index 59d0f04d59af..a19c84cad0e9 100644
--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
@@ -710,6 +710,7 @@ static int igb_set_eeprom(struct net_device *netdev,
710 if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG))) 710 if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG)))
711 hw->nvm.ops.update(hw); 711 hw->nvm.ops.update(hw);
712 712
713 igb_set_fw_version(adapter);
713 kfree(eeprom_buff); 714 kfree(eeprom_buff);
714 return ret_val; 715 return ret_val;
715} 716}
@@ -718,20 +719,16 @@ static void igb_get_drvinfo(struct net_device *netdev,
718 struct ethtool_drvinfo *drvinfo) 719 struct ethtool_drvinfo *drvinfo)
719{ 720{
720 struct igb_adapter *adapter = netdev_priv(netdev); 721 struct igb_adapter *adapter = netdev_priv(netdev);
721 u16 eeprom_data;
722 722
723 strlcpy(drvinfo->driver, igb_driver_name, sizeof(drvinfo->driver)); 723 strlcpy(drvinfo->driver, igb_driver_name, sizeof(drvinfo->driver));
724 strlcpy(drvinfo->version, igb_driver_version, sizeof(drvinfo->version)); 724 strlcpy(drvinfo->version, igb_driver_version, sizeof(drvinfo->version));
725 725
726 /* EEPROM image version # is reported as firmware version # for 726 /*
727 * 82575 controllers */ 727 * EEPROM image version # is reported as firmware version # for
728 adapter->hw.nvm.ops.read(&adapter->hw, 5, 1, &eeprom_data); 728 * 82575 controllers
729 snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), 729 */
730 "%d.%d-%d", 730 strlcpy(drvinfo->fw_version, adapter->fw_version,
731 (eeprom_data & 0xF000) >> 12, 731 sizeof(drvinfo->fw_version));
732 (eeprom_data & 0x0FF0) >> 4,
733 eeprom_data & 0x000F);
734
735 strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), 732 strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
736 sizeof(drvinfo->bus_info)); 733 sizeof(drvinfo->bus_info));
737 drvinfo->n_stats = IGB_STATS_LEN; 734 drvinfo->n_stats = IGB_STATS_LEN;
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index a7c9c5d77e0b..1e0b94ba2ef1 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -1816,6 +1816,69 @@ static const struct net_device_ops igb_netdev_ops = {
1816}; 1816};
1817 1817
1818/** 1818/**
1819 * igb_set_fw_version - Configure version string for ethtool
1820 * @adapter: adapter struct
1821 *
1822 **/
1823void igb_set_fw_version(struct igb_adapter *adapter)
1824{
1825 struct e1000_hw *hw = &adapter->hw;
1826 u16 eeprom_verh, eeprom_verl, comb_verh, comb_verl, comb_offset;
1827 u16 major, build, patch, fw_version;
1828 u32 etrack_id;
1829
1830 hw->nvm.ops.read(hw, 5, 1, &fw_version);
1831 if (adapter->hw.mac.type != e1000_i211) {
1832 hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verh);
1833 hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verl);
1834 etrack_id = (eeprom_verh << IGB_ETRACK_SHIFT) | eeprom_verl;
1835
1836 /* combo image version needs to be found */
1837 hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset);
1838 if ((comb_offset != 0x0) &&
1839 (comb_offset != IGB_NVM_VER_INVALID)) {
1840 hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset
1841 + 1), 1, &comb_verh);
1842 hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset),
1843 1, &comb_verl);
1844
1845 /* Only display Option Rom if it exists and is valid */
1846 if ((comb_verh && comb_verl) &&
1847 ((comb_verh != IGB_NVM_VER_INVALID) &&
1848 (comb_verl != IGB_NVM_VER_INVALID))) {
1849 major = comb_verl >> IGB_COMB_VER_SHFT;
1850 build = (comb_verl << IGB_COMB_VER_SHFT) |
1851 (comb_verh >> IGB_COMB_VER_SHFT);
1852 patch = comb_verh & IGB_COMB_VER_MASK;
1853 snprintf(adapter->fw_version,
1854 sizeof(adapter->fw_version),
1855 "%d.%d%d, 0x%08x, %d.%d.%d",
1856 (fw_version & IGB_MAJOR_MASK) >>
1857 IGB_MAJOR_SHIFT,
1858 (fw_version & IGB_MINOR_MASK) >>
1859 IGB_MINOR_SHIFT,
1860 (fw_version & IGB_BUILD_MASK),
1861 etrack_id, major, build, patch);
1862 goto out;
1863 }
1864 }
1865 snprintf(adapter->fw_version, sizeof(adapter->fw_version),
1866 "%d.%d%d, 0x%08x",
1867 (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT,
1868 (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT,
1869 (fw_version & IGB_BUILD_MASK), etrack_id);
1870 } else {
1871 snprintf(adapter->fw_version, sizeof(adapter->fw_version),
1872 "%d.%d%d",
1873 (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT,
1874 (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT,
1875 (fw_version & IGB_BUILD_MASK));
1876 }
1877out:
1878 return;
1879}
1880
1881/**
1819 * igb_probe - Device Initialization Routine 1882 * igb_probe - Device Initialization Routine
1820 * @pdev: PCI device information struct 1883 * @pdev: PCI device information struct
1821 * @ent: entry in igb_pci_tbl 1884 * @ent: entry in igb_pci_tbl
@@ -2025,6 +2088,9 @@ static int __devinit igb_probe(struct pci_dev *pdev,
2025 goto err_eeprom; 2088 goto err_eeprom;
2026 } 2089 }
2027 2090
2091 /* get firmware version for ethtool -i */
2092 igb_set_fw_version(adapter);
2093
2028 setup_timer(&adapter->watchdog_timer, igb_watchdog, 2094 setup_timer(&adapter->watchdog_timer, igb_watchdog,
2029 (unsigned long) adapter); 2095 (unsigned long) adapter);
2030 setup_timer(&adapter->phy_info_timer, igb_update_phy_info, 2096 setup_timer(&adapter->phy_info_timer, igb_update_phy_info,