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

net: dsa: bcm_sf2: provide own phylink MAC operations

Convert bcm_sf2 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>
Acked-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
Tested-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
Link: https://lore.kernel.org/r/E1rwfu3-00752s-On@rmk-PC.armlinux.org.ukSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 3fde60af
...@@ -740,16 +740,19 @@ static void bcm_sf2_sw_get_caps(struct dsa_switch *ds, int port, ...@@ -740,16 +740,19 @@ static void bcm_sf2_sw_get_caps(struct dsa_switch *ds, int port,
MAC_10 | MAC_100 | MAC_1000; MAC_10 | MAC_100 | MAC_1000;
} }
static void bcm_sf2_sw_mac_config(struct dsa_switch *ds, int port, static void bcm_sf2_sw_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 bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); struct dsa_port *dp = dsa_phylink_to_port(config);
u32 id_mode_dis = 0, port_mode; u32 id_mode_dis = 0, port_mode;
struct bcm_sf2_priv *priv;
u32 reg_rgmii_ctrl; u32 reg_rgmii_ctrl;
u32 reg; u32 reg;
if (port == core_readl(priv, CORE_IMP0_PRT_ID)) priv = bcm_sf2_to_priv(dp->ds);
if (dp->index == core_readl(priv, CORE_IMP0_PRT_ID))
return; return;
switch (state->interface) { switch (state->interface) {
...@@ -770,7 +773,7 @@ static void bcm_sf2_sw_mac_config(struct dsa_switch *ds, int port, ...@@ -770,7 +773,7 @@ static void bcm_sf2_sw_mac_config(struct dsa_switch *ds, int port,
return; return;
} }
reg_rgmii_ctrl = bcm_sf2_reg_rgmii_cntrl(priv, port); reg_rgmii_ctrl = bcm_sf2_reg_rgmii_cntrl(priv, dp->index);
/* Clear id_mode_dis bit, and the existing port mode, let /* Clear id_mode_dis bit, and the existing port mode, let
* RGMII_MODE_EN bet set by mac_link_{up,down} * RGMII_MODE_EN bet set by mac_link_{up,down}
...@@ -809,13 +812,16 @@ static void bcm_sf2_sw_mac_link_set(struct dsa_switch *ds, int port, ...@@ -809,13 +812,16 @@ static void bcm_sf2_sw_mac_link_set(struct dsa_switch *ds, int port,
reg_writel(priv, reg, reg_rgmii_ctrl); reg_writel(priv, reg, reg_rgmii_ctrl);
} }
static void bcm_sf2_sw_mac_link_down(struct dsa_switch *ds, int port, static void bcm_sf2_sw_mac_link_down(struct phylink_config *config,
unsigned int mode, unsigned int mode,
phy_interface_t interface) phy_interface_t interface)
{ {
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); struct dsa_port *dp = dsa_phylink_to_port(config);
struct bcm_sf2_priv *priv;
int port = dp->index;
u32 reg, offset; u32 reg, offset;
priv = bcm_sf2_to_priv(dp->ds);
if (priv->wol_ports_mask & BIT(port)) if (priv->wol_ports_mask & BIT(port))
return; return;
...@@ -824,23 +830,26 @@ static void bcm_sf2_sw_mac_link_down(struct dsa_switch *ds, int port, ...@@ -824,23 +830,26 @@ static void bcm_sf2_sw_mac_link_down(struct dsa_switch *ds, int port,
reg &= ~LINK_STS; reg &= ~LINK_STS;
core_writel(priv, reg, offset); core_writel(priv, reg, offset);
bcm_sf2_sw_mac_link_set(ds, port, interface, false); bcm_sf2_sw_mac_link_set(dp->ds, port, interface, false);
} }
static void bcm_sf2_sw_mac_link_up(struct dsa_switch *ds, int port, static void bcm_sf2_sw_mac_link_up(struct phylink_config *config,
struct phy_device *phydev,
unsigned int mode, unsigned int 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 bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); struct dsa_port *dp = dsa_phylink_to_port(config);
struct ethtool_keee *p = &priv->dev->ports[port].eee; struct bcm_sf2_priv *priv;
u32 reg_rgmii_ctrl = 0; u32 reg_rgmii_ctrl = 0;
struct ethtool_keee *p;
int port = dp->index;
u32 reg, offset; u32 reg, offset;
bcm_sf2_sw_mac_link_set(ds, port, interface, true); bcm_sf2_sw_mac_link_set(dp->ds, port, interface, true);
priv = bcm_sf2_to_priv(dp->ds);
offset = bcm_sf2_port_override_offset(priv, port); offset = bcm_sf2_port_override_offset(priv, port);
if (phy_interface_mode_is_rgmii(interface) || if (phy_interface_mode_is_rgmii(interface) ||
...@@ -886,8 +895,10 @@ static void bcm_sf2_sw_mac_link_up(struct dsa_switch *ds, int port, ...@@ -886,8 +895,10 @@ static void bcm_sf2_sw_mac_link_up(struct dsa_switch *ds, int port,
core_writel(priv, reg, offset); core_writel(priv, reg, offset);
if (mode == MLO_AN_PHY && phydev) if (mode == MLO_AN_PHY && phydev) {
p->eee_enabled = b53_eee_init(ds, port, phydev); p = &priv->dev->ports[port].eee;
p->eee_enabled = b53_eee_init(dp->ds, port, phydev);
}
} }
static void bcm_sf2_sw_fixed_state(struct dsa_switch *ds, int port, static void bcm_sf2_sw_fixed_state(struct dsa_switch *ds, int port,
...@@ -1196,6 +1207,12 @@ static int bcm_sf2_sw_get_sset_count(struct dsa_switch *ds, int port, ...@@ -1196,6 +1207,12 @@ static int bcm_sf2_sw_get_sset_count(struct dsa_switch *ds, int port,
return cnt; return cnt;
} }
static const struct phylink_mac_ops bcm_sf2_phylink_mac_ops = {
.mac_config = bcm_sf2_sw_mac_config,
.mac_link_down = bcm_sf2_sw_mac_link_down,
.mac_link_up = bcm_sf2_sw_mac_link_up,
};
static const struct dsa_switch_ops bcm_sf2_ops = { static const struct dsa_switch_ops bcm_sf2_ops = {
.get_tag_protocol = b53_get_tag_protocol, .get_tag_protocol = b53_get_tag_protocol,
.setup = bcm_sf2_sw_setup, .setup = bcm_sf2_sw_setup,
...@@ -1206,9 +1223,6 @@ static const struct dsa_switch_ops bcm_sf2_ops = { ...@@ -1206,9 +1223,6 @@ static const struct dsa_switch_ops bcm_sf2_ops = {
.get_ethtool_phy_stats = b53_get_ethtool_phy_stats, .get_ethtool_phy_stats = b53_get_ethtool_phy_stats,
.get_phy_flags = bcm_sf2_sw_get_phy_flags, .get_phy_flags = bcm_sf2_sw_get_phy_flags,
.phylink_get_caps = bcm_sf2_sw_get_caps, .phylink_get_caps = bcm_sf2_sw_get_caps,
.phylink_mac_config = bcm_sf2_sw_mac_config,
.phylink_mac_link_down = bcm_sf2_sw_mac_link_down,
.phylink_mac_link_up = bcm_sf2_sw_mac_link_up,
.phylink_fixed_state = bcm_sf2_sw_fixed_state, .phylink_fixed_state = bcm_sf2_sw_fixed_state,
.suspend = bcm_sf2_sw_suspend, .suspend = bcm_sf2_sw_suspend,
.resume = bcm_sf2_sw_resume, .resume = bcm_sf2_sw_resume,
...@@ -1399,6 +1413,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev) ...@@ -1399,6 +1413,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
priv->dev = dev; priv->dev = dev;
ds = dev->ds; ds = dev->ds;
ds->ops = &bcm_sf2_ops; ds->ops = &bcm_sf2_ops;
ds->phylink_mac_ops = &bcm_sf2_phylink_mac_ops;
/* Advertise the 8 egress queues */ /* Advertise the 8 egress queues */
ds->num_tx_queues = SF2_NUM_EGRESS_QUEUES; ds->num_tx_queues = SF2_NUM_EGRESS_QUEUES;
......
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