Module Name:    src
Committed By:   kiyohara
Date:           Sun Dec  6 12:22:17 UTC 2009

Modified Files:
        src/sys/dev/ic: lan9118.c

Log Message:
Split internal phy.  We can use ukphy(4).
  SMSC manufactures some PHY.  This PHY is built into LAN9x18 Family.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/ic/lan9118.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/lan9118.c
diff -u src/sys/dev/ic/lan9118.c:1.10 src/sys/dev/ic/lan9118.c:1.11
--- src/sys/dev/ic/lan9118.c:1.10	Wed Dec  2 12:51:50 2009
+++ src/sys/dev/ic/lan9118.c	Sun Dec  6 12:22:17 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: lan9118.c,v 1.10 2009/12/02 12:51:50 kiyohara Exp $	*/
+/*	$NetBSD: lan9118.c,v 1.11 2009/12/06 12:22:17 kiyohara Exp $	*/
 /*
  * Copyright (c) 2008 KIYOHARA Takashi
  * All rights reserved.
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lan9118.c,v 1.10 2009/12/02 12:51:50 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lan9118.c,v 1.11 2009/12/06 12:22:17 kiyohara Exp $");
 
 /*
  * The LAN9118 Family
@@ -233,11 +233,17 @@
 
 	ifmedia_init(&sc->sc_mii.mii_media, 0,
 	    lan9118_ifm_change, lan9118_ifm_status);
+	sc->sc_mii.mii_ifp = ifp;
+	sc->sc_mii.mii_readreg = lan9118_miibus_readreg;
+	sc->sc_mii.mii_writereg = lan9118_miibus_writereg;
+	sc->sc_mii.mii_statchg = lan9118_miibus_statchg;
+
 	/*
 	 * Number of instance of Internal PHY is always 0.  External PHY
 	 * number that above.
 	 */
-	sc->sc_mii.mii_instance++;
+	mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1, MII_OFFSET_ANY, 0);
+
 	if (sc->sc_id == LAN9118_ID_9115 || sc->sc_id == LAN9118_ID_9117 ||
 	    sc->sc_id == LAN9218_ID_9215 || sc->sc_id == LAN9218_ID_9217) {
 		if (bus_space_read_4(sc->sc_iot, sc->sc_ioh, LAN9118_HW_CFG) &
@@ -248,10 +254,6 @@
 			 */
 			DPRINTFN(1, ("%s: detect External PHY\n", __func__));
 
-			sc->sc_mii.mii_readreg = lan9118_miibus_readreg;
-			sc->sc_mii.mii_writereg = lan9118_miibus_writereg;
-			sc->sc_mii.mii_statchg = lan9118_miibus_statchg;
-
 			/* Switch MII and SMI */
 			bus_space_write_4(sc->sc_iot, sc->sc_ioh,
 			    LAN9118_HW_CFG,
@@ -274,17 +276,7 @@
 				    i, MII_OFFSET_ANY, 0);
 		}
 	}
-	ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | IFM_MANUAL, 0, NULL);
-	ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | IFM_10_T, 0, NULL);
-	ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | IFM_10_T | IFM_FDX, 0,
-	    NULL);
-	ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | IFM_100_TX, 0, NULL);
-	ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | IFM_100_TX | IFM_FDX, 0,
-	    NULL);
-	ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO, 0, NULL);
 
-	aprint_normal_dev(sc->sc_dev,
-	    "10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto\n");
 	ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO);
 
 	/* Attach the interface. */
@@ -703,8 +695,7 @@
 	struct mii_data *mii = &sc->sc_mii;
 	struct ifmedia *ifm = &mii->mii_media;
 	struct ifmedia_entry *ife = ifm->ifm_cur;
-	uint32_t pmt_ctrl, bmc, bms, ana, anlpa;
-	int i;
+	uint32_t pmt_ctrl;
 
 	DPRINTFN(3, ("%s: ifm inst %d\n", __func__, IFM_INST(ife->ifm_media)));
 
@@ -741,80 +732,7 @@
 	while (bus_space_read_4(sc->sc_iot, sc->sc_ioh, LAN9118_PMT_CTRL) &
 	    LAN9118_PMT_CTRL_PHY_RST);
 
-	if (IFM_SUBTYPE(ifm->ifm_media) == IFM_AUTO) {
-		bmc = BMCR_AUTOEN | BMCR_STARTNEG;
-		bms = lan9118_mii_readreg(sc, LAN9118_IPHY_ADDR, MII_BMSR);
-		ana = ANAR_FC | BMSR_MEDIA_TO_ANAR(bms) | ANAR_CSMA;
-
-		lan9118_mii_writereg(sc, LAN9118_IPHY_ADDR, MII_ANAR, ana);
-		lan9118_mii_writereg(sc, LAN9118_IPHY_ADDR, MII_BMCR, bmc);
-
-		/* Wait 5sec for it to complete. */
-		for (i = 0; i < 5000; i++) {
-			if (lan9118_mii_readreg(sc, LAN9118_IPHY_ADDR, MII_BMSR)
-								& BMSR_ACOMP)
-				break;
-			delay(1000);
-		}
-		if (i == 5000) {
-			aprint_error_ifnet(ifp, "Auto-Negotiate failed\n");
-			return EIO;
-		}
-	} else {
-		switch (IFM_SUBTYPE(ifm->ifm_media)) {
-		case IFM_10_T:
-			bmc = BMCR_S10;
-			ana = ANAR_CSMA | ANAR_10;
-			break;
-
-		case IFM_100_TX:
-			bmc = BMCR_S100;
-			if (ifm->ifm_media & IFM_FDX)
-				bmc |= BMCR_FDX;
-			ana = ANAR_CSMA | ANAR_TX;
-			break;
-
-		case IFM_NONE:
-			bmc = BMCR_PDOWN;
-			break;
-
-		default:
-			return EINVAL;
-		}
-		if (ifm->ifm_media & IFM_FDX)
-			bmc |= BMCR_FDX;
-		if (ifm->ifm_media & IFM_FLOW)
-			ana |= ANAR_FC;
-
-		lan9118_mii_writereg(sc, LAN9118_IPHY_ADDR, MII_ANAR, ana);
-		lan9118_mii_writereg(sc, LAN9118_IPHY_ADDR, MII_BMCR, bmc);
-	}
-
-	bms = lan9118_mii_readreg(sc, LAN9118_IPHY_ADDR, MII_BMSR);
-	if (bms & BMSR_LINK) {
-		mii->mii_media_status |= IFM_ACTIVE;
-
-		bmc = lan9118_mii_readreg(sc, LAN9118_IPHY_ADDR, MII_BMCR);
-		if (bmc & BMCR_AUTOEN) {
-			anlpa = lan9118_mii_readreg(sc, LAN9118_IPHY_ADDR,
-			    MII_ANLPAR);
-			if (anlpa & ANLPAR_TX_FD)
-				mii->mii_media_active |= IFM_100_TX | IFM_FDX;
-			else if (anlpa & ANLPAR_T4)
-				mii->mii_media_active |= IFM_100_T4;
-			else if (anlpa & ANLPAR_TX)
-				mii->mii_media_active |= IFM_100_TX;
-			else if (anlpa & ANLPAR_10_FD)
-				mii->mii_media_active |= IFM_10_T|IFM_FDX;
-			else if (anlpa & ANLPAR_10)
-				mii->mii_media_active |= IFM_10_T;
-			else
-				mii->mii_media_active |= IFM_NONE;
-		} else
-			mii->mii_media_active = ife->ifm_media;
-
-		lan9118_miibus_statchg(sc->sc_dev);
-	}
+	mii_mediachg(&sc->sc_mii);
 	return 0;
 }
 
@@ -823,43 +741,12 @@
 {
 	struct lan9118_softc *sc = ifp->if_softc;
 	struct mii_data *mii = &sc->sc_mii;
-	struct ifmedia *ifm = &mii->mii_media;
-	struct ifmedia_entry *ife = ifm->ifm_cur;
-	uint32_t bms, physcs;
 
 	DPRINTFN(3, ("%s\n", __func__));
 
-	if (IFM_INST(ife->ifm_media) != 0) {
-		mii_pollstat(mii);
-		ifmr->ifm_active = mii->mii_media_active;
-		ifmr->ifm_status = mii->mii_media_status;
-		return;
-	}
-
-	ifmr->ifm_active = IFM_ETHER;
-	ifmr->ifm_status = IFM_AVALID;
-
-	bms = lan9118_mii_readreg(sc, LAN9118_IPHY_ADDR, MII_BMSR);
-	if (!(bms & BMSR_LINK)) {
-		/* link is down */
-		ifmr->ifm_active |= IFM_NONE;
-		return;
-	}
-	ifmr->ifm_status |= IFM_ACTIVE;
-	physcs = lan9118_mii_readreg(sc, LAN9118_IPHY_ADDR, LAN9118_PHYSCSR);
-	if (IFM_SUBTYPE(ifm->ifm_media) == IFM_AUTO) {
-		if (!(physcs & LAN9118_PHYSCSR_AUTODONE)) {
-			/* negotiation in progress */
-			ifmr->ifm_active |= IFM_NONE;
-			return;
-		}
-	}
-	if (physcs & LAN9118_PHYSCSR_SI_10)
-		ifmr->ifm_active |= IFM_10_T;
-	if (physcs & LAN9118_PHYSCSR_SI_100)
-		ifmr->ifm_active |= IFM_100_TX;
-	if (physcs & LAN9118_PHYSCSR_SI_FDX)
-		ifmr->ifm_active |= IFM_FDX;
+	mii_pollstat(mii);
+	ifmr->ifm_active = mii->mii_media_active;
+	ifmr->ifm_status = mii->mii_media_status;
 }
 
 

Reply via email to