Skip to content

Commit 30296ac

Browse files
vladimirolteankuba-moo
authored andcommitted
net: dsa: xrs700x: reject unsupported HSR configurations
As discussed here: https://lore.kernel.org/netdev/20240620090210.drop6jwh7e5qw556@skbuf/ the fact is that the xrs700x.c driver only supports offloading HSR_PT_SLAVE_A and HSR_PT_SLAVE_B (which were the only port types at the time the offload was written, _for this driver_). Up until now, the API did not explicitly tell offloading drivers what port has what role. So xrs700x can get confused and think that it can support a configuration which it actually can't. There was a table in the attached link which gave an example: $ ip link add name hsr0 type hsr slave1 swp0 slave2 swp1 \ interlink swp2 supervision 45 version 1 HSR_PT_SLAVE_A HSR_PT_SLAVE_B HSR_PT_INTERLINK ---------------------------------------------------------------- user space 0 1 2 requests ---------------------------------------------------------------- XRS700X driver 1 2 - understands The switch would act as if the ring ports were swp1 and swp2. Now that we have explicit hsr_get_port_type() API, let's use that to work around the unintended semantical changes of the offloading API brought by the introduction of interlink ports in HSR. Fixes: 5055ccc ("net: hsr: Provide RedBox support (HSR-SAN)") Cc: Lukasz Majewski <lukma@denx.de> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: George McCollister <george.mccollister@gmail.com> Link: https://patch.msgid.link/20251130131657.65080-5-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent bed59a8 commit 30296ac

1 file changed

Lines changed: 11 additions & 0 deletions

File tree

drivers/net/dsa/xrs700x/xrs700x.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,7 @@ static int xrs700x_hsr_join(struct dsa_switch *ds, int port,
566566
struct xrs700x *priv = ds->priv;
567567
struct net_device *user;
568568
int ret, i, hsr_pair[2];
569+
enum hsr_port_type type;
569570
enum hsr_version ver;
570571
bool fwd = false;
571572

@@ -589,6 +590,16 @@ static int xrs700x_hsr_join(struct dsa_switch *ds, int port,
589590
return -EOPNOTSUPP;
590591
}
591592

593+
ret = hsr_get_port_type(hsr, dsa_to_port(ds, port)->user, &type);
594+
if (ret)
595+
return ret;
596+
597+
if (type != HSR_PT_SLAVE_A && type != HSR_PT_SLAVE_B) {
598+
NL_SET_ERR_MSG_MOD(extack,
599+
"Only HSR slave ports can be offloaded");
600+
return -EOPNOTSUPP;
601+
}
602+
592603
dsa_hsr_foreach_port(dp, ds, hsr) {
593604
if (dp->index != port) {
594605
partner = dp;

0 commit comments

Comments
 (0)