Commit cff05632 authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by David S. Miller

net: mvpp2: use .mac_select_pcs() interface

Use the mac_select_pcs() method to choose between the GMAC and XLG
PCS implementations.
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0d22d4b6
...@@ -1239,7 +1239,8 @@ struct mvpp2_port { ...@@ -1239,7 +1239,8 @@ struct mvpp2_port {
phy_interface_t phy_interface; phy_interface_t phy_interface;
struct phylink *phylink; struct phylink *phylink;
struct phylink_config phylink_config; struct phylink_config phylink_config;
struct phylink_pcs phylink_pcs; struct phylink_pcs pcs_gmac;
struct phylink_pcs pcs_xlg;
struct phy *comphy; struct phy *comphy;
struct mvpp2_bm_pool *pool_long; struct mvpp2_bm_pool *pool_long;
......
...@@ -6115,15 +6115,20 @@ static struct mvpp2_port *mvpp2_phylink_to_port(struct phylink_config *config) ...@@ -6115,15 +6115,20 @@ static struct mvpp2_port *mvpp2_phylink_to_port(struct phylink_config *config)
return container_of(config, struct mvpp2_port, phylink_config); return container_of(config, struct mvpp2_port, phylink_config);
} }
static struct mvpp2_port *mvpp2_pcs_to_port(struct phylink_pcs *pcs) static struct mvpp2_port *mvpp2_pcs_xlg_to_port(struct phylink_pcs *pcs)
{ {
return container_of(pcs, struct mvpp2_port, phylink_pcs); return container_of(pcs, struct mvpp2_port, pcs_xlg);
}
static struct mvpp2_port *mvpp2_pcs_gmac_to_port(struct phylink_pcs *pcs)
{
return container_of(pcs, struct mvpp2_port, pcs_gmac);
} }
static void mvpp2_xlg_pcs_get_state(struct phylink_pcs *pcs, static void mvpp2_xlg_pcs_get_state(struct phylink_pcs *pcs,
struct phylink_link_state *state) struct phylink_link_state *state)
{ {
struct mvpp2_port *port = mvpp2_pcs_to_port(pcs); struct mvpp2_port *port = mvpp2_pcs_xlg_to_port(pcs);
u32 val; u32 val;
if (port->phy_interface == PHY_INTERFACE_MODE_5GBASER) if (port->phy_interface == PHY_INTERFACE_MODE_5GBASER)
...@@ -6161,7 +6166,7 @@ static const struct phylink_pcs_ops mvpp2_phylink_xlg_pcs_ops = { ...@@ -6161,7 +6166,7 @@ static const struct phylink_pcs_ops mvpp2_phylink_xlg_pcs_ops = {
static void mvpp2_gmac_pcs_get_state(struct phylink_pcs *pcs, static void mvpp2_gmac_pcs_get_state(struct phylink_pcs *pcs,
struct phylink_link_state *state) struct phylink_link_state *state)
{ {
struct mvpp2_port *port = mvpp2_pcs_to_port(pcs); struct mvpp2_port *port = mvpp2_pcs_gmac_to_port(pcs);
u32 val; u32 val;
val = readl(port->base + MVPP2_GMAC_STATUS0); val = readl(port->base + MVPP2_GMAC_STATUS0);
...@@ -6198,7 +6203,7 @@ static int mvpp2_gmac_pcs_config(struct phylink_pcs *pcs, unsigned int mode, ...@@ -6198,7 +6203,7 @@ static int mvpp2_gmac_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
const unsigned long *advertising, const unsigned long *advertising,
bool permit_pause_to_mac) bool permit_pause_to_mac)
{ {
struct mvpp2_port *port = mvpp2_pcs_to_port(pcs); struct mvpp2_port *port = mvpp2_pcs_gmac_to_port(pcs);
u32 mask, val, an, old_an, changed; u32 mask, val, an, old_an, changed;
mask = MVPP2_GMAC_IN_BAND_AUTONEG_BYPASS | mask = MVPP2_GMAC_IN_BAND_AUTONEG_BYPASS |
...@@ -6252,7 +6257,7 @@ static int mvpp2_gmac_pcs_config(struct phylink_pcs *pcs, unsigned int mode, ...@@ -6252,7 +6257,7 @@ static int mvpp2_gmac_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
static void mvpp2_gmac_pcs_an_restart(struct phylink_pcs *pcs) static void mvpp2_gmac_pcs_an_restart(struct phylink_pcs *pcs)
{ {
struct mvpp2_port *port = mvpp2_pcs_to_port(pcs); struct mvpp2_port *port = mvpp2_pcs_gmac_to_port(pcs);
u32 val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG); u32 val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
writel(val | MVPP2_GMAC_IN_BAND_RESTART_AN, writel(val | MVPP2_GMAC_IN_BAND_RESTART_AN,
...@@ -6365,8 +6370,23 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode, ...@@ -6365,8 +6370,23 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode,
writel(ctrl4, port->base + MVPP22_GMAC_CTRL_4_REG); writel(ctrl4, port->base + MVPP22_GMAC_CTRL_4_REG);
} }
static int mvpp2__mac_prepare(struct phylink_config *config, unsigned int mode, static struct phylink_pcs *mvpp2_select_pcs(struct phylink_config *config,
phy_interface_t interface) phy_interface_t interface)
{
struct mvpp2_port *port = mvpp2_phylink_to_port(config);
/* Select the appropriate PCS operations depending on the
* configured interface mode. We will only switch to a mode
* that the validate() checks have already passed.
*/
if (mvpp2_is_xlg(interface))
return &port->pcs_xlg;
else
return &port->pcs_gmac;
}
static int mvpp2_mac_prepare(struct phylink_config *config, unsigned int mode,
phy_interface_t interface)
{ {
struct mvpp2_port *port = mvpp2_phylink_to_port(config); struct mvpp2_port *port = mvpp2_phylink_to_port(config);
...@@ -6415,31 +6435,9 @@ static int mvpp2__mac_prepare(struct phylink_config *config, unsigned int mode, ...@@ -6415,31 +6435,9 @@ static int mvpp2__mac_prepare(struct phylink_config *config, unsigned int mode,
} }
} }
/* Select the appropriate PCS operations depending on the
* configured interface mode. We will only switch to a mode
* that the validate() checks have already passed.
*/
if (mvpp2_is_xlg(interface))
port->phylink_pcs.ops = &mvpp2_phylink_xlg_pcs_ops;
else
port->phylink_pcs.ops = &mvpp2_phylink_gmac_pcs_ops;
return 0; return 0;
} }
static int mvpp2_mac_prepare(struct phylink_config *config, unsigned int mode,
phy_interface_t interface)
{
struct mvpp2_port *port = mvpp2_phylink_to_port(config);
int ret;
ret = mvpp2__mac_prepare(config, mode, interface);
if (ret == 0)
phylink_set_pcs(port->phylink, &port->phylink_pcs);
return ret;
}
static void mvpp2_mac_config(struct phylink_config *config, unsigned int mode, static void mvpp2_mac_config(struct phylink_config *config, unsigned int mode,
const struct phylink_link_state *state) const struct phylink_link_state *state)
{ {
...@@ -6611,6 +6609,7 @@ static void mvpp2_mac_link_down(struct phylink_config *config, ...@@ -6611,6 +6609,7 @@ static void mvpp2_mac_link_down(struct phylink_config *config,
static const struct phylink_mac_ops mvpp2_phylink_ops = { static const struct phylink_mac_ops mvpp2_phylink_ops = {
.validate = mvpp2_phylink_validate, .validate = mvpp2_phylink_validate,
.mac_select_pcs = mvpp2_select_pcs,
.mac_prepare = mvpp2_mac_prepare, .mac_prepare = mvpp2_mac_prepare,
.mac_config = mvpp2_mac_config, .mac_config = mvpp2_mac_config,
.mac_finish = mvpp2_mac_finish, .mac_finish = mvpp2_mac_finish,
...@@ -6628,12 +6627,15 @@ static void mvpp2_acpi_start(struct mvpp2_port *port) ...@@ -6628,12 +6627,15 @@ static void mvpp2_acpi_start(struct mvpp2_port *port)
struct phylink_link_state state = { struct phylink_link_state state = {
.interface = port->phy_interface, .interface = port->phy_interface,
}; };
mvpp2__mac_prepare(&port->phylink_config, MLO_AN_INBAND, struct phylink_pcs *pcs;
port->phy_interface);
pcs = mvpp2_select_pcs(&port->phylink_config, port->phy_interface);
mvpp2_mac_prepare(&port->phylink_config, MLO_AN_INBAND,
port->phy_interface);
mvpp2_mac_config(&port->phylink_config, MLO_AN_INBAND, &state); mvpp2_mac_config(&port->phylink_config, MLO_AN_INBAND, &state);
port->phylink_pcs.ops->pcs_config(&port->phylink_pcs, MLO_AN_INBAND, pcs->ops->pcs_config(pcs, MLO_AN_INBAND, port->phy_interface,
port->phy_interface, state.advertising, false);
state.advertising, false);
mvpp2_mac_finish(&port->phylink_config, MLO_AN_INBAND, mvpp2_mac_finish(&port->phylink_config, MLO_AN_INBAND,
port->phy_interface); port->phy_interface);
mvpp2_mac_link_up(&port->phylink_config, NULL, mvpp2_mac_link_up(&port->phylink_config, NULL,
...@@ -6941,6 +6943,9 @@ static int mvpp2_port_probe(struct platform_device *pdev, ...@@ -6941,6 +6943,9 @@ static int mvpp2_port_probe(struct platform_device *pdev,
port->phylink_config.supported_interfaces); port->phylink_config.supported_interfaces);
} }
port->pcs_gmac.ops = &mvpp2_phylink_gmac_pcs_ops;
port->pcs_xlg.ops = &mvpp2_phylink_xlg_pcs_ops;
phylink = phylink_create(&port->phylink_config, port_fwnode, phylink = phylink_create(&port->phylink_config, port_fwnode,
phy_mode, &mvpp2_phylink_ops); phy_mode, &mvpp2_phylink_ops);
if (IS_ERR(phylink)) { if (IS_ERR(phylink)) {
......
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