amd64/151409: Problem with Marvell driver, e1000phy.c

Steve Cochran steve at more.net
Tue Oct 12 15:40:07 UTC 2010


>Number:         151409
>Category:       amd64
>Synopsis:       Problem with Marvell driver, e1000phy.c
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-amd64
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Oct 12 15:40:07 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Steve Cochran
>Release:        8.1R
>Organization:
University of Missouri System
>Environment:
FreeBSD shaggy.netsys.more.net 8.1-RELEASE-p1 FreeBSD 8.1-RELEASE-p1 #12: Sun Oct 10 14:29:31 CDT 2010     root at shaggy.netsys.more.net:/usr/obj/usr/src/sys/GENERIC  amd64

>Description:

After upgrading from 7.2R to 8.1R I had serious problems with the build-in Ethernet ports on my server. As soon as the OS initialized the port the LEDs looked wrong: activity LED on solid and speed indicator off.  It would come up in half-duplex regardless of the setting on the connected switch and any attempt to force full-duplex operation would apparently cause the port to hang completely. Sometimes it would pass traffic in half-duplex mode (but at low speeds and with errors), sometimes it wouldn't pass traffic at all.

I couldn't find any mention of similar problems on Google so I compared some kernel files between 7.2 and 8.1 and found that dev/mii/e1000phy.c had some significant differences. I tried iteratively backing out some changes but didn't have much luck building a working driver. I'm not a kernel hacker and know very little about Ethernet drivers or Marvell hardware so I only had a dim idea of what I was doing. Eventually I just modified the driver in 8.1 to match the one from 7.2 ( __FBSDID("$FreeBSD: src/sys/dev/mii/e1000phy.c,v 1.18.2.4.2.1 2009/04/15 03:14:26 kensmith Exp $") ) as much as possible.  This finally gave me a working driver.

Here are the relevant lines from dmesg.

Copyright (c) 1992-2010 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 8.1-RELEASE-p1 #12: Sun Oct 10 14:29:31 CDT 2010
    root at shaggy.netsys.more.net:/usr/obj/usr/src/sys/GENERIC amd64
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Quad-Core AMD Opteron(tm) Processor 1354 (2200.10-MHz K8-class CPU)
  Origin = "AuthenticAMD"  Id = 0x100f23  Family = 10  Model = 2  Stepping = 3
  Features=0x178bfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,MMX,FXSR,SSE,SSE2,HTT>
  Features2=0x802009<SSE3,MON,CX16,POPCNT>
  AMD Features=0xee500800<SYSCALL,NX,MMX+,FFXSR,Page1GB,RDTSCP,LM,3DNow!+,3DNow!>
  AMD Features2=0x7ff<LAHF,CMP,SVM,ExtAPIC,CR8,ABM,SSE4A,MAS,Prefetch,OSVW,IBS>
  TSC: P-state invariant
real memory  = 4294967296 (4096 MB)
avail memory = 4110999552 (3920 MB)
ACPI APIC Table: <061908 APIC1103>
FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
FreeBSD/SMP: 1 package(s) x 4 core(s)
 cpu0 (BSP): APIC ID:  0
 cpu1 (AP): APIC ID:  1
 cpu2 (AP): APIC ID:  2
 cpu3 (AP): APIC ID:  3
..
nfe0: <NVIDIA nForce MCP55 Networking Adapter> port 0xb400-0xb407 mem 0xfeaf6000-0xfeaf6fff,0xfeafa800-0xfeafa8ff,0xfeafa400-0xfeafa40f irq 22 at device 8.0 on pci0
miibus0: <MII bus> on nfe0
e1000phy0: <Marvell 88E1116 Gigabit PHY> PHY 2 on miibus0
e1000phy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-FDX, auto
nfe0: Ethernet address: 00:e0:81:b5:f1:04
nfe0: [FILTER]
nfe0: [FILTER]
nfe0: [FILTER]
nfe0: [FILTER]
nfe0: [FILTER]
nfe0: [FILTER]
nfe0: [FILTER]
nfe0: [FILTER]
nfe1: <NVIDIA nForce MCP55 Networking Adapter> port 0xb080-0xb087 mem 0xfeaf5000-0xfeaf5fff,0xfeafa000-0xfeafa0ff,0xfeaf4c00-0xfeaf4c0f irq 23 at device 9.0 on pci0
miibus1: <MII bus> on nfe1
e1000phy1: <Marvell 88E1116 Gigabit PHY> PHY 3 on miibus1
e1000phy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-FDX, auto
nfe1: Ethernet address: 00:e0:81:b5:f1:05
nfe1: [FILTER]
nfe1: [FILTER]
nfe1: [FILTER]
nfe1: [FILTER]
nfe1: [FILTER]
nfe1: [FILTER]
nfe1: [FILTER]
nfe1: [FILTER]
..
>How-To-Repeat:
The server showing the problem has a Tyan Tomcat n3400B Opteron motherboard with NVIDIA nForce MCP55 chipset and Marvell 88E1116 Ethernet controller. I assume any server with similar hardware would show the same problem. Given the lack of cries in the mailing lists I'm guessing this isn't all that common a setup.
>Fix:
I'd submit the working version of e1000phy.c that I came up with but I'm pretty sure I broke support for some newer Marvell chipsets in the process of fixing my own.  It is mostly identical to src/sys/dev/mii/e1000phy.c,v 1.18.2.4.2.1 but with the necessary changes to make it work with the 8.1 kernel.


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-amd64 mailing list