lkml.org 
[lkml]   [2004]   [Feb]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subjecttms380tr patch 1/3 (bug fix)
Hi Jeff,

this fixes some problems partly introduced in the latest token ring
update:
- mix of alloc_trdev(0) and alloc_trdev(sizeof(struct net_local)) confused
memory management.
- initialization of proteon and sknet cards was broken.
- proteon_close() and skisa_close() deleted.

--jochen

abyss.c | 2 -
madgemc.c | 2 -
proteon.c | 91 ++++++++++++++++++++++++-------------------------------
skisa.c | 100 +++++++++++++++++++++++++------------------------------------
tms380tr.c | 41 +++++++++----------------
tmspci.c | 2 -
6 files changed, 100 insertions(+), 138 deletions(-)


diff -u -p -r1.17 tms380tr.c
--- drivers/net/tokenring/tms380tr.c 7 Feb 2004 03:16:12 -0000 1.17
+++ drivers/net/tokenring/tms380tr.c 8 Feb 2004 22:24:43 -0000
@@ -246,6 +246,7 @@ int tms380tr_open(struct net_device *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. */

@@ -266,7 +267,6 @@ int tms380tr_open(struct net_device *dev
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;
@@ -2342,37 +2342,26 @@ void tmsdev_term(struct net_device *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 */
diff -u -p -r1.8 proteon.c
--- drivers/net/tokenring/proteon.c 5 Feb 2004 21:07:47 -0000 1.8
+++ drivers/net/tokenring/proteon.c 8 Feb 2004 10:31:36 -0000
@@ -65,7 +65,6 @@ static char cardname[] = "Proteon 1392\0

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);

@@ -117,21 +116,15 @@ nodev:
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 */
@@ -178,7 +171,7 @@ struct net_device * __init proteon_probe
tp->tmspriv = NULL;

dev->open = proteon_open;
- dev->stop = proteon_close;
+ dev->stop = tms380tr_close;

if (dev->irq == 0)
{
@@ -257,7 +250,7 @@ struct net_device * __init proteon_probe
if (err)
goto out;

- return dev;
+ return 0;
out:
free_dma(dev->dma);
out2:
@@ -266,6 +259,29 @@ out3:
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);
}
@@ -333,14 +349,7 @@ static int proteon_open(struct net_devic
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
@@ -359,45 +368,25 @@ MODULE_PARM(dma, "1-" __MODULE_STRING(IS

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);
}
}

diff -u -p -r1.7 skisa.c
--- drivers/net/tokenring/skisa.c 5 Feb 2004 21:07:47 -0000 1.7
+++ drivers/net/tokenring/skisa.c 8 Feb 2004 10:31:23 -0000
@@ -69,8 +69,8 @@ static int dmalist[] __initdata = {

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);

@@ -133,21 +133,15 @@ static int __init sk_isa_probe1(struct n
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 */
@@ -194,7 +188,7 @@ struct net_device * __init sk_isa_probe(
tp->tmspriv = NULL;

dev->open = sk_isa_open;
- dev->stop = sk_isa_close;
+ dev->stop = tms380tr_close;

if (dev->irq == 0)
{
@@ -273,7 +267,7 @@ struct net_device * __init sk_isa_probe(
if (err)
goto out;

- return dev;
+ return 0;
out:
free_dma(dev->dma);
out2:
@@ -282,6 +276,28 @@ out3:
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);
}
@@ -342,22 +358,13 @@ static int sk_isa_open(struct net_device
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];
@@ -368,51 +375,28 @@ MODULE_PARM(io, "1-" __MODULE_STRING(ISA
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);
}
}

diff -u -p -r1.17 tmspci.c
--- drivers/net/tokenring/tmspci.c 5 Feb 2004 21:07:47 -0000 1.17
+++ drivers/net/tokenring/tmspci.c 25 Jan 2004 18:40:51 -0000
@@ -112,7 +112,7 @@ static int __devinit tms_pci_attach(stru
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);
diff -u -p -r1.14 abyss.c
--- drivers/net/tokenring/abyss.c 5 Feb 2004 21:07:47 -0000 1.14
+++ drivers/net/tokenring/abyss.c 8 Feb 2004 22:31:38 -0000
@@ -112,7 +112,7 @@ static int __devinit abyss_attach(struct

/* At this point we have found a valid card. */

- dev = alloc_trdev(0);
+ dev = alloc_trdev(sizeof(struct net_local));
if (!dev)
return -ENOMEM;

diff -u -p -r1.19 madgemc.c
--- drivers/net/tokenring/madgemc.c 5 Feb 2004 21:07:47 -0000 1.19
+++ drivers/net/tokenring/madgemc.c 8 Feb 2004 22:32:01 -0000
@@ -177,7 +177,7 @@ static int __init madgemc_probe(void)
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)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 14:00    [W:0.069 / U:0.456 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site