Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Aug 2006 18:30:18 +0900
From:      Pyun YongHyeon <pyunyh@gmail.com>
To:        Jelte Jansen <jelte@NLnetLabs.nl>
Cc:        freebsd-current@freebsd.org
Subject:   Re: re(4) link goes down when manually setting media type
Message-ID:  <20060810093018.GB17452@cdnetworks.co.kr>
In-Reply-To: <44D84620.9020800@NLnetLabs.nl>
References:  <44D84620.9020800@NLnetLabs.nl>

next in thread | previous in thread | raw e-mail | index | archive | help

--TRYliJ5NKNqkz5bu
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Tue, Aug 08, 2006 at 10:06:56AM +0200, Jelte Jansen wrote:
 > -----BEGIN PGP SIGNED MESSAGE-----
 > Hash: SHA1
 > 
 > 
 > Hi,
 > 
 > i have a problem with the if_re driver for my gigabit network card
 > (RTL8196). When i set it to autoselect, it works fine,
 > although with apparently random performance problems. When i try to set
 > it to a fixed media type (both 100baseTX and 1000baseTX) the link goes
 > down, and stays down until i set it to autoselect again. It does seem to
 > work when setting it to 10baset/utp.
 > 
 > This happens with the driver in -CURRENT (__FBSDID("$FreeBSD:
 > src/sys/dev/re/if_re.c,v 1.72 2006/08/03 00:15:19 yongari Ex)
 > 
 > I have seen in the issue tracker and on the -current and -stable that
 > there were other problems with the re(4) driver, but did not see this
 > one. Any ideas?
 > 

Due to the poor PHY documentation from RealTek I can't sure but
I guess the RealTek PHY needs to set RGEPHY_BMCR_AUTOEN bit of
RGEPHY_MII_BMCR register and proper ANAR register setting for
manual media type selection.
How about attached patch?

-- 
Regards,
Pyun YongHyeon

--TRYliJ5NKNqkz5bu
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="rgephy.diff"

Index: rgephy.c
===================================================================
RCS file: /pool/ncvs/src/sys/dev/mii/rgephy.c,v
retrieving revision 1.10
diff -u -r1.10 rgephy.c
--- rgephy.c	3 Jul 2006 02:53:39 -0000	1.10
+++ rgephy.c	10 Aug 2006 09:28:26 -0000
@@ -166,7 +166,7 @@
 rgephy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
 	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
-	int reg, speed, gig;
+	int reg, speed, gig, anar;
 
 	switch (cmd) {
 	case MII_POLLSTAT:
@@ -196,6 +196,10 @@
 
 		rgephy_reset(sc);	/* XXX hardware bug work-around */
 
+		anar = PHY_READ(sc, RGEPHY_MII_ANAR);
+		anar &= ~(RGEPHY_ANAR_TX_FD | RGEPHY_ANAR_TX |
+		    RGEPHY_ANAR_10_FD | RGEPHY_ANAR_10);
+
 		switch (IFM_SUBTYPE(ife->ifm_media)) {
 		case IFM_AUTO:
 #ifdef foo
@@ -212,28 +216,30 @@
 			goto setit;
 		case IFM_100_TX:
 			speed = RGEPHY_S100;
+			anar |= RGEPHY_ANAR_TX_FD | RGEPHY_ANAR_TX;
 			goto setit;
 		case IFM_10_T:
 			speed = RGEPHY_S10;
+			anar |= RGEPHY_ANAR_10_FD | RGEPHY_ANAR_10;
 setit:
 			rgephy_loop(sc);
 			if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) {
 				speed |= RGEPHY_BMCR_FDX;
 				gig = RGEPHY_1000CTL_AFD;
+				anar &= ~(RGEPHY_ANAR_TX | RGEPHY_ANAR_10);
 			} else {
 				gig = RGEPHY_1000CTL_AHD;
+				anar &=
+				    ~(RGEPHY_ANAR_TX_FD | RGEPHY_ANAR_10_FD);
 			}
 
-			PHY_WRITE(sc, RGEPHY_MII_1000CTL, 0);
-			PHY_WRITE(sc, RGEPHY_MII_BMCR, speed);
-			PHY_WRITE(sc, RGEPHY_MII_ANAR, RGEPHY_SEL_TYPE);
-
-			if (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T) 
+			if (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T) {
+				PHY_WRITE(sc, RGEPHY_MII_1000CTL, 0);
+				PHY_WRITE(sc, RGEPHY_MII_ANAR, anar);
+				PHY_WRITE(sc, RGEPHY_MII_BMCR, speed |
+				    RGEPHY_BMCR_AUTOEN | RGEPHY_BMCR_STARTNEG);
 				break;
-
-			PHY_WRITE(sc, RGEPHY_MII_1000CTL, gig);
-			PHY_WRITE(sc, RGEPHY_MII_BMCR,
-			    speed|RGEPHY_BMCR_AUTOEN|RGEPHY_BMCR_STARTNEG);
+			}
 
 			/*
 			 * When settning the link manually, one side must
@@ -250,6 +256,8 @@
 				PHY_WRITE(sc, RGEPHY_MII_1000CTL,
 				    gig|RGEPHY_1000CTL_MSE);
 			}
+			PHY_WRITE(sc, RGEPHY_MII_BMCR, speed |
+			    RGEPHY_BMCR_AUTOEN | RGEPHY_BMCR_STARTNEG);
 			break;
 #ifdef foo
 		case IFM_NONE:

--TRYliJ5NKNqkz5bu--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060810093018.GB17452>