mirror of https://gitee.com/openkylin/linux.git
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: Ioana Ciornei <ioana.ciornei@nxp.com> Suggested-by: Vladimir Oltean <olteanv@gmail.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
17091180b1
commit
77373d49de
|
@ -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_vid_del(struct dsa_port *dp, u16 vid);
|
||||||
int dsa_port_link_register_of(struct dsa_port *dp);
|
int dsa_port_link_register_of(struct dsa_port *dp);
|
||||||
void dsa_port_link_unregister_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 */
|
/* slave.c */
|
||||||
extern const struct dsa_device_ops notag_netdev_ops;
|
extern const struct dsa_device_ops notag_netdev_ops;
|
||||||
|
|
100
net/dsa/port.c
100
net/dsa/port.c
|
@ -422,6 +422,106 @@ static struct phy_device *dsa_port_get_phy_device(struct dsa_port *dp)
|
||||||
return phydev;
|
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)
|
static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable)
|
||||||
{
|
{
|
||||||
struct dsa_switch *ds = dp->ds;
|
struct dsa_switch *ds = dp->ds;
|
||||||
|
|
|
@ -1164,100 +1164,6 @@ static struct device_type dsa_type = {
|
||||||
.name = "dsa",
|
.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)
|
void dsa_port_phylink_mac_change(struct dsa_switch *ds, int port, bool up)
|
||||||
{
|
{
|
||||||
const struct dsa_port *dp = dsa_to_port(ds, port);
|
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_config.type = PHYLINK_NETDEV;
|
||||||
|
|
||||||
dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(port_dn), mode,
|
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)) {
|
if (IS_ERR(dp->pl)) {
|
||||||
netdev_err(slave_dev,
|
netdev_err(slave_dev,
|
||||||
"error creating PHYLINK: %ld\n", PTR_ERR(dp->pl));
|
"error creating PHYLINK: %ld\n", PTR_ERR(dp->pl));
|
||||||
|
|
Loading…
Reference in New Issue