Linux and the Intel PCI EtherExpress Pro 100 series
Products Supported
This page contains information on using Linux with the Intel PCI
EtherExpress Pro 100 series, the Pro/100B, Pro/100+, and other PCI
boards using the i82557, i82558 or i82559 chips.
This driver will also work with the Intel Pro/100 CardBus "generation II"
product that uses the i82559 chip. Most Intel CardBus cards use the i21143
chip and need the Tulip driver.
This driver will not work with any ISA or EISA cards. Nor will this
driver work with the few original 100A cards using the i82556 chip. No
driver is planned for the long-obsolete i82556 chip. This driver will work
with the 10mbps PCI Pro-Plus boards that use the i82557 chip.
Driver Status
The master copy of this page resides on the
Scyld web server.
This driver is tested with the x86, Alpha,
and PowerPC architecture with kernel versions 2.0 and later. It is reported
to be stable, with the following known operational errata:
- This driver does not support kernels earlier than 2.0.0.
- Only limited testing has been done with other (e.g. MIPS)
architectures.
See also the
Other driver versions
Andrey Savochkin maintains a version of the driver for the pre-2.4
kernel. His versions are avaiable at
Usage instructions
Installation
The driver installation directions are on the Driver Updates page. You may install just one
driver (see below), or install all updated drivers using either the
netdriver.tgz file or the SRPM.
To install a single updated driver read the Network Drivers as Modules page for
instructions. You should, of course, substitute the proper driver file name.
When updating a single driver you will need to build pci-scan.o along
with the specific driver.o file. This means that in addition to the
driver.c file, you must download pci-scan.c, pci-scan.h, and kern_compat.h.
Configuration Options
Note: Do not force the duplex or speed setting unless you are certain
that it is required for your network environment. Forcing a setting is
needed only to work around flawed equipment.
When loaded as a module the following variables may be set:
| name | type | description |
| debug | int | The debug message level, 0 (no
messages) to 6 (wordy). |
| options | int[] | The media type override and card operation
settings (See list below.) |
| full_duplex | int[] | Force full duplex. |
| max_interrupt_work | int | Maximum number of events to
handle at each interrupt, default 20.
|
| rx_copybreak | int | See driver source for tuning details.
|
In most cases no transceiver override option need be set. A notable
exception is when connecting to an older ethernet switch that operates in
full-duplex mode but does not do NWay
autonegotation. The following driver options flags are recognized:
Hex Decimal Meaning
0x10 16 Force Full-Duplex operation (must be used with 0x20 or 0x40)
0x20 32 Force 100mbps-only operation
0x40 64 Force 10mbps-only
Add the above decimal values to get the complete option setting.
The option flags are passed as follows when loading the driver as a module
insmod eepro100.o debug=1 options=0x20,0,0x50
This sets the first adapter to 100mbps-only operation, the second to the
default NWay autonegotiation, and the
third to 10mbps full-duplex.
The option flags are passed as the third parameter when using the driver
permanently linked into the kernel
ether=0,0,0x20,eth0 ether=0,0,0,eth1 ether=0,0,0x50,eth2
Several additional internal values may be tuned when the driver is loaded as a
modules. See the top of the driver source code for details.
Run-time Configuration
This driver provide a interface to the Media Independent Interface, "MII"
transceiver configuration and diagnostic settings. This interface allows
the media type (i.e. 10Mbps or 100Mbps, half or full duplex) to be
configured. The settings are usually configured by the (slightly misnamed)
mii-diag program. The details of this program may found on the diagnostic home page.
Limitations and Notes
The current version of the Intel EtherExpress Pro
100B driver is designed for 2.0 and 2.2 kernels. The 1.2.* kernels do
not permit the reserving space in the "skbuff" for a descriptor, and thus
will not work with this driver.
Some web browsers will corrupt the driver source code when
transferring via HTTP. You might wish to use FTP to transfer the driver
source code from
ftp://scyld.com/pub/network/eepro100.c instead.
This driver will work only with PCI cards. ISA and EISA cards have
different architectures and have no chance of working with this driver.
The older 100A cards using the i82556 chip will not work with this driver.
There is no simple modification to make it so. I have no plans to write a
driver for the ancient 100A, or documentation to do so. Please don't write
to ask about it. Please.
As of July 2000, there is no known driver development for the 100A boards.
This driver will also work with the following boards:
- Microdyne/Eagle NE10/100 (i82557 w/DP83840 transceiver).
- IBM IBM EtherJet PCI 10/100 board (i82557, i82559).
- Allied Telesyn AT-2560 (including the FX transceiver version).
Support
Mailing list
Support for the EEPro100 driver is handled through the following mailing
lists:
- eepro100-announce
- Annoucements of new drivers and features.
- eepro100
- General driver discussions, including bug fixes.
- eepro100-bug
- Reporting driver bugs.
See
http://www.scyld.com/mailman/listinfo for information on subscribing to
these lists.
Using the above lists for unrelated advertisements is subject to a charge
of $0.34 per destination address, payable in advance to Scyld's Annapolis MD
address.
Diagnostic and Setup Programs
A diagnostic and setup program is available from
http://www.scyld.com/diag/index.html .
That same page includes the 'mii-diag' program used to modify the run-time
setting of the transceiver.
Please send the output of the relevant program when reporting a
problem.
Common Problems
Syntax errors during compile
If you get syntax errors during the compile, your web browser (or this
web server's) MIME-types table is likely broken. C source code files should
be transferred as raw text, not interpreted as HTML source. Try
transferring the driver using FTP from ftp://ftp.scyld.com/pub/network/
'ifconfig' reports "Try again"
The EEPro100 board has an IRQ conflict. While the driver does use
shared PCI interrupts, problems can still occur. Read
http://www.scyld.com/expert/irq-conflict.html.
Errata and History
Recent revisions:
- v1.05 of 10/16/98:
Added a mdio_read() at the end of open() to recover from the transceiver
reset.
Modified the rx_work_limit check in the receive loop to avoid a bug when
the ring is full (usually caused by no free memory for Rx buffers).
- v1.04 of 10/8/98:
Worked around MODULE_PARAM() bug in 2.1.* when not a module.
Detection of and support for the 256x16 EEPROM on i82559.
Put configure command into a single descriptor.
Restructured the multicast command. The driver now allocates a maximum
sized multicast command, and has a single-use lock to prevent race
conditions when rapidly changing the multicast table.
- v1.03 of 8/11/98:
Modifications to support recent kernels.
Tweaked the buffer-deficit Rx code.
- v1.02 of 7/24/98:
The multicast filter bug should now be fixed. The work-around of
setting multicast_filter_limit=2 is no longer needed. This bug was
potentially corrupting subsequent commands, explaining the Tx timeouts
when long multicast filter lists are used. (I was wrong in assuming
that the chip was just taking a long time to digest multicast lists --
it was executing random commands!)
Changed the Rx structure to refill the Rx "buffer debt" in a separate
phase of the receive process.
This fixes the low-memory skb_put() bug, which occur when a new skbuff
could not be allocated. When the old driver ran out of Rx buffers
(normally this should never occur), it dropped the packet *after*
already having done the skb_put()!
The above change enables the i82558 to run out of Rx buffers and send
flow-control frames. (Only on the i82558 chip, enabled but completely
untested.)
The driver now uses the Extended-Simple Tx Descriptor mode of the
i82558. This new mode is almost identical to the structure the driver
was using before -- appending the buffer descriptor right after the Tx
command. The i82558 can now read the Tx command and two Tx buffer
descriptors in a single PCI burst. The only change for the i82557 is
that the second (unused) buffer descriptor is now allocated.
The driver should support 2.1.100+ kernels, but no longer supports
pre-2.0.0 kernels.
The driver is ready for conversion to PCI memory space access, instead
of I/O space. This will make architecture e.g. Alpha ports
faster/easier, but the card wouldn't show up in /proc/ioports.
Multiple-word PCI accesses are enabled (iff the BIOS sets up the PCI
configuration registers as well).
- v1.01 of 7/23/98:
Changed the Rx structure to go into "buffer debt" when short of
memory. This fixes the low-memory skb_put() bug, which occur when
a new skbuff could not be allocated.
Minor spelling and indentation clean-ups.
Changed 'ioaddr' to always be type 'long' in preparation for using
PCI memory space instead of I/O space on some architectures.
- v1.00 was a renamed v0.99B.
- v0.99C 4/7/98:
Added support for the post-2.1.85 PCI probe scheme (which is not
complete and will have to be changed!), and cleaned up the PCI
probe.
Retrigger N-Way autonegotiation when the transmitter times out.
- v0.99B 4/7/98:
Code clean-up of 0.38 for 2.0.34 kernel release.
Ancient fixes
- The driver reportedly stops network operation under extended heavy load
on some machines. Resetting the driver (with 'ifconfig eth0 down up' and
'route...') restores operation.
This was actually two problems -- not activating a Rx-lockup fix required
with some early chips, and a problem with the Rx-out-of-buffers state. The
new driver has a real fix, but the trivial work-around is to increase the
RX_RING_SIZE to a large value. 32 or 64 entries is plenty.
- Force-100mbps and force-full-duplex ("FD") options were added to permit
reliable connections to non-NWay equipment.
The following example sets the first
board to Autosense (options=0), the second to 100mbps (options=32), the third
to speed autosense/forced full-duplex (options=16) and the fourth to forced
100baseTx-FD (options=32+16)
/sbin/insmod eepro100.o options=0,32,16,48
Smaller transceiver indices are reserved for compatibility with other drivers.
- v0.21 of 12/11/96:
Added Alpha architecture support (untested -- please send a report if you
can), and fixed a bug with the 1.2.13 timer code.
- v0.23 of 12/18/96:
Fixed a few Alpha address conversions.
Changed the TX_TIMEOUT to use HZ instead of just 'jiffies'. (The x86 uses
100 HZ, the Alpha uses 1024 HZ, so the alpha would time out 10X too
quickly.)
Only count user frames transmitted, not the commands to set the receive
mode. (This was deliberate for the testing version, but now produces
confusing statistics.)
Added a driver-generated interrupt to reap the Tx queue before declaring
a transmit timeout. This solution avoids overhead in most cases, but
does leaves a window where the transmitter might go idle. I might tweak
this code later.
Transmit timeouts only restart the transmitter if it's not in the active
state.
- v0.25 of 2/10/97:
This revision fixes only Alpha problems -- some I/O address variables
were declared as 'short', while others were 'int'.
This may need to be revisited, as some Alpha implementation may require
"I/O addresses" to be stored as 'long'.
- v0.26 of 2/14/97:
The "I have no date for Valentines Day" release.
Changed the media-monitor timer to not queue up a setup frame if the
Tx queue is full. This will hopefully fix the Tx-timeout problems on
a mostly-idle network.
Added the Intel-recommend "undocumented" parameters to the driver, with
the Intel spelling of the keywords.
Addressed (and perhaps even fixed ;->) the problem with specifying
full-duplex by
- setting the DP83840 "LED4" output to always indicate full-duplex
rather than polarity at 10mbps and FD at 100mbps.
- setting the DP83840 to not use NWay when the link speed was set
Note that the link speed must be specified for the full-duplex setting
to work (see next).
Added a flag bit to the driver option word, 0x40, that specifies 10mbps-only
operation. The 0x20 flag continues to specify 100mbps-only operation.
- v0.27 of 2/28/97:
Converted all SLOW_DOWN_IO calls to use udelay instead.
Moved the Tx timeout code to a separate routine.
- v0.28 of 3/6/97:
Changed set_rx_mode() mode to avoid a null pointer dereference.
(This fix appears to be correct, but is somehow broken! Curiously the
obviously broken code worked much better.)
- v0.29 of 3/21/97:
Worked around the bug with multicast filter settings introduced in v0.28.
The bug still exists when using more than two multicast addresses.
- v0.30 of 3/28/97:
Fixed problems with the 1.2.13 version reported by merlinm@justus.chi.il.us:
double allocation of dev->priv and a flawed Rx consistency check.
- v0.31 of 3/29/97:
Fixed a few type mismatches with 1.2.13 reported by merlinm@justus.chi.il.us
by deleting excess debug messages.
- v0.32 of 4/8/97:
Added the 83840A PHY type.
- v0.33 of 8/29/97:
fixed the return value for a module insertion
add i82555 recognition
reset the MII on transmit timeout
added KERN_* flags to more printk() statements
- v0.34 of 8/30/97:
Fixed the detection of multiple cards when the driver is built-in.
Added changes for 2.1.51 suggested by Mark Lord.
- v0.35 of 10/11/97:
Fixed Alpha timing problems with udelay().
Added additional 2.1.* support.
Added an chip reset after self-test/init to hopefully fix the cold-boot
problem experienced with some configurations.
Updated to i82558 recommendation of not enabling the DMA maximum byte
counts. This should avoid the Tx FIFO retries (which are mostly harmless
but still counted as errors).
Added module-settable values for rx_copybreak and max_interrupt_work.
Fixed multiple-detection of a single card when used as a built-in driver.
Added MII-control ioctl() support.
- v0.36 of 10/20/97:
Added additional call to wait_for_cmd_done() in an attempt to solve the
cold-boot problem that a few machines encounter.
- v0.37 of 1/31/98:
Added multicast_filter_limit variable.
Added enable for PCI I/O space.
Added a minimum pci_latency setting.
Better reset of the MII transceiver.
Fixed multicast filter NULL-dereference.
Changed to test_and_set_bit() for in_interrupt.
- v0.37A of 1/31/98:
Deleted the NULL check in the transmit routine.
- v0.38 of 2/17/98:
Increased Tx timeout to 0.8 seconds.
Developer Information
-
Intel network application note index
-
AP-369 LAN557 Hardware/Software Interface Definition
-
This document contains the EEPROM format for the i82557 and i82558.
-
AP-373 Replacing the DEC 21140 with the Intel 82557
- A feature comparison table -- mostly marketing literature.
Acknowledgments
Thanks to Steve Williams,
Steven_D_Williams@ccm.jf.intel.com,
and Terry Crawford of Intel for sorting
out the incompatibilities of the standard Intel NDA and the Linux/GPL source
code release terms. They provided a pair of EtherExpress Pro 100B cards as
well.
My thanks also go to
Chris Ho, a dedicated pre-alpha tester that tried many non-working versions
before I had the hardware to do so myself.
Linux Network Drivers Page
Linux Network Drivers Updates Page
SCYLD information.
Author:
Donald Becker.
See the drivers for the contact email address. Do not bother sending email
to zinc.anode@scyld.com, as email to that address adds your domain or IP
address to the known-spammer list.