aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/r8169.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index cd9a21581f56..2b4e975770f3 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -81,6 +81,10 @@ static const int multicast_filter_limit = 32;
81#define RTL8169_TX_TIMEOUT (6*HZ) 81#define RTL8169_TX_TIMEOUT (6*HZ)
82#define RTL8169_PHY_TIMEOUT (10*HZ) 82#define RTL8169_PHY_TIMEOUT (10*HZ)
83 83
84#define RTL_EEPROM_SIG cpu_to_le32(0x8129)
85#define RTL_EEPROM_SIG_MASK cpu_to_le32(0xffff)
86#define RTL_EEPROM_SIG_ADDR 0x0000
87
84/* write/read MMIO register */ 88/* write/read MMIO register */
85#define RTL_W8(reg, val8) writeb ((val8), ioaddr + (reg)) 89#define RTL_W8(reg, val8) writeb ((val8), ioaddr + (reg))
86#define RTL_W16(reg, val16) writew ((val16), ioaddr + (reg)) 90#define RTL_W16(reg, val16) writew ((val16), ioaddr + (reg))
@@ -1944,9 +1948,10 @@ static void rtl_init_mac_address(struct rtl8169_private *tp,
1944 void __iomem *ioaddr) 1948 void __iomem *ioaddr)
1945{ 1949{
1946 struct pci_dev *pdev = tp->pci_dev; 1950 struct pci_dev *pdev = tp->pci_dev;
1947 u8 cfg1;
1948 int vpd_cap; 1951 int vpd_cap;
1952 __le32 sig;
1949 u8 mac[8]; 1953 u8 mac[8];
1954 u8 cfg1;
1950 1955
1951 cfg1 = RTL_R8(Config1); 1956 cfg1 = RTL_R8(Config1);
1952 if (!(cfg1 & VPD)) { 1957 if (!(cfg1 & VPD)) {
@@ -1961,7 +1966,16 @@ static void rtl_init_mac_address(struct rtl8169_private *tp,
1961 if (!vpd_cap) 1966 if (!vpd_cap)
1962 return; 1967 return;
1963 1968
1964 /* MAC address is stored in EEPROM at offset 0x0e 1969 if (rtl_eeprom_read(pdev, vpd_cap, RTL_EEPROM_SIG_ADDR, &sig) < 0)
1970 return;
1971
1972 if ((sig & RTL_EEPROM_SIG_MASK) != RTL_EEPROM_SIG) {
1973 dev_info(&pdev->dev, "Missing EEPROM signature: %08x\n", sig);
1974 return;
1975 }
1976
1977 /*
1978 * MAC address is stored in EEPROM at offset 0x0e
1965 * Realtek says: "The VPD address does not have to be a DWORD-aligned 1979 * Realtek says: "The VPD address does not have to be a DWORD-aligned
1966 * address as defined in the PCI 2.2 Specifications, but the VPD data 1980 * address as defined in the PCI 2.2 Specifications, but the VPD data
1967 * is always consecutive 4-byte data starting from the VPD address 1981 * is always consecutive 4-byte data starting from the VPD address
@@ -1983,8 +1997,8 @@ static void rtl_init_mac_address(struct rtl8169_private *tp,
1983 print_mac(buf, mac)); 1997 print_mac(buf, mac));
1984 } 1998 }
1985 1999
1986 /* Write MAC address */ 2000 if (is_valid_ether_addr(mac))
1987 rtl_rar_set(tp, mac); 2001 rtl_rar_set(tp, mac);
1988} 2002}
1989 2003
1990static int __devinit 2004static int __devinit