/* At this point we have found a valid card. */
- dev = alloc_trdev(0);
+ dev = alloc_trdev(sizeof(struct net_local));
if (!dev)
return -ENOMEM;
if (versionprinted++ == 0)
printk("%s", version);
- dev = alloc_trdev(0);
+ dev = alloc_trdev(sizeof(struct net_local));
if (dev == NULL) {
printk("madgemc: unable to allocate dev space\n");
if (madgemc_card_list)
struct net_device *proteon_probe(int unit);
static int proteon_open(struct net_device *dev);
-static int proteon_close(struct net_device *dev);
static void proteon_read_eeprom(struct net_device *dev);
static unsigned short proteon_setnselout_pins(struct net_device *dev);
return -ENODEV;
}
-struct net_device * __init proteon_probe(int unit)
+static int __init setup_card(struct net_device *dev)
{
- struct net_device *dev = alloc_trdev(sizeof(struct net_local));
struct net_local *tp;
static int versionprinted;
const unsigned *port;
int j,err = 0;
if (!dev)
- return ERR_PTR(-ENOMEM);
-
- if (unit >= 0) {
- sprintf(dev->name, "tr%d", unit);
- netdev_boot_setup_check(dev);
- }
+ return -ENOMEM;
SET_MODULE_OWNER(dev);
if (dev->base_addr) /* probe specific location */
tp->tmspriv = NULL;
dev->open = proteon_open;
- dev->stop = proteon_close;
+ dev->stop = tms380tr_close;
if (dev->irq == 0)
{
if (err)
goto out;
- return dev;
+ return 0;
out:
free_dma(dev->dma);
out2:
tmsdev_term(dev);
out4:
release_region(dev->base_addr, PROTEON_IO_EXTENT);
+ return err;
+}
+
+struct net_device * __init proteon_probe(int unit)
+{
+ struct net_device *dev = alloc_trdev(sizeof(struct net_local));
+ int err = 0;
+
+ if (!dev)
+ return ERR_PTR(-ENOMEM);
+
+ if (unit >= 0) {
+ sprintf(dev->name, "tr%d", unit);
+ netdev_boot_setup_check(dev);
+ }
+
+ err = setup_card(dev);
+ if (err)
+ goto out;
+
+ return dev;
+
+out:
free_netdev(dev);
return ERR_PTR(err);
}
val |= i;
outb(val, dev->base_addr + 0x13);
- tms380tr_open(dev);
- return 0;
-}
-
-static int proteon_close(struct net_device *dev)
-{
- tms380tr_close(dev);
- return 0;
+ return tms380tr_open(dev);
}
#ifdef MODULE
static struct net_device *proteon_dev[ISATR_MAX_ADAPTERS];
-static struct net_device * __init setup_card(unsigned long io, unsigned irq, unsigned char dma)
-{
- struct net_device *dev = alloc_trdev(sizeof(struct net_local));
- int err;
-
- if (!dev)
- return ERR_PTR(-ENOMEM);
-
- dev->irq = irq;
- dev->dma = dma;
- err = proteon_probe1(dev, io);
- if (err)
- goto out;
-
- err = register_netdev(dev);
- if (err)
- goto out1;
- return dev;
- out1:
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
- free_irq(dev->irq, dev);
- free_dma(dev->dma);
- tmsdev_term(dev);
- out:
- free_netdev(dev);
- return ERR_PTR(err);
-}
-
int init_module(void)
{
struct net_device *dev;
- int i, num = 0;
+ int i, num = 0, err = 0;
for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
- dev = io[0] ? setup_card(io[i], irq[i], dma[i])
- : proteon_probe(-1);
- if (!IS_ERR(dev)) {
+ dev = alloc_trdev(sizeof(struct net_local));
+ if (!dev)
+ continue;
+
+ dev->base_addr = io[i];
+ dev->irq = irq[i];
+ dev->dma = dma[i];
+ err = setup_card(dev);
+ if (!err) {
proteon_dev[i] = dev;
++num;
+ } else {
+ free_netdev(dev);
}
}
static char isa_cardname[] = "SK NET TR 4/16 ISA\0";
+struct net_device *sk_isa_probe(int unit);
static int sk_isa_open(struct net_device *dev);
-static int sk_isa_close(struct net_device *dev);
static void sk_isa_read_eeprom(struct net_device *dev);
static unsigned short sk_isa_setnselout_pins(struct net_device *dev);
return 0;
}
-struct net_device * __init sk_isa_probe(int unit)
+static int __init setup_card(struct net_device *dev)
{
- struct net_device *dev = alloc_trdev(sizeof(struct net_local));
struct net_local *tp;
static int versionprinted;
const unsigned *port;
int j, err = 0;
if (!dev)
- return ERR_PTR(-ENOMEM);
-
- if (unit >= 0) {
- sprintf(dev->name, "tr%d", unit);
- netdev_boot_setup_check(dev);
- }
+ return -ENOMEM;
SET_MODULE_OWNER(dev);
if (dev->base_addr) /* probe specific location */
tp->tmspriv = NULL;
dev->open = sk_isa_open;
- dev->stop = sk_isa_close;
+ dev->stop = tms380tr_close;
if (dev->irq == 0)
{
if (err)
goto out;
- return dev;
+ return 0;
out:
free_dma(dev->dma);
out2:
tmsdev_term(dev);
out4:
release_region(dev->base_addr, SK_ISA_IO_EXTENT);
+ return err;
+}
+
+struct net_device * __init sk_isa_probe(int unit)
+{
+ struct net_device *dev = alloc_trdev(sizeof(struct net_local));
+ int err = 0;
+
+ if (!dev)
+ return ERR_PTR(-ENOMEM);
+
+ if (unit >= 0) {
+ sprintf(dev->name, "tr%d", unit);
+ netdev_boot_setup_check(dev);
+ }
+
+ err = setup_card(dev);
+ if (err)
+ goto out;
+
+ return dev;
+out:
free_netdev(dev);
return ERR_PTR(err);
}
val &= oldval;
sk_isa_sifwriteb(dev, val, POSREG);
- tms380tr_open(dev);
- return 0;
-}
-
-static int sk_isa_close(struct net_device *dev)
-{
- tms380tr_close(dev);
- return 0;
+ return tms380tr_open(dev);
}
#ifdef MODULE
#define ISATR_MAX_ADAPTERS 3
-static struct net_device *sk_isa_dev[ISATR_MAX_ADAPTERS];
-
static int io[ISATR_MAX_ADAPTERS];
static int irq[ISATR_MAX_ADAPTERS];
static int dma[ISATR_MAX_ADAPTERS];
MODULE_PARM(irq, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
MODULE_PARM(dma, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
-static struct net_device * __init setup_card(unsigned long io, unsigned irq, unsigned char dma)
-{
- struct net_device *dev = alloc_trdev(sizeof(struct net_local));
- int err;
-
- if (!dev)
- return ERR_PTR(-ENOMEM);
-
- dev->base_addr = io;
- dev->irq = irq;
- dev->dma = dma;
-
- err = sk_isa_probe1(dev, io);
- if (err)
- goto out;
-
- err = register_netdev(dev);
- if (err)
- goto out1;
- return dev;
-
- out1:
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
- free_irq(dev->irq, dev);
- free_dma(dev->dma);
- tmsdev_term(dev);
- out:
- free_netdev(dev);
- return ERR_PTR(err);
-}
+static struct net_device *sk_isa_dev[ISATR_MAX_ADAPTERS];
int init_module(void)
{
struct net_device *dev;
- int i, num;
+ int i, num = 0, err = 0;
- num = 0;
for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
- if (io[0]) /* Only probe addresses from command line */
- dev = setup_card(io[i], irq[i], dma[i]);
- else
- dev = sk_isa_probe(-1);
- if (!IS_ERR(dev)) {
+ dev = alloc_trdev(sizeof(struct net_local));
+ if (!dev)
+ continue;
+
+ dev->base_addr = io[i];
+ dev->irq = irq[i];
+ dev->dma = dma[i];
+ err = setup_card(dev);
+
+ if (!err) {
sk_isa_dev[i] = dev;
++num;
+ } else {
+ free_netdev(dev);
}
}
/* init the spinlock */
spin_lock_init(&tp->lock);
+ init_timer(&tp->timer);
/* Reset the hardware here. Don't forget to set the station address. */
return (-1);
}
- init_timer(&tp->timer);
tp->timer.expires = jiffies + 30*HZ;
tp->timer.function = tms380tr_timer_end_wait;
tp->timer.data = (unsigned long)dev;
tp = (struct net_local *) dev->priv;
pci_unmap_single(tp->pdev, tp->dmabuffer, sizeof(struct net_local),
PCI_DMA_BIDIRECTIONAL);
- kfree(dev->priv);
}
int tmsdev_init(struct net_device *dev, unsigned long dmalimit,
struct pci_dev *pdev)
{
- if (dev->priv == NULL)
+ struct net_local *tms_local;
+
+ memset(dev->priv, 0, sizeof(struct net_local));
+ tms_local = (struct net_local *)dev->priv;
+ init_waitqueue_head(&tms_local->wait_for_tok_int);
+ tms_local->dmalimit = dmalimit;
+ tms_local->pdev = pdev;
+ tms_local->dmabuffer = pci_map_single(pdev, (void *)tms_local,
+ sizeof(struct net_local), PCI_DMA_BIDIRECTIONAL);
+ if (tms_local->dmabuffer + sizeof(struct net_local) > dmalimit)
{
- struct net_local *tms_local;
-
- dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA);
- if (dev->priv == NULL)
- {
- printk(KERN_INFO "%s: Out of memory for DMA\n",
- dev->name);
- return -ENOMEM;
- }
- memset(dev->priv, 0, sizeof(struct net_local));
- tms_local = (struct net_local *)dev->priv;
- init_waitqueue_head(&tms_local->wait_for_tok_int);
- tms_local->dmalimit = dmalimit;
- tms_local->pdev = pdev;
- tms_local->dmabuffer = pci_map_single(pdev, (void *)tms_local,
- sizeof(struct net_local), PCI_DMA_BIDIRECTIONAL);
- if (tms_local->dmabuffer + sizeof(struct net_local) > dmalimit)
- {
- printk(KERN_INFO "%s: Memory not accessible for DMA\n",
- dev->name);
- tmsdev_term(dev);
- return -ENOMEM;
- }
+ printk(KERN_INFO "%s: Memory not accessible for DMA\n",
+ dev->name);
+ tmsdev_term(dev);
+ return -ENOMEM;
}
/* These can be overridden by the card driver if needed */
pci_ioaddr = pci_resource_start (pdev, 0);
/* At this point we have found a valid card. */
- dev = alloc_trdev(0);
+ dev = alloc_trdev(sizeof(struct net_local));
if (!dev)
return -ENOMEM;
SET_MODULE_OWNER(dev);