From: James S. <jsi...@us...> - 2002-02-12 18:16:18
|
Update of /cvsroot/linux-mips/linux/drivers/net In directory usw-pr-cvs1:/tmp/cvs-serv6951 Modified Files: ioc3-eth.c Log Message: Use __devexit_p(). Index: ioc3-eth.c =================================================================== RCS file: /cvsroot/linux-mips/linux/drivers/net/ioc3-eth.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- ioc3-eth.c 5 Feb 2002 17:05:28 -0000 1.7 +++ ioc3-eth.c 12 Feb 2002 18:16:14 -0000 1.8 @@ -340,14 +340,15 @@ } /* - * Read the NIC (Number-In-a-Can) device. + * Read the NIC (Number-In-a-Can) device used to store the MAC address on + * SN0 / SN00 nodeboards and PCI cards. */ -static void ioc3_get_eaddr(struct ioc3_private *ip) +static void ioc3_get_eaddr_nic(struct ioc3_private *ip) { struct ioc3 *ioc3 = ip->regs; u8 nic[14]; - int i; int tries = 2; /* There may be some problem with the battery? */ + int i; ioc3_w(gpcr_s, (1 << 21)); @@ -370,15 +371,122 @@ for (i = 13; i >= 0; i--) nic[i] = nic_read_byte(ioc3); - printk("Ethernet address is "); - for (i = 2; i < 8; i++) { + for (i = 2; i < 8; i++) ip->dev->dev_addr[i - 2] = nic[i]; - printk("%02x", nic[i]); +} + +#if defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_SGI_SN2) +/* + * Get the ether-address on SN1 nodes + */ +static void ioc3_get_eaddr_sn(struct ioc3_private *ip) +{ + int ibrick_mac_addr_get(nasid_t, char *); + struct ioc3 *ioc3 = ip->regs; + nasid_t nasid_of_ioc3; + char io7eaddr[20]; + long mac; + int err_val; + + /* + * err_val = ibrick_mac_addr_get(get_nasid(), io7eaddr ); + * + * BAD!! The above call uses get_nasid() and assumes that + * the ioc3 pointed to by struct ioc3 is hooked up to the + * cbrick that we're running on. The proper way to make this call + * is to figure out which nasid the ioc3 is connected to + * and use that to call ibrick_mac_addr_get. Below is + * a hack to do just that. + */ + + /* + * Get the nasid of the ioc3 from the ioc3's base addr. + * FIXME: the 8 at the end assumes we're in memory mode, + * not node mode (for that, we'd change it to a 9). + * Is there a call to extract this info from a physical + * addr somewhere in an sn header file already? If so, + * we should probably use that, or restructure this routine + * to use pci_dev and generic numa nodeid getting stuff. + */ + nasid_of_ioc3 = (((unsigned long)ioc3 >> 33) & ~(-1 << 8)); + err_val = ibrick_mac_addr_get(nasid_of_ioc3, io7eaddr ); + + + if (err_val) { + /* Couldn't read the eeprom; try OSLoadOptions. */ + printk("WARNING: ibrick_mac_addr_get failed: %d\n", err_val); + + /* this is where we hardwire the mac address + * 1st ibrick had 08:00:69:11:34:75 + * 2nd ibrick had 08:00:69:11:35:35 + * + * Eagan Machines: + * mankato1 08:00:69:11:BE:95 + * warroad 08:00:69:11:bd:60 + * duron 08:00:69:11:34:60 + * + * an easy way to get the mac address is to hook + * up an ip35, then from L1 do 'cti serial' + * and then look for MAC line XXX THIS DOESN"T QUITE WORK!! + */ + printk("ioc3_get_eaddr: setting ethernet address to:\n -----> "); + ip->dev->dev_addr[0] = 0x8; + ip->dev->dev_addr[1] = 0x0; + ip->dev->dev_addr[2] = 0x69; + ip->dev->dev_addr[3] = 0x11; + ip->dev->dev_addr[4] = 0x34; + ip->dev->dev_addr[5] = 0x60; + } + else { + long simple_strtol(const char *,char **,unsigned int); + + mac = simple_strtol(io7eaddr, (char **)0, 16); + ip->dev->dev_addr[0] = (mac >> 40) & 0xff; + ip->dev->dev_addr[1] = (mac >> 32) & 0xff; + ip->dev->dev_addr[2] = (mac >> 24) & 0xff; + ip->dev->dev_addr[3] = (mac >> 16) & 0xff; + ip->dev->dev_addr[4] = (mac >> 8) & 0xff; + ip->dev->dev_addr[5] = mac & 0xff; + } +} +#endif + +/* + * Ok, this is hosed by design. It's necessary to know what machine the + * NIC is in in order to know how to read the NIC address. We also have + * to know if it's a PCI card or a NIC in on the node board ... + */ +static void ioc3_get_eaddr(struct ioc3_private *ip) +{ + void (*do_get_eaddr)(struct ioc3_private *ip) = NULL; + int i; + + /* + * We should also use this code for PCI cards, no matter what host + * machine but how to know that we're a PCI card? + */ +#ifdef CONFIG_SGI_IP27 + do_get_eaddr = ioc3_get_eaddr_nic; +#endif +#if defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_SGI_SN2) + do_get_eaddr = ioc3_get_eaddr_sn; +#endif + + if (!do_get_eaddr) { + printk(KERN_ERR "Don't know how to read MAC address of this " + "IOC3 NIC\n"); + return; + } + + printk("Ethernet address is "); + for (i = 0; i < 6; i++) { + printk("%02x", ip->dev->dev_addr[i]); if (i < 7) printk(":"); } printk(".\n"); } + /* * Caller must hold the ioc3_lock ever for MII readers. This is also |