netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] sealevel -- syncppp startup fix
@ 2003-09-26 23:48 Stephen Hemminger
  2003-09-28  2:21 ` hamradio/baycom and "make allyesconfig" Jeff Garzik
  0 siblings, 1 reply; 4+ messages in thread
From: Stephen Hemminger @ 2003-09-26 23:48 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: netdev

The sealevel driver called sppp_attach before checking that board existed
and never called detach in the error path.

My change is to call sppp_attach from the netdev->init hook which happens
later in the process, and call detach from the uninit hook.

Also, changed the structure element 'netdev' to 'pppdev' to avoid confusion.

Here is the fix against 2.6.0-test5 latest

--- linux-2.5/drivers/net/wan/sealevel.c	2003-09-22 10:21:32.000000000 -0700
+++ linux-2.5-net/drivers/net/wan/sealevel.c	2003-09-26 16:47:02.163974888 -0700
@@ -32,7 +32,7 @@
 struct slvl_device
 {
 	struct z8530_channel *chan;
-	struct ppp_device netdev;
+	struct ppp_device pppdev;
 	int channel;
 };
 
@@ -199,11 +199,24 @@ static int sealevel_neigh_setup_dev(stru
 	return 0;
 }
 
+static int sealevel_attach(struct net_device *dev)
+{
+	struct slvl_device *sv = dev->priv;
+	sppp_attach(&sv->pppdev);
+	return 0;
+}
+
+static void sealevel_detach(struct net_device *dev)
+{
+	sppp_detach(dev);
+}
 		
 static void slvl_setup(struct net_device *d)
 {
 	d->open = sealevel_open;
 	d->stop = sealevel_close;
+	d->init = sealevel_attach;
+	d->uninit = sealevel_detach;
 	d->hard_start_xmit = sealevel_queue_xmit;
 	d->get_stats = sealevel_get_stats;
 	d->set_multicast_list = NULL;
@@ -225,11 +238,10 @@ static inline struct slvl_device *slvl_a
 		return NULL;
 
 	sv = d->priv;
-	sv->netdev.dev = d;
+	sv->pppdev.dev = d;
 	d->base_addr = iobase;
 	d->irq = irq;
 		
-	sppp_attach(&sv->netdev);
 	return sv;
 }
 
@@ -315,8 +327,8 @@ static __init struct slvl_board *slvl_in
 	dev->irq=irq;
 	dev->chanA.private=&b->dev[0];
 	dev->chanB.private=&b->dev[1];
-	dev->chanA.netdevice=b->dev[0]->netdev.dev;
-	dev->chanB.netdevice=b->dev[1]->netdev.dev;
+	dev->chanA.netdevice=b->dev[0]->pppdev.dev;
+	dev->chanB.netdevice=b->dev[1]->pppdev.dev;
 	dev->chanA.dev=dev;
 	dev->chanB.dev=dev;
 
@@ -357,10 +369,10 @@ static __init struct slvl_board *slvl_in
 	
 	enable_irq(irq);
 
-	if (register_netdev(b->dev[0]->netdev.dev)) 
+	if (register_netdev(b->dev[0]->pppdev.dev)) 
 		goto dmafail2;
 		
-	if (register_netdev(b->dev[1]->netdev.dev)) 
+	if (register_netdev(b->dev[1]->pppdev.dev)) 
 		goto fail_unit;
 
 	z8530_describe(dev, "I/O", iobase);
@@ -368,7 +380,7 @@ static __init struct slvl_board *slvl_in
 	return b;
 
 fail_unit:
-	unregister_netdev(b->dev[0]->netdev.dev);
+	unregister_netdev(b->dev[0]->pppdev.dev);
 	
 dmafail2:
 	free_dma(dev->chanA.rxdma);
@@ -377,9 +389,9 @@ dmafail:
 fail:
 	free_irq(irq, dev);
 fail1_1:
-	free_netdev(b->dev[1]->netdev.dev);
+	free_netdev(b->dev[1]->pppdev.dev);
 fail1_0:
-	free_netdev(b->dev[0]->netdev.dev);
+	free_netdev(b->dev[0]->pppdev.dev);
 fail2:
 	kfree(b);
 fail3:
@@ -395,9 +407,7 @@ static void __exit slvl_shutdown(struct 
 	
 	for(u=0; u<2; u++)
 	{
-		struct net_device *d = b->dev[u]->netdev.dev;
-		sppp_detach(d);
-
+		struct net_device *d = b->dev[u]->pppdev.dev;
 		unregister_netdev(d);
 		free_netdev(d);
 	}

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

* hamradio/baycom and "make allyesconfig"
  2003-09-26 23:48 [PATCH] sealevel -- syncppp startup fix Stephen Hemminger
@ 2003-09-28  2:21 ` Jeff Garzik
  2003-09-28  3:58   ` Stephen Hemminger
  0 siblings, 1 reply; 4+ messages in thread
From: Jeff Garzik @ 2003-09-28  2:21 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

Can you fix this up, in 2.6.0-test6?


>   CC      drivers/net/hamradio/bpqether.o
>   CC      drivers/net/hamradio/baycom_ser_fdx.o
> drivers/net/hamradio/baycom_ser_fdx.c: In function `init_baycomserfdx':
> drivers/net/hamradio/baycom_ser_fdx.c:641: warning: implicit declaration of function `hdlcdrv_register'
> drivers/net/hamradio/baycom_ser_fdx.c:643: warning: assignment makes pointer from integer without a cast
> drivers/net/hamradio/baycom_ser_fdx.c: In function `cleanup_baycomserfdx':
> drivers/net/hamradio/baycom_ser_fdx.c:667: warning: implicit declaration of function `hdlcdrv_unregister'
>   CC      drivers/net/hamradio/hdlcdrv.o
>   CC      drivers/net/hamradio/baycom_ser_hdx.o
> drivers/net/hamradio/baycom_ser_hdx.c: In function `init_baycomserhdx':
> drivers/net/hamradio/baycom_ser_hdx.c:678: warning: implicit declaration of function `hdlcdrv_register'
> drivers/net/hamradio/baycom_ser_hdx.c:680: warning: assignment makes pointer from integer without a cast
> drivers/net/hamradio/baycom_ser_hdx.c: In function `cleanup_baycomserhdx':
> drivers/net/hamradio/baycom_ser_hdx.c:704: warning: implicit declaration of function `hdlcdrv_unregister'
>   CC      drivers/net/hamradio/baycom_par.o
> drivers/net/hamradio/baycom_par.c: In function `init_baycompar':
> drivers/net/hamradio/baycom_par.c:518: warning: implicit declaration of function `hdlcdrv_register'
> drivers/net/hamradio/baycom_par.c:520: warning: assignment makes pointer from integer without a cast
> drivers/net/hamradio/baycom_par.c: In function `cleanup_baycompar':
> drivers/net/hamradio/baycom_par.c:544: warning: implicit declaration of function `hdlcdrv_unregister'

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

* Re: hamradio/baycom and "make allyesconfig"
  2003-09-28  2:21 ` hamradio/baycom and "make allyesconfig" Jeff Garzik
@ 2003-09-28  3:58   ` Stephen Hemminger
  2003-09-28 14:37     ` Jeff Garzik
  0 siblings, 1 reply; 4+ messages in thread
From: Stephen Hemminger @ 2003-09-28  3:58 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: netdev

Sorry, overlooked the corresponding .h file in that patch, here it is.

diff -Nru a/include/linux/hdlcdrv.h b/include/linux/hdlcdrv.h
--- a/include/linux/hdlcdrv.h	Sat Sep 27 20:57:18 2003
+++ b/include/linux/hdlcdrv.h	Sat Sep 27 20:57:18 2003
@@ -359,11 +359,11 @@
 void hdlcdrv_receiver(struct net_device *, struct hdlcdrv_state *);
 void hdlcdrv_transmitter(struct net_device *, struct hdlcdrv_state *);
 void hdlcdrv_arbitrate(struct net_device *, struct hdlcdrv_state *);
-int hdlcdrv_register_hdlcdrv(struct net_device *dev, const struct hdlcdrv_ops *ops,
-			     unsigned int privsize, char *ifname,
-			     unsigned int baseaddr, unsigned int irq, 
-			     unsigned int dma);
-int hdlcdrv_unregister_hdlcdrv(struct net_device *dev);
+struct net_device *hdlcdrv_register(const struct hdlcdrv_ops *ops,
+				    unsigned int privsize, const char *ifname,
+				    unsigned int baseaddr, unsigned int irq, 
+				    unsigned int dma);
+void hdlcdrv_unregister(struct net_device *dev);
 
 /* -------------------------------------------------------------------- */
 

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

* Re: hamradio/baycom and "make allyesconfig"
  2003-09-28  3:58   ` Stephen Hemminger
@ 2003-09-28 14:37     ` Jeff Garzik
  0 siblings, 0 replies; 4+ messages in thread
From: Jeff Garzik @ 2003-09-28 14:37 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

applied

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

end of thread, other threads:[~2003-09-28 14:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-09-26 23:48 [PATCH] sealevel -- syncppp startup fix Stephen Hemminger
2003-09-28  2:21 ` hamradio/baycom and "make allyesconfig" Jeff Garzik
2003-09-28  3:58   ` Stephen Hemminger
2003-09-28 14:37     ` Jeff Garzik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).