Sun Jan 9 00:12:45 2011 UTC ()
Try reading MAC addr from register if it fails to read from EEPROM.
Copied from FreeBSD driver.

Without this my JMC261 doesn't get MAC address properly.

OK'ed by bouyer@


(kochi)
diff -r1.15 -r1.16 src/sys/dev/pci/if_jme.c

cvs diff -r1.15 -r1.16 src/sys/dev/pci/if_jme.c (expand / switch to context diff)
--- src/sys/dev/pci/if_jme.c 2010/11/13 13:52:06 1.15
+++ src/sys/dev/pci/if_jme.c 2011/01/09 00:12:45 1.16
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_jme.c,v 1.15 2010/11/13 13:52:06 uebayasi Exp $	*/
+/*	$NetBSD: if_jme.c,v 1.16 2011/01/09 00:12:45 kochi Exp $	*/
 
 /*
  * Copyright (c) 2008 Manuel Bouyer.  All rights reserved.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_jme.c,v 1.15 2010/11/13 13:52:06 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_jme.c,v 1.16 2011/01/09 00:12:45 kochi Exp $");
 
 
 #include <sys/param.h>
@@ -215,6 +215,7 @@
 
 static int jme_eeprom_read_byte(struct jme_softc *, uint8_t, uint8_t *);
 static int jme_eeprom_macaddr(struct jme_softc *);
+static int jme_reg_macaddr(struct jme_softc *);
 
 #define JME_TIMEOUT		1000
 #define JME_PHY_TIMEOUT		1000
@@ -384,7 +385,7 @@
 	jme_reset(sc);
 
 	/* read mac addr */
-	if (jme_eeprom_macaddr(sc)) {
+	if (jme_eeprom_macaddr(sc) && jme_reg_macaddr(sc)) {
 		aprint_error_dev(self, "error reading Ethernet address\n");
 		/* return; */
 	}
@@ -1998,6 +1999,28 @@
 	}
 
 	return (ENOENT);
+}
+
+static int
+jme_reg_macaddr(struct jme_softc *sc)
+{
+	uint32_t par0, par1;
+
+	par0 = bus_space_read_4(sc->jme_bt_mac, sc->jme_bh_mac, JME_PAR0);
+	par1 = bus_space_read_4(sc->jme_bt_mac, sc->jme_bh_mac, JME_PAR1);
+	par1 &= 0xffff;
+	if ((par0 == 0 && par1 == 0) ||
+	    (par0 == 0xffffffff && par1 == 0xffff)) {
+		return (ENOENT);
+	} else {
+		sc->jme_enaddr[0] = (par0 >> 0) & 0xff;
+		sc->jme_enaddr[1] = (par0 >> 8) & 0xff;
+		sc->jme_enaddr[2] = (par0 >> 16) & 0xff;
+		sc->jme_enaddr[3] = (par0 >> 24) & 0xff;
+		sc->jme_enaddr[4] = (par1 >> 0) & 0xff;
+		sc->jme_enaddr[5] = (par1 >> 8) & 0xff;
+	}
+	return (0);
 }
 
 /*