aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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