| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* $Id: idprom.c,v 1.3 1999/08/31 06:54:53 davem Exp $ | 
|  | 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 | } |