Module Name: src Committed By: bouyer Date: Sun Jan 16 12:51:59 UTC 2011
Modified Files: src/sys/dev/pci [netbsd-5]: if_jme.c Log Message: Pull up following revision(s) (requested by kochi in ticket #1525): sys/dev/pci/if_jme.c: revision 1.16 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.4.6.2 -r1.4.6.3 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.4.6.2 src/sys/dev/pci/if_jme.c:1.4.6.3 --- src/sys/dev/pci/if_jme.c:1.4.6.2 Mon Feb 2 20:50:11 2009 +++ src/sys/dev/pci/if_jme.c Sun Jan 16 12:51:59 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: if_jme.c,v 1.4.6.2 2009/02/02 20:50:11 snj Exp $ */ +/* $NetBSD: if_jme.c,v 1.4.6.3 2011/01/16 12:51:59 bouyer Exp $ */ /* * Copyright (c) 2008 Manuel Bouyer. All rights reserved. @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_jme.c,v 1.4.6.2 2009/02/02 20:50:11 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_jme.c,v 1.4.6.3 2011/01/16 12:51:59 bouyer Exp $"); #include <sys/param.h> @@ -223,6 +223,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 @@ -392,7 +393,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; */ } @@ -2005,6 +2006,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()