JME(4)

πŸ“¦
version 15.1 Β· 3 versions
, in freebsd 14.5, freebsd 15.1, nixpkgs unstable

πŸ’– jme(4) β€” the Kernel Interfaces Manual page, but make it cute πŸ’–

okay so bestie, you're looking at the jme page from the Kernel Interfaces Manual, and honestly? it's giving "niche but iconic" ✨ it's literally the JMicron Gigabit/Fast Ethernet driver and we're gonna go through the whole thing together, no skips, no cap 🫢


🌸 NAME 🌸

jme β€” the JMicron Gigabit/Fast Ethernet driver. that's her. that's the whole name. short, sweet, main character energy πŸ‘‘


✨ SYNOPSIS ✨

so if you wanna compile this driver into the kernel (instead of loading it as a module), you drop these lines into your kernel configuration file:

device miibus
device jme

or, alternative route bestie β€” load it as a module at boot time by putting this line in loader.conf(5):

if_jme_load="YES"

literally that's it. two paths, both valid, choose your fighter πŸ’…


πŸ¦‹ DESCRIPTION πŸ¦‹

the jme device driver provides support for JMicron JMC25x PCI Express Gigabit Ethernet controllers and JMicron JMC26x PCI Express Fast Ethernet controllers. yes, both families. we love range 🌈

every single LOM supported by the jme driver has:

  • TCP/UDP/IP checksum offload for both transmit and receive
  • TCP segmentation offload (TSO)
  • hardware VLAN tag stripping/insertion features
  • Wake On Lan (WOL)
  • an interrupt coalescing/moderation mechanism
  • a 64-bit multicast hash filter

that's a stacked feature list and honestly? she ate πŸ”₯

the JMC25x also supports Jumbo Frames (up to 9216 bytes), which you can configure via the interface MTU setting. select an MTU larger than 1500 bytes with the ifconfig(8) utility and boom β€” the adapter is configured to receive and transmit Jumbo Frames ✨

the jme driver supports the following media types:

  • autoselect β€” enable autoselection of the media type and options. the user can manually override the autoselected mode by adding media options to rc.conf(5).
  • 10baseT/UTP β€” set 10Mbps operation.
  • 100baseTX β€” set 100Mbps (Fast Ethernet) operation.
  • 1000baseTX β€” set 1000baseTX operation over twisted pair.

and the following media options:

  • full-duplex β€” force full duplex operation.
  • half-duplex β€” force half duplex operation.

for more info on configuring this device, see ifconfig(8). iykyk πŸ’œ


πŸŽ€ HARDWARE πŸŽ€

the jme device driver provides support for these Ethernet controllers, and yes we're listing all four, no cutting corners:

  • JMicron JMC250 PCI Express Gigabit Ethernet controller
  • JMicron JMC251 PCI Express Gigabit Ethernet with Card Read Host controller
  • JMicron JMC260 PCI Express Fast Ethernet controller
  • JMicron JMC261 PCI Express Gigabit Ethernet with Card Read Host controller

look at that lineup. little family portrait 🫢


⭐ LOADER TUNABLES ⭐

tunables can be set at the loader(8) prompt before booting the kernel, or stored in loader.conf(5). your call, bestie πŸ’…

  • hw.jme.msi_disable β€” this tunable disables MSI support on the Ethernet hardware. the default value is 0.
  • hw.jme.msix_disable β€” this tunable disables MSI-X support on the Ethernet hardware. the default value is 0.

two switches, both off by default, both doing exactly what they say on the tin πŸŽ€


🧚 SYSCTL VARIABLES 🧚

the following variables are available as both sysctl(8) variables and loader(8) tunables. double duty, we love a multitasker πŸ‘‘

  • dev.jme.%d.tx_coal_to β€” sets the maximum amount of time to delay before sending a Tx completion interrupt, in microseconds. the accepted range is 1 to 65535; the default is 100 (100us).
  • dev.jme.%d.tx_coal_pkt β€” sets the maximum number of outgoing packets which may be coalesced together into a single Tx completion interrupt. the accepted range is 1 to 255; the default is 8.
  • dev.jme.%d.rx_coal_to β€” sets the maximum amount of time to wait for additional packets to arrive (for possible packet coalescing) before firing an Rx completion interrupt, in microseconds. the accepted range is 1 to 65535; the default is 100 (100us).
  • dev.jme.%d.rx_coal_pkt β€” sets the maximum number of incoming packets which may be coalesced into a single Rx completion interrupt. the accepted range is 1 to 255; the default is 2.
  • dev.jme.%d.process_limit β€” sets the maximum number of events that will be processed in a single batch before the handler is requeued into a taskqueue. the accepted range is 10 to 255; the default value is 128 events. and the cute part: the interface does not need to be brought down and up again before a change takes effect πŸ¦‹

πŸ”₯ SEE ALSO πŸ”₯

altq(4), arp(4), miibus(4), netintro(4), ng_ether(4), vlan(4), ifconfig(8)

go read them, they're all linked, this is the friend group πŸ’œ


🌈 HISTORY 🌈

the jme driver was written by Pyun YongHyeon <yongari@FreeBSD.org>. it first appeared in FreeBSD 7.1. a legend, honestly 😭


πŸ’€ CAVEATS πŸ’€

okay bestie, sit down, this part matters. not joking around here πŸ™ˆ

the jme driver tries to avoid unnecessary station address reprogramming for controllers that use eFuse to store the station address. the number of times that eFuse can be safely reprogrammed is 16 at most. and here's the scary bit: there is no way to restore the factory default station address once the station address has been reprogrammed via eFuse.

it is highly recommended not to reprogram the station address, and it is the responsibility of the administrator to store the original station address in a safe place when the station address is changed. like, write it down. put it in a vault. do not lose it 🚨

also, there are two known 1000baseT link establishment issues with JMC25x:

  • if the full mask revision number of the JMC25x controller is less than or equal to 4 and the link partner enabled the IEEE 802.3az Energy Efficient Ethernet feature, the controller will not be able to establish a 1000baseT link.
  • also, if the length of the cable is longer than 120 meters, the controller can not establish a 1000baseT link.

the known workaround for these issues is to force manual link configuration with 100baseTX instead of relying on auto-negotiation. you can check the full mask revision number of the controller with the verbose kernel boot option β€” use the lower nibble of the chip revision number to get the full mask revision of the controller. noted, saved, screenshot taken πŸ“Έ


okay that's the whole page, you're officially a jme expert now, no cap πŸ’…βœ¨

source & version: this one comes from Debian, dated March 4, 2012 β€” so yeah, she's vintage, but vintage is iconic πŸŽ€πŸ’–

later bestie, go configure your NIC πŸŒΈπŸ¦‹

πŸ“¦ where this page comes from