Commit 19458860 authored by David Daney's avatar David Daney Committed by Grant Likely

of/mdio: Fix some endianness problems.

In of_mdiobus_register(), the __be32 *addr variable is dereferenced.
This will not work on little-endian targets.  Also since it is
unsigned, checking for less than zero is redundant.

Fix these two issues.
Signed-off-by: default avatarDavid Daney <ddaney@caviumnetworks.com>
[grant.likely@secretlab.ca: removed goto]
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent 0131d897
...@@ -52,27 +52,35 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) ...@@ -52,27 +52,35 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
/* Loop over the child nodes and register a phy_device for each one */ /* Loop over the child nodes and register a phy_device for each one */
for_each_child_of_node(np, child) { for_each_child_of_node(np, child) {
const __be32 *addr; const __be32 *paddr;
u32 addr;
int len; int len;
/* A PHY must have a reg property in the range [0-31] */ /* A PHY must have a reg property in the range [0-31] */
addr = of_get_property(child, "reg", &len); paddr = of_get_property(child, "reg", &len);
if (!addr || len < sizeof(*addr) || *addr >= 32 || *addr < 0) { if (!paddr || len < sizeof(*paddr)) {
dev_err(&mdio->dev, "%s has invalid PHY address\n", dev_err(&mdio->dev, "%s has invalid PHY address\n",
child->full_name); child->full_name);
continue; continue;
} }
addr = be32_to_cpup(paddr);
if (addr >= 32) {
dev_err(&mdio->dev, "%s PHY address %i is too large\n",
child->full_name, addr);
continue;
}
if (mdio->irq) { if (mdio->irq) {
mdio->irq[*addr] = irq_of_parse_and_map(child, 0); mdio->irq[addr] = irq_of_parse_and_map(child, 0);
if (!mdio->irq[*addr]) if (!mdio->irq[addr])
mdio->irq[*addr] = PHY_POLL; mdio->irq[addr] = PHY_POLL;
} }
phy = get_phy_device(mdio, be32_to_cpup(addr)); phy = get_phy_device(mdio, addr);
if (!phy || IS_ERR(phy)) { if (!phy || IS_ERR(phy)) {
dev_err(&mdio->dev, "error probing PHY at address %i\n", dev_err(&mdio->dev, "error probing PHY at address %i\n",
*addr); addr);
continue; continue;
} }
phy_scan_fixups(phy); phy_scan_fixups(phy);
...@@ -91,7 +99,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) ...@@ -91,7 +99,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
} }
dev_dbg(&mdio->dev, "registered phy %s at address %i\n", dev_dbg(&mdio->dev, "registered phy %s at address %i\n",
child->name, *addr); child->name, addr);
} }
return 0; return 0;
......
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