/* * We cannot (yet) probe for an IO mapped card, although we can check that * it's where we were told it was, and even do autoirq. */ static int __init com20020isa_probe(struct net_device *dev) { int ioaddr; unsigned long airqmask; struct arcnet_local *lp = dev->priv; #ifndef MODULE arcnet_init(); #endif BUGLVL(D_NORMAL) printk(VERSION); ioaddr = dev->base_addr; if (!ioaddr) { BUGMSG(D_NORMAL, "No autoprobe (yet) for IO mapped cards; you " "must specify the base address!\n"); return -ENODEV; } if (check_region(ioaddr, ARCNET_TOTAL_SIZE)) { BUGMSG(D_NORMAL, "IO region %xh-%xh already allocated.\n", ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1); return -ENXIO; } if (ASTATUS() == 0xFF) { BUGMSG(D_NORMAL, "IO address %x empty\n", ioaddr); return -ENODEV; } if (com20020_check(dev)) return -ENODEV; if (!dev->irq) { /* if we do this, we're sure to get an IRQ since the * card has just reset and the NORXflag is on until * we tell it to start receiving. */ BUGMSG(D_INIT_REASONS, "intmask was %02Xh\n", inb(_INTMASK)); outb(0, _INTMASK); airqmask = probe_irq_on(); outb(NORXflag, _INTMASK); udelay(1); outb(0, _INTMASK); dev->irq = probe_irq_off(airqmask); if (dev->irq <= 0) { BUGMSG(D_INIT_REASONS, "Autoprobe IRQ failed first time\n"); airqmask = probe_irq_on(); outb(NORXflag, _INTMASK); udelay(5); outb(0, _INTMASK); dev->irq = probe_irq_off(airqmask); if (dev->irq <= 0) { BUGMSG(D_NORMAL, "Autoprobe IRQ failed.\n"); return -ENODEV; } } } lp->card_name = "ISA COM20020"; return com20020_found(dev, 0); }
static int __devinit com20020pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { struct net_device *dev; struct arcnet_local *lp; int ioaddr, err; if (pci_enable_device(pdev)) return -EIO; dev = dev_alloc(device ? : "arc%d", &err); if (!dev) return err; lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL); if (!lp) { err = -ENOMEM; goto out_dev; } memset(lp, 0, sizeof(struct arcnet_local)); pci_set_drvdata(pdev, dev); ioaddr = pci_resource_start(pdev, 2); dev->base_addr = ioaddr; dev->irq = pdev->irq; dev->dev_addr[0] = node; lp->card_name = pdev->name; lp->card_flags = id->driver_data; lp->backplane = backplane; lp->clockp = clockp & 7; lp->clockm = clockm & 3; lp->timeout = timeout; lp->hw.open_close_ll = com20020pci_open_close; if (check_region(ioaddr, ARCNET_TOTAL_SIZE)) { BUGMSG(D_INIT, "IO region %xh-%xh already allocated.\n", ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1); err = -EBUSY; goto out_priv; } if (ASTATUS() == 0xFF) { BUGMSG(D_NORMAL, "IO address %Xh was reported by PCI BIOS, " "but seems empty!\n", ioaddr); err = -EIO; goto out_priv; } if (com20020_check(dev)) { err = -EIO; goto out_priv; } if ((err = com20020_found(dev, SA_SHIRQ)) != 0) goto out_priv; return 0; out_priv: kfree(dev->priv); out_dev: kfree(dev); return err; }
static int com20020_config(struct pcmcia_device *link) { struct arcnet_local *lp; tuple_t tuple; cisparse_t parse; com20020_dev_t *info; struct net_device *dev; int i, last_ret, last_fn; u_char buf[64]; int ioaddr; info = link->priv; dev = info->dev; DEBUG(1,"config...\n"); DEBUG(0, "com20020_config(0x%p)\n", link); tuple.Attributes = 0; tuple.TupleData = buf; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); link->conf.ConfigBase = parse.config.base; DEBUG(1,"arcnet: baseport1 is %Xh\n", link->io.BasePort1); i = !CS_SUCCESS; if (!link->io.BasePort1) { for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10) { link->io.BasePort1 = ioaddr; i = pcmcia_request_io(link, &link->io); if (i == CS_SUCCESS) break; } } else i = pcmcia_request_io(link, &link->io); if (i != CS_SUCCESS) { DEBUG(1,"arcnet: requestIO failed totally!\n"); goto failed; } ioaddr = dev->base_addr = link->io.BasePort1; DEBUG(1,"arcnet: got ioaddr %Xh\n", ioaddr); DEBUG(1,"arcnet: request IRQ %d (%Xh/%Xh)\n", link->irq.AssignedIRQ, link->irq.IRQInfo1, link->irq.IRQInfo2); i = pcmcia_request_irq(link, &link->irq); if (i != CS_SUCCESS) { DEBUG(1,"arcnet: requestIRQ failed totally!\n"); goto failed; } dev->irq = link->irq.AssignedIRQ; CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); if (com20020_check(dev)) { regdump(dev); goto failed; } lp = dev->priv; lp->card_name = "PCMCIA COM20020"; lp->card_flags = ARC_CAN_10MBIT; /* pretend all of them can 10Mbit */ link->dev_node = &info->node; SET_NETDEV_DEV(dev, &handle_to_dev(link)); i = com20020_found(dev, 0); /* calls register_netdev */ if (i != 0) { DEBUG(1,KERN_NOTICE "com20020_cs: com20020_found() failed\n"); link->dev_node = NULL; goto failed; } strcpy(info->node.dev_name, dev->name); DEBUG(1,KERN_INFO "%s: port %#3lx, irq %d\n", dev->name, dev->base_addr, dev->irq); return 0; cs_failed: cs_error(link, last_fn, last_ret); failed: DEBUG(1,"com20020_config failed...\n"); com20020_release(link); return -ENODEV; } /* com20020_config */
static int __devinit com20020pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { struct net_device *dev; struct arcnet_local *lp; int ioaddr, err; if (pci_enable_device(pdev)) return -EIO; dev = alloc_arcdev(device); if (!dev) return -ENOMEM; lp = dev->priv; pci_set_drvdata(pdev, dev); // SOHARD needs PCI base addr 4 if (pdev->vendor==0x10B5) { BUGMSG(D_NORMAL, "SOHARD\n"); ioaddr = pci_resource_start(pdev, 4); } else { BUGMSG(D_NORMAL, "Contemporary Controls\n"); ioaddr = pci_resource_start(pdev, 2); } if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "com20020-pci")) { BUGMSG(D_INIT, "IO region %xh-%xh already allocated.\n", ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1); err = -EBUSY; goto out_dev; } // Dummy access after Reset // ARCNET controller needs this access to detect bustype outb(0x00,ioaddr+1); inb(ioaddr+1); dev->base_addr = ioaddr; dev->irq = pdev->irq; dev->dev_addr[0] = node; lp->card_name = "PCI COM20020"; lp->card_flags = id->driver_data; lp->backplane = backplane; lp->clockp = clockp & 7; lp->clockm = clockm & 3; lp->timeout = timeout; lp->hw.owner = THIS_MODULE; if (ASTATUS() == 0xFF) { BUGMSG(D_NORMAL, "IO address %Xh was reported by PCI BIOS, " "but seems empty!\n", ioaddr); err = -EIO; goto out_port; } if (com20020_check(dev)) { err = -EIO; goto out_port; } if ((err = com20020_found(dev, IRQF_SHARED)) != 0) goto out_port; return 0; out_port: release_region(ioaddr, ARCNET_TOTAL_SIZE); out_dev: free_netdev(dev); return err; }
static int com20020_config(struct pcmcia_device *link) { struct arcnet_local *lp; com20020_dev_t *info; struct net_device *dev; int i, ret; int ioaddr; info = link->priv; dev = info->dev; dev_dbg(&link->dev, "config...\n"); dev_dbg(&link->dev, "com20020_config\n"); dev_dbg(&link->dev, "baseport1 is %Xh\n", (unsigned int) link->resource[0]->start); i = -ENODEV; link->io_lines = 16; if (!link->resource[0]->start) { for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10) { link->resource[0]->start = ioaddr; i = pcmcia_request_io(link); if (i == 0) break; } } else i = pcmcia_request_io(link); if (i != 0) { dev_dbg(&link->dev, "requestIO failed totally!\n"); goto failed; } ioaddr = dev->base_addr = link->resource[0]->start; dev_dbg(&link->dev, "got ioaddr %Xh\n", ioaddr); dev_dbg(&link->dev, "request IRQ %d\n", link->irq); if (!link->irq) { dev_dbg(&link->dev, "requestIRQ failed totally!\n"); goto failed; } dev->irq = link->irq; ret = pcmcia_enable_device(link); if (ret) goto failed; if (com20020_check(dev)) { regdump(dev); goto failed; } lp = netdev_priv(dev); lp->card_name = "PCMCIA COM20020"; lp->card_flags = ARC_CAN_10MBIT; /* pretend all of them can 10Mbit */ SET_NETDEV_DEV(dev, &link->dev); i = com20020_found(dev, 0); /* calls register_netdev */ if (i != 0) { dev_notice(&link->dev, "com20020_found() failed\n"); goto failed; } netdev_dbg(dev, "port %#3lx, irq %d\n", dev->base_addr, dev->irq); return 0; failed: dev_dbg(&link->dev, "com20020_config failed...\n"); com20020_release(link); return -ENODEV; } /* com20020_config */
static int com20020_config(struct pcmcia_device *link) { struct arcnet_local *lp; com20020_dev_t *info; struct net_device *dev; int i, ret; int ioaddr; info = link->priv; dev = info->dev; dev_dbg(&link->dev, "config...\n"); dev_dbg(&link->dev, "com20020_config\n"); dev_dbg(&link->dev, "baseport1 is %Xh\n", link->io.BasePort1); i = -ENODEV; if (!link->io.BasePort1) { for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10) { link->io.BasePort1 = ioaddr; i = pcmcia_request_io(link, &link->io); if (i == 0) break; } } else i = pcmcia_request_io(link, &link->io); if (i != 0) { dev_dbg(&link->dev, "requestIO failed totally!\n"); goto failed; } ioaddr = dev->base_addr = link->io.BasePort1; dev_dbg(&link->dev, "got ioaddr %Xh\n", ioaddr); dev_dbg(&link->dev, "request IRQ %d\n", link->irq); if (!link->irq) { dev_dbg(&link->dev, "requestIRQ failed totally!\n"); goto failed; } dev->irq = link->irq; ret = pcmcia_request_configuration(link, &link->conf); if (ret) goto failed; if (com20020_check(dev)) { regdump(dev); goto failed; } lp = netdev_priv(dev); lp->card_name = "PCMCIA COM20020"; lp->card_flags = ARC_CAN_10MBIT; /* pretend all of them can 10Mbit */ SET_NETDEV_DEV(dev, &link->dev); i = com20020_found(dev, 0); /* calls register_netdev */ if (i != 0) { dev_printk(KERN_NOTICE, &link->dev, "com20020_cs: com20020_found() failed\n"); goto failed; } dev_dbg(&link->dev,KERN_INFO "%s: port %#3lx, irq %d\n", dev->name, dev->base_addr, dev->irq); return 0; failed: dev_dbg(&link->dev, "com20020_config failed...\n"); com20020_release(link); return -ENODEV; } /* com20020_config */
static int com20020_config(struct pcmcia_device *link) { struct arcnet_local *lp; com20020_dev_t *info; struct net_device *dev; int i, last_ret, last_fn; int ioaddr; info = link->priv; dev = info->dev; DEBUG(1,"config...\n"); DEBUG(0, "com20020_config(0x%p)\n", link); DEBUG(1,"arcnet: baseport1 is %Xh\n", link->io.BasePort1); i = -ENODEV; if (!link->io.BasePort1) { for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10) { link->io.BasePort1 = ioaddr; i = pcmcia_request_io(link, &link->io); if (i == 0) break; } } else i = pcmcia_request_io(link, &link->io); if (i != 0) { DEBUG(1,"arcnet: requestIO failed totally!\n"); goto failed; } ioaddr = dev->base_addr = link->io.BasePort1; DEBUG(1,"arcnet: got ioaddr %Xh\n", ioaddr); DEBUG(1,"arcnet: request IRQ %d (%Xh/%Xh)\n", link->irq.AssignedIRQ, link->irq.IRQInfo1, link->irq.IRQInfo2); i = pcmcia_request_irq(link, &link->irq); if (i != 0) { DEBUG(1,"arcnet: requestIRQ failed totally!\n"); goto failed; } dev->irq = link->irq.AssignedIRQ; CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); if (com20020_check(dev)) { regdump(dev); goto failed; } lp = netdev_priv(dev); lp->card_name = "PCMCIA COM20020"; lp->card_flags = ARC_CAN_10MBIT; /* pretend all of them can 10Mbit */ link->dev_node = &info->node; SET_NETDEV_DEV(dev, &handle_to_dev(link)); i = com20020_found(dev, 0); /* calls register_netdev */ if (i != 0) { DEBUG(1,KERN_NOTICE "com20020_cs: com20020_found() failed\n"); link->dev_node = NULL; goto failed; } strcpy(info->node.dev_name, dev->name); DEBUG(1,KERN_INFO "%s: port %#3lx, irq %d\n", dev->name, dev->base_addr, dev->irq); return 0; cs_failed: cs_error(link, last_fn, last_ret); failed: DEBUG(1,"com20020_config failed...\n"); com20020_release(link); return -ENODEV; } /* com20020_config */
static void com20020_config(dev_link_t *link) { struct arcnet_local *lp; client_handle_t handle; tuple_t tuple; cisparse_t parse; com20020_dev_t *info; struct net_device *dev; int i, last_ret, last_fn; u_char buf[64]; int ioaddr; handle = link->handle; info = link->priv; dev = info->dev; DEBUG(1,"config...\n"); DEBUG(0, "com20020_config(0x%p)\n", link); tuple.Attributes = 0; tuple.TupleData = buf; tuple.TupleDataMax = 64; tuple.TupleOffset = 0; tuple.DesiredTuple = CISTPL_CONFIG; CS_CHECK(GetFirstTuple, handle, &tuple); CS_CHECK(GetTupleData, handle, &tuple); CS_CHECK(ParseTuple, handle, &tuple, &parse); link->conf.ConfigBase = parse.config.base; /* Configure card */ link->state |= DEV_CONFIG; strcpy(info->node.dev_name, dev->name); DEBUG(1,"arcnet: baseport1 is %Xh\n", link->io.BasePort1); i = !CS_SUCCESS; if (!link->io.BasePort1) { for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10) { link->io.BasePort1 = ioaddr; i = CardServices(RequestIO, link->handle, &link->io); if (i == CS_SUCCESS) break; } } else i = CardServices(RequestIO, link->handle, &link->io); if (i != CS_SUCCESS) { DEBUG(1,"arcnet: requestIO failed totally!\n"); goto failed; } ioaddr = dev->base_addr = link->io.BasePort1; DEBUG(1,"arcnet: got ioaddr %Xh\n", ioaddr); DEBUG(1,"arcnet: request IRQ %d (%Xh/%Xh)\n", link->irq.AssignedIRQ, link->irq.IRQInfo1, link->irq.IRQInfo2); i = CardServices(RequestIRQ, link->handle, &link->irq); if (i != CS_SUCCESS) { DEBUG(1,"arcnet: requestIRQ failed totally!\n"); goto failed; } dev->irq = link->irq.AssignedIRQ; CS_CHECK(RequestConfiguration, link->handle, &link->conf); if (com20020_check(dev)) { regdump(dev); goto failed; } MOD_INC_USE_COUNT; lp = dev->priv; lp->card_name = "PCMCIA COM20020"; lp->card_flags = ARC_CAN_10MBIT; /* pretend all of them can 10Mbit */ i = com20020_found(dev, 0); if (i != 0) { DEBUG(1,KERN_NOTICE "com20020_cs: com20020_found() failed\n"); goto failed; } info->dev_configured = 1; link->dev = &info->node; link->state &= ~DEV_CONFIG_PENDING; DEBUG(1,KERN_INFO "%s: port %#3lx, irq %d\n", dev->name, dev->base_addr, dev->irq); return; cs_failed: cs_error(link->handle, last_fn, last_ret); failed: DEBUG(1,"com20020_config failed...\n"); com20020_release((u_long)link); } /* com20020_config */
static int __init com20020isa_probe(struct net_device *dev) { int ioaddr; unsigned long airqmask; struct arcnet_local *lp = netdev_priv(dev); int err; BUGLVL(D_NORMAL) printk(VERSION); ioaddr = dev->base_addr; if (!ioaddr) { BUGMSG(D_NORMAL, "No autoprobe (yet) for IO mapped cards; you " "must specify the base address!\n"); return -ENODEV; } if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "arcnet (COM20020)")) { BUGMSG(D_NORMAL, "IO region %xh-%xh already allocated.\n", ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1); return -ENXIO; } if (ASTATUS() == 0xFF) { BUGMSG(D_NORMAL, "IO address %x empty\n", ioaddr); err = -ENODEV; goto out; } if (com20020_check(dev)) { err = -ENODEV; goto out; } if (!dev->irq) { BUGMSG(D_INIT_REASONS, "intmask was %02Xh\n", inb(_INTMASK)); outb(0, _INTMASK); airqmask = probe_irq_on(); outb(NORXflag, _INTMASK); udelay(1); outb(0, _INTMASK); dev->irq = probe_irq_off(airqmask); if ((int)dev->irq <= 0) { BUGMSG(D_INIT_REASONS, "Autoprobe IRQ failed first time\n"); airqmask = probe_irq_on(); outb(NORXflag, _INTMASK); udelay(5); outb(0, _INTMASK); dev->irq = probe_irq_off(airqmask); if ((int)dev->irq <= 0) { BUGMSG(D_NORMAL, "Autoprobe IRQ failed.\n"); err = -ENODEV; goto out; } } } lp->card_name = "ISA COM20020"; if ((err = com20020_found(dev, 0)) != 0) goto out; return 0; out: release_region(ioaddr, ARCNET_TOTAL_SIZE); return err; }