static int __devinit tms_pci_attach(struct pci_dev *pdev, const struct pci_device_id *ent) { static int versionprinted; struct net_device *dev; struct net_local *tp; int ret; unsigned int pci_irq_line; unsigned long pci_ioaddr; struct card_info *cardinfo = &card_info_table[ent->driver_data]; if (versionprinted++ == 0) printk("%s", version); if (pci_enable_device(pdev)) return -EIO; /* Remove I/O space marker in bit 0. */ pci_irq_line = pdev->irq; pci_ioaddr = pci_resource_start (pdev, 0); /* At this point we have found a valid card. */ dev = alloc_trdev(sizeof(struct net_local)); if (!dev) return -ENOMEM; if (!request_region(pci_ioaddr, TMS_PCI_IO_EXTENT, dev->name)) { ret = -EBUSY; goto err_out_trdev; } dev->base_addr = pci_ioaddr; dev->irq = pci_irq_line; dev->dma = 0; printk("%s: %s\n", dev->name, cardinfo->name); printk("%s: IO: %#4lx IRQ: %d\n", dev->name, dev->base_addr, dev->irq); tms_pci_read_eeprom(dev); printk("%s: Ring Station Address: %pM\n", dev->name, dev->dev_addr); ret = tmsdev_init(dev, &pdev->dev); if (ret) { printk("%s: unable to get memory for dev->priv.\n", dev->name); goto err_out_region; } tp = netdev_priv(dev); tp->setnselout = tms_pci_setnselout_pins; tp->sifreadb = tms_pci_sifreadb; tp->sifreadw = tms_pci_sifreadw; tp->sifwriteb = tms_pci_sifwriteb; tp->sifwritew = tms_pci_sifwritew; memcpy(tp->ProductID, cardinfo->name, PROD_ID_SIZE + 1); tp->tmspriv = cardinfo; dev->netdev_ops = &tms380tr_netdev_ops; ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED, dev->name, dev); if (ret) goto err_out_tmsdev; pci_set_drvdata(pdev, dev); SET_NETDEV_DEV(dev, &pdev->dev); ret = register_netdev(dev); if (ret) goto err_out_irq; return 0; err_out_irq: free_irq(pdev->irq, dev); err_out_tmsdev: pci_set_drvdata(pdev, NULL); tmsdev_term(dev); err_out_region: release_region(pci_ioaddr, TMS_PCI_IO_EXTENT); err_out_trdev: free_netdev(dev); return ret; }
static int __init setup_card(struct net_device *dev, struct device *pdev) { struct net_local *tp; static int versionprinted; const unsigned *port; int j, err = 0; if (!dev) return -ENOMEM; if (dev->base_addr) /* probe specific location */ err = sk_isa_probe1(dev, dev->base_addr); else { for (port = portlist; *port; port++) { err = sk_isa_probe1(dev, *port); if (!err) break; } } if (err) goto out5; /* At this point we have found a valid card. */ if (versionprinted++ == 0) printk(KERN_DEBUG "%s", version); err = -EIO; pdev->dma_mask = &dma_mask; if (tmsdev_init(dev, pdev)) goto out4; dev->base_addr &= ~3; sk_isa_read_eeprom(dev); printk(KERN_DEBUG "skisa.c: Ring Station Address: %pM\n", dev->dev_addr); tp = netdev_priv(dev); tp->setnselout = sk_isa_setnselout_pins; tp->sifreadb = sk_isa_sifreadb; tp->sifreadw = sk_isa_sifreadw; tp->sifwriteb = sk_isa_sifwriteb; tp->sifwritew = sk_isa_sifwritew; memcpy(tp->ProductID, isa_cardname, PROD_ID_SIZE + 1); tp->tmspriv = NULL; dev->netdev_ops = &sk_isa_netdev_ops; if (dev->irq == 0) { for(j = 0; irqlist[j] != 0; j++) { dev->irq = irqlist[j]; if (!request_irq(dev->irq, tms380tr_interrupt, 0, isa_cardname, dev)) break; } if(irqlist[j] == 0) { printk(KERN_INFO "skisa.c: AutoSelect no IRQ available\n"); goto out3; } } else { for(j = 0; irqlist[j] != 0; j++) if (irqlist[j] == dev->irq) break; if (irqlist[j] == 0) { printk(KERN_INFO "skisa.c: Illegal IRQ %d specified\n", dev->irq); goto out3; } if (request_irq(dev->irq, tms380tr_interrupt, 0, isa_cardname, dev)) { printk(KERN_INFO "skisa.c: Selected IRQ %d not available\n", dev->irq); goto out3; } } if (dev->dma == 0) { for(j = 0; dmalist[j] != 0; j++) { dev->dma = dmalist[j]; if (!request_dma(dev->dma, isa_cardname)) break; } if(dmalist[j] == 0) { printk(KERN_INFO "skisa.c: AutoSelect no DMA available\n"); goto out2; } } else { for(j = 0; dmalist[j] != 0; j++) if (dmalist[j] == dev->dma) break; if (dmalist[j] == 0) { printk(KERN_INFO "skisa.c: Illegal DMA %d specified\n", dev->dma); goto out2; } if (request_dma(dev->dma, isa_cardname)) { printk(KERN_INFO "skisa.c: Selected DMA %d not available\n", dev->dma); goto out2; } } err = register_netdev(dev); if (err) goto out; printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n", dev->name, dev->base_addr, dev->irq, dev->dma); return 0; out: free_dma(dev->dma); out2: free_irq(dev->irq, dev); out3: tmsdev_term(dev); out4: release_region(dev->base_addr, SK_ISA_IO_EXTENT); out5: return err; }
static int __devinit abyss_attach(struct pci_dev *pdev, const struct pci_device_id *ent) { static int versionprinted; struct net_device *dev; struct net_local *tp; int ret, pci_irq_line; unsigned long pci_ioaddr; if (versionprinted++ == 0) printk("%s", version); if (pci_enable_device(pdev)) return -EIO; pci_irq_line = pdev->irq; pci_ioaddr = pci_resource_start (pdev, 0); dev = alloc_trdev(sizeof(struct net_local)); if (!dev) return -ENOMEM; if (!request_region(pci_ioaddr, ABYSS_IO_EXTENT, dev->name)) { ret = -EBUSY; goto err_out_trdev; } ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED, dev->name, dev); if (ret) goto err_out_region; dev->base_addr = pci_ioaddr; dev->irq = pci_irq_line; printk("%s: Madge Smart 16/4 PCI Mk2 (Abyss)\n", dev->name); printk("%s: IO: %#4lx IRQ: %d\n", dev->name, pci_ioaddr, dev->irq); dev->base_addr += 0x10; ret = tmsdev_init(dev, &pdev->dev); if (ret) { printk("%s: unable to get memory for dev->priv.\n", dev->name); goto err_out_irq; } abyss_read_eeprom(dev); printk("%s: Ring Station Address: %pM\n", dev->name, dev->dev_addr); tp = netdev_priv(dev); tp->setnselout = abyss_setnselout_pins; tp->sifreadb = abyss_sifreadb; tp->sifreadw = abyss_sifreadw; tp->sifwriteb = abyss_sifwriteb; tp->sifwritew = abyss_sifwritew; memcpy(tp->ProductID, "Madge PCI 16/4 Mk2", PROD_ID_SIZE + 1); dev->netdev_ops = &abyss_netdev_ops; pci_set_drvdata(pdev, dev); SET_NETDEV_DEV(dev, &pdev->dev); ret = register_netdev(dev); if (ret) goto err_out_tmsdev; return 0; err_out_tmsdev: pci_set_drvdata(pdev, NULL); tmsdev_term(dev); err_out_irq: free_irq(pdev->irq, dev); err_out_region: release_region(pci_ioaddr, ABYSS_IO_EXTENT); err_out_trdev: free_netdev(dev); return ret; }
static int __init abyss_attach(struct pci_dev *pdev, const struct pci_device_id *ent) { static int versionprinted; struct net_device *dev; struct net_local *tp; int i, ret, pci_irq_line; unsigned long pci_ioaddr; if (versionprinted++ == 0) printk("%s", version); if (pci_enable_device(pdev)) return -EIO; /* Remove I/O space marker in bit 0. */ pci_irq_line = pdev->irq; pci_ioaddr = pci_resource_start (pdev, 0); /* At this point we have found a valid card. */ dev = init_trdev(NULL, 0); if (!dev) return -ENOMEM; SET_MODULE_OWNER(dev); if (!request_region(pci_ioaddr, ABYSS_IO_EXTENT, dev->name)) { ret = -EBUSY; goto err_out_trdev; } ret = request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ, dev->name, dev); if (ret) goto err_out_region; dev->base_addr = pci_ioaddr; dev->irq = pci_irq_line; printk("%s: Madge Smart 16/4 PCI Mk2 (Abyss)\n", dev->name); printk("%s: IO: %#4lx IRQ: %d\n", dev->name, pci_ioaddr, dev->irq); /* * The TMS SIF registers lay 0x10 above the card base address. */ dev->base_addr += 0x10; ret = tmsdev_init(dev, PCI_MAX_ADDRESS, pdev); if (ret) { printk("%s: unable to get memory for dev->priv.\n", dev->name); goto err_out_irq; } abyss_read_eeprom(dev); printk("%s: Ring Station Address: ", dev->name); printk("%2.2x", dev->dev_addr[0]); for (i = 1; i < 6; i++) printk(":%2.2x", dev->dev_addr[i]); printk("\n"); tp = dev->priv; tp->setnselout = abyss_setnselout_pins; tp->sifreadb = abyss_sifreadb; tp->sifreadw = abyss_sifreadw; tp->sifwriteb = abyss_sifwriteb; tp->sifwritew = abyss_sifwritew; memcpy(tp->ProductID, "Madge PCI 16/4 Mk2", PROD_ID_SIZE + 1); dev->open = abyss_open; dev->stop = abyss_close; ret = register_trdev(dev); if (ret) goto err_out_tmsdev; pci_set_drvdata(pdev, dev); return 0; err_out_tmsdev: tmsdev_term(dev); err_out_irq: free_irq(pdev->irq, dev); err_out_region: release_region(pci_ioaddr, ABYSS_IO_EXTENT); err_out_trdev: unregister_netdev(dev); kfree(dev); return ret; }
int __init proteon_probe(struct net_device *dev) { static int versionprinted; struct net_local *tp; int i,j; struct proteon_card *card; #ifndef MODULE netdev_boot_setup_check(dev); tr_setup(dev); #endif SET_MODULE_OWNER(dev); if (!dev->base_addr) { for(i = 0; portlist[i]; i++) { if (!request_region(portlist[i], PROTEON_IO_EXTENT, cardname)) continue; if(proteon_probe1(portlist[i])) { release_region(dev->base_addr, PROTEON_IO_EXTENT); continue; } dev->base_addr = portlist[i]; break; } if(!dev->base_addr) return -1; } else { if (!request_region(dev->base_addr, PROTEON_IO_EXTENT, cardname)) return -1; if(proteon_probe1(dev->base_addr)) { release_region(dev->base_addr, PROTEON_IO_EXTENT); return -1; } } /* At this point we have found a valid card. */ if (versionprinted++ == 0) printk(KERN_DEBUG "%s", version); if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL)) goto out4; dev->base_addr &= ~3; proteon_read_eeprom(dev); printk(KERN_DEBUG "%s: Ring Station Address: ", dev->name); printk("%2.2x", dev->dev_addr[0]); for (j = 1; j < 6; j++) printk(":%2.2x", dev->dev_addr[j]); printk("\n"); tp = (struct net_local *)dev->priv; tp->setnselout = proteon_setnselout_pins; tp->sifreadb = proteon_sifreadb; tp->sifreadw = proteon_sifreadw; tp->sifwriteb = proteon_sifwriteb; tp->sifwritew = proteon_sifwritew; memcpy(tp->ProductID, cardname, PROD_ID_SIZE + 1); tp->tmspriv = NULL; dev->open = proteon_open; dev->stop = proteon_close; if (dev->irq == 0) { for(j = 0; irqlist[j] != 0; j++) { dev->irq = irqlist[j]; if (!request_irq(dev->irq, tms380tr_interrupt, 0, cardname, dev)) break; } if(irqlist[j] == 0) { printk(KERN_INFO "%s: AutoSelect no IRQ available\n", dev->name); goto out3; } } else { for(j = 0; irqlist[j] != 0; j++) if (irqlist[j] == dev->irq) break; if (irqlist[j] == 0) { printk(KERN_INFO "%s: Illegal IRQ %d specified\n", dev->name, dev->irq); goto out3; } if (request_irq(dev->irq, tms380tr_interrupt, 0, cardname, dev)) { printk(KERN_INFO "%s: Selected IRQ %d not available\n", dev->name, dev->irq); goto out3; } } if (dev->dma == 0) { for(j = 0; dmalist[j] != 0; j++) { dev->dma = dmalist[j]; if (!request_dma(dev->dma, cardname)) break; } if(dmalist[j] == 0) { printk(KERN_INFO "%s: AutoSelect no DMA available\n", dev->name); goto out2; } } else { for(j = 0; dmalist[j] != 0; j++) if (dmalist[j] == dev->dma) break; if (dmalist[j] == 0) { printk(KERN_INFO "%s: Illegal DMA %d specified\n", dev->name, dev->dma); goto out2; } if (request_dma(dev->dma, cardname)) { printk(KERN_INFO "%s: Selected DMA %d not available\n", dev->name, dev->dma); goto out2; } } printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n", dev->name, dev->base_addr, dev->irq, dev->dma); /* Enlist in the card list */ card = kmalloc(sizeof(struct proteon_card), GFP_KERNEL); if (!card) goto out; card->next = proteon_card_list; proteon_card_list = card; card->dev = dev; return 0; out: free_dma(dev->dma); out2: free_irq(dev->irq, dev); out3: tmsdev_term(dev); out4: release_region(dev->base_addr, PROTEON_IO_EXTENT); return -1; }
static int __init setup_card(struct net_device *dev) { struct net_local *tp; static int versionprinted; const unsigned *port; int j,err = 0; if (!dev) return -ENOMEM; SET_MODULE_OWNER(dev); if (dev->base_addr) /* probe specific location */ err = proteon_probe1(dev, dev->base_addr); else { for (port = portlist; *port; port++) { err = proteon_probe1(dev, *port); if (!err) break; } } if (err) goto out4; /* At this point we have found a valid card. */ if (versionprinted++ == 0) printk(KERN_DEBUG "%s", version); err = -EIO; if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL)) goto out4; dev->base_addr &= ~3; proteon_read_eeprom(dev); printk(KERN_DEBUG "%s: Ring Station Address: ", dev->name); printk("%2.2x", dev->dev_addr[0]); for (j = 1; j < 6; j++) printk(":%2.2x", dev->dev_addr[j]); printk("\n"); tp = netdev_priv(dev); tp->setnselout = proteon_setnselout_pins; tp->sifreadb = proteon_sifreadb; tp->sifreadw = proteon_sifreadw; tp->sifwriteb = proteon_sifwriteb; tp->sifwritew = proteon_sifwritew; memcpy(tp->ProductID, cardname, PROD_ID_SIZE + 1); tp->tmspriv = NULL; dev->open = proteon_open; dev->stop = tms380tr_close; if (dev->irq == 0) { for(j = 0; irqlist[j] != 0; j++) { dev->irq = irqlist[j]; if (!request_irq(dev->irq, tms380tr_interrupt, 0, cardname, dev)) break; } if(irqlist[j] == 0) { printk(KERN_INFO "%s: AutoSelect no IRQ available\n", dev->name); goto out3; } } else { for(j = 0; irqlist[j] != 0; j++) if (irqlist[j] == dev->irq) break; if (irqlist[j] == 0) { printk(KERN_INFO "%s: Illegal IRQ %d specified\n", dev->name, dev->irq); goto out3; } if (request_irq(dev->irq, tms380tr_interrupt, 0, cardname, dev)) { printk(KERN_INFO "%s: Selected IRQ %d not available\n", dev->name, dev->irq); goto out3; } } if (dev->dma == 0) { for(j = 0; dmalist[j] != 0; j++) { dev->dma = dmalist[j]; if (!request_dma(dev->dma, cardname)) break; } if(dmalist[j] == 0) { printk(KERN_INFO "%s: AutoSelect no DMA available\n", dev->name); goto out2; } } else { for(j = 0; dmalist[j] != 0; j++) if (dmalist[j] == dev->dma) break; if (dmalist[j] == 0) { printk(KERN_INFO "%s: Illegal DMA %d specified\n", dev->name, dev->dma); goto out2; } if (request_dma(dev->dma, cardname)) { printk(KERN_INFO "%s: Selected DMA %d not available\n", dev->name, dev->dma); goto out2; } } printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n", dev->name, dev->base_addr, dev->irq, dev->dma); err = register_netdev(dev); if (err) goto out; return 0; out: free_dma(dev->dma); out2: free_irq(dev->irq, dev); out3: tmsdev_term(dev); out4: release_region(dev->base_addr, PROTEON_IO_EXTENT); return err; }