aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/igb/e1000_nvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/intel/igb/e1000_nvm.c')
-rw-r--r--drivers/net/ethernet/intel/igb/e1000_nvm.c80
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 **/
710void igb_get_fw_version(struct e1000_hw *hw, struct e1000_fw_version *fw_vers) 710void 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
798etrack_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}