summaryrefslogtreecommitdiffstats
path: root/sys/dev/xl
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2010-11-14 23:53:13 +0000
committeryongari <yongari@FreeBSD.org>2010-11-14 23:53:13 +0000
commit1bdd9a86072258a0f0ab29b2cc1cf9e59b01310e (patch)
treead9bba3f889143441ba5218c5df8d741700f597a /sys/dev/xl
parent5a7162f62d8d21d7ec6fa137495afbab65b3688a (diff)
downloadFreeBSD-src-1bdd9a86072258a0f0ab29b2cc1cf9e59b01310e.zip
FreeBSD-src-1bdd9a86072258a0f0ab29b2cc1cf9e59b01310e.tar.gz
Add flow control for 3C905B and newer controllers. Note, these
controllers support RX pause only. Reviewed by: marius
Diffstat (limited to 'sys/dev/xl')
-rw-r--r--sys/dev/xl/if_xl.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/sys/dev/xl/if_xl.c b/sys/dev/xl/if_xl.c
index d99109f..ad54d79 100644
--- a/sys/dev/xl/if_xl.c
+++ b/sys/dev/xl/if_xl.c
@@ -555,6 +555,7 @@ xl_miibus_statchg(device_t dev)
{
struct xl_softc *sc;
struct mii_data *mii;
+ uint8_t macctl;
sc = device_get_softc(dev);
mii = device_get_softc(sc->xl_miibus);
@@ -563,11 +564,22 @@ xl_miibus_statchg(device_t dev)
/* Set ASIC's duplex mode to match the PHY. */
XL_SEL_WIN(3);
- if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX)
- CSR_WRITE_1(sc, XL_W3_MAC_CTRL, XL_MACCTRL_DUPLEX);
- else
- CSR_WRITE_1(sc, XL_W3_MAC_CTRL,
- (CSR_READ_1(sc, XL_W3_MAC_CTRL) & ~XL_MACCTRL_DUPLEX));
+ macctl = CSR_READ_1(sc, XL_W3_MAC_CTRL);
+ if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) {
+ macctl |= XL_MACCTRL_DUPLEX;
+ if (sc->xl_type == XL_TYPE_905B) {
+ if ((IFM_OPTIONS(mii->mii_media_active) &
+ IFM_ETH_RXPAUSE) != 0)
+ macctl |= XL_MACCTRL_FLOW_CONTROL_ENB;
+ else
+ macctl &= ~XL_MACCTRL_FLOW_CONTROL_ENB;
+ }
+ } else {
+ macctl &= ~XL_MACCTRL_DUPLEX;
+ if (sc->xl_type == XL_TYPE_905B)
+ macctl &= ~XL_MACCTRL_FLOW_CONTROL_ENB;
+ }
+ CSR_WRITE_1(sc, XL_W3_MAC_CTRL, macctl);
}
/*
@@ -1464,7 +1476,8 @@ xl_attach(device_t dev)
if ((sc->xl_flags & XL_FLAG_PHYOK) == 0)
phy = 24;
error = mii_attach(dev, &sc->xl_miibus, ifp, xl_ifmedia_upd,
- xl_ifmedia_sts, BMSR_DEFCAPMASK, phy, MII_OFFSET_ANY, 0);
+ xl_ifmedia_sts, BMSR_DEFCAPMASK, phy, MII_OFFSET_ANY,
+ sc->xl_type == XL_TYPE_905B ? MIIF_DOPAUSE : 0);
if (error != 0) {
device_printf(dev, "attaching PHYs failed\n");
goto fail;
OpenPOWER on IntegriCloud