I felt it’d be of substantial help to others who inevitably run into this problem with their JMicron JMC250 Gigabit NIC, while running Linux, if I were to document the solution in a central spot, so they needn’t sift through forum posts as I did.
The Problem
As of today, September 14th, 2011, the jme driver for the JMC2x0 line of NICs is not up to date with the release by JMicron, and this seems to result in the NIC only managing about 10 megabits-per-second, instead of the gigabit speeds that it should. The resolution to this is slightly more than updating the driver, but the other steps aren’t something the average user will figure out on their own.
Driver Update
To future-proof this post, I’ll simply say that you should download the latest driver for your JMicron NIC from their FTP. As of today, it’s version 1.0.8.3, but they seem to have been updating it frequently, which is awesome for a Linux driver.
Once you have the tar.bz2 file downloaded, open up your terminal (if you’re using a GUI; these instructions should work for any Linux system). Change to the directory you downloaded the file to, and extract the archive using:
tar -jxf jmebp-1.0.8.3.tar.bz2
Change into the directory that is extracted, and do the standard make/make install, then reload the jme module.
make
...
sudo make install
sudo modprobe -r jme && modprobe jme
Updating your initramfs
For some reason, probably related to finding of root devices, you need to update your initramfs for the driver to start working. It’s a simple process for Debian/Ubuntu users, and this may work for others. I think you need to reboot after this point, as the initrd is specific to the boot process, so changes to it taking effect will require rebooting.
sudo update-initramfs
Change your NIC settings
Now, you need to update your NIC settings to indicate that the device should run with a 1000 MBit speed, and full-duplex. Substitute in whatever your ethernet device is, for eth0.
sudo ethtool -s eth0 speed 1000 duplex full
That’s it!
After doing these things, your gigabit NIC should magically start working at gigabit speeds. Let me know in the comments if you happen to find otherwise. I’m in the process of filing a bug report with the Linux kernel so the driver will be updated, and I may create a Ubuntu PPA to make it easier for non-technical users to get their JMC250 NIC working.
A few updates (November 16, 2011)
I thought I’d add a few details, for those who are troubleshooting their cards. If you’re still having problems for some reason, you might try compiling the master branch of the driver’s git repository. There seem to be a few updates since the last tarball release, which might alleviate some fringe errors.
#1 by FTG on September 18, 2011 - 5:58 am
update-initramfs -u (-u is important for newbie ;) )
#2 by Pierrot on September 25, 2011 - 2:47 pm
Thank you so much for posting this, it really helped!
#3 by Guo-Fu Tseng on October 12, 2011 - 5:22 am
Just googled this page. :p
By “while running Linux”, do you mean it can get stable 1G link while running other OS(s)?
#4 by Justin Martin on October 12, 2011 - 7:45 am
I’ve yet to test that, as I don’t run Windows, but there should be a driver that enables gigabit capabilities in Windows.
#5 by Guo-Fu Tseng on October 12, 2011 - 8:03 am
I’m just wondering if it’s an issue of the driver.
Does other NICs gets 1G link with the same peer
without setting the speed fixed?
Anyway. You are welcome to send me more detail if you like.
FYI: I’m the author of this driver. :)
#6 by Justin Martin on October 15, 2011 - 2:38 pm
I thought I recognized that name from somewhere! Thanks for the work.
As I say, I don’t know whether or not the card gets gigabit rates on other OS’. My laptop which has the JMC250 is actually in the back of a UPS truck on the way back to Eurocom, for a second time, due to severe hardware issues (Probably Cougar Point bug). Once I get it back, I’ll let you know if I can get gigabit speeds on Windows 7 with the latest driver.
#7 by merlijn on November 11, 2011 - 4:27 pm
latest kubuntu:
I did everything you said but after
sudo ethtool -s eth0 speed 1000 duplex full
internet stopped working.
After reboot it worked again, but trying the command a second time results in the same.
sudo ethtool -s eth0 speed 100 duplex full
Works, but won’t give me the same speed, no?
#8 by Justin Martin on November 12, 2011 - 8:42 am
I’m not sure about what this would be, without seeing additional information. If you could pastebin the `sudo lshw -class network` output, along with the output of `sudo modinfo jme`, I would have more information upon which to offer a suggestion.
#9 by Henry on November 16, 2011 - 11:08 am
I compiled the 1.0.8.3 driver and loaded it manually on an ubuntu 11.11 64-bit server to test it out. Setting the speed to 100 works ok, but the interface never links up if the speed is set to 1000. The behavior is identical with the default 1.0.8 driver shipped in ubuntu 11.11.
lshw reports: http://pastebin.com/TEy7Vmmb
modinfo jme reports: http://pastebin.com/cuVxaRPD
Note that the version says ’1.0.8.2-jmmod’ even though I grabbed the 1.0.8.3 tarball.
#10 by Justin Martin on November 16, 2011 - 11:15 am
A few things that’ll help in figuring out the problem would be:
* Did you update your initramfs and then restart, before changing the interface speed?
* Is the switch you’re connecting to a gigabit switch?
* Do the gigabit capabilities work in Windows, if you have it?
* Did you bring the interface down and then back up after setting the speed?
And yeah, 1.0.8.2-jmmod is known as 1.0.8.3.
#11 by Henry on November 16, 2011 - 12:54 pm
I tried both manually reloading the new driver, and doing the full update-initramfs -u plus reboot, and neither made a difference.
The switch is a Netgear GS105 gigabit switch, other devices connect to it fine at gigabit speeds.
I don’t have windows on this machine, so I can’t test with that.
Bringing the interface down and back up after setting the speed doesn’t seem to make any difference.
I’ve also tried adding a pre-up call to ethtool in /etc/networks/interfaces, and have the same issue with speed – 1000 fails, 100 works (but at least now I can have the interface come up automatically after a reboot).
#12 by Justin Martin on November 16, 2011 - 12:58 pm
Looking at your lshw output, it occurs to me that you have autonegotiation disabled. You might want to try enabling it.
Could you also provide the lshw output of the device when you have 1000 speed enabled? I’m wondering if it’s just that having the speed set to gigabit, but not having configured certain other settings, may be causing the problem.
#13 by Henry on November 16, 2011 - 1:15 pm
speed 1000 appears to require autonet on, but it doesn’t actually negotiate or link:
# ethtool -s eth0 speed 1000 duplex full autoneg on; ifdown eth0; ifup eth0
lshw reports:
*-network
description: Ethernet interface
product: JMC250 PCI Express Gigabit Ethernet Controller
vendor: JMicron Technology Corp.
physical id: 0.5
bus info: pci@0000:02:00.5
logical name: eth0
version: 03
serial: 80:ee:73:13:5f:23
size: 10Mbit/s
capacity: 1Gbit/s
width: 32 bits
clock: 33MHz
capabilities: pm pciexpress msix msi bus_master cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 1000bt 1000bt-fd autonegotiation
configuration: autonegotiation=on broadcast=yes driver=jme driverversion=1.0.8.2-jmmod duplex=half ip=192.168.1.2 latency=0 link=no multicast=yes port=MII speed=10Mbit/s
resources: irq:45 memory:feaf8000-feafbfff ioport:dc00(size=128) ioport:d800(size=256)
# ethtool -s eth0 speed 1000 duplex full autoneg off
Cannot set new settings: Invalid argument
not setting speed
not setting duplex
not setting autoneg
#14 by Justin Martin on November 16, 2011 - 1:24 pm
That’s rather odd… In your lshw output there, it looks like it’s autonegotiating down to 10Mb/s.
Looking at your switch’s specs, it only supports 1000BASE-T, which means autonegotiation is required for gigabit. You might want to try setting the interface to half-duplex and 1000 speed.
It’s rather hard to troubleshoot this without being able to use the shotgun approach, as several different things could be in play, here.