Commit e7026f15 authored by Colin Foster's avatar Colin Foster Committed by David S. Miller

net: phy: lynx: refactor Lynx PCS module to use generic phylink_pcs

Remove references to lynx_pcs structures so drivers like the Felix DSA
can reference alternate PCS drivers.
Signed-off-by: default avatarColin Foster <colin.foster@in-advantage.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 60c33202
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include <linux/of_net.h> #include <linux/of_net.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/pcs-lynx.h>
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <net/dsa.h> #include <net/dsa.h>
#include "felix.h" #include "felix.h"
...@@ -832,7 +831,7 @@ static void felix_phylink_mac_config(struct dsa_switch *ds, int port, ...@@ -832,7 +831,7 @@ static void felix_phylink_mac_config(struct dsa_switch *ds, int port,
struct dsa_port *dp = dsa_to_port(ds, port); struct dsa_port *dp = dsa_to_port(ds, port);
if (felix->pcs && felix->pcs[port]) if (felix->pcs && felix->pcs[port])
phylink_set_pcs(dp->pl, &felix->pcs[port]->pcs); phylink_set_pcs(dp->pl, felix->pcs[port]);
} }
static void felix_phylink_mac_link_down(struct dsa_switch *ds, int port, static void felix_phylink_mac_link_down(struct dsa_switch *ds, int port,
......
...@@ -62,7 +62,7 @@ struct felix { ...@@ -62,7 +62,7 @@ struct felix {
const struct felix_info *info; const struct felix_info *info;
struct ocelot ocelot; struct ocelot ocelot;
struct mii_bus *imdio; struct mii_bus *imdio;
struct lynx_pcs **pcs; struct phylink_pcs **pcs;
resource_size_t switch_base; resource_size_t switch_base;
resource_size_t imdio_base; resource_size_t imdio_base;
enum dsa_tag_protocol tag_proto; enum dsa_tag_protocol tag_proto;
......
...@@ -1039,7 +1039,7 @@ static int vsc9959_mdio_bus_alloc(struct ocelot *ocelot) ...@@ -1039,7 +1039,7 @@ static int vsc9959_mdio_bus_alloc(struct ocelot *ocelot)
int rc; int rc;
felix->pcs = devm_kcalloc(dev, felix->info->num_ports, felix->pcs = devm_kcalloc(dev, felix->info->num_ports,
sizeof(struct lynx_pcs *), sizeof(struct phylink_pcs *),
GFP_KERNEL); GFP_KERNEL);
if (!felix->pcs) { if (!felix->pcs) {
dev_err(dev, "failed to allocate array for PCS PHYs\n"); dev_err(dev, "failed to allocate array for PCS PHYs\n");
...@@ -1088,8 +1088,8 @@ static int vsc9959_mdio_bus_alloc(struct ocelot *ocelot) ...@@ -1088,8 +1088,8 @@ static int vsc9959_mdio_bus_alloc(struct ocelot *ocelot)
for (port = 0; port < felix->info->num_ports; port++) { for (port = 0; port < felix->info->num_ports; port++) {
struct ocelot_port *ocelot_port = ocelot->ports[port]; struct ocelot_port *ocelot_port = ocelot->ports[port];
struct phylink_pcs *phylink_pcs;
struct mdio_device *pcs; struct mdio_device *pcs;
struct lynx_pcs *lynx;
if (dsa_is_unused_port(felix->ds, port)) if (dsa_is_unused_port(felix->ds, port))
continue; continue;
...@@ -1101,13 +1101,13 @@ static int vsc9959_mdio_bus_alloc(struct ocelot *ocelot) ...@@ -1101,13 +1101,13 @@ static int vsc9959_mdio_bus_alloc(struct ocelot *ocelot)
if (IS_ERR(pcs)) if (IS_ERR(pcs))
continue; continue;
lynx = lynx_pcs_create(pcs); phylink_pcs = lynx_pcs_create(pcs);
if (!lynx) { if (!phylink_pcs) {
mdio_device_free(pcs); mdio_device_free(pcs);
continue; continue;
} }
felix->pcs[port] = lynx; felix->pcs[port] = phylink_pcs;
dev_info(dev, "Found PCS at internal MDIO address %d\n", port); dev_info(dev, "Found PCS at internal MDIO address %d\n", port);
} }
...@@ -1121,13 +1121,15 @@ static void vsc9959_mdio_bus_free(struct ocelot *ocelot) ...@@ -1121,13 +1121,15 @@ static void vsc9959_mdio_bus_free(struct ocelot *ocelot)
int port; int port;
for (port = 0; port < ocelot->num_phys_ports; port++) { for (port = 0; port < ocelot->num_phys_ports; port++) {
struct lynx_pcs *pcs = felix->pcs[port]; struct phylink_pcs *phylink_pcs = felix->pcs[port];
struct mdio_device *mdio_device;
if (!pcs) if (!phylink_pcs)
continue; continue;
mdio_device_free(pcs->mdio); mdio_device = lynx_get_mdio_device(phylink_pcs);
lynx_pcs_destroy(pcs); mdio_device_free(mdio_device);
lynx_pcs_destroy(phylink_pcs);
} }
mdiobus_unregister(felix->imdio); mdiobus_unregister(felix->imdio);
} }
......
...@@ -1012,7 +1012,7 @@ static int vsc9953_mdio_bus_alloc(struct ocelot *ocelot) ...@@ -1012,7 +1012,7 @@ static int vsc9953_mdio_bus_alloc(struct ocelot *ocelot)
int rc; int rc;
felix->pcs = devm_kcalloc(dev, felix->info->num_ports, felix->pcs = devm_kcalloc(dev, felix->info->num_ports,
sizeof(struct phy_device *), sizeof(struct phylink_pcs *),
GFP_KERNEL); GFP_KERNEL);
if (!felix->pcs) { if (!felix->pcs) {
dev_err(dev, "failed to allocate array for PCS PHYs\n"); dev_err(dev, "failed to allocate array for PCS PHYs\n");
...@@ -1039,9 +1039,9 @@ static int vsc9953_mdio_bus_alloc(struct ocelot *ocelot) ...@@ -1039,9 +1039,9 @@ static int vsc9953_mdio_bus_alloc(struct ocelot *ocelot)
for (port = 0; port < felix->info->num_ports; port++) { for (port = 0; port < felix->info->num_ports; port++) {
struct ocelot_port *ocelot_port = ocelot->ports[port]; struct ocelot_port *ocelot_port = ocelot->ports[port];
int addr = port + 4; struct phylink_pcs *phylink_pcs;
struct mdio_device *pcs; struct mdio_device *pcs;
struct lynx_pcs *lynx; int addr = port + 4;
if (dsa_is_unused_port(felix->ds, port)) if (dsa_is_unused_port(felix->ds, port))
continue; continue;
...@@ -1053,13 +1053,13 @@ static int vsc9953_mdio_bus_alloc(struct ocelot *ocelot) ...@@ -1053,13 +1053,13 @@ static int vsc9953_mdio_bus_alloc(struct ocelot *ocelot)
if (IS_ERR(pcs)) if (IS_ERR(pcs))
continue; continue;
lynx = lynx_pcs_create(pcs); phylink_pcs = lynx_pcs_create(pcs);
if (!lynx) { if (!phylink_pcs) {
mdio_device_free(pcs); mdio_device_free(pcs);
continue; continue;
} }
felix->pcs[port] = lynx; felix->pcs[port] = phylink_pcs;
dev_info(dev, "Found PCS at internal MDIO address %d\n", addr); dev_info(dev, "Found PCS at internal MDIO address %d\n", addr);
} }
...@@ -1073,13 +1073,15 @@ static void vsc9953_mdio_bus_free(struct ocelot *ocelot) ...@@ -1073,13 +1073,15 @@ static void vsc9953_mdio_bus_free(struct ocelot *ocelot)
int port; int port;
for (port = 0; port < ocelot->num_phys_ports; port++) { for (port = 0; port < ocelot->num_phys_ports; port++) {
struct lynx_pcs *pcs = felix->pcs[port]; struct phylink_pcs *phylink_pcs = felix->pcs[port];
struct mdio_device *mdio_device;
if (!pcs) if (!phylink_pcs)
continue; continue;
mdio_device_free(pcs->mdio); mdio_device = lynx_get_mdio_device(phylink_pcs);
lynx_pcs_destroy(pcs); mdio_device_free(mdio_device);
lynx_pcs_destroy(phylink_pcs);
} }
mdiobus_unregister(felix->imdio); mdiobus_unregister(felix->imdio);
} }
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
/* Copyright 2019 NXP */ /* Copyright 2019 NXP */
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/pcs-lynx.h>
#include <linux/property.h> #include <linux/property.h>
#include "dpaa2-eth.h" #include "dpaa2-eth.h"
...@@ -204,11 +205,13 @@ static int dpaa2_pcs_create(struct dpaa2_mac *mac, ...@@ -204,11 +205,13 @@ static int dpaa2_pcs_create(struct dpaa2_mac *mac,
static void dpaa2_pcs_destroy(struct dpaa2_mac *mac) static void dpaa2_pcs_destroy(struct dpaa2_mac *mac)
{ {
struct lynx_pcs *pcs = mac->pcs; struct phylink_pcs *phylink_pcs = mac->pcs;
if (pcs) { if (phylink_pcs) {
struct device *dev = &pcs->mdio->dev; struct mdio_device *mdio = lynx_get_mdio_device(phylink_pcs);
lynx_pcs_destroy(pcs); struct device *dev = &mdio->dev;
lynx_pcs_destroy(phylink_pcs);
put_device(dev); put_device(dev);
mac->pcs = NULL; mac->pcs = NULL;
} }
...@@ -292,7 +295,7 @@ int dpaa2_mac_connect(struct dpaa2_mac *mac) ...@@ -292,7 +295,7 @@ int dpaa2_mac_connect(struct dpaa2_mac *mac)
mac->phylink = phylink; mac->phylink = phylink;
if (mac->pcs) if (mac->pcs)
phylink_set_pcs(mac->phylink, &mac->pcs->pcs); phylink_set_pcs(mac->phylink, mac->pcs);
err = phylink_fwnode_phy_connect(mac->phylink, dpmac_node, 0); err = phylink_fwnode_phy_connect(mac->phylink, dpmac_node, 0);
if (err) { if (err) {
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include <linux/of_mdio.h> #include <linux/of_mdio.h>
#include <linux/of_net.h> #include <linux/of_net.h>
#include <linux/phylink.h> #include <linux/phylink.h>
#include <linux/pcs-lynx.h>
#include "dpmac.h" #include "dpmac.h"
#include "dpmac-cmd.h" #include "dpmac-cmd.h"
...@@ -23,7 +22,7 @@ struct dpaa2_mac { ...@@ -23,7 +22,7 @@ struct dpaa2_mac {
struct phylink *phylink; struct phylink *phylink;
phy_interface_t if_mode; phy_interface_t if_mode;
enum dpmac_link_type if_link_type; enum dpmac_link_type if_link_type;
struct lynx_pcs *pcs; struct phylink_pcs *pcs;
struct fwnode_handle *fw_node; struct fwnode_handle *fw_node;
}; };
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/of_mdio.h> #include <linux/of_mdio.h>
#include <linux/of_net.h> #include <linux/of_net.h>
#include <linux/pcs-lynx.h>
#include "enetc_ierb.h" #include "enetc_ierb.h"
#include "enetc_pf.h" #include "enetc_pf.h"
...@@ -828,7 +829,7 @@ static int enetc_imdio_create(struct enetc_pf *pf) ...@@ -828,7 +829,7 @@ static int enetc_imdio_create(struct enetc_pf *pf)
{ {
struct device *dev = &pf->si->pdev->dev; struct device *dev = &pf->si->pdev->dev;
struct enetc_mdio_priv *mdio_priv; struct enetc_mdio_priv *mdio_priv;
struct lynx_pcs *pcs_lynx; struct phylink_pcs *phylink_pcs;
struct mdio_device *pcs; struct mdio_device *pcs;
struct mii_bus *bus; struct mii_bus *bus;
int err; int err;
...@@ -860,8 +861,8 @@ static int enetc_imdio_create(struct enetc_pf *pf) ...@@ -860,8 +861,8 @@ static int enetc_imdio_create(struct enetc_pf *pf)
goto unregister_mdiobus; goto unregister_mdiobus;
} }
pcs_lynx = lynx_pcs_create(pcs); phylink_pcs = lynx_pcs_create(pcs);
if (!pcs_lynx) { if (!phylink_pcs) {
mdio_device_free(pcs); mdio_device_free(pcs);
err = -ENOMEM; err = -ENOMEM;
dev_err(dev, "cannot create lynx pcs (%d)\n", err); dev_err(dev, "cannot create lynx pcs (%d)\n", err);
...@@ -869,7 +870,7 @@ static int enetc_imdio_create(struct enetc_pf *pf) ...@@ -869,7 +870,7 @@ static int enetc_imdio_create(struct enetc_pf *pf)
} }
pf->imdio = bus; pf->imdio = bus;
pf->pcs = pcs_lynx; pf->pcs = phylink_pcs;
return 0; return 0;
...@@ -882,8 +883,11 @@ static int enetc_imdio_create(struct enetc_pf *pf) ...@@ -882,8 +883,11 @@ static int enetc_imdio_create(struct enetc_pf *pf)
static void enetc_imdio_remove(struct enetc_pf *pf) static void enetc_imdio_remove(struct enetc_pf *pf)
{ {
struct mdio_device *mdio_device;
if (pf->pcs) { if (pf->pcs) {
mdio_device_free(pf->pcs->mdio); mdio_device = lynx_get_mdio_device(pf->pcs);
mdio_device_free(mdio_device);
lynx_pcs_destroy(pf->pcs); lynx_pcs_destroy(pf->pcs);
} }
if (pf->imdio) { if (pf->imdio) {
...@@ -941,7 +945,7 @@ static void enetc_pl_mac_config(struct phylink_config *config, ...@@ -941,7 +945,7 @@ static void enetc_pl_mac_config(struct phylink_config *config,
priv = netdev_priv(pf->si->ndev); priv = netdev_priv(pf->si->ndev);
if (pf->pcs) if (pf->pcs)
phylink_set_pcs(priv->phylink, &pf->pcs->pcs); phylink_set_pcs(priv->phylink, pf->pcs);
} }
static void enetc_force_rgmii_mac(struct enetc_hw *hw, int speed, int duplex) static void enetc_force_rgmii_mac(struct enetc_hw *hw, int speed, int duplex)
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* Copyright 2017-2019 NXP */ /* Copyright 2017-2019 NXP */
#include "enetc.h" #include "enetc.h"
#include <linux/pcs-lynx.h> #include <linux/phylink.h>
#define ENETC_PF_NUM_RINGS 8 #define ENETC_PF_NUM_RINGS 8
...@@ -46,7 +46,7 @@ struct enetc_pf { ...@@ -46,7 +46,7 @@ struct enetc_pf {
struct mii_bus *mdio; /* saved for cleanup */ struct mii_bus *mdio; /* saved for cleanup */
struct mii_bus *imdio; struct mii_bus *imdio;
struct lynx_pcs *pcs; struct phylink_pcs *pcs;
phy_interface_t if_mode; phy_interface_t if_mode;
struct phylink_config phylink_config; struct phylink_config phylink_config;
......
...@@ -22,6 +22,11 @@ ...@@ -22,6 +22,11 @@
#define IF_MODE_SPEED_MSK GENMASK(3, 2) #define IF_MODE_SPEED_MSK GENMASK(3, 2)
#define IF_MODE_HALF_DUPLEX BIT(4) #define IF_MODE_HALF_DUPLEX BIT(4)
struct lynx_pcs {
struct phylink_pcs pcs;
struct mdio_device *mdio;
};
enum sgmii_speed { enum sgmii_speed {
SGMII_SPEED_10 = 0, SGMII_SPEED_10 = 0,
SGMII_SPEED_100 = 1, SGMII_SPEED_100 = 1,
...@@ -30,6 +35,15 @@ enum sgmii_speed { ...@@ -30,6 +35,15 @@ enum sgmii_speed {
}; };
#define phylink_pcs_to_lynx(pl_pcs) container_of((pl_pcs), struct lynx_pcs, pcs) #define phylink_pcs_to_lynx(pl_pcs) container_of((pl_pcs), struct lynx_pcs, pcs)
#define lynx_to_phylink_pcs(lynx) (&(lynx)->pcs)
struct mdio_device *lynx_get_mdio_device(struct phylink_pcs *pcs)
{
struct lynx_pcs *lynx = phylink_pcs_to_lynx(pcs);
return lynx->mdio;
}
EXPORT_SYMBOL(lynx_get_mdio_device);
static void lynx_pcs_get_state_usxgmii(struct mdio_device *pcs, static void lynx_pcs_get_state_usxgmii(struct mdio_device *pcs,
struct phylink_link_state *state) struct phylink_link_state *state)
...@@ -329,7 +343,7 @@ static const struct phylink_pcs_ops lynx_pcs_phylink_ops = { ...@@ -329,7 +343,7 @@ static const struct phylink_pcs_ops lynx_pcs_phylink_ops = {
.pcs_link_up = lynx_pcs_link_up, .pcs_link_up = lynx_pcs_link_up,
}; };
struct lynx_pcs *lynx_pcs_create(struct mdio_device *mdio) struct phylink_pcs *lynx_pcs_create(struct mdio_device *mdio)
{ {
struct lynx_pcs *lynx_pcs; struct lynx_pcs *lynx_pcs;
...@@ -341,13 +355,15 @@ struct lynx_pcs *lynx_pcs_create(struct mdio_device *mdio) ...@@ -341,13 +355,15 @@ struct lynx_pcs *lynx_pcs_create(struct mdio_device *mdio)
lynx_pcs->pcs.ops = &lynx_pcs_phylink_ops; lynx_pcs->pcs.ops = &lynx_pcs_phylink_ops;
lynx_pcs->pcs.poll = true; lynx_pcs->pcs.poll = true;
return lynx_pcs; return lynx_to_phylink_pcs(lynx_pcs);
} }
EXPORT_SYMBOL(lynx_pcs_create); EXPORT_SYMBOL(lynx_pcs_create);
void lynx_pcs_destroy(struct lynx_pcs *pcs) void lynx_pcs_destroy(struct phylink_pcs *pcs)
{ {
kfree(pcs); struct lynx_pcs *lynx = phylink_pcs_to_lynx(pcs);
kfree(lynx);
} }
EXPORT_SYMBOL(lynx_pcs_destroy); EXPORT_SYMBOL(lynx_pcs_destroy);
......
...@@ -9,13 +9,10 @@ ...@@ -9,13 +9,10 @@
#include <linux/mdio.h> #include <linux/mdio.h>
#include <linux/phylink.h> #include <linux/phylink.h>
struct lynx_pcs { struct mdio_device *lynx_get_mdio_device(struct phylink_pcs *pcs);
struct phylink_pcs pcs;
struct mdio_device *mdio;
};
struct lynx_pcs *lynx_pcs_create(struct mdio_device *mdio); struct phylink_pcs *lynx_pcs_create(struct mdio_device *mdio);
void lynx_pcs_destroy(struct lynx_pcs *pcs); void lynx_pcs_destroy(struct phylink_pcs *pcs);
#endif /* __LINUX_PCS_LYNX_H */ #endif /* __LINUX_PCS_LYNX_H */
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