Adrian Bunk | b00dc83 | 2008-05-19 16:52:27 -0700 | [diff] [blame] | 1 | /* |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 2 | * idprom.c: Routines to load the idprom into kernel addresses and |
| 3 | * interpret the data contained within. |
| 4 | * |
| 5 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
| 6 | */ |
| 7 | |
| 8 | #include <linux/kernel.h> |
| 9 | #include <linux/types.h> |
| 10 | #include <linux/init.h> |
| 11 | |
| 12 | #include <asm/oplib.h> |
| 13 | #include <asm/idprom.h> |
| 14 | |
| 15 | struct idprom *idprom; |
| 16 | static struct idprom idprom_buffer; |
| 17 | |
| 18 | /* Calculate the IDPROM checksum (xor of the data bytes). */ |
| 19 | static unsigned char __init calc_idprom_cksum(struct idprom *idprom) |
| 20 | { |
| 21 | unsigned char cksum, i, *ptr = (unsigned char *)idprom; |
| 22 | |
| 23 | for (i = cksum = 0; i <= 0x0E; i++) |
| 24 | cksum ^= *ptr++; |
| 25 | |
| 26 | return cksum; |
| 27 | } |
| 28 | |
| 29 | /* Create a local IDPROM copy and verify integrity. */ |
| 30 | void __init idprom_init(void) |
| 31 | { |
| 32 | prom_get_idprom((char *) &idprom_buffer, sizeof(idprom_buffer)); |
| 33 | |
| 34 | idprom = &idprom_buffer; |
| 35 | |
| 36 | if (idprom->id_format != 0x01) { |
| 37 | prom_printf("IDPROM: Warning, unknown format type!\n"); |
| 38 | } |
| 39 | |
| 40 | if (idprom->id_cksum != calc_idprom_cksum(idprom)) { |
| 41 | prom_printf("IDPROM: Warning, checksum failure (nvram=%x, calc=%x)!\n", |
| 42 | idprom->id_cksum, calc_idprom_cksum(idprom)); |
| 43 | } |
| 44 | |
| 45 | printk("Ethernet address: %02x:%02x:%02x:%02x:%02x:%02x\n", |
| 46 | idprom->id_ethaddr[0], idprom->id_ethaddr[1], |
| 47 | idprom->id_ethaddr[2], idprom->id_ethaddr[3], |
| 48 | idprom->id_ethaddr[4], idprom->id_ethaddr[5]); |
| 49 | } |