static int __init amiga_gayle_ide_probe(struct platform_device *pdev) { struct resource *res; struct gayle_ide_platform_data *pdata; unsigned long base, ctrlport, irqport; unsigned int i; int error; struct ide_hw hw[GAYLE_NUM_HWIFS], *hws[GAYLE_NUM_HWIFS]; struct ide_port_info d = gayle_port_info; struct ide_host *host; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) return -ENODEV; if (!request_mem_region(res->start, resource_size(res), "IDE")) return -EBUSY; pdata = dev_get_platdata(&pdev->dev); pr_info("ide: Gayle IDE controller (A%u style%s)\n", pdata->explicit_ack ? 1200 : 4000, ide_doubler ? ", IDE doubler" : ""); base = (unsigned long)ZTWO_VADDR(pdata->base); ctrlport = 0; irqport = (unsigned long)ZTWO_VADDR(pdata->irqport); if (pdata->explicit_ack) d.port_ops = &gayle_a1200_port_ops; else d.port_ops = &gayle_a4000_port_ops; for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++, base += GAYLE_NEXT_PORT) { if (GAYLE_HAS_CONTROL_REG) ctrlport = base + GAYLE_CONTROL; gayle_setup_ports(&hw[i], base, ctrlport, irqport); hws[i] = &hw[i]; } error = ide_host_add(&d, hws, i, &host); if (error) goto out; platform_set_drvdata(pdev, host); return 0; out: release_mem_region(res->start, resource_size(res)); return error; }
int a3000_detect(Scsi_Host_Template *tpnt) { static unsigned char called = 0; if (called) return 0; if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(A3000_SCSI)) return 0; tpnt->proc_dir = &proc_scsi_a3000; tpnt->proc_info = &wd33c93_proc_info; a3000_host = scsi_register (tpnt, sizeof(struct WD33C93_hostdata)); a3000_host->base = (unsigned char *)ZTWO_VADDR(0xDD0000); a3000_host->irq = IRQ_AMIGA_PORTS & ~IRQ_MACHSPEC; DMA(a3000_host)->DAWR = DAWR_A3000; wd33c93_init(a3000_host, (wd33c93_regs *)&(DMA(a3000_host)->SASR), dma_setup, dma_stop, WD33C93_FS_12_15); request_irq(IRQ_AMIGA_PORTS, a3000_intr, 0, "A3000 SCSI", a3000_intr); DMA(a3000_host)->CNTR = CNTR_PDMD | CNTR_INTEN; called = 1; return 1; }
void *amiga_chip_alloc(unsigned long size, const char *name) { struct resource *res; /* round up */ size = PAGE_ALIGN(size); #ifdef DEBUG printk("amiga_chip_alloc: allocate %ld bytes\n", size); #endif res = kzalloc(sizeof(struct resource), GFP_KERNEL); if (!res) return NULL; res->name = name; if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0) { kfree(res); return NULL; } chipavail -= size; #ifdef DEBUG printk("amiga_chip_alloc: returning %lx\n", res->start); #endif return (void *)ZTWO_VADDR(res->start); }
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; }
static int __init hydra_probe(void) { struct zorro_dev *z = NULL; unsigned long board; int err = -ENODEV; if (load_8390_module("hydra.c")) return -ENOSYS; while ((z = zorro_find_device(ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET, z))) { board = z->resource.start; if (!request_mem_region(board, 0x10000, "Hydra")) continue; if ((err = hydra_init(ZTWO_VADDR(board)))) { release_mem_region(board, 0x10000); return err; } err = 0; } if (err == -ENODEV) { printk("No Hydra ethernet card found.\n"); unload_8390_module(); } return err; }
static int __devinit a2091_probe(struct zorro_dev *z, const struct zorro_device_id *ent) { struct Scsi_Host *instance; int error; struct a2091_scsiregs *regs; wd33c93_regs wdregs; struct a2091_hostdata *hdata; if (!request_mem_region(z->resource.start, 256, "wd33c93")) return -EBUSY; instance = scsi_host_alloc(&a2091_scsi_template, sizeof(struct a2091_hostdata)); if (!instance) { error = -ENOMEM; goto fail_alloc; } instance->irq = IRQ_AMIGA_PORTS; instance->unique_id = z->slotaddr; regs = (struct a2091_scsiregs *)ZTWO_VADDR(z->resource.start); regs->DAWR = DAWR_A2091; wdregs.SASR = ®s->SASR; wdregs.SCMD = ®s->SCMD; hdata = shost_priv(instance); hdata->wh.no_sync = 0xff; hdata->wh.fast = 0; hdata->wh.dma_mode = CTRL_DMA; hdata->regs = regs; wd33c93_init(instance, wdregs, dma_setup, dma_stop, WD33C93_FS_8_10); error = request_irq(IRQ_AMIGA_PORTS, a2091_intr, IRQF_SHARED, "A2091 SCSI", instance); if (error) goto fail_irq; regs->CNTR = CNTR_PDMD | CNTR_INTEN; error = scsi_add_host(instance, NULL); if (error) goto fail_host; zorro_set_drvdata(z, instance); scsi_scan_host(instance); return 0; fail_host: free_irq(IRQ_AMIGA_PORTS, instance); fail_irq: scsi_host_put(instance); fail_alloc: release_mem_region(z->resource.start, 256); return error; }
static int __init zorro_init(void) { struct zorro_dev *z; unsigned int i; if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) return 0; pr_info("Zorro: Probing AutoConfig expansion devices: %d device%s\n", zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s"); /* Initialize the Zorro bus */ INIT_LIST_HEAD(&zorro_bus.devices); strcpy(zorro_bus.dev.bus_id, "zorro"); device_register(&zorro_bus.dev); /* Request the resources */ zorro_bus.num_resources = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2; for (i = 0; i < zorro_bus.num_resources; i++) request_resource(&iomem_resource, &zorro_bus.resources[i]); /* Register all devices */ for (i = 0; i < zorro_num_autocon; i++) { z = &zorro_autocon[i]; z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8); if (z->id == ZORRO_PROD_GVP_EPC_BASE) { /* GVP quirk */ unsigned long magic = zorro_resource_start(z)+0x8000; z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK; } sprintf(z->name, "Zorro device %08x", z->id); zorro_name_device(z); z->resource.name = z->name; if (request_resource(zorro_find_parent_resource(z), &z->resource)) printk(KERN_ERR "Zorro: Address space collision on device %s " "[%lx:%lx]\n", z->name, (unsigned long)zorro_resource_start(z), (unsigned long)zorro_resource_end(z)); sprintf(z->dev.bus_id, "%02x", i); z->dev.parent = &zorro_bus.dev; z->dev.bus = &zorro_bus_type; device_register(&z->dev); zorro_create_sysfs_dev_files(z); } /* Mark all available Zorro II memory */ zorro_for_each_dev(z) { if (z->rom.er_Type & ERTF_MEMLIST) mark_region(zorro_resource_start(z), zorro_resource_end(z)+1, 1); } /* Unmark all used Zorro II memory */ for (i = 0; i < m68k_num_memory; i++) if (m68k_memory[i].addr < 16*1024*1024) mark_region(m68k_memory[i].addr, m68k_memory[i].addr+m68k_memory[i].size, 0); return 0; }
static int __devinit a4000t_probe(struct device *dev) { struct Scsi_Host * host = NULL; struct NCR_700_Host_Parameters *hostdata; if (!(MACH_IS_AMIGA && AMIGAHW_PRESENT(A4000_SCSI))) goto out; if (!request_mem_region(A4000T_SCSI_ADDR, 0x1000, "A4000T builtin SCSI")) goto out; hostdata = kmalloc(sizeof(struct NCR_700_Host_Parameters), GFP_KERNEL); if (hostdata == NULL) { printk(KERN_ERR "a4000t-scsi: Failed to allocate host data\n"); goto out_release; } memset(hostdata, 0, sizeof(struct NCR_700_Host_Parameters)); /* Fill in the required pieces of hostdata */ hostdata->base = (void __iomem *)ZTWO_VADDR(A4000T_SCSI_ADDR); hostdata->clock = 50; hostdata->chip710 = 1; hostdata->dmode_extra = DMODE_FC2; hostdata->dcntl_extra = EA_710; /* and register the chip */ host = NCR_700_detect(&a4000t_scsi_driver_template, hostdata, dev); if (!host) { printk(KERN_ERR "a4000t-scsi: No host detected; " "board configuration problem?\n"); goto out_free; } host->this_id = 7; host->base = A4000T_SCSI_ADDR; host->irq = IRQ_AMIGA_PORTS; if (request_irq(host->irq, NCR_700_intr, IRQF_SHARED, "a4000t-scsi", host)) { printk(KERN_ERR "a4000t-scsi: request_irq failed\n"); goto out_put_host; } dev_set_drvdata(dev, host); scsi_scan_host(host); return 0; out_put_host: scsi_host_put(host); out_free: kfree(hostdata); out_release: release_mem_region(A4000T_SCSI_ADDR, 0x1000); out: return -ENODEV; }
static int __init parport_mfc3_init(void) { struct parport *p; int pias = 0; struct pia *pp; struct zorro_dev *z = NULL; if (!MACH_IS_AMIGA) return -ENODEV; while ((z = zorro_find_device(ZORRO_PROD_BSC_MULTIFACE_III, z))) { unsigned long piabase = z->resource.start+PIABASE; if (!request_mem_region(piabase, sizeof(struct pia), "PIA")) continue; pp = (struct pia *)ZTWO_VADDR(piabase); pp->crb = 0; pp->pddrb = 255; /* all data pins output */ pp->crb = PIA_DDR|32|8; dummy = pp->pddrb; /* reading clears interrupt */ pp->cra = 0; pp->pddra = 0xe0; /* /RESET, /DIR ,/AUTO-FEED output */ pp->cra = PIA_DDR; pp->ppra = 0; /* reset printer */ udelay(10); pp->ppra = 128; p = parport_register_port((unsigned long)pp, IRQ_AMIGA_PORTS, PARPORT_DMA_NONE, &pp_mfc3_ops); if (!p) goto out_port; if (p->irq != PARPORT_IRQ_NONE) { if (use_cnt++ == 0) if (request_irq(IRQ_AMIGA_PORTS, mfc3_interrupt, IRQF_SHARED, p->name, &pp_mfc3_ops)) goto out_irq; } p->dev = &z->dev; this_port[pias++] = p; printk(KERN_INFO "%s: Multiface III port using irq\n", p->name); /* XXX: set operating mode */ p->private_data = (void *)piabase; parport_announce_port (p); if (pias >= MAX_MFC) break; continue; out_irq: parport_put_port(p); out_port: release_mem_region(piabase, sizeof(struct pia)); } return pias ? 0 : -ENODEV; }
static int identify(int devnum, char *buf) { struct ConfigDev *cd; int manuf, prod; u_long addr, size; char *manufname, *prodname, *is_mem; char zorro, mag, configured; int identified = 0; int i, j, k, len = 0; enum GVP_ident epc; cd = &boot_info.bi_amiga.autocon[devnum]; manuf = cd->cd_Rom.er_Manufacturer; prod = cd->cd_Rom.er_Product; addr = (u_long)cd->cd_BoardAddr; size = cd->cd_BoardSize; configured = BoardPartFlags[devnum] ? '*' : ' '; manufname = prodname = "<UNKNOWN>"; for (i = 0; i < NUM_MANUF; i++) if (Manufacturers[i].ID == manuf) { manufname = Manufacturers[i].Name; for (j = 0; j < Manufacturers[i].NumProd; j++) if (Manufacturers[i].Products[j].ID == prod) if ((manuf != MANUF_GVP) || (prod != PROD_GVP)) { prodname = Manufacturers[i].Products[j].Name; identified = 1; break; } else { epc = *(enum GVP_ident *)ZTWO_VADDR(addr+0x8000) & GVP_EPCMASK; for (k = 0; k < NUM_GVP_PROD; k++) if (Ext_Prod_GVP[k].ID == epc) { prodname = Ext_Prod_GVP[k].Name; identified = 1; break; } } break; } switch (cd->cd_Rom.er_Type & ERT_TYPEMASK) { case ERT_ZORROII: zorro = '2'; break; case ERT_ZORROIII: zorro = '3'; break; default: zorro = '?'; break; } if (size & 0xfffff) { size >>= 10; mag = 'K'; } else {
static int __init a2091_detect(struct scsi_host_template *tpnt) { static unsigned char called = 0; struct Scsi_Host *instance; unsigned long address; struct zorro_dev *z = NULL; wd33c93_regs regs; int num_a2091 = 0; if (!MACH_IS_AMIGA || called) return 0; called = 1; tpnt->proc_name = "A2091"; tpnt->proc_info = &wd33c93_proc_info; while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { if (z->id != ZORRO_PROD_CBM_A590_A2091_1 && z->id != ZORRO_PROD_CBM_A590_A2091_2) continue; address = z->resource.start; if (!request_mem_region(address, 256, "wd33c93")) continue; instance = scsi_register (tpnt, sizeof (struct WD33C93_hostdata)); if (instance == NULL) goto release; instance->base = ZTWO_VADDR(address); instance->irq = IRQ_AMIGA_PORTS; instance->unique_id = z->slotaddr; DMA(instance)->DAWR = DAWR_A2091; regs.SASR = &(DMA(instance)->SASR); regs.SCMD = &(DMA(instance)->SCMD); HDATA(instance)->no_sync = 0xff; HDATA(instance)->fast = 0; HDATA(instance)->dma_mode = CTRL_DMA; wd33c93_init(instance, regs, dma_setup, dma_stop, WD33C93_FS_8_10); if (request_irq(IRQ_AMIGA_PORTS, a2091_intr, IRQF_SHARED, "A2091 SCSI", instance)) goto unregister; DMA(instance)->CNTR = CNTR_PDMD | CNTR_INTEN; num_a2091++; continue; unregister: scsi_unregister(instance); wd33c93_release(); release: release_mem_region(address, 256); } return num_a2091; }
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
void __init zorro_init(void) { struct zorro_dev *dev; u_int i; if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) return; printk("Zorro: Probing AutoConfig expansion devices: %d device%s\n", zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s"); /* Request the resources */ zorro_num_res = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2; for (i = 0; i < zorro_num_res; i++) request_resource(&iomem_resource, &zorro_res[i]); for (i = 0; i < zorro_num_autocon; i++) { dev = &zorro_autocon[i]; dev->id = (dev->rom.er_Manufacturer<<16) | (dev->rom.er_Product<<8); if (dev->id == ZORRO_PROD_GVP_EPC_BASE) { /* GVP quirk */ unsigned long magic = dev->resource.start+0x8000; dev->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK; } sprintf(dev->name, "Zorro device %08x", dev->id); zorro_name_device(dev); dev->resource.name = dev->name; if (request_resource(zorro_find_parent_resource(dev), &dev->resource)) printk(KERN_ERR "Zorro: Address space collision on device %s " "[%lx:%lx]\n", dev->name, dev->resource.start, dev->resource.end); } /* Mark all available Zorro II memory */ for (i = 0; i < zorro_num_autocon; i++) { dev = &zorro_autocon[i]; if (dev->rom.er_Type & ERTF_MEMLIST) mark_region(dev->resource.start, dev->resource.end+1, 1); } /* Unmark all used Zorro II memory */ for (i = 0; i < m68k_num_memory; i++) if (m68k_memory[i].addr < 16*1024*1024) mark_region(m68k_memory[i].addr, m68k_memory[i].addr+m68k_memory[i].size, 0); }
static void get_z2ram( void ) { int i; for ( i = 0; i < Z2RAM_SIZE / Z2RAM_CHUNKSIZE; i++ ) { if ( test_bit( i, zorro_unused_z2ram ) ) { z2_count++; z2ram_map[ z2ram_size++ ] = ZTWO_VADDR( Z2RAM_START ) + ( i << Z2RAM_CHUNKSHIFT ); clear_bit( i, zorro_unused_z2ram ); } } return; }
void *amiga_chip_alloc_res(unsigned long size, struct resource *res) { int error; /* round up */ size = PAGE_ALIGN(size); pr_debug("amiga_chip_alloc_res: allocate %lu bytes\n", size); error = allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE, NULL, NULL); if (error < 0) { pr_err("amiga_chip_alloc_res: allocate_resource() failed %d!\n", error); return NULL; } atomic_sub(size, &chipavail); pr_debug("amiga_chip_alloc_res: returning %pR\n", res); return (void *)ZTWO_VADDR(res->start); }
int __init a3000_detect(struct scsi_host_template *tpnt) { wd33c93_regs regs; if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(A3000_SCSI)) return 0; if (!request_mem_region(0xDD0000, 256, "wd33c93")) return 0; tpnt->proc_name = "A3000"; tpnt->proc_info = &wd33c93_proc_info; a3000_host = scsi_register (tpnt, sizeof(struct WD33C93_hostdata)); if (a3000_host == NULL) goto fail_register; a3000_host->base = ZTWO_VADDR(0xDD0000); a3000_host->irq = IRQ_AMIGA_PORTS; DMA(a3000_host)->DAWR = DAWR_A3000; regs.SASR = &(DMA(a3000_host)->SASR); regs.SCMD = &(DMA(a3000_host)->SCMD); HDATA(a3000_host)->no_sync = 0xff; HDATA(a3000_host)->fast = 0; HDATA(a3000_host)->dma_mode = CTRL_DMA; wd33c93_init(a3000_host, regs, dma_setup, dma_stop, WD33C93_FS_12_15); if (request_irq(IRQ_AMIGA_PORTS, a3000_intr, IRQF_SHARED, "A3000 SCSI", a3000_intr)) goto fail_irq; DMA(a3000_host)->CNTR = CNTR_PDMD | CNTR_INTEN; return 1; fail_irq: wd33c93_release(); scsi_unregister(a3000_host); fail_register: release_mem_region(0xDD0000, 256); return 0; }
void * __init amiga_chip_alloc_res(unsigned long size, struct resource *res) { unsigned long start; /* round up */ size = PAGE_ALIGN(size); /* dmesg into chipmem prefers memory at the safe end */ start = CHIP_PHYSADDR + chipavail - size; #ifdef DEBUG printk("amiga_chip_alloc_res: allocate %ld bytes\n", size); #endif if (allocate_resource(&chipram_res, res, size, start, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0) { printk("amiga_chip_alloc_res: first alloc failed!\n"); if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0) return NULL; } chipavail -= size; #ifdef DEBUG printk("amiga_chip_alloc_res: returning %lx\n", res->start); #endif return (void *)ZTWO_VADDR(res->start); }
/***************************************************************** Detection */ int __init blz2060_esp_detect(Scsi_Host_Template *tpnt) { struct NCR_ESP *esp; struct zorro_dev *z = NULL; unsigned long address; if ((z = zorro_find_device(ZORRO_PROD_PHASE5_BLIZZARD_2060, z))) { unsigned long board = z->resource.start; if (request_mem_region(board+BLZ2060_ESP_ADDR, sizeof(struct ESP_regs), "NCR53C9x")) { esp = esp_allocate(tpnt, (void *)board+BLZ2060_ESP_ADDR); /* Do command transfer with programmed I/O */ esp->do_pio_cmds = 1; /* Required functions */ esp->dma_bytes_sent = &dma_bytes_sent; esp->dma_can_transfer = &dma_can_transfer; esp->dma_dump_state = &dma_dump_state; esp->dma_init_read = &dma_init_read; esp->dma_init_write = &dma_init_write; esp->dma_ints_off = &dma_ints_off; esp->dma_ints_on = &dma_ints_on; esp->dma_irq_p = &dma_irq_p; esp->dma_ports_p = &dma_ports_p; esp->dma_setup = &dma_setup; /* Optional functions */ esp->dma_barrier = 0; esp->dma_drain = 0; esp->dma_invalidate = 0; esp->dma_irq_entry = 0; esp->dma_irq_exit = 0; esp->dma_led_on = &dma_led_on; esp->dma_led_off = &dma_led_off; esp->dma_poll = 0; esp->dma_reset = 0; /* SCSI chip speed */ esp->cfreq = 40000000; /* The DMA registers on the Blizzard are mapped * relative to the device (i.e. in the same Zorro * I/O block). */ address = (unsigned long)ZTWO_VADDR(board); esp->dregs = (void *)(address + BLZ2060_DMA_ADDR); /* ESP register base */ esp->eregs = (struct ESP_regs *)(address + BLZ2060_ESP_ADDR); /* Set the command buffer */ esp->esp_command = cmd_buffer; esp->esp_command_dvma = virt_to_bus((void *)cmd_buffer); esp->irq = IRQ_AMIGA_PORTS; request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, "Blizzard 2060 SCSI", esp->ehost); /* Figure out our scsi ID on the bus */ esp->scsi_id = 7; /* We don't have a differential SCSI-bus. */ esp->diff = 0; esp_initialize(esp); printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps, esps_in_use); esps_running = esps_in_use; return esps_in_use; } } return 0; }
/***************************************************************** Detection */ int __init cyber_esp_detect(Scsi_Host_Template *tpnt) { struct NCR_ESP *esp; struct zorro_dev *z = NULL; unsigned long address; while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { unsigned long board = z->resource.start; if ((z->id == ZORRO_PROD_PHASE5_BLIZZARD_1220_CYBERSTORM || z->id == ZORRO_PROD_PHASE5_BLIZZARD_1230_II_FASTLANE_Z3_CYBERSCSI_CYBERSTORM060) && request_mem_region(board+CYBER_ESP_ADDR, sizeof(struct ESP_regs), "NCR53C9x")) { /* Figure out if this is a CyberStorm or really a * Fastlane/Blizzard Mk II by looking at the board size. * CyberStorm maps 64kB * (ZORRO_PROD_PHASE5_BLIZZARD_1220_CYBERSTORM does anyway) */ if(z->resource.end-board != 0xffff) { release_mem_region(board+CYBER_ESP_ADDR, sizeof(struct ESP_regs)); return 0; } esp = esp_allocate(tpnt, (void *)board+CYBER_ESP_ADDR); /* Do command transfer with programmed I/O */ esp->do_pio_cmds = 1; /* Required functions */ esp->dma_bytes_sent = &dma_bytes_sent; esp->dma_can_transfer = &dma_can_transfer; esp->dma_dump_state = &dma_dump_state; esp->dma_init_read = &dma_init_read; esp->dma_init_write = &dma_init_write; esp->dma_ints_off = &dma_ints_off; esp->dma_ints_on = &dma_ints_on; esp->dma_irq_p = &dma_irq_p; esp->dma_ports_p = &dma_ports_p; esp->dma_setup = &dma_setup; /* Optional functions */ esp->dma_barrier = 0; esp->dma_drain = 0; esp->dma_invalidate = 0; esp->dma_irq_entry = 0; esp->dma_irq_exit = 0; esp->dma_led_on = &dma_led_on; esp->dma_led_off = &dma_led_off; esp->dma_poll = 0; esp->dma_reset = 0; /* SCSI chip speed */ esp->cfreq = 40000000; /* The DMA registers on the CyberStorm are mapped * relative to the device (i.e. in the same Zorro * I/O block). */ address = (unsigned long)ZTWO_VADDR(board); esp->dregs = (void *)(address + CYBER_DMA_ADDR); /* ESP register base */ esp->eregs = (struct ESP_regs *)(address + CYBER_ESP_ADDR); /* Set the command buffer */ esp->esp_command = cmd_buffer; esp->esp_command_dvma = virt_to_bus((void *)cmd_buffer); esp->irq = IRQ_AMIGA_PORTS; request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, "CyberStorm SCSI", esp->ehost); /* Figure out our scsi ID on the bus */ /* The DMA cond flag contains a hardcoded jumper bit * which can be used to select host number 6 or 7. * However, even though it may change, we use a hardcoded * value of 7. */ esp->scsi_id = 7; /* We don't have a differential SCSI-bus. */ esp->diff = 0; esp_initialize(esp); printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps, esps_in_use); esps_running = esps_in_use; return esps_in_use; } } return 0; }
static int __init amiga_zorro_probe(struct platform_device *pdev) { struct zorro_bus *bus; struct zorro_dev *z; struct resource *r; unsigned int i; int error; /* Initialize the Zorro bus */ bus = kzalloc(sizeof(*bus), GFP_KERNEL); if (!bus) return -ENOMEM; INIT_LIST_HEAD(&bus->devices); bus->dev.parent = &pdev->dev; dev_set_name(&bus->dev, "zorro"); error = device_register(&bus->dev); if (error) { pr_err("Zorro: Error registering zorro_bus\n"); kfree(bus); return error; } platform_set_drvdata(pdev, bus); /* Register all devices */ pr_info("Zorro: Probing AutoConfig expansion devices: %u device%s\n", zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s"); for (i = 0; i < zorro_num_autocon; i++) { z = &zorro_autocon[i]; z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8); if (z->id == ZORRO_PROD_GVP_EPC_BASE) { /* GVP quirk */ unsigned long magic = zorro_resource_start(z)+0x8000; z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK; } sprintf(z->name, "Zorro device %08x", z->id); zorro_name_device(z); z->resource.name = z->name; r = zorro_find_parent_resource(pdev, z); error = request_resource(r, &z->resource); if (error) dev_err(&bus->dev, "Address space collision on device %s %pR\n", z->name, &z->resource); dev_set_name(&z->dev, "%02x", i); z->dev.parent = &bus->dev; z->dev.bus = &zorro_bus_type; error = device_register(&z->dev); if (error) { dev_err(&bus->dev, "Error registering device %s\n", z->name); continue; } error = zorro_create_sysfs_dev_files(z); if (error) dev_err(&z->dev, "Error creating sysfs files\n"); } /* Mark all available Zorro II memory */ zorro_for_each_dev(z) { if (z->rom.er_Type & ERTF_MEMLIST) mark_region(zorro_resource_start(z), zorro_resource_end(z)+1, 1); } /* Unmark all used Zorro II memory */ for (i = 0; i < m68k_num_memory; i++) if (m68k_memory[i].addr < 16*1024*1024) mark_region(m68k_memory[i].addr, m68k_memory[i].addr+m68k_memory[i].size, 0); return 0; }
int __init amiga7xx_detect(Scsi_Host_Template *tpnt) { static unsigned char called = 0; int num = 0, clock; long long options; struct zorro_dev *z = NULL; unsigned long address; if (called || !MACH_IS_AMIGA) return 0; tpnt->proc_name = "Amiga7xx"; #ifdef CONFIG_A4000T_SCSI if (AMIGAHW_PRESENT(A4000_SCSI)) { address = 0xdd0040; if (request_mem_region(address, 0x1000, "ncr53c710")) { address = ZTWO_VADDR(address); options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 | OPTION_INTFLY | OPTION_SYNCHRONOUS | OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT; clock = 50000000; /* 50MHz SCSI Clock */ ncr53c7xx_init(tpnt, 0, 710, address, 0, IRQ_AMIGA_PORTS, DMA_NONE, options, clock); num++; } } #endif while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { unsigned long address = z->resource.start; unsigned long size = z->resource.end-z->resource.start+1; switch (z->id) { #ifdef CONFIG_BLZ603EPLUS_SCSI case ZORRO_PROD_PHASE5_BLIZZARD_603E_PLUS: address = 0xf40000; if (request_mem_region(address, 0x1000, "ncr53c710")) { address = ZTWO_VADDR(address); options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 | OPTION_INTFLY | OPTION_SYNCHRONOUS | OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT; clock = 50000000; /* 50MHz SCSI Clock */ ncr53c7xx_init(tpnt, 0, 710, address, 0, IRQ_AMIGA_PORTS, DMA_NONE, options, clock); num++; } break; #endif #ifdef CONFIG_WARPENGINE_SCSI case ZORRO_PROD_MACROSYSTEMS_WARP_ENGINE_40xx: if (request_mem_region(address+0x40000, 0x1000, "ncr53c710")) { address = (unsigned long)z_ioremap(address, size); options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 | OPTION_INTFLY | OPTION_SYNCHRONOUS | OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT; clock = 50000000; /* 50MHz SCSI Clock */ ncr53c7xx_init(tpnt, 0, 710, address+0x40000, 0, IRQ_AMIGA_PORTS, DMA_NONE, options, clock); num++; } break; #endif #ifdef CONFIG_A4091_SCSI case ZORRO_PROD_CBM_A4091_1: case ZORRO_PROD_CBM_A4091_2: if (request_mem_region(address+0x800000, 0x1000, "ncr53c710")) { address = (unsigned long)z_ioremap(address, size); options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 | OPTION_INTFLY | OPTION_SYNCHRONOUS | OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT; clock = 50000000; /* 50MHz SCSI Clock */ ncr53c7xx_init(tpnt, 0, 710, address+0x800000, 0, IRQ_AMIGA_PORTS, DMA_NONE, options, clock); num++; } break; #endif #ifdef CONFIG_GVP_TURBO_SCSI case ZORRO_PROD_GVP_GFORCE_040_060: if (request_mem_region(address+0x40000, 0x1000, "ncr53c710")) { address = ZTWO_VADDR(address); options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 | OPTION_INTFLY | OPTION_SYNCHRONOUS | OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT; clock = 50000000; /* 50MHz SCSI Clock */ ncr53c7xx_init(tpnt, 0, 710, address+0x40000, 0, IRQ_AMIGA_PORTS, DMA_NONE, options, clock); num++; } #endif } } called = 1; return num; }
static inline volatile struct a2232memory *a2232mem(unsigned int board) { return (volatile struct a2232memory *)ZTWO_VADDR(zd_a2232[board]->resource.start); }
/***************************************************************** Detection */ int oktagon_esp_detect(Scsi_Host_Template *tpnt) { struct NCR_ESP *esp; struct zorro_dev *z = NULL; unsigned long address; struct ESP_regs *eregs; while ((z = zorro_find_device(ZORRO_PROD_BSC_OKTAGON_2008, z))) { unsigned long board = z->resource.start; if (request_mem_region(board+OKTAGON_ESP_ADDR, sizeof(struct ESP_regs), "NCR53C9x")) { /* * It is a SCSI controller. * Hardwire Host adapter to SCSI ID 7 */ address = (unsigned long)ZTWO_VADDR(board); eregs = (struct ESP_regs *)(address + OKTAGON_ESP_ADDR); /* This line was 5 lines lower */ esp = esp_allocate(tpnt, (void *)board+OKTAGON_ESP_ADDR); /* we have to shift the registers only one bit for oktagon */ esp->shift = 1; esp_write(eregs->esp_cfg1, (ESP_CONFIG1_PENABLE | 7)); udelay(5); if (esp_read(eregs->esp_cfg1) != (ESP_CONFIG1_PENABLE | 7)) return 0; /* Bail out if address did not hold data */ /* Do command transfer with programmed I/O */ esp->do_pio_cmds = 1; /* Required functions */ esp->dma_bytes_sent = &dma_bytes_sent; esp->dma_can_transfer = &dma_can_transfer; esp->dma_dump_state = &dma_dump_state; esp->dma_init_read = &dma_init_read; esp->dma_init_write = &dma_init_write; esp->dma_ints_off = &dma_ints_off; esp->dma_ints_on = &dma_ints_on; esp->dma_irq_p = &dma_irq_p; esp->dma_ports_p = &dma_ports_p; esp->dma_setup = &dma_setup; /* Optional functions */ esp->dma_barrier = 0; esp->dma_drain = 0; esp->dma_invalidate = &dma_invalidate; esp->dma_irq_entry = 0; esp->dma_irq_exit = &dma_irq_exit; esp->dma_led_on = &dma_led_on; esp->dma_led_off = &dma_led_off; esp->dma_poll = 0; esp->dma_reset = 0; esp->dma_mmu_get_scsi_one = &dma_mmu_get_scsi_one; esp->dma_mmu_get_scsi_sgl = &dma_mmu_get_scsi_sgl; esp->dma_mmu_release_scsi_one = &dma_mmu_release_scsi_one; esp->dma_mmu_release_scsi_sgl = &dma_mmu_release_scsi_sgl; esp->dma_advance_sg = &dma_advance_sg; /* SCSI chip speed */ /* Looking at the quartz of the SCSI board... */ esp->cfreq = 25000000; /* The DMA registers on the CyberStorm are mapped * relative to the device (i.e. in the same Zorro * I/O block). */ esp->dregs = (void *)(address + OKTAGON_DMA_ADDR); paddress = (long *) esp->dregs; /* ESP register base */ esp->eregs = eregs; /* Set the command buffer */ esp->esp_command = (volatile unsigned char*) cmd_buffer; /* Yes, the virtual address. See below. */ esp->esp_command_dvma = (__u32) cmd_buffer; esp->irq = IRQ_AMIGA_PORTS; request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, "BSC Oktagon SCSI", esp->ehost); /* Figure out our scsi ID on the bus */ esp->scsi_id = 7; /* We don't have a differential SCSI-bus. */ esp->diff = 0; esp_initialize(esp); printk("ESP_Oktagon Driver 1.1" #ifdef USE_BOTTOM_HALF " [BOTTOM_HALF]" #else " [IRQ]" #endif " registered.\n"); printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps,esps_in_use); esps_running = esps_in_use; current_esp = esp; register_reboot_notifier(&oktagon_notifier); return esps_in_use; } } return 0; }
void __init buddha_init(void) { hw_regs_t hw; ide_hwif_t *hwif; int i, index; struct zorro_dev *z = NULL; u_long buddha_board = 0; BuddhaType type; int buddha_num_hwifs; while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { unsigned long board; if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) { buddha_num_hwifs = BUDDHA_NUM_HWIFS; type=BOARD_BUDDHA; } else if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_CATWEASEL) { buddha_num_hwifs = CATWEASEL_NUM_HWIFS; type=BOARD_CATWEASEL; } else if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF) { buddha_num_hwifs = XSURF_NUM_HWIFS; type=BOARD_XSURF; } else continue; board = z->resource.start; /* * FIXME: we now have selectable mmio v/s iomio transports. */ if(type != BOARD_XSURF) { if (!request_mem_region(board+BUDDHA_BASE1, 0x800, "IDE")) continue; } else { if (!request_mem_region(board+XSURF_BASE1, 0x1000, "IDE")) continue; if (!request_mem_region(board+XSURF_BASE2, 0x1000, "IDE")) goto fail_base2; if (!request_mem_region(board+XSURF_IRQ1, 0x8, "IDE")) { release_mem_region(board+XSURF_BASE2, 0x1000); fail_base2: release_mem_region(board+XSURF_BASE1, 0x1000); continue; } } buddha_board = ZTWO_VADDR(board); /* write to BUDDHA_IRQ_MR to enable the board IRQ */ /* X-Surf doesn't have this. IRQs are always on */ if (type != BOARD_XSURF) z_writeb(0, buddha_board+BUDDHA_IRQ_MR); for(i=0;i<buddha_num_hwifs;i++) { if(type != BOARD_XSURF) { ide_setup_ports(&hw, (buddha_board+buddha_bases[i]), buddha_offsets, 0, (buddha_board+buddha_irqports[i]), buddha_ack_intr, // budda_iops, IRQ_AMIGA_PORTS); } else { ide_setup_ports(&hw, (buddha_board+xsurf_bases[i]), xsurf_offsets, 0, (buddha_board+xsurf_irqports[i]), xsurf_ack_intr, // xsurf_iops, IRQ_AMIGA_PORTS); } index = ide_register_hw(&hw, NULL, 1, &hwif); if (index != -1) { hwif->mmio = 1; printk("ide%d: ", index); switch(type) { case BOARD_BUDDHA: printk("Buddha"); break; case BOARD_CATWEASEL: printk("Catweasel"); break; case BOARD_XSURF: printk("X-Surf"); break; } printk(" IDE interface\n"); } } } }
/***************************************************************** Detection */ int __init blz1230_esp_detect(Scsi_Host_Template *tpnt) { struct NCR_ESP *esp; struct zorro_dev *z = NULL; unsigned long address; struct ESP_regs *eregs; unsigned long board; #if MKIV #define REAL_BLZ1230_ID ZORRO_PROD_PHASE5_BLIZZARD_1230_IV_1260 #define REAL_BLZ1230_ESP_ADDR BLZ1230_ESP_ADDR #define REAL_BLZ1230_DMA_ADDR BLZ1230_DMA_ADDR #else #define REAL_BLZ1230_ID ZORRO_PROD_PHASE5_BLIZZARD_1230_II_FASTLANE_Z3_CYBERSCSI_CYBERSTORM060 #define REAL_BLZ1230_ESP_ADDR BLZ1230II_ESP_ADDR #define REAL_BLZ1230_DMA_ADDR BLZ1230II_DMA_ADDR #endif if ((z = zorro_find_device(REAL_BLZ1230_ID, z))) { board = z->resource.start; if (request_mem_region(board+REAL_BLZ1230_ESP_ADDR, sizeof(struct ESP_regs), "NCR53C9x")) { /* Do some magic to figure out if the blizzard is * equipped with a SCSI controller */ address = ZTWO_VADDR(board); eregs = (struct ESP_regs *)(address + REAL_BLZ1230_ESP_ADDR); esp = esp_allocate(tpnt, (void *)board+REAL_BLZ1230_ESP_ADDR); esp_write(eregs->esp_cfg1, (ESP_CONFIG1_PENABLE | 7)); udelay(5); if(esp_read(eregs->esp_cfg1) != (ESP_CONFIG1_PENABLE | 7)) goto err_out; /* Do command transfer with programmed I/O */ esp->do_pio_cmds = 1; /* Required functions */ esp->dma_bytes_sent = &dma_bytes_sent; esp->dma_can_transfer = &dma_can_transfer; esp->dma_dump_state = &dma_dump_state; esp->dma_init_read = &dma_init_read; esp->dma_init_write = &dma_init_write; esp->dma_ints_off = &dma_ints_off; esp->dma_ints_on = &dma_ints_on; esp->dma_irq_p = &dma_irq_p; esp->dma_ports_p = &dma_ports_p; esp->dma_setup = &dma_setup; /* Optional functions */ esp->dma_barrier = 0; esp->dma_drain = 0; esp->dma_invalidate = 0; esp->dma_irq_entry = 0; esp->dma_irq_exit = 0; esp->dma_led_on = 0; esp->dma_led_off = 0; esp->dma_poll = 0; esp->dma_reset = 0; /* SCSI chip speed */ esp->cfreq = 40000000; /* The DMA registers on the Blizzard are mapped * relative to the device (i.e. in the same Zorro * I/O block). */ esp->dregs = (void *)(address + REAL_BLZ1230_DMA_ADDR); /* ESP register base */ esp->eregs = eregs; /* Set the command buffer */ esp->esp_command = cmd_buffer; esp->esp_command_dvma = virt_to_bus((void *)cmd_buffer); esp->irq = IRQ_AMIGA_PORTS; esp->slot = board+REAL_BLZ1230_ESP_ADDR; if (request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ, "Blizzard 1230 SCSI IV", esp->ehost)) goto err_out; /* Figure out our scsi ID on the bus */ esp->scsi_id = 7; /* We don't have a differential SCSI-bus. */ esp->diff = 0; esp_initialize(esp); printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps, esps_in_use); esps_running = esps_in_use; return esps_in_use; } } return 0; err_out: scsi_unregister(esp->ehost); esp_deallocate(esp); release_mem_region(board+REAL_BLZ1230_ESP_ADDR, sizeof(struct ESP_regs)); return 0; }
static int __devinit zorro7xx_init_one(struct zorro_dev *z, const struct zorro_device_id *ent) { struct Scsi_Host * host = NULL; struct NCR_700_Host_Parameters *hostdata; struct zorro_driver_data *zdd; unsigned long board, ioaddr; board = zorro_resource_start(z); zdd = (struct zorro_driver_data *)ent->driver_data; if (zdd->absolute) { ioaddr = zdd->offset; } else { ioaddr = board + zdd->offset; } if (!zorro_request_device(z, zdd->name)) { printk(KERN_ERR "zorro7xx: cannot reserve region 0x%lx, abort\n", board); return -EBUSY; } hostdata = kmalloc(sizeof(struct NCR_700_Host_Parameters), GFP_KERNEL); if (hostdata == NULL) { printk(KERN_ERR "zorro7xx: Failed to allocate host data\n"); goto out_release; } memset(hostdata, 0, sizeof(struct NCR_700_Host_Parameters)); /* Fill in the required pieces of hostdata */ if (ioaddr > 0x01000000) hostdata->base = ioremap(ioaddr, zorro_resource_len(z)); else hostdata->base = (void __iomem *)ZTWO_VADDR(ioaddr); hostdata->clock = 50; hostdata->chip710 = 1; /* Settings for at least WarpEngine 40xx */ hostdata->ctest7_extra = CTEST7_TT1; zorro7xx_scsi_driver_template.name = zdd->name; /* and register the chip */ host = NCR_700_detect(&zorro7xx_scsi_driver_template, hostdata, &z->dev); if (!host) { printk(KERN_ERR "zorro7xx: No host detected; " "board configuration problem?\n"); goto out_free; } host->this_id = 7; host->base = ioaddr; host->irq = IRQ_AMIGA_PORTS; if (request_irq(host->irq, NCR_700_intr, IRQF_SHARED, "zorro7xx-scsi", host)) { printk(KERN_ERR "zorro7xx: request_irq failed\n"); goto out_put_host; } zorro_set_drvdata(z, host); scsi_scan_host(host); return 0; out_put_host: scsi_host_put(host); out_free: if (ioaddr > 0x01000000) iounmap(hostdata->base); kfree(hostdata); out_release: zorro_release_device(z); return -ENODEV; }
static int __init amiga_a3000_scsi_probe(struct platform_device *pdev) { struct resource *res; struct Scsi_Host *instance; int error; struct a3000_scsiregs *regs; wd33c93_regs wdregs; struct a3000_hostdata *hdata; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) return -ENODEV; if (!request_mem_region(res->start, resource_size(res), "wd33c93")) return -EBUSY; instance = scsi_host_alloc(&amiga_a3000_scsi_template, sizeof(struct a3000_hostdata)); if (!instance) { error = -ENOMEM; goto fail_alloc; } instance->irq = IRQ_AMIGA_PORTS; regs = (struct a3000_scsiregs *)ZTWO_VADDR(res->start); regs->DAWR = DAWR_A3000; wdregs.SASR = ®s->SASR; wdregs.SCMD = ®s->SCMD; hdata = shost_priv(instance); hdata->wh.no_sync = 0xff; hdata->wh.fast = 0; hdata->wh.dma_mode = CTRL_DMA; hdata->regs = regs; wd33c93_init(instance, wdregs, dma_setup, dma_stop, WD33C93_FS_12_15); error = request_irq(IRQ_AMIGA_PORTS, a3000_intr, IRQF_SHARED, "A3000 SCSI", instance); if (error) goto fail_irq; regs->CNTR = CNTR_PDMD | CNTR_INTEN; error = scsi_add_host(instance, NULL); if (error) goto fail_host; platform_set_drvdata(pdev, instance); scsi_scan_host(instance); return 0; fail_host: free_irq(IRQ_AMIGA_PORTS, instance); fail_irq: scsi_host_put(instance); fail_alloc: release_mem_region(res->start, resource_size(res)); return error; }
static int __init ariadne_probe(void) { struct zorro_dev *z = NULL; struct net_device *dev; struct ariadne_private *priv; int res = -ENODEV; while ((z = zorro_find_device(ZORRO_PROD_VILLAGE_TRONIC_ARIADNE, z))) { unsigned long board = z->resource.start; unsigned long base_addr = board+ARIADNE_LANCE; unsigned long mem_start = board+ARIADNE_RAM; struct resource *r1, *r2; r1 = request_mem_region(base_addr, sizeof(struct Am79C960), "Am79C960"); if (!r1) continue; r2 = request_mem_region(mem_start, ARIADNE_RAM_SIZE, "RAM"); if (!r2) { release_resource(r1); continue; } dev = init_etherdev(NULL, sizeof(struct ariadne_private)); if (dev == NULL) { release_resource(r1); release_resource(r2); return -ENOMEM; } SET_MODULE_OWNER(dev); priv = dev->priv; r1->name = dev->name; r2->name = dev->name; priv->dev = dev; dev->dev_addr[0] = 0x00; dev->dev_addr[1] = 0x60; dev->dev_addr[2] = 0x30; dev->dev_addr[3] = (z->rom.er_SerialNumber>>16) & 0xff; dev->dev_addr[4] = (z->rom.er_SerialNumber>>8) & 0xff; dev->dev_addr[5] = z->rom.er_SerialNumber & 0xff; printk("%s: Ariadne at 0x%08lx, Ethernet Address " "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, board, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); dev->base_addr = ZTWO_VADDR(base_addr); dev->mem_start = ZTWO_VADDR(mem_start); dev->mem_end = dev->mem_start+ARIADNE_RAM_SIZE; dev->open = &ariadne_open; dev->stop = &ariadne_close; dev->hard_start_xmit = &ariadne_start_xmit; dev->tx_timeout = &ariadne_tx_timeout; dev->watchdog_timeo = 5*HZ; dev->get_stats = &ariadne_get_stats; dev->set_multicast_list = &set_multicast_list; #ifdef MODULE priv->next_module = root_ariadne_dev; root_ariadne_dev = priv; #endif res = 0; } return res; }
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; }
static int __init gayle_init(void) { int a4000, i; u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; if (!MACH_IS_AMIGA) return -ENODEV; if ((a4000 = AMIGAHW_PRESENT(A4000_IDE)) || AMIGAHW_PRESENT(A1200_IDE)) goto found; #ifdef CONFIG_ZORRO if (zorro_find_device(ZORRO_PROD_MTEC_VIPER_MK_V_E_MATRIX_530_SCSI_IDE, NULL)) goto found; #endif return -ENODEV; found: printk(KERN_INFO "ide: Gayle IDE controller (A%d style%s)\n", a4000 ? 4000 : 1200, #ifdef CONFIG_BLK_DEV_IDEDOUBLER ide_doubler ? ", IDE doubler" : #endif ""); for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) { unsigned long base, ctrlport, irqport; ide_ack_intr_t *ack_intr; hw_regs_t hw; ide_hwif_t *hwif; unsigned long phys_base, res_start, res_n; if (a4000) { phys_base = GAYLE_BASE_4000; irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000); ack_intr = gayle_ack_intr_a4000; } else { phys_base = GAYLE_BASE_1200; irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_1200); ack_intr = gayle_ack_intr_a1200; } /* * FIXME: we now have selectable modes between mmio v/s iomio */ phys_base += i*GAYLE_NEXT_PORT; res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1); res_n = GAYLE_IDEREG_SIZE; if (!request_mem_region(res_start, res_n, "IDE")) continue; base = (unsigned long)ZTWO_VADDR(phys_base); ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0; gayle_setup_ports(&hw, base, ctrlport, irqport, ack_intr); hwif = ide_find_port(); if (hwif) { u8 index = hwif->index; ide_init_port_hw(hwif, &hw); idx[i] = index; } else release_mem_region(res_start, res_n); } ide_device_add(idx, NULL); return 0; }