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

net: dsa: remove cross-chip support for MRP



The cross-chip notifiers for MRP are bypass operations, meaning that
even though all switches in a tree are notified, only the switch
specified in the info structure is targeted.

We can eliminate the unnecessary complexity by deleting the cross-chip
notifier logic and calling the ds->ops straight from port.c.

Cc: Horatiu Vultur <horatiu.vultur@microchip.com>
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ff91e1b6
Loading
Loading
Loading
Loading
+0 −18
Original line number Original line Diff line number Diff line
@@ -40,10 +40,6 @@ enum {
	DSA_NOTIFIER_TAG_PROTO,
	DSA_NOTIFIER_TAG_PROTO,
	DSA_NOTIFIER_TAG_PROTO_CONNECT,
	DSA_NOTIFIER_TAG_PROTO_CONNECT,
	DSA_NOTIFIER_TAG_PROTO_DISCONNECT,
	DSA_NOTIFIER_TAG_PROTO_DISCONNECT,
	DSA_NOTIFIER_MRP_ADD,
	DSA_NOTIFIER_MRP_DEL,
	DSA_NOTIFIER_MRP_ADD_RING_ROLE,
	DSA_NOTIFIER_MRP_DEL_RING_ROLE,
	DSA_NOTIFIER_TAG_8021Q_VLAN_ADD,
	DSA_NOTIFIER_TAG_8021Q_VLAN_ADD,
	DSA_NOTIFIER_TAG_8021Q_VLAN_DEL,
	DSA_NOTIFIER_TAG_8021Q_VLAN_DEL,
};
};
@@ -107,20 +103,6 @@ struct dsa_notifier_tag_proto_info {
	const struct dsa_device_ops *tag_ops;
	const struct dsa_device_ops *tag_ops;
};
};


/* DSA_NOTIFIER_MRP_* */
struct dsa_notifier_mrp_info {
	const struct switchdev_obj_mrp *mrp;
	int sw_index;
	int port;
};

/* DSA_NOTIFIER_MRP_* */
struct dsa_notifier_mrp_ring_role_info {
	const struct switchdev_obj_ring_role_mrp *mrp;
	int sw_index;
	int port;
};

/* DSA_NOTIFIER_TAG_8021Q_VLAN_* */
/* DSA_NOTIFIER_TAG_8021Q_VLAN_* */
struct dsa_notifier_tag_8021q_vlan_info {
struct dsa_notifier_tag_8021q_vlan_info {
	int tree_index;
	int tree_index;
+20 −24
Original line number Original line Diff line number Diff line
@@ -907,49 +907,45 @@ int dsa_port_vlan_del(struct dsa_port *dp,
int dsa_port_mrp_add(const struct dsa_port *dp,
int dsa_port_mrp_add(const struct dsa_port *dp,
		     const struct switchdev_obj_mrp *mrp)
		     const struct switchdev_obj_mrp *mrp)
{
{
	struct dsa_notifier_mrp_info info = {
	struct dsa_switch *ds = dp->ds;
		.sw_index = dp->ds->index,

		.port = dp->index,
	if (!ds->ops->port_mrp_add)
		.mrp = mrp,
		return -EOPNOTSUPP;
	};


	return dsa_port_notify(dp, DSA_NOTIFIER_MRP_ADD, &info);
	return ds->ops->port_mrp_add(ds, dp->index, mrp);
}
}


int dsa_port_mrp_del(const struct dsa_port *dp,
int dsa_port_mrp_del(const struct dsa_port *dp,
		     const struct switchdev_obj_mrp *mrp)
		     const struct switchdev_obj_mrp *mrp)
{
{
	struct dsa_notifier_mrp_info info = {
	struct dsa_switch *ds = dp->ds;
		.sw_index = dp->ds->index,

		.port = dp->index,
	if (!ds->ops->port_mrp_del)
		.mrp = mrp,
		return -EOPNOTSUPP;
	};


	return dsa_port_notify(dp, DSA_NOTIFIER_MRP_DEL, &info);
	return ds->ops->port_mrp_del(ds, dp->index, mrp);
}
}


int dsa_port_mrp_add_ring_role(const struct dsa_port *dp,
int dsa_port_mrp_add_ring_role(const struct dsa_port *dp,
			       const struct switchdev_obj_ring_role_mrp *mrp)
			       const struct switchdev_obj_ring_role_mrp *mrp)
{
{
	struct dsa_notifier_mrp_ring_role_info info = {
	struct dsa_switch *ds = dp->ds;
		.sw_index = dp->ds->index,

		.port = dp->index,
	if (!ds->ops->port_mrp_add_ring_role)
		.mrp = mrp,
		return -EOPNOTSUPP;
	};


	return dsa_port_notify(dp, DSA_NOTIFIER_MRP_ADD_RING_ROLE, &info);
	return ds->ops->port_mrp_add_ring_role(ds, dp->index, mrp);
}
}


int dsa_port_mrp_del_ring_role(const struct dsa_port *dp,
int dsa_port_mrp_del_ring_role(const struct dsa_port *dp,
			       const struct switchdev_obj_ring_role_mrp *mrp)
			       const struct switchdev_obj_ring_role_mrp *mrp)
{
{
	struct dsa_notifier_mrp_ring_role_info info = {
	struct dsa_switch *ds = dp->ds;
		.sw_index = dp->ds->index,

		.port = dp->index,
	if (!ds->ops->port_mrp_del_ring_role)
		.mrp = mrp,
		return -EOPNOTSUPP;
	};


	return dsa_port_notify(dp, DSA_NOTIFIER_MRP_DEL_RING_ROLE, &info);
	return ds->ops->port_mrp_del_ring_role(ds, dp->index, mrp);
}
}


void dsa_port_set_tag_protocol(struct dsa_port *cpu_dp,
void dsa_port_set_tag_protocol(struct dsa_port *cpu_dp,
+0 −64
Original line number Original line Diff line number Diff line
@@ -701,58 +701,6 @@ dsa_switch_disconnect_tag_proto(struct dsa_switch *ds,
	return 0;
	return 0;
}
}


static int dsa_switch_mrp_add(struct dsa_switch *ds,
			      struct dsa_notifier_mrp_info *info)
{
	if (!ds->ops->port_mrp_add)
		return -EOPNOTSUPP;

	if (ds->index == info->sw_index)
		return ds->ops->port_mrp_add(ds, info->port, info->mrp);

	return 0;
}

static int dsa_switch_mrp_del(struct dsa_switch *ds,
			      struct dsa_notifier_mrp_info *info)
{
	if (!ds->ops->port_mrp_del)
		return -EOPNOTSUPP;

	if (ds->index == info->sw_index)
		return ds->ops->port_mrp_del(ds, info->port, info->mrp);

	return 0;
}

static int
dsa_switch_mrp_add_ring_role(struct dsa_switch *ds,
			     struct dsa_notifier_mrp_ring_role_info *info)
{
	if (!ds->ops->port_mrp_add_ring_role)
		return -EOPNOTSUPP;

	if (ds->index == info->sw_index)
		return ds->ops->port_mrp_add_ring_role(ds, info->port,
						       info->mrp);

	return 0;
}

static int
dsa_switch_mrp_del_ring_role(struct dsa_switch *ds,
			     struct dsa_notifier_mrp_ring_role_info *info)
{
	if (!ds->ops->port_mrp_del_ring_role)
		return -EOPNOTSUPP;

	if (ds->index == info->sw_index)
		return ds->ops->port_mrp_del_ring_role(ds, info->port,
						       info->mrp);

	return 0;
}

static int dsa_switch_event(struct notifier_block *nb,
static int dsa_switch_event(struct notifier_block *nb,
			    unsigned long event, void *info)
			    unsigned long event, void *info)
{
{
@@ -826,18 +774,6 @@ static int dsa_switch_event(struct notifier_block *nb,
	case DSA_NOTIFIER_TAG_PROTO_DISCONNECT:
	case DSA_NOTIFIER_TAG_PROTO_DISCONNECT:
		err = dsa_switch_disconnect_tag_proto(ds, info);
		err = dsa_switch_disconnect_tag_proto(ds, info);
		break;
		break;
	case DSA_NOTIFIER_MRP_ADD:
		err = dsa_switch_mrp_add(ds, info);
		break;
	case DSA_NOTIFIER_MRP_DEL:
		err = dsa_switch_mrp_del(ds, info);
		break;
	case DSA_NOTIFIER_MRP_ADD_RING_ROLE:
		err = dsa_switch_mrp_add_ring_role(ds, info);
		break;
	case DSA_NOTIFIER_MRP_DEL_RING_ROLE:
		err = dsa_switch_mrp_del_ring_role(ds, info);
		break;
	case DSA_NOTIFIER_TAG_8021Q_VLAN_ADD:
	case DSA_NOTIFIER_TAG_8021Q_VLAN_ADD:
		err = dsa_switch_tag_8021q_vlan_add(ds, info);
		err = dsa_switch_tag_8021q_vlan_add(ds, info);
		break;
		break;