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

Commit 77373d49 authored by Ioana Ciornei's avatar Ioana Ciornei Committed by David S. Miller
Browse files

net: dsa: Move the phylink driver calls into port.c



In order to have a common handling of PHYLINK for the slave and non-user
ports, the DSA core glue logic (between PHYLINK and the driver) must use
an API that does not rely on a struct net_device.

These will also be called by the CPU-port-handling code in a further
patch.

Signed-off-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Suggested-by: default avatarVladimir Oltean <olteanv@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 17091180
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -163,6 +163,23 @@ int dsa_port_vid_add(struct dsa_port *dp, u16 vid, u16 flags);
int dsa_port_vid_del(struct dsa_port *dp, u16 vid);
int dsa_port_link_register_of(struct dsa_port *dp);
void dsa_port_link_unregister_of(struct dsa_port *dp);
void dsa_port_phylink_validate(struct phylink_config *config,
			       unsigned long *supported,
			       struct phylink_link_state *state);
int dsa_port_phylink_mac_link_state(struct phylink_config *config,
				    struct phylink_link_state *state);
void dsa_port_phylink_mac_config(struct phylink_config *config,
				 unsigned int mode,
				 const struct phylink_link_state *state);
void dsa_port_phylink_mac_an_restart(struct phylink_config *config);
void dsa_port_phylink_mac_link_down(struct phylink_config *config,
				    unsigned int mode,
				    phy_interface_t interface);
void dsa_port_phylink_mac_link_up(struct phylink_config *config,
				  unsigned int mode,
				  phy_interface_t interface,
				  struct phy_device *phydev);
extern const struct phylink_mac_ops dsa_port_phylink_mac_ops;

/* slave.c */
extern const struct dsa_device_ops notag_netdev_ops;
+100 −0
Original line number Diff line number Diff line
@@ -422,6 +422,106 @@ static struct phy_device *dsa_port_get_phy_device(struct dsa_port *dp)
	return phydev;
}

void dsa_port_phylink_validate(struct phylink_config *config,
			       unsigned long *supported,
			       struct phylink_link_state *state)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct dsa_switch *ds = dp->ds;

	if (!ds->ops->phylink_validate)
		return;

	ds->ops->phylink_validate(ds, dp->index, supported, state);
}
EXPORT_SYMBOL_GPL(dsa_port_phylink_validate);

int dsa_port_phylink_mac_link_state(struct phylink_config *config,
				    struct phylink_link_state *state)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct dsa_switch *ds = dp->ds;

	/* Only called for SGMII and 802.3z */
	if (!ds->ops->phylink_mac_link_state)
		return -EOPNOTSUPP;

	return ds->ops->phylink_mac_link_state(ds, dp->index, state);
}
EXPORT_SYMBOL_GPL(dsa_port_phylink_mac_link_state);

void dsa_port_phylink_mac_config(struct phylink_config *config,
				 unsigned int mode,
				 const struct phylink_link_state *state)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct dsa_switch *ds = dp->ds;

	if (!ds->ops->phylink_mac_config)
		return;

	ds->ops->phylink_mac_config(ds, dp->index, mode, state);
}
EXPORT_SYMBOL_GPL(dsa_port_phylink_mac_config);

void dsa_port_phylink_mac_an_restart(struct phylink_config *config)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct dsa_switch *ds = dp->ds;

	if (!ds->ops->phylink_mac_an_restart)
		return;

	ds->ops->phylink_mac_an_restart(ds, dp->index);
}
EXPORT_SYMBOL_GPL(dsa_port_phylink_mac_an_restart);

void dsa_port_phylink_mac_link_down(struct phylink_config *config,
				    unsigned int mode,
				    phy_interface_t interface)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct net_device *dev = dp->slave;
	struct dsa_switch *ds = dp->ds;

	if (!ds->ops->phylink_mac_link_down) {
		if (ds->ops->adjust_link && dev->phydev)
			ds->ops->adjust_link(ds, dp->index, dev->phydev);
		return;
	}

	ds->ops->phylink_mac_link_down(ds, dp->index, mode, interface);
}
EXPORT_SYMBOL_GPL(dsa_port_phylink_mac_link_down);

void dsa_port_phylink_mac_link_up(struct phylink_config *config,
				  unsigned int mode,
				  phy_interface_t interface,
				  struct phy_device *phydev)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct net_device *dev = dp->slave;
	struct dsa_switch *ds = dp->ds;

	if (!ds->ops->phylink_mac_link_up) {
		if (ds->ops->adjust_link && dev->phydev)
			ds->ops->adjust_link(ds, dp->index, dev->phydev);
		return;
	}

	ds->ops->phylink_mac_link_up(ds, dp->index, mode, interface, phydev);
}
EXPORT_SYMBOL_GPL(dsa_port_phylink_mac_link_up);

const struct phylink_mac_ops dsa_port_phylink_mac_ops = {
	.validate = dsa_port_phylink_validate,
	.mac_link_state = dsa_port_phylink_mac_link_state,
	.mac_config = dsa_port_phylink_mac_config,
	.mac_an_restart = dsa_port_phylink_mac_an_restart,
	.mac_link_down = dsa_port_phylink_mac_link_down,
	.mac_link_up = dsa_port_phylink_mac_link_up,
};

static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable)
{
	struct dsa_switch *ds = dp->ds;
+1 −95
Original line number Diff line number Diff line
@@ -1164,100 +1164,6 @@ static struct device_type dsa_type = {
	.name	= "dsa",
};

static void dsa_slave_phylink_validate(struct phylink_config *config,
				       unsigned long *supported,
				       struct phylink_link_state *state)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct dsa_switch *ds = dp->ds;

	if (!ds->ops->phylink_validate)
		return;

	ds->ops->phylink_validate(ds, dp->index, supported, state);
}

static int dsa_slave_phylink_mac_link_state(struct phylink_config *config,
					    struct phylink_link_state *state)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct dsa_switch *ds = dp->ds;

	/* Only called for SGMII and 802.3z */
	if (!ds->ops->phylink_mac_link_state)
		return -EOPNOTSUPP;

	return ds->ops->phylink_mac_link_state(ds, dp->index, state);
}

static void dsa_slave_phylink_mac_config(struct phylink_config *config,
					 unsigned int mode,
					 const struct phylink_link_state *state)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct dsa_switch *ds = dp->ds;

	if (!ds->ops->phylink_mac_config)
		return;

	ds->ops->phylink_mac_config(ds, dp->index, mode, state);
}

static void dsa_slave_phylink_mac_an_restart(struct phylink_config *config)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct dsa_switch *ds = dp->ds;

	if (!ds->ops->phylink_mac_an_restart)
		return;

	ds->ops->phylink_mac_an_restart(ds, dp->index);
}

static void dsa_slave_phylink_mac_link_down(struct phylink_config *config,
					    unsigned int mode,
					    phy_interface_t interface)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct net_device *dev = dp->slave;
	struct dsa_switch *ds = dp->ds;

	if (!ds->ops->phylink_mac_link_down) {
		if (ds->ops->adjust_link && dev->phydev)
			ds->ops->adjust_link(ds, dp->index, dev->phydev);
		return;
	}

	ds->ops->phylink_mac_link_down(ds, dp->index, mode, interface);
}

static void dsa_slave_phylink_mac_link_up(struct phylink_config *config,
					  unsigned int mode,
					  phy_interface_t interface,
					  struct phy_device *phydev)
{
	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
	struct net_device *dev = dp->slave;
	struct dsa_switch *ds = dp->ds;

	if (!ds->ops->phylink_mac_link_up) {
		if (ds->ops->adjust_link && dev->phydev)
			ds->ops->adjust_link(ds, dp->index, dev->phydev);
		return;
	}

	ds->ops->phylink_mac_link_up(ds, dp->index, mode, interface, phydev);
}

static const struct phylink_mac_ops dsa_slave_phylink_mac_ops = {
	.validate = dsa_slave_phylink_validate,
	.mac_link_state = dsa_slave_phylink_mac_link_state,
	.mac_config = dsa_slave_phylink_mac_config,
	.mac_an_restart = dsa_slave_phylink_mac_an_restart,
	.mac_link_down = dsa_slave_phylink_mac_link_down,
	.mac_link_up = dsa_slave_phylink_mac_link_up,
};

void dsa_port_phylink_mac_change(struct dsa_switch *ds, int port, bool up)
{
	const struct dsa_port *dp = dsa_to_port(ds, port);
@@ -1309,7 +1215,7 @@ static int dsa_slave_phy_setup(struct net_device *slave_dev)
	dp->pl_config.type = PHYLINK_NETDEV;

	dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(port_dn), mode,
				&dsa_slave_phylink_mac_ops);
				&dsa_port_phylink_mac_ops);
	if (IS_ERR(dp->pl)) {
		netdev_err(slave_dev,
			   "error creating PHYLINK: %ld\n", PTR_ERR(dp->pl));