aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/igb
diff options
context:
space:
mode:
authorCarolyn Wyborny <carolyn.wyborny@intel.com>2012-10-18 03:16:19 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2012-10-30 02:49:29 -0400
commit0b1a6f2ee85d77d02e73ea8be43e1a9d8d97ccee (patch)
tree81fc5687ac4df40f1024a52ebb425dc81c471e58 /drivers/net/ethernet/intel/igb
parent9f0b8516198e8b0919774a1874fab064a2ea3ae8 (diff)
igb: Update firmware version info for ethtool output.
There are multiple places in our device nvm where the version is stored. This update fixes some output errors with some types of images and refactors the way the version data is gathered and stored for ethtool output. Signed-off-by: Carolyn Wyborny <carolyn.wyborny@intel.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/igb')
-rw-r--r--drivers/net/ethernet/intel/igb/e1000_defines.h14
-rw-r--r--drivers/net/ethernet/intel/igb/e1000_nvm.c70
-rw-r--r--drivers/net/ethernet/intel/igb/e1000_nvm.h16
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c76
4 files changed, 126 insertions, 50 deletions
diff --git a/drivers/net/ethernet/intel/igb/e1000_defines.h b/drivers/net/ethernet/intel/igb/e1000_defines.h
index de4b41ec3c40..e647cff9a5e3 100644
--- a/drivers/net/ethernet/intel/igb/e1000_defines.h
+++ b/drivers/net/ethernet/intel/igb/e1000_defines.h
@@ -636,6 +636,7 @@
636/* NVM Word Offsets */ 636/* NVM Word Offsets */
637#define NVM_COMPAT 0x0003 637#define NVM_COMPAT 0x0003
638#define NVM_ID_LED_SETTINGS 0x0004 /* SERDES output amplitude */ 638#define NVM_ID_LED_SETTINGS 0x0004 /* SERDES output amplitude */
639#define NVM_VERSION 0x0005
639#define NVM_INIT_CONTROL2_REG 0x000F 640#define NVM_INIT_CONTROL2_REG 0x000F
640#define NVM_INIT_CONTROL3_PORT_B 0x0014 641#define NVM_INIT_CONTROL3_PORT_B 0x0014
641#define NVM_INIT_CONTROL3_PORT_A 0x0024 642#define NVM_INIT_CONTROL3_PORT_A 0x0024
@@ -653,6 +654,19 @@
653#define NVM_LED_1_CFG 0x001C 654#define NVM_LED_1_CFG 0x001C
654#define NVM_LED_0_2_CFG 0x001F 655#define NVM_LED_0_2_CFG 0x001F
655 656
657/* NVM version defines */
658#define NVM_ETRACK_WORD 0x0042
659#define NVM_COMB_VER_OFF 0x0083
660#define NVM_COMB_VER_PTR 0x003d
661#define NVM_MAJOR_MASK 0xF000
662#define NVM_MINOR_MASK 0x0FF0
663#define NVM_BUILD_MASK 0x000F
664#define NVM_COMB_VER_MASK 0x00FF
665#define NVM_MAJOR_SHIFT 12
666#define NVM_MINOR_SHIFT 4
667#define NVM_COMB_VER_SHFT 8
668#define NVM_VER_INVALID 0xFFFF
669#define NVM_ETRACK_SHIFT 16
656 670
657#define E1000_NVM_CFG_DONE_PORT_0 0x040000 /* MNG config cycle done */ 671#define E1000_NVM_CFG_DONE_PORT_0 0x040000 /* MNG config cycle done */
658#define E1000_NVM_CFG_DONE_PORT_1 0x080000 /* ...for second port */ 672#define E1000_NVM_CFG_DONE_PORT_1 0x080000 /* ...for second port */
diff --git a/drivers/net/ethernet/intel/igb/e1000_nvm.c b/drivers/net/ethernet/intel/igb/e1000_nvm.c
index aa5fcdf3f357..54ff53905ffe 100644
--- a/drivers/net/ethernet/intel/igb/e1000_nvm.c
+++ b/drivers/net/ethernet/intel/igb/e1000_nvm.c
@@ -710,3 +710,73 @@ s32 igb_update_nvm_checksum(struct e1000_hw *hw)
710out: 710out:
711 return ret_val; 711 return ret_val;
712} 712}
713
714/**
715 * igb_get_fw_version - Get firmware version information
716 * @hw: pointer to the HW structure
717 * @fw_vers: pointer to output structure
718 *
719 * unsupported MAC types will return all 0 version structure
720 **/
721void igb_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers)
722{
723 u16 eeprom_verh, eeprom_verl, comb_verh, comb_verl, comb_offset;
724 u16 fw_version;
725
726 memset(fw_vers, 0, sizeof(struct e1000_fw_version));
727
728 switch (hw->mac.type) {
729 case e1000_i211:
730 return;
731 case e1000_82575:
732 case e1000_82576:
733 case e1000_82580:
734 case e1000_i350:
735 case e1000_i210:
736 break;
737 default:
738 return;
739 }
740 /* basic eeprom version numbers */
741 hw->nvm.ops.read(hw, NVM_VERSION, 1, &fw_version);
742 fw_vers->eep_major = (fw_version & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT;
743 fw_vers->eep_minor = (fw_version & NVM_MINOR_MASK);
744
745 /* etrack id */
746 hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verl);
747 hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verh);
748 fw_vers->etrack_id = (eeprom_verh << NVM_ETRACK_SHIFT) | eeprom_verl;
749
750 switch (hw->mac.type) {
751 case e1000_i210:
752 case e1000_i350:
753 /* find combo image version */
754 hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset);
755 if ((comb_offset != 0x0) && (comb_offset != NVM_VER_INVALID)) {
756
757 hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset
758 + 1), 1, &comb_verh);
759 hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset),
760 1, &comb_verl);
761
762 /* get Option Rom version if it exists and is valid */
763 if ((comb_verh && comb_verl) &&
764 ((comb_verh != NVM_VER_INVALID) &&
765 (comb_verl != NVM_VER_INVALID))) {
766
767 fw_vers->or_valid = true;
768 fw_vers->or_major =
769 comb_verl >> NVM_COMB_VER_SHFT;
770 fw_vers->or_build =
771 ((comb_verl << NVM_COMB_VER_SHFT)
772 | (comb_verh >> NVM_COMB_VER_SHFT));
773 fw_vers->or_patch =
774 comb_verh & NVM_COMB_VER_MASK;
775 }
776 }
777 break;
778 default:
779 break;
780 }
781 return;
782}
diff --git a/drivers/net/ethernet/intel/igb/e1000_nvm.h b/drivers/net/ethernet/intel/igb/e1000_nvm.h
index 825b0228cac0..7012d458c6f7 100644
--- a/drivers/net/ethernet/intel/igb/e1000_nvm.h
+++ b/drivers/net/ethernet/intel/igb/e1000_nvm.h
@@ -40,4 +40,20 @@ s32 igb_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data);
40s32 igb_validate_nvm_checksum(struct e1000_hw *hw); 40s32 igb_validate_nvm_checksum(struct e1000_hw *hw);
41s32 igb_update_nvm_checksum(struct e1000_hw *hw); 41s32 igb_update_nvm_checksum(struct e1000_hw *hw);
42 42
43struct e1000_fw_version {
44 u32 etrack_id;
45 u16 eep_major;
46 u16 eep_minor;
47
48 u8 invm_major;
49 u8 invm_minor;
50 u8 invm_img_type;
51
52 bool or_valid;
53 u16 or_major;
54 u16 or_build;
55 u16 or_patch;
56};
57void igb_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers);
58
43#endif 59#endif
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index b07d679b46f2..df1e7907bbaf 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -1785,58 +1785,34 @@ static const struct net_device_ops igb_netdev_ops = {
1785void igb_set_fw_version(struct igb_adapter *adapter) 1785void igb_set_fw_version(struct igb_adapter *adapter)
1786{ 1786{
1787 struct e1000_hw *hw = &adapter->hw; 1787 struct e1000_hw *hw = &adapter->hw;
1788 u16 eeprom_verh, eeprom_verl, comb_verh, comb_verl, comb_offset; 1788 struct e1000_fw_version fw;
1789 u16 major, build, patch, fw_version; 1789
1790 u32 etrack_id; 1790 igb_get_fw_version(hw, &fw);
1791 1791
1792 hw->nvm.ops.read(hw, 5, 1, &fw_version); 1792 switch (hw->mac.type) {
1793 if (adapter->hw.mac.type != e1000_i211) { 1793 case e1000_i211:
1794 hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verh);
1795 hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verl);
1796 etrack_id = (eeprom_verh << IGB_ETRACK_SHIFT) | eeprom_verl;
1797
1798 /* combo image version needs to be found */
1799 hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset);
1800 if ((comb_offset != 0x0) &&
1801 (comb_offset != IGB_NVM_VER_INVALID)) {
1802 hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset
1803 + 1), 1, &comb_verh);
1804 hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset),
1805 1, &comb_verl);
1806
1807 /* Only display Option Rom if it exists and is valid */
1808 if ((comb_verh && comb_verl) &&
1809 ((comb_verh != IGB_NVM_VER_INVALID) &&
1810 (comb_verl != IGB_NVM_VER_INVALID))) {
1811 major = comb_verl >> IGB_COMB_VER_SHFT;
1812 build = (comb_verl << IGB_COMB_VER_SHFT) |
1813 (comb_verh >> IGB_COMB_VER_SHFT);
1814 patch = comb_verh & IGB_COMB_VER_MASK;
1815 snprintf(adapter->fw_version,
1816 sizeof(adapter->fw_version),
1817 "%d.%d%d, 0x%08x, %d.%d.%d",
1818 (fw_version & IGB_MAJOR_MASK) >>
1819 IGB_MAJOR_SHIFT,
1820 (fw_version & IGB_MINOR_MASK) >>
1821 IGB_MINOR_SHIFT,
1822 (fw_version & IGB_BUILD_MASK),
1823 etrack_id, major, build, patch);
1824 goto out;
1825 }
1826 }
1827 snprintf(adapter->fw_version, sizeof(adapter->fw_version),
1828 "%d.%d%d, 0x%08x",
1829 (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT,
1830 (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT,
1831 (fw_version & IGB_BUILD_MASK), etrack_id);
1832 } else {
1833 snprintf(adapter->fw_version, sizeof(adapter->fw_version), 1794 snprintf(adapter->fw_version, sizeof(adapter->fw_version),
1834 "%d.%d%d", 1795 "%2d.%2d-%d",
1835 (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT, 1796 fw.invm_major, fw.invm_minor, fw.invm_img_type);
1836 (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT, 1797 break;
1837 (fw_version & IGB_BUILD_MASK)); 1798
1799 default:
1800 /* if option is rom valid, display its version too */
1801 if (fw.or_valid) {
1802 snprintf(adapter->fw_version,
1803 sizeof(adapter->fw_version),
1804 "%d.%d, 0x%08x, %d.%d.%d",
1805 fw.eep_major, fw.eep_minor, fw.etrack_id,
1806 fw.or_major, fw.or_build, fw.or_patch);
1807 /* no option rom */
1808 } else {
1809 snprintf(adapter->fw_version,
1810 sizeof(adapter->fw_version),
1811 "%d.%d, 0x%08x",
1812 fw.eep_major, fw.eep_minor, fw.etrack_id);
1813 }
1814 break;
1838 } 1815 }
1839out:
1840 return; 1816 return;
1841} 1817}
1842 1818