All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 405] Amiga Hydra Ethernet new driver model
@ 2004-02-08 15:28 Geert Uytterhoeven
  2004-02-08 18:47 ` Adrian Bunk
  0 siblings, 1 reply; 5+ messages in thread
From: Geert Uytterhoeven @ 2004-02-08 15:28 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton, Jeff Garzik
  Cc: Linux Kernel Development, Geert Uytterhoeven

Hydra Ethernet: Convert to the new driver model

--- linux-2.6.3-rc1/drivers/net/hydra.c	2004-02-08 10:19:34.000000000 +0100
+++ linux-m68k-2.6.3-rc1/drivers/net/hydra.c	2004-02-08 11:47:55.000000000 +0100
@@ -44,10 +44,10 @@
 
 #define WORDSWAP(a)     ((((a)>>8)&0xff) | ((a)<<8))
 
-static struct net_device *root_hydra_dev;
 
-static int __init hydra_probe(void);
-static int __init hydra_init(unsigned long board);
+static int __devinit hydra_init_one(struct zorro_dev *z,
+				    const struct zorro_device_id *ent);
+static int __init hydra_init(struct zorro_dev *z);
 static int hydra_open(struct net_device *dev);
 static int hydra_close(struct net_device *dev);
 static void hydra_reset_8390(struct net_device *dev);
@@ -57,34 +57,38 @@
 			      struct sk_buff *skb, int ring_offset);
 static void hydra_block_output(struct net_device *dev, int count,
 			       const unsigned char *buf, int start_page);
-static void __exit hydra_cleanup(void);
+static void __devexit hydra_remove_one(struct zorro_dev *z);
 
-static int __init hydra_probe(void)
-{
-    struct zorro_dev *z = NULL;
-    unsigned long board;
-    int err = -ENODEV;
-
-    while ((z = zorro_find_device(ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET, z))) {
-	board = z->resource.start;
-	if (!request_mem_region(board, 0x10000, "Hydra"))
-	    continue;
-	if ((err = hydra_init(ZTWO_VADDR(board)))) {
-	    release_mem_region(board, 0x10000);
-	    return err;
-	}
-	err = 0;
-    }
+static struct zorro_device_id hydra_zorro_tbl[] = {
+    { ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET },
+    { 0 }
+};
+
+static struct zorro_driver hydra_driver = {
+    .name	= "hydra",
+    .id_table	= hydra_zorro_tbl,
+    .probe	= hydra_init_one,
+    .remove	= __devexit_p(hydra_remove_one),
+};
 
-    if (err == -ENODEV)
-	printk("No Hydra ethernet card found.\n");
+static int __devinit hydra_init_one(struct zorro_dev *z,
+				    const struct zorro_device_id *ent)
+{
+    int err;
 
-    return err;
+    if (!request_mem_region(z->resource.start, 0x10000, "Hydra"))
+	return -EBUSY;
+    if ((err = hydra_init(z))) {
+	release_mem_region(z->resource.start, 0x10000);
+	return -EBUSY;
+    }
+    return 0;
 }
 
-static int __init hydra_init(unsigned long board)
+static int __init hydra_init(struct zorro_dev *z)
 {
     struct net_device *dev;
+    unsigned long board = ZTWO_VADDR(z->resource.start);
     unsigned long ioaddr = board+HYDRA_NIC_BASE;
     const char name[] = "NE2000";
     int start_page, stop_page;
@@ -128,7 +132,7 @@
 	return -ENOMEM;
     }
 
-    printk("%s: hydra at 0x%08lx, address %02x:%02x:%02x:%02x:%02x:%02x (hydra.c " HYDRA_VERSION ")\n", dev->name, ZTWO_PADDR(board),
+    printk("%s: hydra at 0x%08lx, address %02x:%02x:%02x:%02x:%02x:%02x (hydra.c " HYDRA_VERSION ")\n", dev->name, z->resource.start,
 	dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
 	dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
 
@@ -147,19 +151,18 @@
     ei_status.reg_offset = hydra_offsets;
     dev->open = &hydra_open;
     dev->stop = &hydra_close;
-#ifdef MODULE
-    ei_status.priv = (unsigned long)root_hydra_dev;
-    root_hydra_dev = dev;
-#endif
     NS8390_init(dev, 0);
+
     err = register_netdev(dev);
-    if (!err)
-	return 0;
+    if (err) {
+	free_irq(IRQ_AMIGA_PORTS, dev);
+	kfree(dev->priv);
+	free_netdev(dev);
+	return err;
+    }
 
-    free_irq(IRQ_AMIGA_PORTS, dev);
-    kfree(dev->priv);
-    free_netdev(dev);
-    return err;
+    zorro_set_drvdata(z, dev);
+    return 0;
 }
 
 static int hydra_open(struct net_device *dev)
@@ -230,20 +233,27 @@
     z_memcpy_toio(mem_base+((start_page - NESM_START_PG)<<8), buf, count);
 }
 
-static void __exit hydra_cleanup(void)
+static void __devexit hydra_remove_one(struct zorro_dev *z)
 {
-    struct net_device *dev, *next;
+    struct net_device *dev = zorro_get_drvdata(z);
 
-    while ((dev = root_hydra_dev)) {
-	next = (struct net_device *)(ei_status.priv);
-	unregister_netdev(dev);
-	free_irq(IRQ_AMIGA_PORTS, dev);
-	release_mem_region(ZTWO_PADDR(dev->base_addr)-HYDRA_NIC_BASE, 0x10000);
-	free_netdev(dev);
-	root_hydra_dev = next;
-    }
+    unregister_netdev(dev);
+    free_irq(IRQ_AMIGA_PORTS, dev);
+    release_mem_region(ZTWO_PADDR(dev->base_addr)-HYDRA_NIC_BASE, 0x10000);
+    free_netdev(dev);
+}
+
+static int __init hydra_init_module(void)
+{
+    return zorro_module_init(&hydra_driver);
+}
+
+static void __exit hydra_cleanup_module(void)
+{
+    zorro_unregister_driver(&hydra_driver);
 }
 
-module_init(hydra_probe);
-module_exit(hydra_cleanup);
+module_init(hydra_init_module);
+module_exit(hydra_cleanup_module);
+
 MODULE_LICENSE("GPL");

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 405] Amiga Hydra Ethernet new driver model
  2004-02-08 15:28 [PATCH 405] Amiga Hydra Ethernet new driver model Geert Uytterhoeven
@ 2004-02-08 18:47 ` Adrian Bunk
  2004-02-08 19:06   ` Geert Uytterhoeven
  0 siblings, 1 reply; 5+ messages in thread
From: Adrian Bunk @ 2004-02-08 18:47 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Linus Torvalds, Andrew Morton, Jeff Garzik,
	Linux Kernel Development

On Sun, Feb 08, 2004 at 04:28:29PM +0100, Geert Uytterhoeven wrote:
> Hydra Ethernet: Convert to the new driver model
> 
> --- linux-2.6.3-rc1/drivers/net/hydra.c	2004-02-08 10:19:34.000000000 +0100
> +++ linux-m68k-2.6.3-rc1/drivers/net/hydra.c	2004-02-08 11:47:55.000000000 +0100
>...
> -static int __init hydra_init(unsigned long board);
> +static int __devinit hydra_init_one(struct zorro_dev *z,
> +				    const struct zorro_device_id *ent);
> +static int __init hydra_init(struct zorro_dev *z);
>...
> +static int __devinit hydra_init_one(struct zorro_dev *z,
> +				    const struct zorro_device_id *ent)
> +{
> +    int err;
>  
> -    return err;
> +    if (!request_mem_region(z->resource.start, 0x10000, "Hydra"))
> +	return -EBUSY;
> +    if ((err = hydra_init(z))) {
> +	release_mem_region(z->resource.start, 0x10000);
> +	return -EBUSY;
> +    }
> +    return 0;
>  }
>...

__init hydra_init called from __devinit hydra_init_one ?

This will break when compiling the driver statically into a kernel with
CONFIG_HOTPLUG=y .


> Gr{oetje,eeting}s,
> 
> 						Geert

cu
Adrian

-- 

       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 405] Amiga Hydra Ethernet new driver model
  2004-02-08 18:47 ` Adrian Bunk
@ 2004-02-08 19:06   ` Geert Uytterhoeven
  2004-02-08 19:34     ` Jeff Garzik
  0 siblings, 1 reply; 5+ messages in thread
From: Geert Uytterhoeven @ 2004-02-08 19:06 UTC (permalink / raw)
  To: Adrian Bunk
  Cc: Linus Torvalds, Andrew Morton, Jeff Garzik,
	Linux Kernel Development

On Sun, 8 Feb 2004, Adrian Bunk wrote:
> On Sun, Feb 08, 2004 at 04:28:29PM +0100, Geert Uytterhoeven wrote:
> > Hydra Ethernet: Convert to the new driver model
> >
> > --- linux-2.6.3-rc1/drivers/net/hydra.c	2004-02-08 10:19:34.000000000 +0100
> > +++ linux-m68k-2.6.3-rc1/drivers/net/hydra.c	2004-02-08 11:47:55.000000000 +0100
> >...
> > -static int __init hydra_init(unsigned long board);
> > +static int __devinit hydra_init_one(struct zorro_dev *z,
> > +				    const struct zorro_device_id *ent);
> > +static int __init hydra_init(struct zorro_dev *z);
> >...
> > +static int __devinit hydra_init_one(struct zorro_dev *z,
> > +				    const struct zorro_device_id *ent)
> > +{
> > +    int err;
> >
> > -    return err;
> > +    if (!request_mem_region(z->resource.start, 0x10000, "Hydra"))
> > +	return -EBUSY;
> > +    if ((err = hydra_init(z))) {
> > +	release_mem_region(z->resource.start, 0x10000);
> > +	return -EBUSY;
> > +    }
> > +    return 0;
> >  }
> >...
>
> __init hydra_init called from __devinit hydra_init_one ?
>
> This will break when compiling the driver statically into a kernel with
> CONFIG_HOTPLUG=y .

Thanks, you're right!

I checked the other drivers, and zorro8390.c has the same problem with
zorro8390_init(). I'll fix them and will resend after 2.6.3.

BTW, while verifying the rules w.r.t. the various __*it markers, I stumbled
across this in Documentation/pci.txt (while it's not really PCI-related):

| Tips:
|         The module_init()/module_exit() functions (and all initialization
|         functions called only from these) should be marked __init/exit.
|         The struct pci_driver shouldn't be marked with any of these tags.
|         The ID table array should be marked __devinitdata.
|         The probe() and remove() functions (and all initialization
|         functions called only from these) should be marked __devinit/exit.
|         If you are sure the driver is not a hotplug driver then use only
|         __init/exit __initdata/exitdata.
|
|         Pointers to functions marked as __devexit must be created using
|         __devexit_p(function_name).  That will generate the function
|         name or NULL if the __devexit function will be discarded.

But a quick look shows that very few drivers seem to mark their ID table array
__devinitdata...

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 405] Amiga Hydra Ethernet new driver model
  2004-02-08 19:06   ` Geert Uytterhoeven
@ 2004-02-08 19:34     ` Jeff Garzik
  0 siblings, 0 replies; 5+ messages in thread
From: Jeff Garzik @ 2004-02-08 19:34 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Adrian Bunk, Linus Torvalds, Andrew Morton,
	Linux Kernel Development, Greg KH

Geert Uytterhoeven wrote:
> But a quick look shows that very few drivers seem to mark their ID table array
> __devinitdata...


Yes, this highlights a recent problem with CONFIG_HOTPLUG.  These 
markers were removed when the "add PCI ids to your table dynamically" 
patch was added in 2.5.x.  The patch didn't require CONFIG_HOTPLUG, and 
fun ensued.  This got fixed (IIRC), but also many drivers had their 
__devinitdata markers removed.  This is a fuzzy area where Greg loves to 
make the case for removing  CONFIG_HOTPLUG completely :)

	Jeff




^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 405] Amiga Hydra Ethernet new driver model
@ 2004-02-20 12:46 Geert Uytterhoeven
  0 siblings, 0 replies; 5+ messages in thread
From: Geert Uytterhoeven @ 2004-02-20 12:46 UTC (permalink / raw)
  To: Linus Torvalds, Andrew Morton, Jeff Garzik
  Cc: Linux Kernel Development, Geert Uytterhoeven

Hydra Ethernet: Convert to the new driver model

--- linux-2.6.3/drivers/net/hydra.c	2004-02-08 10:19:34.000000000 +0100
+++ linux-m68k-2.6.3/drivers/net/hydra.c	2004-02-08 11:47:55.000000000 +0100
@@ -44,10 +44,10 @@
 
 #define WORDSWAP(a)     ((((a)>>8)&0xff) | ((a)<<8))
 
-static struct net_device *root_hydra_dev;
 
-static int __init hydra_probe(void);
-static int __init hydra_init(unsigned long board);
+static int __devinit hydra_init_one(struct zorro_dev *z,
+				    const struct zorro_device_id *ent);
+static int __devinit hydra_init(struct zorro_dev *z);
 static int hydra_open(struct net_device *dev);
 static int hydra_close(struct net_device *dev);
 static void hydra_reset_8390(struct net_device *dev);
@@ -57,34 +57,38 @@
 			      struct sk_buff *skb, int ring_offset);
 static void hydra_block_output(struct net_device *dev, int count,
 			       const unsigned char *buf, int start_page);
-static void __exit hydra_cleanup(void);
+static void __devexit hydra_remove_one(struct zorro_dev *z);
 
-static int __init hydra_probe(void)
-{
-    struct zorro_dev *z = NULL;
-    unsigned long board;
-    int err = -ENODEV;
-
-    while ((z = zorro_find_device(ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET, z))) {
-	board = z->resource.start;
-	if (!request_mem_region(board, 0x10000, "Hydra"))
-	    continue;
-	if ((err = hydra_init(ZTWO_VADDR(board)))) {
-	    release_mem_region(board, 0x10000);
-	    return err;
-	}
-	err = 0;
-    }
+static struct zorro_device_id hydra_zorro_tbl[] __devinitdata = {
+    { ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET },
+    { 0 }
+};
+
+static struct zorro_driver hydra_driver = {
+    .name	= "hydra",
+    .id_table	= hydra_zorro_tbl,
+    .probe	= hydra_init_one,
+    .remove	= __devexit_p(hydra_remove_one),
+};
 
-    if (err == -ENODEV)
-	printk("No Hydra ethernet card found.\n");
+static int __devinit hydra_init_one(struct zorro_dev *z,
+				    const struct zorro_device_id *ent)
+{
+    int err;
 
-    return err;
+    if (!request_mem_region(z->resource.start, 0x10000, "Hydra"))
+	return -EBUSY;
+    if ((err = hydra_init(z))) {
+	release_mem_region(z->resource.start, 0x10000);
+	return -EBUSY;
+    }
+    return 0;
 }
 
-static int __init hydra_init(unsigned long board)
+static int __devinit hydra_init(struct zorro_dev *z)
 {
     struct net_device *dev;
+    unsigned long board = ZTWO_VADDR(z->resource.start);
     unsigned long ioaddr = board+HYDRA_NIC_BASE;
     const char name[] = "NE2000";
     int start_page, stop_page;
@@ -119,7 +123,7 @@
 	return -EAGAIN;
     }
 
-    printk("%s: hydra at 0x%08lx, address %02x:%02x:%02x:%02x:%02x:%02x (hydra.c " HYDRA_VERSION ")\n", dev->name, ZTWO_PADDR(board),
+    printk("%s: hydra at 0x%08lx, address %02x:%02x:%02x:%02x:%02x:%02x (hydra.c " HYDRA_VERSION ")\n", dev->name, z->resource.start,
 	dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
 	dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
 
@@ -138,18 +142,17 @@
     ei_status.reg_offset = hydra_offsets;
     dev->open = &hydra_open;
     dev->stop = &hydra_close;
-#ifdef MODULE
-    ei_status.priv = (unsigned long)root_hydra_dev;
-    root_hydra_dev = dev;
-#endif
     NS8390_init(dev, 0);
+
     err = register_netdev(dev);
-    if (!err)
-	return 0;
+    if (err) {
+	free_irq(IRQ_AMIGA_PORTS, dev);
+	free_netdev(dev);
+	return err;
+    }
 
-    free_irq(IRQ_AMIGA_PORTS, dev);
-    free_netdev(dev);
-    return err;
+    zorro_set_drvdata(z, dev);
+    return 0;
 }
 
 static int hydra_open(struct net_device *dev)
@@ -220,20 +223,27 @@
     z_memcpy_toio(mem_base+((start_page - NESM_START_PG)<<8), buf, count);
 }
 
-static void __exit hydra_cleanup(void)
+static void __devexit hydra_remove_one(struct zorro_dev *z)
 {
-    struct net_device *dev, *next;
+    struct net_device *dev = zorro_get_drvdata(z);
 
-    while ((dev = root_hydra_dev)) {
-	next = (struct net_device *)(ei_status.priv);
-	unregister_netdev(dev);
-	free_irq(IRQ_AMIGA_PORTS, dev);
-	release_mem_region(ZTWO_PADDR(dev->base_addr)-HYDRA_NIC_BASE, 0x10000);
-	free_netdev(dev);
-	root_hydra_dev = next;
-    }
+    unregister_netdev(dev);
+    free_irq(IRQ_AMIGA_PORTS, dev);
+    release_mem_region(ZTWO_PADDR(dev->base_addr)-HYDRA_NIC_BASE, 0x10000);
+    free_netdev(dev);
+}
+
+static int __init hydra_init_module(void)
+{
+    return zorro_module_init(&hydra_driver);
+}
+
+static void __exit hydra_cleanup_module(void)
+{
+    zorro_unregister_driver(&hydra_driver);
 }
 
-module_init(hydra_probe);
-module_exit(hydra_cleanup);
+module_init(hydra_init_module);
+module_exit(hydra_cleanup_module);
+
 MODULE_LICENSE("GPL");

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2004-02-20 12:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-02-08 15:28 [PATCH 405] Amiga Hydra Ethernet new driver model Geert Uytterhoeven
2004-02-08 18:47 ` Adrian Bunk
2004-02-08 19:06   ` Geert Uytterhoeven
2004-02-08 19:34     ` Jeff Garzik
  -- strict thread matches above, loose matches on Subject: below --
2004-02-20 12:46 Geert Uytterhoeven

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.