On 27/04/17 15:04, Andrew Lunn wrote:
On Thu, Apr 27, 2017 at 02:05:51PM +0200, Rafa Corvillo wrote:
On 25/04/17 17:27, Stephen Hemminger wrote:
On Fri, 21 Apr 2017 14:39:00 +0200
Rafa Corvillo <rafael.corvi...@aoifes.com> wrote:
We are working in an ARMv7 embedded system running kernel 4.9 (LEDE build).
It is an imx6 board with 2 ethernet interfaces. One of them is connected to
a Marvell switch.
The schema of the system is the following:
Hi Rafa
Your ASCII art got messed up somewhere. Is this the correct
reconstruction?
Yes, this is the schema.
+-------------------+ eth0
| +--+
| | |
| Embedded system +--+
| |
| ARMv7 |
| | Marvell 88E8057(sky2) +-------------+
| +--+ +--+ +--+ eth1
| | +---------------------+ | | +------+
| +--+ CPU port +--+ mv88e6176 +--+
+------+--+---------+ | |
emulated | | | |
GPIO +--+ +--+ +--+ eth2
MDIO +-----------------------------------+ | | +------+
MDIO +--+ +--+
+-------------+
I assume you are using DSA? Since this is LEDE, it could be swconfig,
but the bridge configuration you mentioned would not make sense for
swconfig.
Yes, we use DSA driver. We don't use swconfig to configure the Marvell
switch. Our board has two ethernet interfaces (eth0 and marvell) using
sky2 driver. The marvell interface is connected to an external Marvell
switch (mv88e6176) with four ethernet ports (but we only use two of
them, eth1 and eth2). The Marvell switch is configured with the MDIO
protocol, that we emulate through GPIOS (mdio-gpio kernel module), and
the DSA driver is used to works with the Marvell switch.
We have the ethernet interfaces in the same bridge:
config interface 'lan'
option type 'bridge'
option ifname 'eth0 eth1 eth2'
option proto 'static'
option ipaddr '192.168.1.100'
option netmask '255.255.255.0'
option ip6assign '60'
root@LEDE:/# brctl show
bridge name bridge id STP enabled interfaces
br-lan 7fff.00d01274f069 no eth0
eth1
eth2
root@LEDE:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel
master br-lan state DOWN group default qlen 1000
link/ether 00:d0:12:74:f0:69 brd ff:ff:ff:ff:ff:ff
3: ifb0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
qlen 32
link/ether be:80:bc:5e:63:c3 brd ff:ff:ff:ff:ff:ff
4: ifb1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
qlen 32
link/ether 0a:1d:8d:06:e3:5d brd ff:ff:ff:ff:ff:ff
5: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN group default qlen 1
link/gre 0.0.0.0 brd 0.0.0.0
6: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN
group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
7: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN
group default qlen 1000
link/ether e2:0b:10:b8:b7:b0 brd ff:ff:ff:ff:ff:ff
8: teql0: <NOARP> mtu 1500 qdisc noop state DOWN group default qlen 100
link/void
9: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN group default qlen 10
link/can
10: marvell: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel
state UP group default qlen 1000
link/ether aa:64:73:91:09:a9 brd ff:ff:ff:ff:ff:ff
inet6 fe80::a864:73ff:fe91:9a9/64 scope link
valid_lft forever preferred_lft forever
11: eth1@marvell: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
noqueue master br-lan switchid 00000000 state LOWERLAYERDOWN group
default qlen 1000
link/ether aa:64:73:91:09:a9 brd ff:ff:ff:ff:ff:ff
12: eth2@marvell: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
noqueue master br-lan switchid 00000000 state UP group default qlen 1000
link/ether aa:64:73:91:09:a9 brd ff:ff:ff:ff:ff:ff
13: eth3@marvell: <BROADCAST,MULTICAST> mtu 1500 qdisc noop switchid
00000000 state DOWN group default qlen 1000
link/ether aa:64:73:91:09:a9 brd ff:ff:ff:ff:ff:ff
14: eth4@marvell: <BROADCAST,MULTICAST> mtu 1500 qdisc noop switchid
00000000 state DOWN group default qlen 1000
link/ether aa:64:73:91:09:a9 brd ff:ff:ff:ff:ff:ff
15: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
state UP group default qlen 1000
link/ether 00:d0:12:74:f0:69 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global br-lan
valid_lft forever preferred_lft forever
inet6 fd7b:a43b:e93e::1/60 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::2d0:12ff:fe74:f069/64 scope link
valid_lft forever preferred_lft forever
We have this configuration working on a kernel 4.1 and including patches
to upgrade dsa/mv88e6xxx to kernel version 4.3 (5acf4d0, Wed, 27 May
2015 15:32:15 -0700) "[PATCH] blk: rq_data_dir() should not return a
boolean."
If I connect the eth1/eth2, the link is up and I can do ping through it.
But, once
I start sending a heavy traffic load the link fails and the kernel sends the
following messages:
[ 48.557140] sky2 0000:04:00.0 marvell: rx error, status 0x5f20010
length 1518
[ 48.564964] sky2 0000:04:00.0 marvell: rx error, status 0x5f20010
length 1518
[ 48.572110] sky2 0000:04:00.0 marvell: rx error, status 0x5f20010
length 1518
[ 48.579263] sky2 0000:04:00.0 marvell: rx error, status 0x5f20010
length 1518
[ 48.586417] sky2 0000:04:00.0 marvell: rx error, status 0x5f20010
length 1518
[ 48.593573] sky2 0000:04:00.0 marvell: rx error, status 0x5f20010
length 1518
[ 48.600718] sky2 0000:04:00.0 marvell: rx error, status 0x5f20010
length 1518
[ 54.877567] net_ratelimit: 6 callbacks suppressed
[ 54.882293] sky2 0000:04:00.0 marvell: rx error, status 0x5f20010
length 1518
[ 61.413552] sky2 0000:04:00.0 marvell: rx error, status 0x5f20010
length 1518
The status error bits are in sky2.h
0x5f20010 is
05f2 frame length => 1522
0010 Too long err
That means the packet was longer than the configured MTU.
You are probably getting packets with VLAN tag but have not configured
a VLAN.
Since you are using DSA, you will have DSA tags enabled on frames
to/from the switch. This adds an extra 8 byte header in the frame. My
guess is, it is this header, not the VLAN tag which is causing you MTU
issues.
But it is strange because, as I have said above, we have the same
configuration working properly on a kernel 4.1 (with OpenWrt), and we
have the MTU set to 1500.
I think this is the first time i've seen sky2 used in a DSA
setup. mv643xx or mvneta is generally what is used, when using Marvell
chipsets. These drivers are more lenient about MTU, and are happy to
pass frames with additional headers.
We use the mv88e6xxx (as our switch is mv88e6176) and it depends on DSA
driver in the kernel (isn't it?).
Thanks for the information. I have increased the MTU value to 1550
(workaround) and it works if sends traffic (with iperf) from my
computer to the unit. But, if I send traffic outside the unit, I get
a new error message and link goes down:
Changing the MTU like this is not a good fix. It will allow you to
receive frames which are bigger, but it also means the local network
stack will generate bigger frames to be transmitted. You probably need
to modify the sky2 driver to allow it to receive frames bigger than
the interface MTU, by about 8 bytes.
Should the DSA driver remove the DSA tags before pass the frames to sky2
interface?
[ 4901.032989] sky2 0000:04:00.0 marvell: tx timeout
[ 4904.722670] sky2 0000:04:00.0 marvell: Link is up at 1000 Mbps,
full duplex, flow control both
Between the sky2 and the switch, do you have two back-to-back PHYs or
are you connecting the RGMII interfaces together?
I think that we have two back-to-back PHYs, but I am going to double
check this with the hardware team.
Thanks,
Rafa
Andrew