]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/r8169.c
r8169: checks against wrong mac addresse init
[linux-2.6-omap-h63xx.git] / drivers / net / r8169.c
index cd9a21581f569b93fcfa7a8318a35a191dc8cc11..2b4e975770f3a950d982f4f084d4ff81f8c94301 100644 (file)
@@ -81,6 +81,10 @@ static const int multicast_filter_limit = 32;
 #define RTL8169_TX_TIMEOUT     (6*HZ)
 #define RTL8169_PHY_TIMEOUT    (10*HZ)
 
+#define RTL_EEPROM_SIG         cpu_to_le32(0x8129)
+#define RTL_EEPROM_SIG_MASK    cpu_to_le32(0xffff)
+#define RTL_EEPROM_SIG_ADDR    0x0000
+
 /* write/read MMIO register */
 #define RTL_W8(reg, val8)      writeb ((val8), ioaddr + (reg))
 #define RTL_W16(reg, val16)    writew ((val16), ioaddr + (reg))
@@ -1944,9 +1948,10 @@ static void rtl_init_mac_address(struct rtl8169_private *tp,
                                 void __iomem *ioaddr)
 {
        struct pci_dev *pdev = tp->pci_dev;
-       u8 cfg1;
        int vpd_cap;
+       __le32 sig;
        u8 mac[8];
+       u8 cfg1;
 
        cfg1 = RTL_R8(Config1);
        if (!(cfg1  & VPD)) {
@@ -1961,7 +1966,16 @@ static void rtl_init_mac_address(struct rtl8169_private *tp,
        if (!vpd_cap)
                return;
 
-       /* MAC address is stored in EEPROM at offset 0x0e
+       if (rtl_eeprom_read(pdev, vpd_cap, RTL_EEPROM_SIG_ADDR, &sig) < 0)
+               return;
+
+       if ((sig & RTL_EEPROM_SIG_MASK) != RTL_EEPROM_SIG) {
+               dev_info(&pdev->dev, "Missing EEPROM signature: %08x\n", sig);
+               return;
+       }
+
+       /*
+        * MAC address is stored in EEPROM at offset 0x0e
         * Realtek says: "The VPD address does not have to be a DWORD-aligned
         * address as defined in the PCI 2.2 Specifications, but the VPD data
         * 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,
                         print_mac(buf, mac));
        }
 
-       /* Write MAC address */
-       rtl_rar_set(tp, mac);
+       if (is_valid_ether_addr(mac))
+               rtl_rar_set(tp, mac);
 }
 
 static int __devinit