aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/of
diff options
context:
space:
mode:
authorDavid Daney <ddaney@caviumnetworks.com>2010-10-27 21:03:47 -0400
committerGrant Likely <grant.likely@secretlab.ca>2010-12-24 03:25:54 -0500
commit194588604765ac803f98fb9d19a36f6b835f4620 (patch)
tree940c6a26436c7dfa38152a8479d0641e9a19d7df /drivers/of
parent0131d8973c8b9bd9d40fee8fae24eab24821efdb (diff)
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>
Diffstat (limited to 'drivers/of')
-rw-r--r--drivers/of/of_mdio.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c
index 1fce00eb421b..dcd7857784f2 100644
--- a/drivers/of/of_mdio.c
+++ b/drivers/of/of_mdio.c
@@ -52,27 +52,35 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
52 52
53 /* Loop over the child nodes and register a phy_device for each one */ 53 /* Loop over the child nodes and register a phy_device for each one */
54 for_each_child_of_node(np, child) { 54 for_each_child_of_node(np, child) {
55 const __be32 *addr; 55 const __be32 *paddr;
56 u32 addr;
56 int len; 57 int len;
57 58
58 /* A PHY must have a reg property in the range [0-31] */ 59 /* A PHY must have a reg property in the range [0-31] */
59 addr = of_get_property(child, "reg", &len); 60 paddr = of_get_property(child, "reg", &len);
60 if (!addr || len < sizeof(*addr) || *addr >= 32 || *addr < 0) { 61 if (!paddr || len < sizeof(*paddr)) {
61 dev_err(&mdio->dev, "%s has invalid PHY address\n", 62 dev_err(&mdio->dev, "%s has invalid PHY address\n",
62 child->full_name); 63 child->full_name);
63 continue; 64 continue;
64 } 65 }
65 66
67 addr = be32_to_cpup(paddr);
68 if (addr >= 32) {
69 dev_err(&mdio->dev, "%s PHY address %i is too large\n",
70 child->full_name, addr);
71 continue;
72 }
73
66 if (mdio->irq) { 74 if (mdio->irq) {
67 mdio->irq[*addr] = irq_of_parse_and_map(child, 0); 75 mdio->irq[addr] = irq_of_parse_and_map(child, 0);
68 if (!mdio->irq[*addr]) 76 if (!mdio->irq[addr])
69 mdio->irq[*addr] = PHY_POLL; 77 mdio->irq[addr] = PHY_POLL;
70 } 78 }
71 79
72 phy = get_phy_device(mdio, be32_to_cpup(addr)); 80 phy = get_phy_device(mdio, addr);
73 if (!phy || IS_ERR(phy)) { 81 if (!phy || IS_ERR(phy)) {
74 dev_err(&mdio->dev, "error probing PHY at address %i\n", 82 dev_err(&mdio->dev, "error probing PHY at address %i\n",
75 *addr); 83 addr);
76 continue; 84 continue;
77 } 85 }
78 phy_scan_fixups(phy); 86 phy_scan_fixups(phy);
@@ -91,7 +99,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
91 } 99 }
92 100
93 dev_dbg(&mdio->dev, "registered phy %s at address %i\n", 101 dev_dbg(&mdio->dev, "registered phy %s at address %i\n",
94 child->name, *addr); 102 child->name, addr);
95 } 103 }
96 104
97 return 0; 105 return 0;