unsigned long flags;
for(i=0;i<NUM_CARDS;i++) {
- if(check_region(ioaddr, cards[i].total_size))
+ if(!request_region(ioaddr, cards[i].total_size, cards[i].cardname))
continue;
if(cards[i].id_offset >= 0) {
if(inb(ioaddr+cards[i].id_offset+0) != cards[i].id0 ||
inb(ioaddr+cards[i].id_offset+1) != cards[i].id1) {
+ release_region(ioaddr, cards[i].total_size);
continue;
}
}
if(cards[i].vendor_id) {
for(j=0;j<3;j++)
- if(inb(ioaddr+cards[i].addr_offset+j) != cards[i].vendor_id[j])
+ if(inb(ioaddr+cards[i].addr_offset+j) != cards[i].vendor_id[j]) {
+ release_region(ioaddr, cards[i].total_size);
continue;
+ }
}
break;
}
for(j=0;j<6;j++)
dev->dev_addr[j] = inb(ioaddr+cards[i].addr_offset+j);
- if( (j=ni65_alloc_buffer(dev)) < 0)
+ if( (j=ni65_alloc_buffer(dev)) < 0) {
+ release_region(ioaddr, cards[i].total_size);
return j;
+ }
p = (struct priv *) dev->priv;
p->cmdr_addr = ioaddr + cards[i].cmd_offset;
p->cardno = i;
if( (j=readreg(CSR0)) != 0x4) {
printk(KERN_ERR "can't RESET card: %04x\n",j);
ni65_free_buffer(p);
+ release_region(ioaddr, cards[p->cardno].total_size);
return -EAGAIN;
}
if(i == 5) {
printk("Can't detect DMA channel!\n");
ni65_free_buffer(p);
+ release_region(ioaddr, cards[p->cardno].total_size);
return -EAGAIN;
}
dev->dma = dmatab[i];
{
printk("Failed to detect IRQ line!\n");
ni65_free_buffer(p);
+ release_region(ioaddr, cards[p->cardno].total_size);
return -EAGAIN;
}
printk("IRQ %d (autodetected).\n",dev->irq);
{
printk("%s: Can't request dma-channel %d\n",dev->name,(int) dev->dma);
ni65_free_buffer(p);
+ release_region(ioaddr, cards[p->cardno].total_size);
return -EAGAIN;
}
- /*
- * Grab the region so we can find another board.
- */
- request_region(ioaddr,cards[p->cardno].total_size,cards[p->cardno].cardname);
-
dev->base_addr = ioaddr;
dev->open = ni65_open;