static int zorro8390_init_one(struct zorro_dev *z, const struct zorro_device_id *ent) { struct net_device *dev; unsigned long board, ioaddr; int err, i; for (i = ARRAY_SIZE(cards) - 1; i >= 0; i--) if (z->id == cards[i].id) break; if (i < 0) return -ENODEV; board = z->resource.start; ioaddr = board + cards[i].offset; dev = ____alloc_ei_netdev(0); if (!dev) return -ENOMEM; if (!request_mem_region(ioaddr, NE_IO_EXTENT * 2, DRV_NAME)) { free_netdev(dev); return -EBUSY; } err = zorro8390_init(dev, board, cards[i].name, ZTWO_VADDR(ioaddr)); if (err) { release_mem_region(ioaddr, NE_IO_EXTENT * 2); free_netdev(dev); return err; } zorro_set_drvdata(z, dev); return 0; }
struct net_device *__alloc_ei_netdev(int size) { struct net_device *dev = ____alloc_ei_netdev(size); if (dev) dev->netdev_ops = &ei_netdev_ops; return dev; }
struct net_device *__alloc_ei_netdev(int size) { struct net_device *dev = ____alloc_ei_netdev(size); #ifdef CONFIG_COMPAT_NET_DEV_OPS if (dev) { dev->hard_start_xmit = ei_start_xmit; dev->get_stats = ei_get_stats; dev->set_multicast_list = ei_set_multicast_list; dev->tx_timeout = ei_tx_timeout; } #endif return dev; }
static int __devinit hydra_init(struct zorro_dev *z) { struct net_device *dev; unsigned long board = ZTWO_VADDR(z->resource.start); unsigned long ioaddr = board+HYDRA_NIC_BASE; const char name[] = "NE2000"; int start_page, stop_page; int j; int err; static u32 hydra_offsets[16] = { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, }; dev = ____alloc_ei_netdev(0); if (!dev) return -ENOMEM; for(j = 0; j < ETHER_ADDR_LEN; j++) dev->dev_addr[j] = *((u8 *)(board + HYDRA_ADDRPROM + 2*j)); /* We must set the 8390 for word mode. */ z_writeb(0x4b, ioaddr + NE_EN0_DCFG); start_page = NESM_START_PG; stop_page = NESM_STOP_PG; dev->base_addr = ioaddr; dev->irq = IRQ_AMIGA_PORTS; /* Install the Interrupt handler */ if (request_irq(IRQ_AMIGA_PORTS, __ei_interrupt, IRQF_SHARED, "Hydra Ethernet", dev)) { free_netdev(dev); return -EAGAIN; } ei_status.name = name; ei_status.tx_start_page = start_page; ei_status.stop_page = stop_page; ei_status.word16 = 1; ei_status.bigendian = 1; ei_status.rx_start_page = start_page + TX_PAGES; <<<<<<< HEAD
static int mcf8390_probe(struct platform_device *pdev) { struct net_device *dev; struct ei_device *ei_local; struct resource *mem, *irq; resource_size_t msize; int ret; irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (irq == NULL) { dev_err(&pdev->dev, "no IRQ specified?\n"); return -ENXIO; } mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (mem == NULL) { dev_err(&pdev->dev, "no memory address specified?\n"); return -ENXIO; } msize = resource_size(mem); if (!request_mem_region(mem->start, msize, pdev->name)) return -EBUSY; dev = ____alloc_ei_netdev(0); if (dev == NULL) { release_mem_region(mem->start, msize); return -ENOMEM; } SET_NETDEV_DEV(dev, &pdev->dev); platform_set_drvdata(pdev, dev); ei_local = netdev_priv(dev); ei_local->msg_enable = mcf8390_msg_enable; dev->irq = irq->start; dev->base_addr = mem->start; ret = mcf8390_init(dev); if (ret) { release_mem_region(mem->start, msize); free_netdev(dev); return ret; } return 0; }
static int __devinit hydra_init(struct zorro_dev *z) { struct net_device *dev; unsigned long board = ZTWO_VADDR(z->resource.start); unsigned long ioaddr = board+HYDRA_NIC_BASE; const char name[] = "NE2000"; int start_page, stop_page; int j; int err; static u32 hydra_offsets[16] = { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, }; dev = ____alloc_ei_netdev(0); if (!dev) return -ENOMEM; for(j = 0; j < ETHER_ADDR_LEN; j++) dev->dev_addr[j] = *((u8 *)(board + HYDRA_ADDRPROM + 2*j)); /* We must set the 8390 for word mode. */ z_writeb(0x4b, ioaddr + NE_EN0_DCFG); start_page = NESM_START_PG; stop_page = NESM_STOP_PG; dev->base_addr = ioaddr; dev->irq = IRQ_AMIGA_PORTS; /* Install the Interrupt handler */ if (request_irq(IRQ_AMIGA_PORTS, __ei_interrupt, IRQF_SHARED, "Hydra Ethernet", dev)) { free_netdev(dev); return -EAGAIN; } ei_status.name = name; ei_status.tx_start_page = start_page; ei_status.stop_page = stop_page; ei_status.word16 = 1; ei_status.bigendian = 1; ei_status.rx_start_page = start_page + TX_PAGES; ei_status.reset_8390 = hydra_reset_8390; ei_status.block_input = hydra_block_input; ei_status.block_output = hydra_block_output; ei_status.get_8390_hdr = hydra_get_8390_hdr; ei_status.reg_offset = hydra_offsets; dev->netdev_ops = &hydra_netdev_ops; __NS8390_init(dev, 0); err = register_netdev(dev); if (err) { free_irq(IRQ_AMIGA_PORTS, dev); free_netdev(dev); return err; } zorro_set_drvdata(z, dev); pr_info("%s: Hydra at %pR, address %pM (hydra.c " HYDRA_VERSION ")\n", dev->name, &z->resource, dev->dev_addr); return 0; }
struct net_device *__alloc_ei_netdev(int size) { return ____alloc_ei_netdev(size); }