Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 Jan 2009 13:47:58 +0900
From:      Pyun YongHyeon <pyunyh@gmail.com>
To:        Sascha Holzleiter <sascha@holzleiter.name>
Cc:        freebsd-stable@freebsd.org, Jung-uk Kim <jkim@freebsd.org>
Subject:   Re: FreeBSD 7.1 Breaks re and rl Network Interface Drivers
Message-ID:  <20090117044758.GB68290@cdnetworks.co.kr>
In-Reply-To: <496CAB07.5020404@holzleiter.name>
References:  <8dfae1c10901070639x67945324jeeecfcac647d7976@mail.gmail.com> <496B7C17.8010107@holzleiter.name> <200901122010.37269.jkim@FreeBSD.org> <496CAB07.5020404@holzleiter.name>

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

--cvVnyQ+4j833TQvp
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Tue, Jan 13, 2009 at 03:53:59PM +0100, Sascha Holzleiter wrote:
 > Jung-uk Kim wrote:
 > >On Monday 12 January 2009 12:21 pm, Sascha Holzleiter wrote:
 > >>Hi,
 > >>
 > >>i see similar problems with a re card:
 > >>
 > >>re0@pci0:4:7:0:	class=0x020000 card=0x816710ec chip=0x816710ec
 > >>rev=0x10 hdr=0x00
 > >>     vendor     = 'Realtek Semiconductor'
 > >>     device     = 'RTL8169/8110 Family Gigabit Ethernet NIC'
 > >>     class      = network
 > >>     subclass   = ethernet
 > >>
 > >>After upgrading to 7.1-RELEASE (and also STABLE) the NIC doesn't
 > >>seem to receive any frames. I can see the DHCP Requests on the DHCP
 > >>Server but the DHCPOFFERS are never seen by the client with the re0
 > >>device. After setting promiscious mode on the interface (i.e. by
 > >>tcpdump -ni re0) the interface begins to work fine.
 > >>
 > >>I've attached a complete dmesg output, but i think the detection
 > >>works fine, here the short version:
 > >>
 > >>re0: <RealTek 8169SC/8110SC Single-chip Gigabit Ethernet> port
 > >>0x9c00-0x9cff mem 0xdfdff000-0xdfdff0ff irq 20 at device 7.0 on
 > >>pci4 re0: Chip rev. 0x18000000
 > >>re0: MAC rev. 0x00000000
 > >>miibus0: <MII bus> on re0
 > >>rgephy0: <RTL8169S/8110S/8211B media interface> PHY 1 on miibus0
 > >>rgephy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX,
 > >>1000baseT, 1000baseT-FDX, auto
 > >>re0: Ethernet address: 00:1a:92:35:29:fa
 > >>re0: [FILTER]
 > >
 > >Please revert SVN r180519 (or CVS r1.95.2.22) and try again:
 > >
 > >http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/re/if_re.c.diff?r1=1.95.2.21;r2=1.95.2.22
 > 
 > Thanks! This fixed my problem. I now have DHCP and a running network 
 > interface again with a 7.1-STABLE and the reverted r180519 changes.
 > If you need to test another version for the changes in r180519 let me 
 > know and i'll test them on this machine.
 > 

It seems that RTL8169SC does not like memory mapping. Instead of
using io mapping for all revisions, how about attached patch?

-- 
Regards,
Pyun YongHyeon

--cvVnyQ+4j833TQvp
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="re.8169sc.diff"

Index: sys/dev/re/if_re.c
===================================================================
--- sys/dev/re/if_re.c	(revision 187352)
+++ sys/dev/re/if_re.c	(working copy)
@@ -158,6 +158,8 @@
 /* Tunables. */
 static int msi_disable = 1;
 TUNABLE_INT("hw.re.msi_disable", &msi_disable);
+static int prefer_iomap = 0;
+TUNABLE_INT("hw.re.prefer_iomap", &prefer_iomap);
 
 #define RE_CSUM_FEATURES    (CSUM_IP | CSUM_TCP | CSUM_UDP)
 
@@ -1131,26 +1133,36 @@
 	pci_enable_busmaster(dev);
 
 	devid = pci_get_device(dev);
-	/* Prefer memory space register mapping over IO space. */
-	sc->rl_res_id = PCIR_BAR(1);
-	sc->rl_res_type = SYS_RES_MEMORY;
-	/* RTL8168/8101E seems to use different BARs. */
-	if (devid == RT_DEVICEID_8168 || devid == RT_DEVICEID_8101E)
-		sc->rl_res_id = PCIR_BAR(2);
+	/*
+	 * Prefer memory space register mapping over IO space.
+	 * Because RTL8169SC does not seem to work when memory mapping
+	 * is used always activate io mapping. 
+	 */
+	if (devid == RT_DEVICEID_8169SC)
+		prefer_iomap = 1;
+	if (prefer_iomap == 0) {
+		sc->rl_res_id = PCIR_BAR(1);
+		sc->rl_res_type = SYS_RES_MEMORY;
+		/* RTL8168/8101E seems to use different BARs. */
+		if (devid == RT_DEVICEID_8168 || devid == RT_DEVICEID_8101E)
+			sc->rl_res_id = PCIR_BAR(2);
+	} else {
+		sc->rl_res_id = PCIR_BAR(0);
+		sc->rl_res_type = SYS_RES_IOPORT;
+	}
 	sc->rl_res = bus_alloc_resource_any(dev, sc->rl_res_type,
 	    &sc->rl_res_id, RF_ACTIVE);
-
-	if (sc->rl_res == NULL) {
+	if (sc->rl_res == NULL && prefer_iomap == 0) {
 		sc->rl_res_id = PCIR_BAR(0);
 		sc->rl_res_type = SYS_RES_IOPORT;
 		sc->rl_res = bus_alloc_resource_any(dev, sc->rl_res_type,
 		    &sc->rl_res_id, RF_ACTIVE);
-		if (sc->rl_res == NULL) {
-			device_printf(dev, "couldn't map ports/memory\n");
-			error = ENXIO;
-			goto fail;
-		}
 	}
+	if (sc->rl_res == NULL) {
+		device_printf(dev, "couldn't map ports/memory\n");
+		error = ENXIO;
+		goto fail;
+	}
 
 	sc->rl_btag = rman_get_bustag(sc->rl_res);
 	sc->rl_bhandle = rman_get_bushandle(sc->rl_res);

--cvVnyQ+4j833TQvp--



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