Deleted Added
full compact
30c30
< __FBSDID("$FreeBSD: head/sys/dev/mii/ip1000phy.c 213893 2010-10-15 14:52:11Z marius $");
---
> __FBSDID("$FreeBSD: head/sys/dev/mii/ip1000phy.c 215297 2010-11-14 13:26:10Z marius $");
87c87
< static int ip1000phy_mii_phy_auto(struct mii_softc *);
---
> static int ip1000phy_mii_phy_auto(struct mii_softc *, int);
123c123
< sc->mii_flags |= MIIF_NOISOLATE;
---
> sc->mii_flags |= MIIF_NOISOLATE | MIIF_NOMANPAUSE;
166c166
< (void)ip1000phy_mii_phy_auto(sc);
---
> (void)ip1000phy_mii_phy_auto(sc, ife->ifm_media);
168d167
< break;
201a201,203
> gig |= IP1000PHY_1000CR_MASTER | IP1000PHY_1000CR_MANUAL;
> if ((ife->ifm_media & IFM_ETH_MASTER) != 0)
> gig |= IP1000PHY_1000CR_MMASTER;
203d204
< PHY_WRITE(sc, IP1000PHY_MII_BMCR, speed);
205,222d205
< /*
< * When setting the link manually, one side must
< * be the master and the other the slave. However
< * ifmedia doesn't give us a good way to specify
< * this, so we fake it by using one of the LINK
< * flags. If LINK0 is set, we program the PHY to
< * be a master, otherwise it's a slave.
< */
< if ((mii->mii_ifp->if_flags & IFF_LINK0))
< PHY_WRITE(sc, IP1000PHY_MII_1000CR, gig |
< IP1000PHY_1000CR_MASTER |
< IP1000PHY_1000CR_MMASTER |
< IP1000PHY_1000CR_MANUAL);
< else
< PHY_WRITE(sc, IP1000PHY_MII_1000CR, gig |
< IP1000PHY_1000CR_MASTER |
< IP1000PHY_1000CR_MANUAL);
<
261c244
< ip1000phy_mii_phy_auto(sc);
---
> ip1000phy_mii_phy_auto(sc, ife->ifm_media);
279d261
< uint32_t ar, lpar;
348,349c330,331
< ar = PHY_READ(sc, IP1000PHY_MII_ANAR);
< lpar = PHY_READ(sc, IP1000PHY_MII_ANLPAR);
---
> if ((mii->mii_media_active & IFM_FDX) != 0)
> mii->mii_media_active |= mii_phy_flowstatus(sc);
351,368d332
< /*
< * FLAG0 : Rx flow-control
< * FLAG1 : Tx flow-control
< */
< if ((ar & IP1000PHY_ANAR_PAUSE) && (lpar & IP1000PHY_ANLPAR_PAUSE))
< mii->mii_media_active |= IFM_FLAG0 | IFM_FLAG1;
< else if (!(ar & IP1000PHY_ANAR_PAUSE) && (ar & IP1000PHY_ANAR_APAUSE) &&
< (lpar & IP1000PHY_ANLPAR_PAUSE) && (lpar & IP1000PHY_ANLPAR_APAUSE))
< mii->mii_media_active |= IFM_FLAG1;
< else if ((ar & IP1000PHY_ANAR_PAUSE) && (ar & IP1000PHY_ANAR_APAUSE) &&
< !(lpar & IP1000PHY_ANLPAR_PAUSE) &&
< (lpar & IP1000PHY_ANLPAR_APAUSE)) {
< mii->mii_media_active |= IFM_FLAG0;
< }
<
< /*
< * FLAG2 : local PHY resolved to MASTER
< */
372c336
< mii->mii_media_active |= IFM_FLAG2;
---
> mii->mii_media_active |= IFM_ETH_MASTER;
377c341
< ip1000phy_mii_phy_auto(struct mii_softc *sc)
---
> ip1000phy_mii_phy_auto(struct mii_softc *sc, int media)
389,390c353,355
< IP1000PHY_ANAR_100TX | IP1000PHY_ANAR_100TX_FDX |
< IP1000PHY_ANAR_PAUSE | IP1000PHY_ANAR_APAUSE;
---
> IP1000PHY_ANAR_100TX | IP1000PHY_ANAR_100TX_FDX;
> if ((media & IFM_FLOW) != 0 || (sc->mii_flags & MIIF_FORCEPAUSE) != 0)
> reg |= IP1000PHY_ANAR_PAUSE | IP1000PHY_ANAR_APAUSE;