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 */
 

Reply via email to