|
@@ -53,12 +53,53 @@ struct mv643xx_eth_platform_data qnap_tsx09_eth_data = {
|
|
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
|
|
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static int __init qnap_tsx09_parse_hex_nibble(char n)
|
|
|
|
+{
|
|
|
|
+ if (n >= '0' && n <= '9')
|
|
|
|
+ return n - '0';
|
|
|
|
+
|
|
|
|
+ if (n >= 'A' && n <= 'F')
|
|
|
|
+ return n - 'A' + 10;
|
|
|
|
+
|
|
|
|
+ if (n >= 'a' && n <= 'f')
|
|
|
|
+ return n - 'a' + 10;
|
|
|
|
+
|
|
|
|
+ return -1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int __init qnap_tsx09_parse_hex_byte(const char *b)
|
|
|
|
+{
|
|
|
|
+ int hi;
|
|
|
|
+ int lo;
|
|
|
|
+
|
|
|
|
+ hi = qnap_tsx09_parse_hex_nibble(b[0]);
|
|
|
|
+ lo = qnap_tsx09_parse_hex_nibble(b[1]);
|
|
|
|
+
|
|
|
|
+ if (hi < 0 || lo < 0)
|
|
|
|
+ return -1;
|
|
|
|
+
|
|
|
|
+ return (hi << 4) | lo;
|
|
|
|
+}
|
|
|
|
+
|
|
static int __init qnap_tsx09_check_mac_addr(const char *addr_str)
|
|
static int __init qnap_tsx09_check_mac_addr(const char *addr_str)
|
|
{
|
|
{
|
|
u_int8_t addr[6];
|
|
u_int8_t addr[6];
|
|
|
|
+ int i;
|
|
|
|
|
|
- if (!mac_pton(addr_str, addr))
|
|
|
|
- return -1;
|
|
|
|
|
|
+ for (i = 0; i < 6; i++) {
|
|
|
|
+ int byte;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Enforce "xx:xx:xx:xx:xx:xx\n" format.
|
|
|
|
+ */
|
|
|
|
+ if (addr_str[(i * 3) + 2] != ((i < 5) ? ':' : '\n'))
|
|
|
|
+ return -1;
|
|
|
|
+
|
|
|
|
+ byte = qnap_tsx09_parse_hex_byte(addr_str + (i * 3));
|
|
|
|
+ if (byte < 0)
|
|
|
|
+ return -1;
|
|
|
|
+ addr[i] = byte;
|
|
|
|
+ }
|
|
|
|
|
|
printk(KERN_INFO "tsx09: found ethernet mac address %pM\n", addr);
|
|
printk(KERN_INFO "tsx09: found ethernet mac address %pM\n", addr);
|
|
|
|
|
|
@@ -77,12 +118,12 @@ void __init qnap_tsx09_find_mac_addr(u32 mem_base, u32 size)
|
|
unsigned long addr;
|
|
unsigned long addr;
|
|
|
|
|
|
for (addr = mem_base; addr < (mem_base + size); addr += 1024) {
|
|
for (addr = mem_base; addr < (mem_base + size); addr += 1024) {
|
|
- void __iomem *nor_page;
|
|
|
|
|
|
+ char *nor_page;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
|
|
|
|
nor_page = ioremap(addr, 1024);
|
|
nor_page = ioremap(addr, 1024);
|
|
if (nor_page != NULL) {
|
|
if (nor_page != NULL) {
|
|
- ret = qnap_tsx09_check_mac_addr((__force const char *)nor_page);
|
|
|
|
|
|
+ ret = qnap_tsx09_check_mac_addr(nor_page);
|
|
iounmap(nor_page);
|
|
iounmap(nor_page);
|
|
}
|
|
}
|
|
|
|
|