int eth_init (bd_t * bd) { gpio_init_cs8900(); /* verify chip id */ if (get_reg_init_bus (PP_ChipID) != 0x630e) { printf ("CS8900 Ethernet chip not found?!\n"); return 0; } eth_reset (); /* set the ethernet address */ put_reg (PP_IA + 0, bd->bi_enetaddr[0] | (bd->bi_enetaddr[1] << 8)); put_reg (PP_IA + 2, bd->bi_enetaddr[2] | (bd->bi_enetaddr[3] << 8)); put_reg (PP_IA + 4, bd->bi_enetaddr[4] | (bd->bi_enetaddr[5] << 8)); eth_reginit (); return 0; }
int eth_init (bd_t * bd) { uchar enetaddr[6]; gpio_init_cs8900(); /* verify chip id */ if (get_reg_init_bus (PP_ChipID) != 0x630e) { printf ("CS8900 Ethernet chip not found?!\n"); return 0; } eth_reset (); /* set the ethernet address */ eth_getenv_enetaddr("ethaddr", enetaddr); put_reg (PP_IA + 0, enetaddr[0] | (enetaddr[1] << 8)); put_reg (PP_IA + 2, enetaddr[2] | (enetaddr[3] << 8)); put_reg (PP_IA + 4, enetaddr[4] | (enetaddr[5] << 8)); eth_reginit (); return 0; }
int __init cirrus_probe(void) { static cirrus_t priv; int i; u16 value; printk ("Jz CS8900A driver for Linux (V0.02)\n"); /* Init hardware for PAVO board */ gpio_init_cs8900(); /* Allocate ethernet device */ dev = alloc_etherdev(sizeof(struct net_device)); memset (&priv,0,sizeof (cirrus_t)); ether_setup (dev); dev->open = cirrus_start; dev->stop = cirrus_stop; dev->hard_start_xmit = cirrus_send_start; dev->get_stats = cirrus_get_stats; dev->set_multicast_list = cirrus_set_receive_mode; dev->set_mac_address = cirrus_set_mac_address; dev->tx_timeout = cirrus_transmit_timeout; dev->watchdog_timeo = HZ; if (ethaddr_cmd==1) { dev->dev_addr[0] = ethaddr_hex[0]; dev->dev_addr[1] = ethaddr_hex[1]; dev->dev_addr[2] = ethaddr_hex[2]; dev->dev_addr[3] = ethaddr_hex[3]; dev->dev_addr[4] = ethaddr_hex[4]; dev->dev_addr[5] = ethaddr_hex[5]; } else //default mac address 00:2a:cc:2a:af:fe { dev->dev_addr[0] = 0x00; dev->dev_addr[1] = 0x62; dev->dev_addr[2] = 0x9c; dev->dev_addr[3] = 0x61; dev->dev_addr[4] = 0xcf; dev->dev_addr[5] = 0x16; } dev->if_port = IF_PORT_10BASET; dev->priv = (void *) &priv; dev->base_addr = CIRRUS_DEFAULT_IO; dev->irq = CIRRUS_DEFAULT_IRQ; /* module parameters override everything */ if (!dev->base_addr) { printk (KERN_ERR "%s: No default I/O base address defined. Use io=... or\n" "%s: define CIRRUS_DEFAULT_IO for your platform\n", dev->name,dev->name); return (-EINVAL); } if (!dev->irq) { printk (KERN_ERR "%s: No default IRQ number defined. Use irq=... or\n" "%s: define CIRRUS_DEFAULT_IRQ for your platform\n", dev->name,dev->name); return (-EINVAL); } #if 0 if ((result = check_region (dev->base_addr,16))) { printk (KERN_ERR "%s: can't get I/O port address 0x%lx\n",dev->name,dev->base_addr); return (result); } #endif if (!request_region (dev->base_addr,16,dev->name)) return -EBUSY; #if 0 /* verify EISA registration number for Cirrus Logic */ if ((value = cirrus_read (dev,PP_ProductID)) != EISA_REG_CODE) { printk (KERN_ERR "%s: incorrect signature 0x%.4x\n",dev->name,value); return (-ENXIO); } #endif /* verify chip version */ value = cirrus_read (dev,PP_ProductID + 2); if (VERSION (value) != CS8900A) { printk (KERN_ERR "%s: unknown chip version 0x%.8x\n",dev->name,VERSION (value)); return (-ENXIO); } printk (KERN_INFO "%s: CS8900A rev %c detected\n",dev->name,'B' + REVISION (value) - REV_B); /* setup interrupt number */ cirrus_write (dev,PP_IntNum,INT_PIN); /* configure MAC address */ for (i = 0; i < ETH_ALEN; i += 2) { //printk(" %x",dev->dev_addr[i] | (dev->dev_addr[i + 1] << 8)); cirrus_write (dev,PP_IA + i,dev->dev_addr[i] | (dev->dev_addr[i + 1] << 8)); } if (register_netdev(dev) != 0) { printk(KERN_ERR " Cannot register net device\n"); free_netdev(dev); return -ENOMEM; } return (0); }