mirror of
https://github.com/openwrt/openwrt.git
synced 2025-12-21 19:14:28 +04:00
realtek: pcs: drop PCS creation without SerDes ref
Since the beginning, the PCS driver had the ability to call its rtpcs_create without a reference to a valid PCS node. A comment in the code mentions that this is done for RTL838X and its built-in octa-PHY which is connected directly instead of via a SerDes. Further explanations are not provided. Drop this ability and make the rtpcs_create call in the dsa driver conditional. As the built-in PHY of RTL838X isn't attached to a SerDes, there is no obvious point of having the PCS driver in that chain. The ports are marked as internal and have no pcs-handle, thus no phylink_pcs instance should be created. Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com> Link: https://github.com/openwrt/openwrt/pull/21146 Signed-off-by: Robert Marko <robimarko@gmail.com>
This commit is contained in:
committed by
Robert Marko
parent
8e4730fd60
commit
a58e41e522
@@ -331,12 +331,14 @@ static int __init rtl83xx_mdio_probe(struct rtl838x_switch_priv *priv)
|
||||
continue;
|
||||
}
|
||||
|
||||
priv->pcs[pn] = rtpcs_create(priv->dev, pcs_node, pn);
|
||||
if (IS_ERR(priv->pcs[pn])) {
|
||||
dev_err(priv->dev, "port %u failed to create PCS instance: %ld\n",
|
||||
pn, PTR_ERR(priv->pcs[pn]));
|
||||
priv->pcs[pn] = NULL;
|
||||
continue;
|
||||
if (pcs_node) {
|
||||
priv->pcs[pn] = rtpcs_create(priv->dev, pcs_node, pn);
|
||||
if (IS_ERR(priv->pcs[pn])) {
|
||||
dev_err(priv->dev, "port %u failed to create PCS instance: %ld\n",
|
||||
pn, PTR_ERR(priv->pcs[pn]));
|
||||
priv->pcs[pn] = NULL;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (of_get_phy_mode(dn, &interface))
|
||||
|
||||
@@ -2930,26 +2930,12 @@ struct phylink_pcs *rtpcs_create(struct device *dev, struct device_node *np, int
|
||||
struct device_node *pcs_np;
|
||||
struct rtpcs_ctrl *ctrl;
|
||||
struct rtpcs_link *link;
|
||||
int sds;
|
||||
u32 sds;
|
||||
|
||||
/*
|
||||
* RTL838x devices have a built-in octa port RTL8218B PHY that is not attached via
|
||||
* a SerDes. Allow to be called with an empty SerDes device node. In this case lookup
|
||||
* the parent/driver node directly.
|
||||
*/
|
||||
if (np) {
|
||||
if (!of_device_is_available(np))
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
if (of_property_read_u32(np, "reg", &sds))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
pcs_np = of_get_parent(np);
|
||||
} else {
|
||||
pcs_np = of_find_compatible_node(NULL, NULL, "realtek,otto-pcs");
|
||||
sds = -1;
|
||||
}
|
||||
if (!np || !of_device_is_available(np))
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
pcs_np = of_get_parent(np);
|
||||
if (!pcs_np)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
@@ -2972,7 +2958,9 @@ struct phylink_pcs *rtpcs_create(struct device *dev, struct device_node *np, int
|
||||
if (port < 0 || port > ctrl->cfg->cpu_port)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (sds != -1 && rtpcs_sds_read(ctrl, sds, 0, 0) < 0)
|
||||
if (of_property_read_u32(np, "reg", &sds))
|
||||
return ERR_PTR(-EINVAL);
|
||||
if (rtpcs_sds_read(ctrl, sds, 0, 0) < 0)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
link = kzalloc(sizeof(*link), GFP_KERNEL);
|
||||
|
||||
Reference in New Issue
Block a user