mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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: 5055cccfc2 ("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>
This commit is contained in:
committed by
Jakub Kicinski
parent
bed59a86e9
commit
30296ac764
@@ -566,6 +566,7 @@ static int xrs700x_hsr_join(struct dsa_switch *ds, int port,
|
||||
struct xrs700x *priv = ds->priv;
|
||||
struct net_device *user;
|
||||
int ret, i, hsr_pair[2];
|
||||
enum hsr_port_type type;
|
||||
enum hsr_version ver;
|
||||
bool fwd = false;
|
||||
|
||||
@@ -589,6 +590,16 @@ static int xrs700x_hsr_join(struct dsa_switch *ds, int port,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
ret = hsr_get_port_type(hsr, dsa_to_port(ds, port)->user, &type);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (type != HSR_PT_SLAVE_A && type != HSR_PT_SLAVE_B) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Only HSR slave ports can be offloaded");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
dsa_hsr_foreach_port(dp, ds, hsr) {
|
||||
if (dp->index != port) {
|
||||
partner = dp;
|
||||
|
||||
Reference in New Issue
Block a user