diff options
author | Alexander Clouter <alex@digriz.org.uk> | 2010-07-05 16:11:26 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2010-08-05 08:26:02 -0400 |
commit | d16f7093b6eb4f3859856f6ee4ab504cbeeea0b9 (patch) | |
tree | 66e693d7562ffa2393b934f78e112bc2a9b59e41 /arch/mips/ar7 | |
parent | 0d59050496db973d8689f954baf8a202ddd4d51a (diff) |
MIPS: AR7: rewrite of cpmac_get_mac()
Shamelessly stealing wisdom from pasemi_mac.c, I found char2hex() could
be replaced with a single call to sscanf(), looks cleaner to me at
least. The result is 100 bytes trimmed off the size of a compiled
cpmac_get_mac() and as an extra bonus it grumbles and gracefully fails
over to using random_ether_addr() when an attempt to parse an invalid
MAC address is made.
Signed-off-by: Alexander Clouter <alex@digriz.org.uk>
To: linux-mips@linux-mips.org
Cc: florian@openwrt.org
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/ar7')
-rw-r--r-- | arch/mips/ar7/platform.c | 42 |
1 files changed, 15 insertions, 27 deletions
diff --git a/arch/mips/ar7/platform.c b/arch/mips/ar7/platform.c index 8f31d1d59683..0da5b2b8dd88 100644 --- a/arch/mips/ar7/platform.c +++ b/arch/mips/ar7/platform.c | |||
@@ -292,40 +292,28 @@ static struct platform_device cpmac_high = { | |||
292 | .num_resources = ARRAY_SIZE(cpmac_high_res), | 292 | .num_resources = ARRAY_SIZE(cpmac_high_res), |
293 | }; | 293 | }; |
294 | 294 | ||
295 | static inline unsigned char char2hex(char h) | 295 | static void __init cpmac_get_mac(int instance, unsigned char *dev_addr) |
296 | { | 296 | { |
297 | switch (h) { | 297 | char name[5], *mac; |
298 | case '0': case '1': case '2': case '3': case '4': | ||
299 | case '5': case '6': case '7': case '8': case '9': | ||
300 | return h - '0'; | ||
301 | case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': | ||
302 | return h - 'A' + 10; | ||
303 | case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': | ||
304 | return h - 'a' + 10; | ||
305 | default: | ||
306 | return 0; | ||
307 | } | ||
308 | } | ||
309 | |||
310 | static void cpmac_get_mac(int instance, unsigned char *dev_addr) | ||
311 | { | ||
312 | int i; | ||
313 | char name[5], default_mac[ETH_ALEN], *mac; | ||
314 | 298 | ||
315 | mac = NULL; | ||
316 | sprintf(name, "mac%c", 'a' + instance); | 299 | sprintf(name, "mac%c", 'a' + instance); |
317 | mac = prom_getenv(name); | 300 | mac = prom_getenv(name); |
318 | if (!mac) { | 301 | if (!mac && instance) { |
319 | sprintf(name, "mac%c", 'a'); | 302 | sprintf(name, "mac%c", 'a'); |
320 | mac = prom_getenv(name); | 303 | mac = prom_getenv(name); |
321 | } | 304 | } |
322 | if (!mac) { | 305 | |
323 | random_ether_addr(default_mac); | 306 | if (mac) { |
324 | mac = default_mac; | 307 | if (sscanf(mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", |
325 | } | 308 | &dev_addr[0], &dev_addr[1], |
326 | for (i = 0; i < 6; i++) | 309 | &dev_addr[2], &dev_addr[3], |
327 | dev_addr[i] = (char2hex(mac[i * 3]) << 4) + | 310 | &dev_addr[4], &dev_addr[5]) != 6) { |
328 | char2hex(mac[i * 3 + 1]); | 311 | pr_warning("cannot parse mac address, " |
312 | "using random address\n"); | ||
313 | random_ether_addr(dev_addr); | ||
314 | } | ||
315 | } else | ||
316 | random_ether_addr(dev_addr); | ||
329 | } | 317 | } |
330 | 318 | ||
331 | /***************************************************************************** | 319 | /***************************************************************************** |