[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <6400e73a-b165-41a8-9fc9-e2226060a68c@kontron.de>
Date: Wed, 29 Jan 2025 09:03:17 +0100
From: Frieder Schrempf <frieder.schrempf@...tron.de>
To: Andrew Lunn <andrew@...n.ch>
Cc: "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
Lukasz Majewski <lukma@...x.de>
Subject: Re: KSZ9477 HSR Offloading
On 29.01.25 8:24 AM, Frieder Schrempf wrote:
> Hi Andrew,
>
> On 28.01.25 6:51 PM, Andrew Lunn wrote:
>> On Tue, Jan 28, 2025 at 05:14:46PM +0100, Frieder Schrempf wrote:
>>> Hi,
>>>
>>> I'm trying out HSR support on KSZ9477 with v6.12. My setup looks like this:
>>>
>>> +-------------+ +-------------+
>>> | | | |
>>> | Node A | | Node D |
>>> | | | |
>>> | | | |
>>> | LAN1 LAN2 | | LAN1 LAN2 |
>>> +--+-------+--+ +--+------+---+
>>> | | | |
>>> | +---------------+ |
>>> | |
>>> | +---------------+ |
>>> | | | |
>>> +--+-------+--+ +--+------+---+
>>> | LAN1 LAN2 | | LAN1 LAN2 |
>>> | | | |
>>> | | | |
>>> | Node B | | Node C |
>>> | | | |
>>> +-------------+ +-------------+
>>>
>>> On each device the LAN1 and LAN2 are added as HSR slaves. Then I try to
>>> do ping tests between each of the HSR interfaces.
>>>
>>> The result is that I can reach the neighboring nodes just fine, but I
>>> can't reach the remote node that needs packages to be forwarded through
>>> the other nodes. For example I can't ping from node A to C.
>>>
>>> I've tried to disable HW offloading in the driver and then everything
>>> starts working.
>>>
>>> Is this a problem with HW offloading in the KSZ driver, or am I missing
>>> something essential?
>>
>> How are IP addresses configured? I assume you have a bridge, LAN1 and
>> LAN2 are members of the bridge, and the IP address is on the bridge
>> interface?
>
> I have a HSR interface on each node that covers LAN1 and LAN2 as slaves
> and the IP addresses are on those HSR interfaces. For node A:
>
> ip link add name hsr type hsr slave1 lan1 slave2 lan2 supervision 45
> version 1
> ip addr add 172.20.1.1/24 dev hsr
>
> The other nodes have the addresses 172.20.1.2/24, 172.20.1.3/24 and
> 172.20.1.4/24 respectively.
>
> Then on node A, I'm doing:
>
> ping 172.20.1.2 # neighboring node B works
> ping 172.20.1.4 # neighboring node D works
> ping 172.20.1.3 # remote node C works only if I disable offloading
BTW, it's enough to disable the offloading of the forwarding for HSR
frames to make it work.
--- a/drivers/net/dsa/microchip/ksz9477.c
+++ b/drivers/net/dsa/microchip/ksz9477.c
@@ -1267,7 +1267,7 @@ int ksz9477_tc_cbs_set_cinc(struct ksz_device
*dev, int port, u32 val)
* Moreover, the NETIF_F_HW_HSR_FWD feature is also enabled, as HSR frames
* can be forwarded in the switch fabric between HSR ports.
*/
-#define KSZ9477_SUPPORTED_HSR_FEATURES (NETIF_F_HW_HSR_DUP |
NETIF_F_HW_HSR_FWD)
+#define KSZ9477_SUPPORTED_HSR_FEATURES (NETIF_F_HW_HSR_DUP)
void ksz9477_hsr_join(struct dsa_switch *ds, int port, struct
net_device *hsr)
{
@@ -1279,16 +1279,6 @@ void ksz9477_hsr_join(struct dsa_switch *ds, int
port, struct net_device *hsr)
/* Program which port(s) shall support HSR */
ksz_rmw32(dev, REG_HSR_PORT_MAP__4, BIT(port), BIT(port));
- /* Forward frames between HSR ports (i.e. bridge together HSR
ports) */
- if (dev->hsr_ports) {
- dsa_hsr_foreach_port(hsr_dp, ds, hsr)
- hsr_ports |= BIT(hsr_dp->index);
-
- hsr_ports |= BIT(dsa_upstream_port(ds, port));
- dsa_hsr_foreach_port(hsr_dp, ds, hsr)
- ksz9477_cfg_port_member(dev, hsr_dp->index,
hsr_ports);
- }
-
if (!dev->hsr_ports) {
/* Enable discarding of received HSR frames */
ksz_read8(dev, REG_HSR_ALU_CTRL_0__1, &data);
Powered by blists - more mailing lists