Please test the following diff which adds flow control support
with any gem(4) adapter.
Please provide a dmesg and "ifconfig gemX" output.
Index: gem.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/gem.c,v
retrieving revision 1.92
diff -u -p -r1.92 gem.c
--- gem.c 18 Jul 2009 14:42:47 -0000 1.92
+++ gem.c 25 Jul 2009 10:22:23 -0000
@@ -134,7 +134,7 @@ gem_config(struct gem_softc *sc)
struct ifnet *ifp = &sc->sc_arpcom.ac_if;
struct mii_data *mii = &sc->sc_mii;
struct mii_softc *child;
- int i, error, phyad;
+ int i, error, mii_flags, phyad;
struct ifmedia_entry *ifm;
/* Make sure the chip is stopped. */
@@ -248,6 +248,8 @@ gem_config(struct gem_softc *sc)
gem_mifinit(sc);
+ mii_flags = MIIF_DOPAUSE;
+
/*
* Look for an external PHY.
*/
@@ -266,7 +268,7 @@ gem_config(struct gem_softc *sc)
}
mii_attach(&sc->sc_dev, mii, 0xffffffff, phyad,
- MII_OFFSET_ANY, 0);
+ MII_OFFSET_ANY, mii_flags);
}
/*
@@ -292,7 +294,7 @@ gem_config(struct gem_softc *sc)
}
mii_attach(&sc->sc_dev, mii, 0xffffffff, phyad,
- MII_OFFSET_ANY, 0);
+ MII_OFFSET_ANY, mii_flags);
}
/*
@@ -314,8 +316,10 @@ gem_config(struct gem_softc *sc)
mii->mii_readreg = gem_pcs_readreg;
mii->mii_writereg = gem_pcs_writereg;
+ mii_flags |= MIIF_NOISOLATE;
+
mii_attach(&sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY,
- MII_OFFSET_ANY, MIIF_NOISOLATE);
+ MII_OFFSET_ANY, mii_flags);
}
child = LIST_FIRST(&mii->mii_phys);
@@ -873,8 +877,8 @@ gem_init_regs(struct gem_softc *sc)
bus_space_write_4(t, h, GEM_MAC_RX_CRC_ERR_CNT, 0);
bus_space_write_4(t, h, GEM_MAC_RX_CODE_VIOL, 0);
- /* Un-pause stuff */
- bus_space_write_4(t, h, GEM_MAC_SEND_PAUSE_CMD, 0);
+ /* Set XOFF PAUSE time */
+ bus_space_write_4(t, h, GEM_MAC_SEND_PAUSE_CMD, 0x1BF0);
/*
* Set the internal arbitration to "infinite" bursts of the
@@ -1331,6 +1335,17 @@ gem_mii_statchg(struct device *dev)
v &= ~GEM_MAC_XIF_GMII_MODE;
}
bus_space_write_4(t, mac, GEM_MAC_XIF_CONFIG, v);
+
+ /*
+ * 802.3x flow control
+ */
+ v = bus_space_read_4(t, mac, GEM_MAC_CONTROL_CONFIG);
+ v &= ~(GEM_MAC_CC_RX_PAUSE | GEM_MAC_CC_TX_PAUSE);
+ if ((IFM_OPTIONS(sc->sc_mii.mii_media_active) & IFM_ETH_RXPAUSE) != 0)
+ v |= GEM_MAC_CC_RX_PAUSE;
+ if ((IFM_OPTIONS(sc->sc_mii.mii_media_active) & IFM_ETH_TXPAUSE) != 0)
+ v |= GEM_MAC_CC_TX_PAUSE;
+ bus_space_write_4(t, mac, GEM_MAC_CONTROL_CONFIG, v);
}
int
--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.