kirby@ reported [0] back in February that the gem(4) on his PowerMac G5 wasn't working. Apparently the logic to determine which PHY to use doesn't work with these machines when the firmware has powered down the chip. At least that's what FreeBSD and linux code say and it seems to correspond to the behavior I observed: when the NIC is used for netbooting the correct PHY is attached.
Diff below is taken from FreeBSD and force the use of the internal PHY on Apple models. This makes the gem(4) on my PowerMac G5 usable even if I don't netboot. I also verified that it does not introduce a regression on my G4. Ok? [0] http://marc.info/?l=openbsd-misc&m=136074529112590&w=2 Index: gem.c =================================================================== RCS file: /cvs/src/sys/dev/ic/gem.c,v retrieving revision 1.98 diff -u -p -r1.98 gem.c --- gem.c 1 Dec 2012 10:04:58 -0000 1.98 +++ gem.c 7 Mar 2013 16:52:31 -0000 @@ -275,11 +275,14 @@ gem_config(struct gem_softc *sc) MII_OFFSET_ANY, mii_flags); } - /* + /* * Fall back on an internal PHY if no external PHY was found. + * Note that with Apple (K2) GMACs GEM_MIF_CONFIG_MDI0 can't be + * trusted when the firmware has powered down the chip */ child = LIST_FIRST(&mii->mii_phys); - if (child == NULL && sc->sc_mif_config & GEM_MIF_CONFIG_MDI0) { + if (child == NULL && + (sc->sc_mif_config & GEM_MIF_CONFIG_MDI0 || GEM_IS_APPLE(sc))) { sc->sc_mif_config &= ~GEM_MIF_CONFIG_PHY_SEL; bus_space_write_4(sc->sc_bustag, sc->sc_h1, GEM_MIF_CONFIG, sc->sc_mif_config); Index: gemvar.h =================================================================== RCS file: /cvs/src/sys/dev/ic/gemvar.h,v retrieving revision 1.26 diff -u -p -r1.26 gemvar.h --- gemvar.h 20 Sep 2010 07:40:41 -0000 1.26 +++ gemvar.h 7 Mar 2013 16:50:39 -0000 @@ -151,6 +151,10 @@ struct gem_softc { #define GEM_APPLE_GMAC 3 /* Apple GMAC */ #define GEM_APPLE_K2_GMAC 4 /* Apple K2 GMAC */ +#define GEM_IS_APPLE(sc) \ + ((sc)->sc_variant == GEM_APPLE_GMAC || \ + (sc)->sc_variant == GEM_APPLE_K2_GMAC) + u_int sc_flags; /* */ #define GEM_GIGABIT 0x0001 /* has a gigabit PHY */