fix up hostess driver

Started by Stephen Hemminger on Sep 16, 2003

DORMANTno replies

open the first message on its own page

Cleanup several problems that kept this driver from building  in 2.6.0-test5:
	- wrong include file.
	- use alloc_netdev and dev->priv
	- order of ppp_device and dev->priv is required for sppp_of
	- handle non-module initialization properly.

Tested by #ifdef'ing out all the naughty bits that talk to hardware
and doing load/unload.

diff -Nru a/drivers/net/wan/hostess_sv11.c b/drivers/net/wan/hostess_sv11.c
--- a/drivers/net/wan/hostess_sv11.c	Tue Sep 16 16:49:42 2003
+++ b/drivers/net/wan/hostess_sv11.c	Tue Sep 16 16:49:42 2003
@@ -33,15 +33,14 @@
 #include <asm/dma.h>
 #include <asm/byteorder.h>
 #include <net/syncppp.h>
-#include "z85229.h"
+#include "z85230.h"
 
 static int dma;
 
 struct sv11_device
 {
-	void *if_ptr;	/* General purpose pointer (used by SPPP) */
+	struct ppp_device netdev;	/* must be first for spp_of()*/
 	struct z8530_dev sync;
-	struct ppp_device netdev;
 };
 
 /*
@@ -55,17 +54,21 @@
  
 static void hostess_input(struct z8530_channel *c, struct sk_buff *skb)
 {
+	struct sv11_device *sv11 
+		= container_of(c->dev, struct sv11_device, sync);
+	struct net_device *dev = sv11->netdev.dev;
+
 	/* Drop the CRC - it's not a good idea to try and negotiate it ;) */
 	skb_trim(skb, skb->len-2);
 	skb->protocol=__constant_htons(ETH_P_WAN_PPP);
 	skb->mac.raw=skb->data;
-	skb->dev=c->netdevice;
+	skb->dev=dev;
 	/*
 	 *	Send it to the PPP layer. We don't have time to process
 	 *	it right now.
 	 */
 	netif_rx(skb);
-	c->netdevice->last_rx = jiffies;
+	dev->last_rx = jiffies;
 }
  
 /*
@@ -122,7 +125,6 @@
 	 */
 
 	netif_start_queue(d);
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -154,7 +156,6 @@
 			z8530_sync_txdma_close(d, &sv11->sync.chanA);
 			break;
 	}
-	MOD_DEC_USE_COUNT;
 	return 0;
 }
 
@@ -206,33 +207,40 @@
 /*
  *	Description block for a Comtrol Hostess SV11 card
  */
+static __init void sv11_setup(struct net_device *d)
+{
+	d->open = hostess_open;
+	d->stop = hostess_close;
+	d->hard_start_xmit = hostess_queue_xmit;
+	d->get_stats = hostess_get_stats;
+	d->set_multicast_list = NULL;
+	d->do_ioctl = hostess_ioctl;
+	d->neigh_setup = hostess_neigh_setup_dev;
+	d->set_mac_address = NULL;
+}
  
-static struct sv11_device *sv11_init(int iobase, int irq)
+static __init struct sv11_device *sv11_init(int iobase, int irq)
 {
 	struct z8530_dev *dev;
 	struct sv11_device *sv;
+	struct net_device *d;
 	
 	/*
 	 *	Get the needed I/O space
 	 */
-	 
 	if(!request_region(iobase, 8, "Comtrol SV11"))
 	{	
 		printk(KERN_WARNING "hostess: I/O 0x%X already in use.\n", iobase);
 		return NULL;
 	}
 	
-	sv=(struct sv11_device *)kmalloc(sizeof(struct sv11_device), GFP_KERNEL);
-	if(!sv)
+	d = alloc_netdev(sizeof(struct sv11_device),
+			 "hdlc%d", sv11_setup);
+	if (!d)
 		goto fail3;
-			
-	memset(sv, 0, sizeof(*sv));
-	sv->if_ptr=&sv->netdev;
-	
-	sv->netdev.dev=(struct net_device *)kmalloc(sizeof(struct net_device), GFP_KERNEL);
-	if(!sv->netdev.dev)
-		goto fail2;
 
+	sv = d->priv;
+	sv->netdev.dev=d;
 	dev=&sv->sync;
 	
 	/*
@@ -310,44 +318,29 @@
 	/*
 	 *	Now we can take the IRQ
 	 */
-	if(dev_alloc_name(dev->chanA.netdevice,"hdlc%d")>=0)
-	{
-		struct net_device *d=dev->chanA.netdevice;
 
-		/* 
-		 *	Initialise the PPP components
-		 */
-		sppp_attach(&sv->netdev);
-		
-		/*
-		 *	Local fields
-		 */	
+	/* 
+	 *	Initialise the PPP components
+	 */
+	sppp_attach(&sv->netdev);
 		
-		d->base_addr = iobase;
-		d->irq = irq;
-		d->priv = sv;
-		d->init = NULL;
+	/*
+	 *	Local fields
+	 */	
 		
-		d->open = hostess_open;
-		d->stop = hostess_close;
-		d->hard_start_xmit = hostess_queue_xmit;
-		d->get_stats = hostess_get_stats;
-		d->set_multicast_list = NULL;
-		d->do_ioctl = hostess_ioctl;
-		d->neigh_setup = hostess_neigh_setup_dev;
-		d->set_mac_address = NULL;
+	d->base_addr = iobase;
+	d->irq = irq;
 		
-		if(register_netdev(d)==-1)
-		{
-			printk(KERN_ERR "%s: unable to register device.\n",
-				d->name);
-			goto fail;
-		}				
+	if(register_netdev(d)) {
+		printk(KERN_ERR "%s: unable to register device.\n",
+		       d->name);
+		goto fail;
+	}				
+
+	z8530_describe(dev, "I/O", iobase);
+	dev->active=1;
+	return sv;	
 
-		z8530_describe(dev, "I/O", iobase);
-		dev->active=1;
-		return sv;	
-	}
 dmafail2:
 	if(dma==1)
 		free_dma(dev->chanA.rxdma);
@@ -356,31 +349,31 @@
 		free_dma(dev->chanA.txdma);
 fail:
 	free_irq(irq, dev);
-fail1:
-	kfree(sv->netdev.dev);
-fail2:
-	kfree(sv);
+
+	kfree(d);
 fail3:
 	release_region(iobase,8);
+fail1:
 	return NULL;
 }
 
-static void sv11_shutdown(struct sv11_device *dev)
+static void __exit sv11_shutdown(struct sv11_device *sv)
 {
-	sppp_detach(dev->netdev.dev);
-	z8530_shutdown(&dev->sync);
-	unregister_netdev(dev->netdev.dev);
-	free_irq(dev->sync.irq, dev);
-	if(dma)
-	{
+	struct net_device *d = sv->netdev.dev;
+	struct z8530_dev *dev = &sv->sync;
+
+	sppp_detach(d);
+	z8530_shutdown(dev);
+	unregister_netdev(d);
+	free_irq(sv->sync.irq, dev);
+	if(dma) {
 		if(dma==1)
-			free_dma(dev->sync.chanA.rxdma);
-		free_dma(dev->sync.chanA.txdma);
+			free_dma(sv->sync.chanA.rxdma);
+		free_dma(sv->sync.chanA.txdma);
 	}
-	release_region(dev->sync.chanA.ctrlio-1, 8);
+	release_region(sv->sync.chanA.ctrlio-1, 8);
 }
 
-#ifdef MODULE
 
 static int io=0x200;
 static int irq=9;
@@ -398,20 +391,22 @@
 
 static struct sv11_device *sv11_unit;
 
-int init_module(void)
+static int __init hostess_init_module(void)
 {
+#ifdef MODULE
 	printk(KERN_INFO "SV-11 Z85230 Synchronous Driver v 0.03.\n");
 	printk(KERN_INFO "(c) Copyright 2001, Red Hat Inc.\n");	
-	if((sv11_unit=sv11_init(io,irq))==NULL)
-		return -ENODEV;
-	return 0;
+#endif
+	sv11_unit =sv11_init(io,irq);
+	return sv11_unit ? 0 : -ENODEV;
 }
 
-void cleanup_module(void)
+static void __exit hostess_cleanup_module(void)
 {
 	if(sv11_unit)
 		sv11_shutdown(sv11_unit);
 }
 
-#endif
+module_init(hostess_init_module);
+module_exit(hostess_cleanup_module);
 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help