Esempio n. 1
0
void
ipgphy_status(struct mii_softc *sc)
{
	struct mii_data *mii = sc->mii_pdata;
	uint32_t bmsr, bmcr, stat;

	mii->mii_media_status = IFM_AVALID;
	mii->mii_media_active = IFM_ETHER;

	bmsr = PHY_READ(sc, IPGPHY_MII_BMSR) |
	    PHY_READ(sc, IPGPHY_MII_BMSR);
	if ((bmsr & IPGPHY_BMSR_LINK) != 0)
		mii->mii_media_status |= IFM_ACTIVE;

	bmcr = PHY_READ(sc, IPGPHY_MII_BMCR);
	if ((bmcr & IPGPHY_BMCR_LOOP) != 0)
		mii->mii_media_active |= IFM_LOOP;

	if ((bmcr & IPGPHY_BMCR_AUTOEN) != 0) {
		if ((bmsr & IPGPHY_BMSR_ANEGCOMP) == 0) {
			/* Erg, still trying, I guess... */
			mii->mii_media_active |= IFM_NONE;
			return;
		}
	}

	stat = PHY_READ(sc, STGE_PhyCtrl);
	switch (PC_LinkSpeed(stat)) {
	case PC_LinkSpeed_Down:
		mii->mii_media_active |= IFM_NONE;
		return;
	case PC_LinkSpeed_10:
		mii->mii_media_active |= IFM_10_T;
		break;
	case PC_LinkSpeed_100:
		mii->mii_media_active |= IFM_100_TX;
		break;
	case PC_LinkSpeed_1000:
		mii->mii_media_active |= IFM_1000_T;
		break;
	}

	if ((stat & PC_PhyDuplexStatus) != 0)
		mii->mii_media_active |= mii_phy_flowstatus(sc) | IFM_FDX;
	else
		mii->mii_media_active |= IFM_HDX;

	stat = PHY_READ(sc, IPGPHY_MII_1000SR);
	if ((IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) &&
	    stat & IPGPHY_1000SR_MASTER)
		mii->mii_media_active |= IFM_ETH_MASTER;
}
Esempio n. 2
0
static void
ip1000phy_status(struct mii_softc *sc)
{
	struct mii_data *mii = sc->mii_pdata;
	uint32_t bmsr, bmcr, stat;

	mii->mii_media_status = IFM_AVALID;
	mii->mii_media_active = IFM_ETHER;

	bmsr = PHY_READ(sc, IP1000PHY_MII_BMSR) |
	    PHY_READ(sc, IP1000PHY_MII_BMSR);
	if ((bmsr & IP1000PHY_BMSR_LINK) != 0)
		mii->mii_media_status |= IFM_ACTIVE;

	bmcr = PHY_READ(sc, IP1000PHY_MII_BMCR);
	if ((bmcr & IP1000PHY_BMCR_LOOP) != 0)
		mii->mii_media_active |= IFM_LOOP;

	if ((bmcr & IP1000PHY_BMCR_AUTOEN) != 0) {
		if ((bmsr & IP1000PHY_BMSR_ANEGCOMP) == 0) {
			/* Erg, still trying, I guess... */
			mii->mii_media_active |= IFM_NONE;
			return;
                }
        }

	if (sc->mii_mpd_model == MII_MODEL_xxICPLUS_IP1001) {
		stat = PHY_READ(sc, IP1000PHY_LSR);
		switch (stat & IP1000PHY_LSR_SPEED_MASK) {
		case IP1000PHY_LSR_SPEED_10:
			mii->mii_media_active |= IFM_10_T;
			break;
		case IP1000PHY_LSR_SPEED_100:
			mii->mii_media_active |= IFM_100_TX;
			break;
		case IP1000PHY_LSR_SPEED_1000:
			mii->mii_media_active |= IFM_1000_T;
			break;
		default:
			mii->mii_media_active |= IFM_NONE;
			return;
		}
		if ((stat & IP1000PHY_LSR_FULL_DUPLEX) != 0)
			mii->mii_media_active |= IFM_FDX;
		else
			mii->mii_media_active |= IFM_HDX;
	} else {
		stat = PHY_READ(sc, STGE_PhyCtrl);
		switch (PC_LinkSpeed(stat)) {
		case PC_LinkSpeed_Down:
			mii->mii_media_active |= IFM_NONE;
			return;
		case PC_LinkSpeed_10:
			mii->mii_media_active |= IFM_10_T;
			break;
		case PC_LinkSpeed_100:
			mii->mii_media_active |= IFM_100_TX;
			break;
		case PC_LinkSpeed_1000:
			mii->mii_media_active |= IFM_1000_T;
			break;
		default:
			mii->mii_media_active |= IFM_NONE;
			return;
		}
		if ((stat & PC_PhyDuplexStatus) != 0)
			mii->mii_media_active |= IFM_FDX;
		else
			mii->mii_media_active |= IFM_HDX;
	}

	if ((mii->mii_media_active & IFM_FDX) != 0)
		mii->mii_media_active |= mii_phy_flowstatus(sc);

	if ((mii->mii_media_active & IFM_1000_T) != 0) {
		stat = PHY_READ(sc, IP1000PHY_MII_1000SR);
		if ((stat & IP1000PHY_1000SR_MASTER) != 0)
			mii->mii_media_active |= IFM_ETH_MASTER;
	}
}
Esempio n. 3
0
static void
ip1000phy_status(struct mii_softc *sc)
{
	struct mii_data *mii = sc->mii_pdata;
	uint32_t bmsr, bmcr, stat;
	uint32_t ar, lpar;

	mii->mii_media_status = IFM_AVALID;
	mii->mii_media_active = IFM_ETHER;

	bmsr = PHY_READ(sc, IP1000PHY_MII_BMSR) |
	    PHY_READ(sc, IP1000PHY_MII_BMSR);
	if ((bmsr & IP1000PHY_BMSR_LINK) != 0)
		mii->mii_media_status |= IFM_ACTIVE;

	bmcr = PHY_READ(sc, IP1000PHY_MII_BMCR);
	if ((bmcr & IP1000PHY_BMCR_LOOP) != 0)
		mii->mii_media_active |= IFM_LOOP;

	if ((bmcr & IP1000PHY_BMCR_AUTOEN) != 0) {
		if ((bmsr & IP1000PHY_BMSR_ANEGCOMP) == 0) {
			/* Erg, still trying, I guess... */
			mii->mii_media_active |= IFM_NONE;
			return;
                }
        }

	stat = PHY_READ(sc, STGE_PhyCtrl);
	switch (PC_LinkSpeed(stat)) {
	case PC_LinkSpeed_Down:
		mii->mii_media_active |= IFM_NONE;
		return;
	case PC_LinkSpeed_10:
		mii->mii_media_active |= IFM_10_T;
		break;
	case PC_LinkSpeed_100:
		mii->mii_media_active |= IFM_100_TX;
		break;
	case PC_LinkSpeed_1000:
		mii->mii_media_active |= IFM_1000_T;
		break;
	}
	if ((stat & PC_PhyDuplexStatus) != 0)
		mii->mii_media_active |= IFM_FDX;
	else
		mii->mii_media_active |= IFM_HDX;

	ar = PHY_READ(sc, IP1000PHY_MII_ANAR);
	lpar = PHY_READ(sc, IP1000PHY_MII_ANLPAR);

	/*
	 * 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
	 */
	if ((mii->mii_media_active & IFM_1000_T) != 0) {
		stat = PHY_READ(sc, IP1000PHY_MII_1000SR);
		if ((stat & IP1000PHY_1000SR_MASTER) != 0)
			mii->mii_media_active |= IFM_FLAG2;
	}
}