[vortex] Two 3c905 in one box break network

Sven Golchert golchert@uni-bremen.de
Fri, 30 Mar 2001 18:32:50 +0200


Hi,

I built a firewall on an old 486/66 with PCI and ISA that has three NICs
built in:

eth0: 3c905B-FX (PCI)
eth1: 3c905C-TX (PCI)
eth2: 3c509B (ISA)

I use SuSe 7.1 and the 3c59x and 3c509 driver modules. The problem
occurs with 3Com's 3c905 driver module as well, but I have only analysed
the problem with 3c59x in operation.

eth0 is connected to my office's uplink. When I use eth2 to connect the
firewall to my office switch (Allied Telesyn CentreCom 724i), everything
works fine. But when I use eth1 to connect to the switch, the network
breaks almost instantly after I try to carry data over the firewall. So
far it seems it's a clash between the two 3c905, so I thought it's
driver related.

Having looked at the logs with debug=7 (see below) though, I suspect
it's got something to do with my physical network architecture. However,
my knowledge on Linux is rather fresh, and I thought you could provide
me with a starting point. Clients on the switch are 100Base-TX full
duplex, with the exception of one Allied Telesyn CentreCom MR820TR hub
that is 10Base-T half duplex AFAIK. The hub has another hub of the same
type connected to it.

AFAICS the problem originates in eth1. When the network has broken,
eth1's lamp on the switch isn't lit anymore. Furthermore, from the
firewall I can't ping my private subnet, but I can still ping the
Internet via eth0. When I "ifconfig eth1 down", eth1's lamp lights
again. When I "ifconfig eth1 up" again, the lamp turns off. I can get
the network back in operation by putting down both eth0 and eth1,
removing 3c59x, then reinserting it and putting interfaces up, but then
the problem is reproducable.

Sidenote: With SuSe 6.4/kernel 2.2.14 and 3c59x, the Linux box wouldn't
even respond to keystrokes after the network went down. I couldn't check
whether 3c905 would also break the system since I wasn't able to make
the driver.

Any help would be greatly appreciated. I tried to snip the most
meaningful bits from the logs. If further information would be helpful,
please tell me what to post.

Thanks in advance
Sven

----
All logs based on 3c59x inserted with debug=7.

(dmesg after inserting 3c59x)
3c59x.c:LK1.1.12 06 Jan 2000  Donald Becker and others.
http://www.scyld.com/network/vortex.html $Revision: 1.102.2.46 $
See Documentation/networking/vortex.txt
eth0: 3Com PCI 3c905B-FX Cyclone 100baseFx at 0x4080,
00:01:02:ed:aa:a8, IRQ 11
  product code 'CA' rev 00.0 date 12-13-00
Full duplex capable
  Internal config register is 2500000, transceivers 0x4.
  8K byte-wide RAM 5:3 Rx:Tx split, 100baseFX interface.
3c59x: Wake-on-LAN functions disabled
  Enabling bus-master transmits and whole-frame receives.
eth1: 3Com PCI 3c905C Tornado at 0x4000,  00:01:02:f2:c6:de, IRQ 10
  product code 'FJ' rev 00.13 date 11-16-00
  Internal config register is 3800000, transceivers 0xa.
  8K byte-wide RAM 5:3 Rx:Tx split, autoselect/Autonegotiate interface.
  MII transceiver found at address 24, status 782d.
3c59x: Wake-on-LAN functions disabled
  Enabling bus-master transmits and whole-frame receives.

(dmesg after putting eth0 up)
eth0:  Filling in the Rx ring.
eth0: using default media 100baseFX
eth0: Initial media type 100baseFX.
vortex_up(): writing 0x2500000 to InternalConfig
eth0: vortex_up() InternalConfig 02500000.
eth0: vortex_up() irq 11 media status 8880.
boomerang_start_xmit()
eth0: Trying to send a packet, Tx index 0.
boomerang_interrupt. status=0xe201
eth0: interrupt, status e201, latency 45 ticks.
eth0: In interrupt loop, status e201.
eth0: exiting interrupt, status e000.
boomerang_start_xmit()
(...)
boomerang_interrupt. status=0xe401
eth0: interrupt, status e401, latency 54 ticks.
eth0: In interrupt loop, status e401.
boomerang_interrupt->boomerang_rx
boomerang_rx(): status e001
Receiving packet size 106 status a800806a.
eth0: exiting interrupt, status e000.

(dmesg after putting eth1 up)
eth1:  Filling in the Rx ring.
eth1: using NWAY autonegotiation
eth1: Initial media type Autonegotiate.
vortex_up(): writing 0x3800000 to InternalConfig
eth1: MII #24 status 782d, link partner capability 45e1, setting
full-duplex.
eth1: vortex_up() InternalConfig 03800000.
eth1: vortex_up() irq 10 media status 8080.
boomerang_start_xmit()
eth1: Trying to send a packet, Tx index 0.
boomerang_interrupt. status=0xe201
eth1: interrupt, status e201, latency 43 ticks.
eth1: In interrupt loop, status e201.
eth1: exiting interrupt, status e000.
(...)
boomerang_interrupt. status=0xe201
eth1: interrupt, status e201, latency 32 ticks.
eth1: In interrupt loop, status e201.
eth1: exiting interrupt, status e000.
boomerang_start_xmit()
eth1: Trying to send a packet, Tx index 3.
boomerang_interrupt. status=0xe201
eth1: interrupt, status e201, latency 26 ticks.
eth1: In interrupt loop, status e201.
eth1: exiting interrupt, status e000.
boomerang_interrupt. status=0xe401
eth0: interrupt, status e401, latency 53 ticks.
eth0: In interrupt loop, status e401.
boomerang_interrupt->boomerang_rx
boomerang_rx(): status e001
Receiving packet size 62 status 803e.
(...)
eth1: Media selection timer tick happened, Autonegotiate.
dev->watchdog_timeo=40
eth1: MII transceiver has status 7829.
eth1: Media selection timer finished, Autonegotiate.
boomerang_interrupt. status=0xe401

(dmesg after the network went down)
3c59x: Wake-on-LAN functions disabled
eth1: using NWAY autonegotiation
eth1: Initial media type Autonegotiate.
vortex_up(): writing 0x3800000 to InternalConfig
eth1: MII #24 status 7809, link partner capability 0000, setting
half-duplex.
eth1: vortex_up() InternalConfig 03800000.
eth1: vortex_up() irq 10 media status 8080.
eth1: In interrupt loop, status e003.
eth1: vortex_error(), status=0xe003
eth1: Host error, FIFO diagnostic register 0000.
eth1: PCI bus error, bus status 40000020

later I also get:

3c59x: Wake-on-LAN functions disabled
eth1: using NWAY autonegotiation
eth1: Initial media type Autonegotiate.
vortex_up(): writing 0x3800000 to InternalConfig
eth1: MII #24 status 7809, link partner capability 0000, setting
half-duplex.
eth1: vortex_up() InternalConfig 03800000.
eth1: vortex_up() irq 10 media status 8080.
eth1: Too much work in interrupt, status e003.
eth1: exiting interrupt, status e000.