This page contains information on using Linux with 3Com EtherLink III series
ethercards. The master copy resides on the
CESDIS
WWW server.
Special Driver Features
The 1.14 and later versions allow overriding the IOADDR, IRQ, and
transceiver setting of detected cards. This capability should be rarely
needed. The syntax for LILO parameters is
ether=10,0x310,3,0x3c509,eth0
This configures the first found 3c509 card for IRQ 10, base I/O 0x310, and
transceiver #3 (10base2). The flag "0x3c509" must be set to avoid conflicts
with other card types when overriding the I/O address.
Only the IRQ and transceiver setting may be overridden when using the
driver as a module. Setting two cards to 10base2/IRQ10 and AUI/IRQ11 is done
by using the xcvr and irq module options:
options 3c509 xcvr=3,3 irq=10,11
Available Transceiver Types
The available transceiver types are
0 | default from EEPROM, normally 10baseT |
1 | AUI (DB15 connector) |
2 | undefined |
3 | 10base2 (BNC) |
4 | 10baseT only (RJ45 connector) |
Common problems
-
eth0: Infinite loop in interrupt, status 2011.
-
These are "mostly harmless" message indicating that the
driver had too much work during that interrupt cycle. With a status of
0x2011 you are receiving packets faster than they can be removed from the
card. This should be rare or impossible in normal operation.
Possible causes of this error report are
- a "green" mode enabled that slows the processor down when there
is no keyboard activitiy.
- some other device or device driver hogging the bus or disabling
interrupts. Check /proc/interrupts for excessive interrupt counts.
The timer tick interrupt should always be incrementing faster than
the others.
- No received packets
- If a 3c509, 3c562 or 3c589 can successfully transmit packets, but never
receives packets (as reported by /proc/net/dev or 'ifconfig') you likely
have an interrupt line problem. Check /proc/interrupts to verify that the
card is actually generating interrupts. If the interrupt count is not
increasing you likely have a physical conflict with two devices trying to
use the same ISA IRQ line. The common conflict is with a sound card on
IRQ10 or IRQ5. The easiest solution is to move the 3c509 to a different
interrupt line.
- If the device is receiving packets but 'ping' doesn't work, you have a
routing problem.
- Tx Carrier Errors Reported in /proc/net/dev
- If an EtherLink III appears to transmit packets, but the "Tx carrier
errors" field in /proc/net/dev increments as quickly as the Tx packet count,
you likely have an unterminated network or the incorrect media tranceiver
selected.
- 3c509B card is not detected on machines with an ISA PnP BIOS.
- While the updated driver works with most PnP BIOS programs, it does not
work with all. This can be fixed by disabling PnP support using the 3Com
setup program.
- 3c509 card is not detected on overclocked machines
- Increase the delay time in id_read_eeprom() from the current value,
500, to an absurdly high value, such as 5000.
Errata
These are the current errata for the distributed Linux-2.0 3c509 driver:
- v1.00-v1.13B message: Waiting for 3c509 to discard packet, status 2011.
The card is taking too long to discard a received frame, or (more likely)
your ISA bus is running faster than standard 8Mhz.
The messages only occur when you get packets with errors or are temporarily
running out of memory.
Changes in v1.14 will fix or minimize the problem.
-
Rather than changing the EEPROM setting to select a different transceiver
port (10baseT, BNC, AUI) type, you can:
- Upgrade to v1.14 or make the following modification to 3c509.c:el3_probe()
- Run the 'ifport' program from the PCMCIA package or
- set the 'ifport' using a new version of 'ifconfig'
found:
dev->base_addr = ioaddr;
dev->irq = irq;
- dev->if_port = if_port;
+ if (dev->mem_start)
+ dev->if_port = dev->mem_start & 3;
+ else
+ dev->if_port = if_port;
request_region(dev->base_addr, EL3_IO_EXTENT, "3c509");
and pass in the transceiver type as the third parameter to the LILO setting:
ether=0,0,4,eth0
where
0 Use EEPROM setting
1 AUI
2 undefined
3 BNC
4 10baseT
These are current errata for the distributed Linux-1.2.13 3c509 driver:
- The 3c509b (the *B* model only) may need to have Plug-and-Play disabled
using the 3Com card configuration program. The driver in kernel 2.0
(and the updated driver for 1.2.13 should avoid this
problem.
- The 1.2.13 driver always uses 0x100 as the "ID Port", preventing an ISA
3c509 from being detected with some hardware configurations. This can
conflict with cards (usually multiport serial cards or "32 bit" sound cards)
unwisely jumpered to be in that I/O area. The updated driver searches for
an empty location of the form 0x1[0-F]0 to use as the ID Port, however this
reportedly does not fix the problem with some "32 bit" sound cards.
- Old 3c509 (not the *B* model) cards would sometimes set the 'adapter
failure' bit for unknown reasons. The 1.2.13 driver fails to note this
failure and doesn't reset the card. This is a rare problem: few people
encounter it. The updated driver should properly recover from this event.
- The 1.2.13 driver may occasionally produce the following message:
eth0: Missed interrupt, status then 2011 now 2000 Tx 00 Rx 8000.
This is (rather, should be) a rare race condition that happens in some error
checking code. When a packet is to be
transmitted, the driver checks if an interrupt is pending. If there is one
pended, it usually means that some other device is using the interrupt line
and preventing the interrupt controller form seeing it.
This check works fine on most motherboards (i.e. "my development
motherboard"), but some chipset are slow to report the interrupt. (Probably
a because they are filtering out interrupt glitches -- a good thing given
some poorly designed older cards.) The driver then thinks the interrupt
line is broken, and prints the message. As part of printing the message, it
check the interrupt status again. Note that the "now" value has the
interrupt cleared, so it was handled after all.
This message can be eliminated by compiling the driver with the
'-Dfinal_version' flag that turns off this (and only this) error check.
The driver update is on
cesdis.gsfc.nasa.gov:/pub/linux/drivers/3c509.c
This update addresses all of the above problems.
Please send a report if this updated driver fixes a problem you have
encountered.
Change summary
- ISA activation mechanism selects a free I/O locations for the ID Port.
- Allows the boot-time parameter to override the EEPROM specified IRQ
line. (I'm still reluctent to allow setting the I/O address with this
method.)
- Always maps the card to the EEPROM location, even if Plug-and-Play
puts it somewhere else.
- Avoids the spurious "interrupt for unknown device" message.
- Replaces a few numeric constants with symbolic ones.
- Recovers from an 'adapter failure' indication when possible.
- Allows more time before deciding that the transmitter has hung.
- Adds MCA support from Erik Nygren, if CONFIG_MCA is defined.
Acknowledgments
Thanks to John Murphy,
murf@perftech.com ,
for pointing out
what was really happening with the Plug-and-Play conflict.
Thanks to Terry Murphy,
Terry_Murphy@3mail.3Com.COM, and
Cameron Spitzer,
cls@truffula.sj.ca.us, of 3Com
for providing the EtherLink III technical reference manuals.
Thanks to Erik Nygren,
nygren@mit.edu,
for the MCA support.
Top
Linux at CESDIS
CESDIS
is located at the
NASA
Goddard Space Flight Center in Greenbelt MD.
Contact:Donald Becker, becker@cesdis.gsfc.nasa.gov.