Module Name: src
Committed By: kochi
Date: Sun Jan 9 00:12:45 UTC 2011
Modified Files:
src/sys/dev/pci: if_jme.c
Log Message:
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@
To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/pci/if_jme.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/if_jme.c
diff -u src/sys/dev/pci/if_jme.c:1.15 src/sys/dev/pci/if_jme.c:1.16
--- src/sys/dev/pci/if_jme.c:1.15 Sat Nov 13 13:52:06 2010
+++ src/sys/dev/pci/if_jme.c Sun Jan 9 00:12:45 2011
@@ -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; */
}
@@ -2000,6 +2001,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);
+}
+
/*
* Set up sysctl(3) MIB, hw.jme.* - Individual controllers will be
* set up in jme_pci_attach()