diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/e1000_nvm.c')
-rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_nvm.c | 80 |
1 files changed, 56 insertions, 24 deletions
diff --git a/drivers/net/ethernet/intel/igb/e1000_nvm.c b/drivers/net/ethernet/intel/igb/e1000_nvm.c index 7f9cd7cbd353..a7db7f3db914 100644 --- a/drivers/net/ethernet/intel/igb/e1000_nvm.c +++ b/drivers/net/ethernet/intel/igb/e1000_nvm.c | |||
@@ -709,11 +709,16 @@ out: | |||
709 | **/ | 709 | **/ |
710 | void igb_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers) | 710 | void igb_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers) |
711 | { | 711 | { |
712 | u16 eeprom_verh, eeprom_verl, comb_verh, comb_verl, comb_offset; | 712 | u16 eeprom_verh, eeprom_verl, etrack_test, fw_version; |
713 | u16 fw_version; | 713 | u8 q, hval, rem, result; |
714 | u16 comb_verh, comb_verl, comb_offset; | ||
714 | 715 | ||
715 | memset(fw_vers, 0, sizeof(struct e1000_fw_version)); | 716 | memset(fw_vers, 0, sizeof(struct e1000_fw_version)); |
716 | 717 | ||
718 | /* basic eeprom version numbers and bits used vary by part and by tool | ||
719 | * used to create the nvm images. Check which data format we have. | ||
720 | */ | ||
721 | hw->nvm.ops.read(hw, NVM_ETRACK_HIWORD, 1, &etrack_test); | ||
717 | switch (hw->mac.type) { | 722 | switch (hw->mac.type) { |
718 | case e1000_i211: | 723 | case e1000_i211: |
719 | igb_read_invm_version(hw, fw_vers); | 724 | igb_read_invm_version(hw, fw_vers); |
@@ -721,30 +726,30 @@ void igb_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers) | |||
721 | case e1000_82575: | 726 | case e1000_82575: |
722 | case e1000_82576: | 727 | case e1000_82576: |
723 | case e1000_82580: | 728 | case e1000_82580: |
724 | case e1000_i354: | 729 | /* Use this format, unless EETRACK ID exists, |
725 | case e1000_i350: | 730 | * then use alternate format |
726 | case e1000_i210: | 731 | */ |
732 | if ((etrack_test & NVM_MAJOR_MASK) != NVM_ETRACK_VALID) { | ||
733 | hw->nvm.ops.read(hw, NVM_VERSION, 1, &fw_version); | ||
734 | fw_vers->eep_major = (fw_version & NVM_MAJOR_MASK) | ||
735 | >> NVM_MAJOR_SHIFT; | ||
736 | fw_vers->eep_minor = (fw_version & NVM_MINOR_MASK) | ||
737 | >> NVM_MINOR_SHIFT; | ||
738 | fw_vers->eep_build = (fw_version & NVM_IMAGE_ID_MASK); | ||
739 | goto etrack_id; | ||
740 | } | ||
727 | break; | 741 | break; |
728 | default: | ||
729 | return; | ||
730 | } | ||
731 | /* basic eeprom version numbers */ | ||
732 | hw->nvm.ops.read(hw, NVM_VERSION, 1, &fw_version); | ||
733 | fw_vers->eep_major = (fw_version & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT; | ||
734 | fw_vers->eep_minor = (fw_version & NVM_MINOR_MASK); | ||
735 | |||
736 | /* etrack id */ | ||
737 | hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verl); | ||
738 | hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verh); | ||
739 | fw_vers->etrack_id = (eeprom_verh << NVM_ETRACK_SHIFT) | eeprom_verl; | ||
740 | |||
741 | switch (hw->mac.type) { | ||
742 | case e1000_i210: | 742 | case e1000_i210: |
743 | case e1000_i354: | 743 | if (!(igb_get_flash_presence_i210(hw))) { |
744 | igb_read_invm_version(hw, fw_vers); | ||
745 | return; | ||
746 | } | ||
747 | /* fall through */ | ||
744 | case e1000_i350: | 748 | case e1000_i350: |
745 | /* find combo image version */ | 749 | /* find combo image version */ |
746 | hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset); | 750 | hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset); |
747 | if ((comb_offset != 0x0) && (comb_offset != NVM_VER_INVALID)) { | 751 | if ((comb_offset != 0x0) && |
752 | (comb_offset != NVM_VER_INVALID)) { | ||
748 | 753 | ||
749 | hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset | 754 | hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset |
750 | + 1), 1, &comb_verh); | 755 | + 1), 1, &comb_verh); |
@@ -760,15 +765,42 @@ void igb_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers) | |||
760 | fw_vers->or_major = | 765 | fw_vers->or_major = |
761 | comb_verl >> NVM_COMB_VER_SHFT; | 766 | comb_verl >> NVM_COMB_VER_SHFT; |
762 | fw_vers->or_build = | 767 | fw_vers->or_build = |
763 | ((comb_verl << NVM_COMB_VER_SHFT) | 768 | (comb_verl << NVM_COMB_VER_SHFT) |
764 | | (comb_verh >> NVM_COMB_VER_SHFT)); | 769 | | (comb_verh >> NVM_COMB_VER_SHFT); |
765 | fw_vers->or_patch = | 770 | fw_vers->or_patch = |
766 | comb_verh & NVM_COMB_VER_MASK; | 771 | comb_verh & NVM_COMB_VER_MASK; |
767 | } | 772 | } |
768 | } | 773 | } |
769 | break; | 774 | break; |
770 | default: | 775 | default: |
771 | break; | 776 | return; |
777 | } | ||
778 | hw->nvm.ops.read(hw, NVM_VERSION, 1, &fw_version); | ||
779 | fw_vers->eep_major = (fw_version & NVM_MAJOR_MASK) | ||
780 | >> NVM_MAJOR_SHIFT; | ||
781 | |||
782 | /* check for old style version format in newer images*/ | ||
783 | if ((fw_version & NVM_NEW_DEC_MASK) == 0x0) { | ||
784 | eeprom_verl = (fw_version & NVM_COMB_VER_MASK); | ||
785 | } else { | ||
786 | eeprom_verl = (fw_version & NVM_MINOR_MASK) | ||
787 | >> NVM_MINOR_SHIFT; | ||
788 | } | ||
789 | /* Convert minor value to hex before assigning to output struct | ||
790 | * Val to be converted will not be higher than 99, per tool output | ||
791 | */ | ||
792 | q = eeprom_verl / NVM_HEX_CONV; | ||
793 | hval = q * NVM_HEX_TENS; | ||
794 | rem = eeprom_verl % NVM_HEX_CONV; | ||
795 | result = hval + rem; | ||
796 | fw_vers->eep_minor = result; | ||
797 | |||
798 | etrack_id: | ||
799 | if ((etrack_test & NVM_MAJOR_MASK) == NVM_ETRACK_VALID) { | ||
800 | hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verl); | ||
801 | hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verh); | ||
802 | fw_vers->etrack_id = (eeprom_verh << NVM_ETRACK_SHIFT) | ||
803 | | eeprom_verl; | ||
772 | } | 804 | } |
773 | return; | 805 | return; |
774 | } | 806 | } |