Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: dsa: slave: fix of-node leak and phy priority

Make sure to drop the reference taken by of_parse_phandle() before
returning from dsa_slave_phy_setup().

Note that this also modifies the PHY priority so that any fixed-link
node is only parsed when no phy-handle is given, which is in accordance
with the common scheme for this.

Fixes: 0d8bcdd383b8 ("net: dsa: allow for more complex PHY setups")
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Johan Hovold and committed by
David S. Miller
0d8f3c67 a5108878

+5 -2
+5 -2
net/dsa/slave.c
··· 1125 1125 p->phy_interface = mode; 1126 1126 1127 1127 phy_dn = of_parse_phandle(port_dn, "phy-handle", 0); 1128 - if (of_phy_is_fixed_link(port_dn)) { 1128 + if (!phy_dn && of_phy_is_fixed_link(port_dn)) { 1129 1129 /* In the case of a fixed PHY, the DT node associated 1130 1130 * to the fixed PHY is the Port DT node 1131 1131 */ ··· 1135 1135 return ret; 1136 1136 } 1137 1137 phy_is_fixed = true; 1138 - phy_dn = port_dn; 1138 + phy_dn = of_node_get(port_dn); 1139 1139 } 1140 1140 1141 1141 if (ds->ops->get_phy_flags) ··· 1154 1154 ret = dsa_slave_phy_connect(p, slave_dev, phy_id); 1155 1155 if (ret) { 1156 1156 netdev_err(slave_dev, "failed to connect to phy%d: %d\n", phy_id, ret); 1157 + of_node_put(phy_dn); 1157 1158 return ret; 1158 1159 } 1159 1160 } else { ··· 1163 1162 phy_flags, 1164 1163 p->phy_interface); 1165 1164 } 1165 + 1166 + of_node_put(phy_dn); 1166 1167 } 1167 1168 1168 1169 if (p->phy && phy_is_fixed)