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 device *pdev) { struct net_local *tp; static int versionprinted; const unsigned *port; int j,err = 0; if (!dev) return -ENOMEM; if (dev->base_addr) err = proteon_probe1(dev, dev->base_addr); else { for (port = portlist; *port; port++) { err = proteon_probe1(dev, *port); if (!err) break; } } if (err) goto out5; 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; proteon_read_eeprom(dev); printk(KERN_DEBUG "proteon.c: Ring Station Address: %pM\n", dev->dev_addr); 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->netdev_ops = &proteon_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, cardname, dev)) break; } if(irqlist[j] == 0) { printk(KERN_INFO "proteon.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 "proteon.c: Illegal IRQ %d specified\n", dev->irq); goto out3; } if (request_irq(dev->irq, tms380tr_interrupt, 0, cardname, dev)) { printk(KERN_INFO "proteon.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, cardname)) break; } if(dmalist[j] == 0) { printk(KERN_INFO "proteon.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 "proteon.c: Illegal DMA %d specified\n", dev->dma); goto out2; } if (request_dma(dev->dma, cardname)) { printk(KERN_INFO "proteon.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, PROTEON_IO_EXTENT); out5: return err; }
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; }