netdev
[Top] [All Lists]

[PATCH] fix arcnet module refcounting

To: netdev@xxxxxxxxxxx
Subject: [PATCH] fix arcnet module refcounting
From: Christoph Hellwig <hch@xxxxxx>
Date: Sun, 13 Jul 2003 14:57:48 +0200
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mutt/1.3.28i
struct arnet_local needs a struct module *owner, that also cleans
up nicely lots of the code.


--- 1.6/drivers/net/arcnet/arc-rimi.c   Sat Jun 28 08:20:41 2003
+++ edited/drivers/net/arcnet/arc-rimi.c        Thu Jul 10 16:28:29 2003
@@ -47,7 +47,6 @@
 static int arcrimi_status(struct net_device *dev);
 static void arcrimi_setmask(struct net_device *dev, int mask);
 static int arcrimi_reset(struct net_device *dev, int really_reset);
-static void arcrimi_openclose(struct net_device *dev, bool open);
 static void arcrimi_copy_to_card(struct net_device *dev, int bufnum, int 
offset,
                                 void *buf, int count);
 static void arcrimi_copy_from_card(struct net_device *dev, int bufnum, int 
offset,
@@ -179,7 +178,7 @@
        lp->hw.status = arcrimi_status;
        lp->hw.intmask = arcrimi_setmask;
        lp->hw.reset = arcrimi_reset;
-       lp->hw.open_close = arcrimi_openclose;
+       lp->hw.owner = THIS_MODULE;
        lp->hw.copy_to_card = arcrimi_copy_to_card;
        lp->hw.copy_from_card = arcrimi_copy_from_card;
        lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 
1);
@@ -252,15 +251,6 @@
 
        /* done!  return success. */
        return 0;
-}
-
-
-static void arcrimi_openclose(struct net_device *dev, int open)
-{
-       if (open)
-               MOD_INC_USE_COUNT;
-       else
-               MOD_DEC_USE_COUNT;
 }
 
 static void arcrimi_setmask(struct net_device *dev, int mask)
--- 1.14/drivers/net/arcnet/arcnet.c    Sun Jun 15 01:16:09 2003
+++ edited/drivers/net/arcnet/arcnet.c  Thu Jul 10 16:53:24 2003
@@ -343,7 +343,10 @@
 static int arcnet_open(struct net_device *dev)
 {
        struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
-       int count, newmtu;
+       int count, newmtu, error;
+
+       if (!try_module_get(lp->hw.owner))
+               return -ENODEV;
 
        BUGLVL(D_PROTO) {
                int count;
@@ -360,8 +363,9 @@
        /* try to put the card in a defined state - if it fails the first
         * time, actually reset it.
         */
+       error = -ENODEV;
        if (ARCRESET(0) && ARCRESET(1))
-               return -ENODEV;
+               goto out_module_put;
 
        newmtu = choose_mtu();
        if (newmtu < dev->mtu)
@@ -391,7 +395,7 @@
        lp->rfc1201.sequence = 1;
 
        /* bring up the hardware driver */
-       ARCOPEN(1);
+       lp->hw.open(dev);
 
        if (dev->dev_addr[0] == 0)
                BUGMSG(D_NORMAL, "WARNING!  Station address 00 is reserved "
@@ -415,6 +419,10 @@
        netif_start_queue(dev);
 
        return 0;
+
+ out_module_put:
+       module_put(lp->hw.owner);
+       return error;
 }
 
 
@@ -432,8 +440,8 @@
        mdelay(1);
 
        /* shut down the card */
-       ARCOPEN(0);
-
+       lp->hw.close(dev);
+       module_put(lp->hw.owner);
        return 0;
 }
 
--- 1.5/drivers/net/arcnet/com20020-isa.c       Thu May 22 10:08:06 2003
+++ edited/drivers/net/arcnet/com20020-isa.c    Thu Jul 10 16:30:53 2003
@@ -131,14 +131,6 @@
 MODULE_PARM(clockm, "i");
 MODULE_LICENSE("GPL");
 
-static void com20020isa_open_close(struct net_device *dev, bool open)
-{
-       if (open)
-               MOD_INC_USE_COUNT;
-       else
-               MOD_DEC_USE_COUNT;
-}
-
 int init_module(void)
 {
        struct net_device *dev;
@@ -160,7 +152,7 @@
        lp->clockp = clockp & 7;
        lp->clockm = clockm & 3;
        lp->timeout = timeout & 3;
-       lp->hw.open_close_ll = com20020isa_open_close;
+       lp->owner = THIS_MODULE;
 
        dev->base_addr = io;
        dev->irq = irq;
--- 1.13/drivers/net/arcnet/com20020-pci.c      Thu May 22 10:08:06 2003
+++ edited/drivers/net/arcnet/com20020-pci.c    Thu Jul 10 16:54:28 2003
@@ -60,14 +60,6 @@
 MODULE_PARM(clockm, "i");
 MODULE_LICENSE("GPL");
 
-static void com20020pci_open_close(struct net_device *dev, bool open)
-{
-       if (open)
-               MOD_INC_USE_COUNT;
-       else
-               MOD_DEC_USE_COUNT;
-}
-
 static int __devinit com20020pci_probe(struct pci_dev *pdev, const struct 
pci_device_id *id)
 {
        struct net_device *dev;
@@ -111,7 +103,7 @@
        lp->clockp = clockp & 7;
        lp->clockm = clockm & 3;
        lp->timeout = timeout;
-       lp->hw.open_close_ll = com20020pci_open_close;
+       lp->hw.owner = THIS_MODULE;
 
        if (check_region(ioaddr, ARCNET_TOTAL_SIZE)) {
                BUGMSG(D_INIT, "IO region %xh-%xh already allocated.\n",
--- 1.5/drivers/net/arcnet/com20020.c   Sat Feb 15 00:22:10 2003
+++ edited/drivers/net/arcnet/com20020.c        Thu Jul 10 16:33:36 2003
@@ -50,13 +50,12 @@
 static int com20020_status(struct net_device *dev);
 static void com20020_setmask(struct net_device *dev, int mask);
 static int com20020_reset(struct net_device *dev, int really_reset);
-static void com20020_openclose(struct net_device *dev, bool open);
 static void com20020_copy_to_card(struct net_device *dev, int bufnum,
                                  int offset, void *buf, int count);
 static void com20020_copy_from_card(struct net_device *dev, int bufnum,
                                    int offset, void *buf, int count);
 static void com20020_set_mc_list(struct net_device *dev);
-
+static void com20020_close(struct net_device *, bool);
 
 static void com20020_copy_from_card(struct net_device *dev, int bufnum,
                                    int offset, void *buf, int count)
@@ -162,13 +161,14 @@
 
        lp = (struct arcnet_local *) dev->priv;
 
+       lp->hw.owner = THIS_MODULE;
        lp->hw.command = com20020_command;
        lp->hw.status = com20020_status;
        lp->hw.intmask = com20020_setmask;
        lp->hw.reset = com20020_reset;
-       lp->hw.open_close = com20020_openclose;
        lp->hw.copy_to_card = com20020_copy_to_card;
        lp->hw.copy_from_card = com20020_copy_from_card;
+       lp->hw.close = com20020_close;
 
        dev->set_multicast_list = com20020_set_mc_list;
 
@@ -298,24 +298,17 @@
        return ASTATUS();
 }
 
-
-static void com20020_openclose(struct net_device *dev, bool open)
+static void com20020_close(struct net_device *dev, bool open)
 {
        struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
        int ioaddr = dev->base_addr;
 
-       if (open) {
-               MOD_INC_USE_COUNT;
-       }
-       else {
+       if (!open) {
                /* disable transmitter */
                lp->config &= ~TXENcfg;
                SETCONF;
-               MOD_DEC_USE_COUNT;
        }
-       lp->hw.open_close_ll(dev, open);
 }
-
 
 /* Set or clear the multicast filter for this adaptor.
  * num_addrs == -1    Promiscuous mode, receive all packets
--- 1.7/drivers/net/arcnet/com90io.c    Thu May 22 10:08:06 2003
+++ edited/drivers/net/arcnet/com90io.c Thu Jul 10 16:28:29 2003
@@ -47,7 +47,6 @@
 static int com90io_status(struct net_device *dev);
 static void com90io_setmask(struct net_device *dev, int mask);
 static int com90io_reset(struct net_device *dev, int really_reset);
-static void com90io_openclose(struct net_device *dev, bool open);
 static void com90io_copy_to_card(struct net_device *dev, int bufnum, int 
offset,
                                 void *buf, int count);
 static void com90io_copy_from_card(struct net_device *dev, int bufnum, int 
offset,
@@ -257,7 +256,7 @@
        lp->hw.status = com90io_status;
        lp->hw.intmask = com90io_setmask;
        lp->hw.reset = com90io_reset;
-       lp->hw.open_close = com90io_openclose;
+       lp->hw.owner = THIS_MODULE;
        lp->hw.copy_to_card = com90io_copy_to_card;
        lp->hw.copy_from_card = com90io_copy_from_card;
 
@@ -342,14 +341,6 @@
        short ioaddr = dev->base_addr;
 
        AINTMASK(mask);
-}
-
-static void com90io_openclose(struct net_device *dev, int open)
-{
-       if (open)
-               MOD_INC_USE_COUNT;
-       else
-               MOD_DEC_USE_COUNT;
 }
 
 static void com90io_copy_to_card(struct net_device *dev, int bufnum, int 
offset,
--- 1.7/drivers/net/arcnet/com90xx.c    Thu May 22 10:08:06 2003
+++ edited/drivers/net/arcnet/com90xx.c Thu Jul 10 16:28:29 2003
@@ -58,7 +58,6 @@
 static int com90xx_status(struct net_device *dev);
 static void com90xx_setmask(struct net_device *dev, int mask);
 static int com90xx_reset(struct net_device *dev, int really_reset);
-static void com90xx_openclose(struct net_device *dev, bool open);
 static void com90xx_copy_to_card(struct net_device *dev, int bufnum, int 
offset,
                                 void *buf, int count);
 static void com90xx_copy_from_card(struct net_device *dev, int bufnum, int 
offset,
@@ -450,7 +449,7 @@
        lp->hw.status = com90xx_status;
        lp->hw.intmask = com90xx_setmask;
        lp->hw.reset = com90xx_reset;
-       lp->hw.open_close = com90xx_openclose;
+       lp->hw.owner = THIS_MODULE;
        lp->hw.copy_to_card = com90xx_copy_to_card;
        lp->hw.copy_from_card = com90xx_copy_from_card;
        lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 
1);
@@ -569,16 +568,6 @@
        /* done!  return success. */
        return 0;
 }
-
-
-static void com90xx_openclose(struct net_device *dev, bool open)
-{
-       if (open)
-               MOD_INC_USE_COUNT;
-       else
-               MOD_DEC_USE_COUNT;
-}
-
 
 static void com90xx_copy_to_card(struct net_device *dev, int bufnum, int 
offset,
                                 void *buf, int count)
--- 1.4/include/linux/arcdevice.h       Sun Jun 15 01:16:09 2003
+++ edited/include/linux/arcdevice.h    Thu Jul 10 16:48:24 2003
@@ -291,12 +291,13 @@
 
        /* hardware-specific functions */
        struct {
+               struct module *owner;
                void (*command) (struct net_device * dev, int cmd);
                int (*status) (struct net_device * dev);
                void (*intmask) (struct net_device * dev, int mask);
                bool (*reset) (struct net_device * dev, bool really_reset);
-               void (*open_close) (struct net_device * dev, bool open);
-               void (*open_close_ll) (struct net_device * dev, bool open);
+               void (*open) (struct net_device * dev);
+               void (*close) (struct net_device * dev);
 
                void (*copy_to_card) (struct net_device * dev, int bufnum, int 
offset,
                                      void *buf, int count);
@@ -312,7 +313,6 @@
 #define ACOMMAND(x)  (lp->hw.command(dev, (x)))
 #define ASTATUS()    (lp->hw.status(dev))
 #define AINTMASK(x)  (lp->hw.intmask(dev, (x)))
-#define ARCOPEN(x)   (lp->hw.open_close(dev, (x)))
 
 
 

<Prev in Thread] Current Thread [Next in Thread>