Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 57ab1ca2 authored by Vivien Didelot's avatar Vivien Didelot Committed by David S. Miller
Browse files

net: dsa: move fixed link registration helpers



The new bindings (dsa2.c) and the old bindings (legacy.c) share two
helpers dsa_cpu_dsa_setup and dsa_cpu_dsa_destroy, used to register or
deregister a fixed PHY if a given port has a corresponding device node.

Unclutter the code by moving them into two new port.c helpers,
dsa_port_fixed_link_register_of and dsa_port_fixed_link_(un)register_of.

Signed-off-by: default avatarVivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 952c5719
Loading
Loading
Loading
Loading
+0 −39
Original line number Diff line number Diff line
@@ -68,37 +68,6 @@ const struct dsa_device_ops *dsa_device_ops[DSA_TAG_LAST] = {
	[DSA_TAG_PROTO_NONE] = &none_ops,
};

int dsa_cpu_dsa_setup(struct dsa_port *port)
{
	struct device_node *port_dn = port->dn;
	struct dsa_switch *ds = port->ds;
	struct phy_device *phydev;
	int ret, mode;

	if (of_phy_is_fixed_link(port_dn)) {
		ret = of_phy_register_fixed_link(port_dn);
		if (ret) {
			dev_err(ds->dev, "failed to register fixed PHY\n");
			return ret;
		}
		phydev = of_phy_find_device(port_dn);

		mode = of_get_phy_mode(port_dn);
		if (mode < 0)
			mode = PHY_INTERFACE_MODE_NA;
		phydev->interface = mode;

		genphy_config_init(phydev);
		genphy_read_status(phydev);
		if (ds->ops->adjust_link)
			ds->ops->adjust_link(ds, port->index, phydev);

		put_device(&phydev->mdio.dev);
	}

	return 0;
}

const struct dsa_device_ops *dsa_resolve_tag_protocol(int tag_protocol)
{
	const struct dsa_device_ops *ops;
@@ -113,14 +82,6 @@ const struct dsa_device_ops *dsa_resolve_tag_protocol(int tag_protocol)
	return ops;
}

void dsa_cpu_dsa_destroy(struct dsa_port *port)
{
	struct device_node *port_dn = port->dn;

	if (of_phy_is_fixed_link(port_dn))
		of_phy_deregister_fixed_link(port_dn);
}

static int dev_is_class(struct device *dev, void *class)
{
	if (dev->class != NULL && !strcmp(dev->class->name, class))
+4 −4
Original line number Diff line number Diff line
@@ -219,7 +219,7 @@ static int dsa_dsa_port_apply(struct dsa_port *port)
	struct dsa_switch *ds = port->ds;
	int err;

	err = dsa_cpu_dsa_setup(port);
	err = dsa_port_fixed_link_register_of(port);
	if (err) {
		dev_warn(ds->dev, "Failed to setup dsa port %d: %d\n",
			 port->index, err);
@@ -235,7 +235,7 @@ static int dsa_dsa_port_apply(struct dsa_port *port)
static void dsa_dsa_port_unapply(struct dsa_port *port)
{
	devlink_port_unregister(&port->devlink_port);
	dsa_cpu_dsa_destroy(port);
	dsa_port_fixed_link_unregister_of(port);
}

static int dsa_cpu_port_apply(struct dsa_port *port)
@@ -243,7 +243,7 @@ static int dsa_cpu_port_apply(struct dsa_port *port)
	struct dsa_switch *ds = port->ds;
	int err;

	err = dsa_cpu_dsa_setup(port);
	err = dsa_port_fixed_link_register_of(port);
	if (err) {
		dev_warn(ds->dev, "Failed to setup cpu port %d: %d\n",
			 port->index, err);
@@ -259,7 +259,7 @@ static int dsa_cpu_port_apply(struct dsa_port *port)
static void dsa_cpu_port_unapply(struct dsa_port *port)
{
	devlink_port_unregister(&port->devlink_port);
	dsa_cpu_dsa_destroy(port);
	dsa_port_fixed_link_unregister_of(port);
}

static int dsa_user_port_apply(struct dsa_port *port)
+3 −2
Original line number Diff line number Diff line
@@ -93,8 +93,6 @@ struct dsa_slave_priv {
};

/* dsa.c */
int dsa_cpu_dsa_setup(struct dsa_port *port);
void dsa_cpu_dsa_destroy(struct dsa_port *dport);
const struct dsa_device_ops *dsa_resolve_tag_protocol(int tag_protocol);
bool dsa_schedule_work(struct work_struct *work);

@@ -159,6 +157,9 @@ int dsa_port_vlan_add(struct dsa_port *dp,
		      struct switchdev_trans *trans);
int dsa_port_vlan_del(struct dsa_port *dp,
		      const struct switchdev_obj_port_vlan *vlan);
int dsa_port_fixed_link_register_of(struct dsa_port *dp);
void dsa_port_fixed_link_unregister_of(struct dsa_port *dp);

/* slave.c */
extern const struct dsa_device_ops notag_netdev_ops;
void dsa_slave_mii_bus_init(struct dsa_switch *ds);
+2 −2
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ static int dsa_cpu_dsa_setups(struct dsa_switch *ds)
		if (!(dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)))
			continue;

		ret = dsa_cpu_dsa_setup(&ds->ports[port]);
		ret = dsa_port_fixed_link_register_of(&ds->ports[port]);
		if (ret)
			return ret;
	}
@@ -274,7 +274,7 @@ static void dsa_switch_destroy(struct dsa_switch *ds)
	for (port = 0; port < ds->num_ports; port++) {
		if (!(dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)))
			continue;
		dsa_cpu_dsa_destroy(&ds->ports[port]);
		dsa_port_fixed_link_unregister_of(&ds->ports[port]);
	}

	if (ds->slave_mii_bus && ds->ops->phy_read)
+47 −0
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@

#include <linux/if_bridge.h>
#include <linux/notifier.h>
#include <linux/of_mdio.h>
#include <linux/of_net.h>

#include "dsa_priv.h"

@@ -264,3 +266,48 @@ int dsa_port_vlan_del(struct dsa_port *dp,

	return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_DEL, &info);
}

int dsa_port_fixed_link_register_of(struct dsa_port *dp)
{
	struct device_node *dn = dp->dn;
	struct dsa_switch *ds = dp->ds;
	struct phy_device *phydev;
	int port = dp->index;
	int mode;
	int err;

	if (of_phy_is_fixed_link(dn)) {
		err = of_phy_register_fixed_link(dn);
		if (err) {
			dev_err(ds->dev,
				"failed to register the fixed PHY of port %d\n",
				port);
			return err;
		}

		phydev = of_phy_find_device(dn);

		mode = of_get_phy_mode(dn);
		if (mode < 0)
			mode = PHY_INTERFACE_MODE_NA;
		phydev->interface = mode;

		genphy_config_init(phydev);
		genphy_read_status(phydev);

		if (ds->ops->adjust_link)
			ds->ops->adjust_link(ds, port, phydev);

		put_device(&phydev->mdio.dev);
	}

	return 0;
}

void dsa_port_fixed_link_unregister_of(struct dsa_port *dp)
{
	struct device_node *dn = dp->dn;

	if (of_phy_is_fixed_link(dn))
		of_phy_deregister_fixed_link(dn);
}