MIPS: AR7: rewrite of cpmac_get_mac()
authorAlexander Clouter <alex@digriz.org.uk>
Mon, 5 Jul 2010 20:11:26 +0000 (21:11 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Thu, 5 Aug 2010 12:26:02 +0000 (13:26 +0100)
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>
arch/mips/ar7/platform.c

index 8f31d1d59683383124035708659089ced9a804a2..0da5b2b8dd88a4a08d75b4eaf9aa3965b1af655f 100644 (file)
@@ -292,40 +292,28 @@ static struct platform_device cpmac_high = {
        .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) {
-       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;
+       char name[5], *mac;
 
-       mac = NULL;
        sprintf(name, "mac%c", 'a' + instance);
        mac = prom_getenv(name);
-       if (!mac) {
+       if (!mac && instance) {
                sprintf(name, "mac%c", 'a');
                mac = prom_getenv(name);
        }
-       if (!mac) {
-               random_ether_addr(default_mac);
-               mac = default_mac;
-       }
-       for (i = 0; i < 6; i++)
-               dev_addr[i] = (char2hex(mac[i * 3]) << 4) +
-                       char2hex(mac[i * 3 + 1]);
+
+       if (mac) {
+               if (sscanf(mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
+                                       &dev_addr[0], &dev_addr[1],
+                                       &dev_addr[2], &dev_addr[3],
+                                       &dev_addr[4], &dev_addr[5]) != 6) {
+                       pr_warning("cannot parse mac address, "
+                                       "using random address\n");
+                       random_ether_addr(dev_addr);
+               }
+       } else
+               random_ether_addr(dev_addr);
 }
 
 /*****************************************************************************