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: David Daney <ddaney@caviumnetworks.com> [grant.likely@secretlab.ca: removed goto] Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
This commit is contained in:
committed by
Grant Likely
parent
0131d8973c
commit
1945886047
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mdio->irq) {
|
addr = be32_to_cpup(paddr);
|
||||||
mdio->irq[*addr] = irq_of_parse_and_map(child, 0);
|
if (addr >= 32) {
|
||||||
if (!mdio->irq[*addr])
|
dev_err(&mdio->dev, "%s PHY address %i is too large\n",
|
||||||
mdio->irq[*addr] = PHY_POLL;
|
child->full_name, addr);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
phy = get_phy_device(mdio, be32_to_cpup(addr));
|
if (mdio->irq) {
|
||||||
|
mdio->irq[addr] = irq_of_parse_and_map(child, 0);
|
||||||
|
if (!mdio->irq[addr])
|
||||||
|
mdio->irq[addr] = PHY_POLL;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
Reference in New Issue
Block a user