dect
/
linux-2.6
Archived
13
0
Fork 0

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>
This commit is contained in:
Alexander Clouter 2010-07-05 21:11:26 +01:00 committed by Ralf Baechle
parent 0d59050496
commit d16f7093b6
1 changed files with 15 additions and 27 deletions

View File

@ -292,40 +292,28 @@ static struct platform_device cpmac_high = {
.num_resources = ARRAY_SIZE(cpmac_high_res), .num_resources = ARRAY_SIZE(cpmac_high_res),
}; };
static inline unsigned char char2hex(char h) static void __init cpmac_get_mac(int instance, unsigned char *dev_addr)
{ {
switch (h) { char name[5], *mac;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
return h - '0';
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
return h - 'A' + 10;
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
return h - 'a' + 10;
default:
return 0;
}
}
static void cpmac_get_mac(int instance, unsigned char *dev_addr)
{
int i;
char name[5], default_mac[ETH_ALEN], *mac;
mac = NULL;
sprintf(name, "mac%c", 'a' + instance); sprintf(name, "mac%c", 'a' + instance);
mac = prom_getenv(name); mac = prom_getenv(name);
if (!mac) { if (!mac && instance) {
sprintf(name, "mac%c", 'a'); sprintf(name, "mac%c", 'a');
mac = prom_getenv(name); mac = prom_getenv(name);
} }
if (!mac) {
random_ether_addr(default_mac); if (mac) {
mac = default_mac; if (sscanf(mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
} &dev_addr[0], &dev_addr[1],
for (i = 0; i < 6; i++) &dev_addr[2], &dev_addr[3],
dev_addr[i] = (char2hex(mac[i * 3]) << 4) + &dev_addr[4], &dev_addr[5]) != 6) {
char2hex(mac[i * 3 + 1]); pr_warning("cannot parse mac address, "
"using random address\n");
random_ether_addr(dev_addr);
}
} else
random_ether_addr(dev_addr);
} }
/***************************************************************************** /*****************************************************************************