Ticket #4671: admboot.c

File admboot.c, 1.5 KB (added by dean@…, 8 years ago)
Line 
1/*
2 *  ADMBoot specific prom routines
3 *
4 *  Copyright (C) 2008 Gabor Juhos <juhosg@openwrt.org>
5 *
6 *  This program is free software; you can redistribute it and/or modify it
7 *  under the terms of the GNU General Public License version 2 as published
8 *  by the Free Software Foundation.
9 *
10 */
11
12#include <linux/types.h>
13#include <linux/init.h>
14#include <linux/errno.h>
15#include <linux/kernel.h>
16
17#include <asm/addrspace.h>
18#include <asm/byteorder.h>
19
20#include <asm/mach-adm5120/adm5120_defs.h>
21#include <prom/admboot.h>
22#include "prom_read.h"
23
24#define ADMBOOT_MAGIC_MAC_BASE                  0x636D676D      /* 'mgmc' */
25
26int __init admboot_get_mac_base(u32 offset, u32 len, u8 *mac)
27{
28        u8 *cfg;
29        int i;
30
31        cfg = (u8 *) KSEG1ADDR(ADM5120_SRAM0_BASE + offset);
32
33        for (i = 0; i < len; i += 1) {
34                u32 magic;
35
36                //21/2/2009
37                //Magic MAC lookup 48533031FA0301 for Omnima EMB ADM5120 based boards
38                //dean@omnima.co.uk
39                if (cfg[i+0]==0x48 && cfg[i+1]==0x53 && cfg[i+2]==0x30 &&
40                        cfg[i+3]==0x31 && cfg[i+4]== 0xfa && cfg[i+5]==0x03 &&
41                        cfg[i+6]==0x01) {
42
43                        int k; 
44
45                        for (k = 0; k < 6; k++)
46                                mac[k] = cfg[i + 7 + k];
47
48                        printk("<6>Omnima HW MAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n", 
49                                mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
50
51                        return 0;
52                }
53
54                magic = prom_read_le32(cfg + i);
55
56                if (magic == ADMBOOT_MAGIC_MAC_BASE) {
57                        int j;
58
59                        for (j = 0; j < 6; j++)
60                                mac[j] = cfg[i + 4 + j];
61
62                        printk("<6>HW MAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n", 
63                                mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
64
65                        return 0;
66                }
67        }
68
69        return -ENXIO;
70}