1/* $Id: idprom.c,v 1.1.1.1 2007/08/03 18:52:18 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 15struct idprom *idprom; 16static struct idprom idprom_buffer; 17 18/* Calculate the IDPROM checksum (xor of the data bytes). */ 19static 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. */ 30void __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} 50