diff options
author | Johan Hovold <johan@kernel.org> | 2016-11-28 13:24:54 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-11-29 23:17:02 -0500 |
commit | 0d8f3c67151faaa80e332c254372dca58fb2a9d4 (patch) | |
tree | f9a76fd26ee475b2258df059c386abb80099f089 /net | |
parent | a510887824171ad260cc4a2603396c6247fdd091 (diff) |
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>
Diffstat (limited to 'net')
-rw-r--r-- | net/dsa/slave.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 6b1282c006b1..2a5c20a13fe4 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c | |||
@@ -1125,7 +1125,7 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p, | |||
1125 | p->phy_interface = mode; | 1125 | p->phy_interface = mode; |
1126 | 1126 | ||
1127 | phy_dn = of_parse_phandle(port_dn, "phy-handle", 0); | 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 | /* In the case of a fixed PHY, the DT node associated | 1129 | /* In the case of a fixed PHY, the DT node associated |
1130 | * to the fixed PHY is the Port DT node | 1130 | * to the fixed PHY is the Port DT node |
1131 | */ | 1131 | */ |
@@ -1135,7 +1135,7 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p, | |||
1135 | return ret; | 1135 | return ret; |
1136 | } | 1136 | } |
1137 | phy_is_fixed = true; | 1137 | phy_is_fixed = true; |
1138 | phy_dn = port_dn; | 1138 | phy_dn = of_node_get(port_dn); |
1139 | } | 1139 | } |
1140 | 1140 | ||
1141 | if (ds->ops->get_phy_flags) | 1141 | if (ds->ops->get_phy_flags) |
@@ -1154,6 +1154,7 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p, | |||
1154 | ret = dsa_slave_phy_connect(p, slave_dev, phy_id); | 1154 | ret = dsa_slave_phy_connect(p, slave_dev, phy_id); |
1155 | if (ret) { | 1155 | if (ret) { |
1156 | netdev_err(slave_dev, "failed to connect to phy%d: %d\n", phy_id, ret); | 1156 | netdev_err(slave_dev, "failed to connect to phy%d: %d\n", phy_id, ret); |
1157 | of_node_put(phy_dn); | ||
1157 | return ret; | 1158 | return ret; |
1158 | } | 1159 | } |
1159 | } else { | 1160 | } else { |
@@ -1162,6 +1163,8 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p, | |||
1162 | phy_flags, | 1163 | phy_flags, |
1163 | p->phy_interface); | 1164 | p->phy_interface); |
1164 | } | 1165 | } |
1166 | |||
1167 | of_node_put(phy_dn); | ||
1165 | } | 1168 | } |
1166 | 1169 | ||
1167 | if (p->phy && phy_is_fixed) | 1170 | if (p->phy && phy_is_fixed) |