Commit f9bcdc36 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller
Browse files

net: dsa: remove cross-chip support from the MRP notifiers



With MRP hardware assist being supported only by the ocelot switch
family, which by design does not support cross-chip bridging, the
current match functions are at best a guess and have not been confirmed
in any way to do anything relevant in a multi-switch topology.

Drop the code and make the notifiers match only on the targeted switch
port.

Cc: Horatiu Vultur <horatiu.vultur@microchip.com>
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 88faba20
Loading
Loading
Loading
Loading
+7 −48
Original line number Diff line number Diff line
@@ -346,36 +346,16 @@ static int dsa_switch_change_tag_proto(struct dsa_switch *ds,
	return 0;
}

static bool dsa_switch_mrp_match(struct dsa_switch *ds, int port,
				 struct dsa_notifier_mrp_info *info)
{
	if (ds->index == info->sw_index && port == info->port)
		return true;

	if (dsa_is_dsa_port(ds, port))
		return true;

	return false;
}

static int dsa_switch_mrp_add(struct dsa_switch *ds,
			      struct dsa_notifier_mrp_info *info)
{
	int err = 0;
	int port;

	if (!ds->ops->port_mrp_add)
		return -EOPNOTSUPP;

	for (port = 0; port < ds->num_ports; port++) {
		if (dsa_switch_mrp_match(ds, port, info)) {
			err = ds->ops->port_mrp_add(ds, port, info->mrp);
			if (err)
				break;
		}
	}
	if (ds->index == info->sw_index)
		return ds->ops->port_mrp_add(ds, info->port, info->mrp);

	return err;
	return 0;
}

static int dsa_switch_mrp_del(struct dsa_switch *ds,
@@ -390,39 +370,18 @@ static int dsa_switch_mrp_del(struct dsa_switch *ds,
	return 0;
}

static bool
dsa_switch_mrp_ring_role_match(struct dsa_switch *ds, int port,
			       struct dsa_notifier_mrp_ring_role_info *info)
{
	if (ds->index == info->sw_index && port == info->port)
		return true;

	if (dsa_is_dsa_port(ds, port))
		return true;

	return false;
}

static int
dsa_switch_mrp_add_ring_role(struct dsa_switch *ds,
			     struct dsa_notifier_mrp_ring_role_info *info)
{
	int err = 0;
	int port;

	if (!ds->ops->port_mrp_add)
		return -EOPNOTSUPP;

	for (port = 0; port < ds->num_ports; port++) {
		if (dsa_switch_mrp_ring_role_match(ds, port, info)) {
			err = ds->ops->port_mrp_add_ring_role(ds, port,
	if (ds->index == info->sw_index)
		return ds->ops->port_mrp_add_ring_role(ds, info->port,
						       info->mrp);
			if (err)
				break;
		}
	}

	return err;
	return 0;
}

static int