diff options
-rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_defines.h | 14 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_nvm.c | 70 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_nvm.h | 16 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 76 |
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) | |||
710 | out: | 710 | out: |
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 | **/ | ||
721 | void 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); | |||
40 | s32 igb_validate_nvm_checksum(struct e1000_hw *hw); | 40 | s32 igb_validate_nvm_checksum(struct e1000_hw *hw); |
41 | s32 igb_update_nvm_checksum(struct e1000_hw *hw); | 41 | s32 igb_update_nvm_checksum(struct e1000_hw *hw); |
42 | 42 | ||
43 | struct 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 | }; | ||
57 | void 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 = { | |||
1785 | void igb_set_fw_version(struct igb_adapter *adapter) | 1785 | void 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 | } |
1839 | out: | ||
1840 | return; | 1816 | return; |
1841 | } | 1817 | } |
1842 | 1818 | ||