Commit ef0e51dc authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by Jakub Kicinski

net: dsa: felix: provide own phylink MAC operations

Convert felix to provide its own phylink MAC operations, thus
avoiding the shim layer in DSA's port.c.
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Tested-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Link: https://lore.kernel.org/r/E1sByYA-00EM0y-Jn@rmk-PC.armlinux.org.ukSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent bbb31b7a
...@@ -1050,24 +1050,32 @@ static void felix_phylink_get_caps(struct dsa_switch *ds, int port, ...@@ -1050,24 +1050,32 @@ static void felix_phylink_get_caps(struct dsa_switch *ds, int port,
config->supported_interfaces); config->supported_interfaces);
} }
static void felix_phylink_mac_config(struct dsa_switch *ds, int port, static void felix_phylink_mac_config(struct phylink_config *config,
unsigned int mode, unsigned int mode,
const struct phylink_link_state *state) const struct phylink_link_state *state)
{ {
struct ocelot *ocelot = ds->priv; struct dsa_port *dp = dsa_phylink_to_port(config);
struct felix *felix = ocelot_to_felix(ocelot); struct ocelot *ocelot = dp->ds->priv;
int port = dp->index;
struct felix *felix;
felix = ocelot_to_felix(ocelot);
if (felix->info->phylink_mac_config) if (felix->info->phylink_mac_config)
felix->info->phylink_mac_config(ocelot, port, mode, state); felix->info->phylink_mac_config(ocelot, port, mode, state);
} }
static struct phylink_pcs *felix_phylink_mac_select_pcs(struct dsa_switch *ds, static struct phylink_pcs *
int port, felix_phylink_mac_select_pcs(struct phylink_config *config,
phy_interface_t iface) phy_interface_t iface)
{ {
struct ocelot *ocelot = ds->priv; struct dsa_port *dp = dsa_phylink_to_port(config);
struct felix *felix = ocelot_to_felix(ocelot); struct ocelot *ocelot = dp->ds->priv;
struct phylink_pcs *pcs = NULL; struct phylink_pcs *pcs = NULL;
int port = dp->index;
struct felix *felix;
felix = ocelot_to_felix(ocelot);
if (felix->pcs && felix->pcs[port]) if (felix->pcs && felix->pcs[port])
pcs = felix->pcs[port]; pcs = felix->pcs[port];
...@@ -1075,11 +1083,13 @@ static struct phylink_pcs *felix_phylink_mac_select_pcs(struct dsa_switch *ds, ...@@ -1075,11 +1083,13 @@ static struct phylink_pcs *felix_phylink_mac_select_pcs(struct dsa_switch *ds,
return pcs; return pcs;
} }
static void felix_phylink_mac_link_down(struct dsa_switch *ds, int port, static void felix_phylink_mac_link_down(struct phylink_config *config,
unsigned int link_an_mode, unsigned int link_an_mode,
phy_interface_t interface) phy_interface_t interface)
{ {
struct ocelot *ocelot = ds->priv; struct dsa_port *dp = dsa_phylink_to_port(config);
struct ocelot *ocelot = dp->ds->priv;
int port = dp->index;
struct felix *felix; struct felix *felix;
felix = ocelot_to_felix(ocelot); felix = ocelot_to_felix(ocelot);
...@@ -1088,15 +1098,19 @@ static void felix_phylink_mac_link_down(struct dsa_switch *ds, int port, ...@@ -1088,15 +1098,19 @@ static void felix_phylink_mac_link_down(struct dsa_switch *ds, int port,
felix->info->quirks); felix->info->quirks);
} }
static void felix_phylink_mac_link_up(struct dsa_switch *ds, int port, static void felix_phylink_mac_link_up(struct phylink_config *config,
struct phy_device *phydev,
unsigned int link_an_mode, unsigned int link_an_mode,
phy_interface_t interface, phy_interface_t interface,
struct phy_device *phydev,
int speed, int duplex, int speed, int duplex,
bool tx_pause, bool rx_pause) bool tx_pause, bool rx_pause)
{ {
struct ocelot *ocelot = ds->priv; struct dsa_port *dp = dsa_phylink_to_port(config);
struct felix *felix = ocelot_to_felix(ocelot); struct ocelot *ocelot = dp->ds->priv;
int port = dp->index;
struct felix *felix;
felix = ocelot_to_felix(ocelot);
ocelot_phylink_mac_link_up(ocelot, port, phydev, link_an_mode, ocelot_phylink_mac_link_up(ocelot, port, phydev, link_an_mode,
interface, speed, duplex, tx_pause, rx_pause, interface, speed, duplex, tx_pause, rx_pause,
...@@ -2083,6 +2097,14 @@ static void felix_get_mm_stats(struct dsa_switch *ds, int port, ...@@ -2083,6 +2097,14 @@ static void felix_get_mm_stats(struct dsa_switch *ds, int port,
ocelot_port_get_mm_stats(ocelot, port, stats); ocelot_port_get_mm_stats(ocelot, port, stats);
} }
const struct phylink_mac_ops felix_phylink_mac_ops = {
.mac_select_pcs = felix_phylink_mac_select_pcs,
.mac_config = felix_phylink_mac_config,
.mac_link_down = felix_phylink_mac_link_down,
.mac_link_up = felix_phylink_mac_link_up,
};
EXPORT_SYMBOL_GPL(felix_phylink_mac_ops);
const struct dsa_switch_ops felix_switch_ops = { const struct dsa_switch_ops felix_switch_ops = {
.get_tag_protocol = felix_get_tag_protocol, .get_tag_protocol = felix_get_tag_protocol,
.change_tag_protocol = felix_change_tag_protocol, .change_tag_protocol = felix_change_tag_protocol,
...@@ -2104,10 +2126,6 @@ const struct dsa_switch_ops felix_switch_ops = { ...@@ -2104,10 +2126,6 @@ const struct dsa_switch_ops felix_switch_ops = {
.get_sset_count = felix_get_sset_count, .get_sset_count = felix_get_sset_count,
.get_ts_info = felix_get_ts_info, .get_ts_info = felix_get_ts_info,
.phylink_get_caps = felix_phylink_get_caps, .phylink_get_caps = felix_phylink_get_caps,
.phylink_mac_config = felix_phylink_mac_config,
.phylink_mac_select_pcs = felix_phylink_mac_select_pcs,
.phylink_mac_link_down = felix_phylink_mac_link_down,
.phylink_mac_link_up = felix_phylink_mac_link_up,
.port_enable = felix_port_enable, .port_enable = felix_port_enable,
.port_fast_age = felix_port_fast_age, .port_fast_age = felix_port_fast_age,
.port_fdb_dump = felix_fdb_dump, .port_fdb_dump = felix_fdb_dump,
......
...@@ -82,6 +82,7 @@ struct felix_tag_proto_ops { ...@@ -82,6 +82,7 @@ struct felix_tag_proto_ops {
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
}; };
extern const struct phylink_mac_ops felix_phylink_mac_ops;
extern const struct dsa_switch_ops felix_switch_ops; extern const struct dsa_switch_ops felix_switch_ops;
/* DSA glue / front-end for struct ocelot */ /* DSA glue / front-end for struct ocelot */
......
...@@ -2717,6 +2717,7 @@ static int felix_pci_probe(struct pci_dev *pdev, ...@@ -2717,6 +2717,7 @@ static int felix_pci_probe(struct pci_dev *pdev,
ds->num_ports = felix->info->num_ports; ds->num_ports = felix->info->num_ports;
ds->num_tx_queues = felix->info->num_tx_queues; ds->num_tx_queues = felix->info->num_tx_queues;
ds->ops = &felix_switch_ops; ds->ops = &felix_switch_ops;
ds->phylink_mac_ops = &felix_phylink_mac_ops;
ds->priv = ocelot; ds->priv = ocelot;
felix->ds = ds; felix->ds = ds;
felix->tag_proto = DSA_TAG_PROTO_OCELOT; felix->tag_proto = DSA_TAG_PROTO_OCELOT;
......
...@@ -96,6 +96,7 @@ static int ocelot_ext_probe(struct platform_device *pdev) ...@@ -96,6 +96,7 @@ static int ocelot_ext_probe(struct platform_device *pdev)
ds->num_tx_queues = felix->info->num_tx_queues; ds->num_tx_queues = felix->info->num_tx_queues;
ds->ops = &felix_switch_ops; ds->ops = &felix_switch_ops;
ds->phylink_mac_ops = &felix_phylink_mac_ops;
ds->priv = ocelot; ds->priv = ocelot;
felix->ds = ds; felix->ds = ds;
felix->tag_proto = DSA_TAG_PROTO_OCELOT; felix->tag_proto = DSA_TAG_PROTO_OCELOT;
......
...@@ -1009,6 +1009,7 @@ static int seville_probe(struct platform_device *pdev) ...@@ -1009,6 +1009,7 @@ static int seville_probe(struct platform_device *pdev)
ds->dev = &pdev->dev; ds->dev = &pdev->dev;
ds->num_ports = felix->info->num_ports; ds->num_ports = felix->info->num_ports;
ds->ops = &felix_switch_ops; ds->ops = &felix_switch_ops;
ds->phylink_mac_ops = &felix_phylink_mac_ops;
ds->priv = ocelot; ds->priv = ocelot;
felix->ds = ds; felix->ds = ds;
felix->tag_proto = DSA_TAG_PROTO_SEVILLE; felix->tag_proto = DSA_TAG_PROTO_SEVILLE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment