|  | @@ -728,6 +728,17 @@ e1000_reset_hw(struct e1000_hw *hw)
 | 
		
	
		
			
			| 728 | 728 |      /* Clear any pending interrupt events. */
 | 
		
	
		
			
			| 729 | 729 |      icr = E1000_READ_REG(hw, ICR);
 | 
		
	
		
			
			| 730 | 730 |  
 | 
		
	
		
			
			|  | 731 | +    if (hw->mac_type == e1000_82571 && hw->laa_is_present == TRUE) {
 | 
		
	
		
			
			|  | 732 | +        /*
 | 
		
	
		
			
			|  | 733 | +         * Hold a copy of the LAA in RAR[14] This is done so that
 | 
		
	
		
			
			|  | 734 | +         * between the time RAR[0] gets clobbered and the time it
 | 
		
	
		
			
			|  | 735 | +         * gets fixed, the actual LAA is in one of the RARs and no
 | 
		
	
		
			
			|  | 736 | +         * incoming packets directed to this port are dropped.
 | 
		
	
		
			
			|  | 737 | +         * Eventually the LAA will be in RAR[0] and RAR[14].
 | 
		
	
		
			
			|  | 738 | +         */
 | 
		
	
		
			
			|  | 739 | +        e1000_rar_set(hw, hw->mac_addr, E1000_RAR_ENTRIES - 1);
 | 
		
	
		
			
			|  | 740 | +    }
 | 
		
	
		
			
			|  | 741 | +
 | 
		
	
		
			
			| 731 | 742 |      /* If MWI was previously enabled, reenable it. */
 | 
		
	
		
			
			| 732 | 743 |      if (hw->mac_type == e1000_82542_rev2_0) {
 | 
		
	
		
			
			| 733 | 744 |          if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
 | 
		
	
	
		
			
			|  | @@ -5774,13 +5785,48 @@ e1000_commit_shadow_ram(struct e1000_hw *hw)
 | 
		
	
		
			
			| 5774 | 5785 |  int32_t
 | 
		
	
		
			
			| 5775 | 5786 |  e1000_read_mac_addr(struct e1000_hw * hw)
 | 
		
	
		
			
			| 5776 | 5787 |  {
 | 
		
	
		
			
			| 5777 |  | -    uint16_t offset;
 | 
		
	
		
			
			|  | 5788 | +    uint16_t offset, mac_addr_offset = 0;
 | 
		
	
		
			
			| 5778 | 5789 |      uint16_t eeprom_data, i;
 | 
		
	
		
			
			|  | 5790 | +    int32_t ret_val;
 | 
		
	
		
			
			| 5779 | 5791 |  
 | 
		
	
		
			
			| 5780 | 5792 |      DEBUGFUNC("e1000_read_mac_addr");
 | 
		
	
		
			
			| 5781 | 5793 |  
 | 
		
	
		
			
			|  | 5794 | +    if (hw->mac_type == e1000_82571) {
 | 
		
	
		
			
			|  | 5795 | +        /* Check for an alternate MAC address.  An alternate MAC
 | 
		
	
		
			
			|  | 5796 | +         * address can be setup by pre-boot software and must be
 | 
		
	
		
			
			|  | 5797 | +         * treated like a permanent address and must override the
 | 
		
	
		
			
			|  | 5798 | +         * actual permanent MAC address.*/
 | 
		
	
		
			
			|  | 5799 | +        ret_val = e1000_read_eeprom(hw, EEPROM_ALT_MAC_ADDR_PTR, 1,
 | 
		
	
		
			
			|  | 5800 | +                                    &mac_addr_offset);
 | 
		
	
		
			
			|  | 5801 | +        if (ret_val) {
 | 
		
	
		
			
			|  | 5802 | +            DEBUGOUT("EEPROM Read Error\n");
 | 
		
	
		
			
			|  | 5803 | +            return -E1000_ERR_EEPROM;
 | 
		
	
		
			
			|  | 5804 | +        }
 | 
		
	
		
			
			|  | 5805 | +        if (mac_addr_offset == 0xFFFF)
 | 
		
	
		
			
			|  | 5806 | +            mac_addr_offset = 0;
 | 
		
	
		
			
			|  | 5807 | +
 | 
		
	
		
			
			|  | 5808 | +        if (mac_addr_offset) {
 | 
		
	
		
			
			|  | 5809 | +            if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)
 | 
		
	
		
			
			|  | 5810 | +                mac_addr_offset += NODE_ADDRESS_SIZE/sizeof(u16);
 | 
		
	
		
			
			|  | 5811 | +
 | 
		
	
		
			
			|  | 5812 | +                /* make sure we have a valid mac address here
 | 
		
	
		
			
			|  | 5813 | +                 * before using it */
 | 
		
	
		
			
			|  | 5814 | +               ret_val = e1000_read_eeprom(hw, mac_addr_offset, 1,
 | 
		
	
		
			
			|  | 5815 | +                                           &eeprom_data);
 | 
		
	
		
			
			|  | 5816 | +               if (ret_val) {
 | 
		
	
		
			
			|  | 5817 | +                   DEBUGOUT("EEPROM Read Error\n");
 | 
		
	
		
			
			|  | 5818 | +                   return -E1000_ERR_EEPROM;
 | 
		
	
		
			
			|  | 5819 | +               }
 | 
		
	
		
			
			|  | 5820 | +               if (eeprom_data & 0x0001)
 | 
		
	
		
			
			|  | 5821 | +                   mac_addr_offset = 0;
 | 
		
	
		
			
			|  | 5822 | +        }
 | 
		
	
		
			
			|  | 5823 | +
 | 
		
	
		
			
			|  | 5824 | +        if (mac_addr_offset)
 | 
		
	
		
			
			|  | 5825 | +            hw->laa_is_present = TRUE;
 | 
		
	
		
			
			|  | 5826 | +    }
 | 
		
	
		
			
			|  | 5827 | +
 | 
		
	
		
			
			| 5782 | 5828 |      for (i = 0; i < NODE_ADDRESS_SIZE; i += 2) {
 | 
		
	
		
			
			| 5783 |  | -        offset = i >> 1;
 | 
		
	
		
			
			|  | 5829 | +        offset = mac_addr_offset + (i >> 1);
 | 
		
	
		
			
			| 5784 | 5830 |          if (e1000_read_eeprom(hw, offset, 1, &eeprom_data) < 0) {
 | 
		
	
		
			
			| 5785 | 5831 |              DEBUGOUT("EEPROM Read Error\n");
 | 
		
	
		
			
			| 5786 | 5832 |              return -E1000_ERR_EEPROM;
 | 
		
	
	
		
			
			|  | @@ -5797,7 +5843,8 @@ e1000_read_mac_addr(struct e1000_hw * hw)
 | 
		
	
		
			
			| 5797 | 5843 |      case e1000_82571:
 | 
		
	
		
			
			| 5798 | 5844 |      case e1000_82576:
 | 
		
	
		
			
			| 5799 | 5845 |      case e1000_80003es2lan:
 | 
		
	
		
			
			| 5800 |  | -        if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)
 | 
		
	
		
			
			|  | 5846 | +        if (!mac_addr_offset &&
 | 
		
	
		
			
			|  | 5847 | +            E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)
 | 
		
	
		
			
			| 5801 | 5848 |              hw->perm_mac_addr[5] ^= 0x01;
 | 
		
	
		
			
			| 5802 | 5849 |          break;
 | 
		
	
		
			
			| 5803 | 5850 |      }
 |