Add flow control for 3C905B and newer controllers. Note, these
controllers support RX pause only. Reviewed by: marius
This commit is contained in:
parent
5a7162f62d
commit
1bdd9a8607
@ -555,6 +555,7 @@ xl_miibus_statchg(device_t dev)
|
|||||||
{
|
{
|
||||||
struct xl_softc *sc;
|
struct xl_softc *sc;
|
||||||
struct mii_data *mii;
|
struct mii_data *mii;
|
||||||
|
uint8_t macctl;
|
||||||
|
|
||||||
sc = device_get_softc(dev);
|
sc = device_get_softc(dev);
|
||||||
mii = device_get_softc(sc->xl_miibus);
|
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. */
|
/* Set ASIC's duplex mode to match the PHY. */
|
||||||
XL_SEL_WIN(3);
|
XL_SEL_WIN(3);
|
||||||
if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX)
|
macctl = CSR_READ_1(sc, XL_W3_MAC_CTRL);
|
||||||
CSR_WRITE_1(sc, XL_W3_MAC_CTRL, XL_MACCTRL_DUPLEX);
|
if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) {
|
||||||
else
|
macctl |= XL_MACCTRL_DUPLEX;
|
||||||
CSR_WRITE_1(sc, XL_W3_MAC_CTRL,
|
if (sc->xl_type == XL_TYPE_905B) {
|
||||||
(CSR_READ_1(sc, XL_W3_MAC_CTRL) & ~XL_MACCTRL_DUPLEX));
|
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)
|
if ((sc->xl_flags & XL_FLAG_PHYOK) == 0)
|
||||||
phy = 24;
|
phy = 24;
|
||||||
error = mii_attach(dev, &sc->xl_miibus, ifp, xl_ifmedia_upd,
|
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) {
|
if (error != 0) {
|
||||||
device_printf(dev, "attaching PHYs failed\n");
|
device_printf(dev, "attaching PHYs failed\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
Loading…
Reference in New Issue
Block a user