netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] sa1100ir - fix for 2.6
@ 2003-12-05 23:06 Stephen Hemminger
  2003-12-06  0:30 ` Jean Tourrilhes
  2003-12-06  8:38 ` Russell King
  0 siblings, 2 replies; 3+ messages in thread
From: Stephen Hemminger @ 2003-12-05 23:06 UTC (permalink / raw)
  To: Russell King, Jeff Garzik, Jean Tourrilhes, Alexander Viro
  Cc: netdev, irda-users

Update the ARM SA1100 irda driver to current 2.6 network device model
  * allocate network device with alloc_irdadev - get rid of dev_alloc
  * change to current system device class model - looks like it was using early
    old version of interface from 2.5
  * better error unwind

This has been cross compiled successfully against net-drivers-2.5-exp

diff -Nru a/drivers/net/irda/sa1100_ir.c b/drivers/net/irda/sa1100_ir.c
--- a/drivers/net/irda/sa1100_ir.c	Fri Dec  5 14:48:38 2003
+++ b/drivers/net/irda/sa1100_ir.c	Fri Dec  5 14:48:38 2003
@@ -30,6 +30,7 @@
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
+#include <linux/sysdev.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/wrapper.h>
@@ -56,6 +57,11 @@
 static int tx_lpm;
 static int max_rate = 4000000;
 
+/*
+ * Our netdevice.  There is only ever one of these.
+ */
+static struct net_device *netdev;
+
 struct sa1100_irda {
 	unsigned char		hscr0;
 	unsigned char		utcr4;
@@ -947,56 +953,77 @@
 	return io->head ? 0 : -ENOMEM;
 }
 
-static struct device_driver sa1100ir_driver = {
-	.name		= "sa1100ir",
-	.bus		= &system_bus_type,
+static struct sysdev_class sa1100ir_sysdev_class = {
+	set_kset_name("sa1100ir"),
 	.suspend	= sa1100_irda_suspend,
 	.resume		= sa1100_irda_resume,
 };
 
 static struct sys_device sa1100ir_device = {
-	.name		= "sa1100ir",
 	.id		= 0,
-	.root		= NULL,
-	.dev		= {
-		.name	= "Intel Corporation SA11x0 [IrDA]",
-		.bus_id	= "0",
-		.driver	= &sa1100ir_driver,
-	},
+	.cls		= &sa1100ir_sysdev_class,
 };
 
-static int sa1100_irda_net_init(struct net_device *dev)
+static int __init sa1100_irda_init(void)
 {
-	struct sa1100_irda *si = dev->priv;
+	struct net_device *dev;
+	struct sa1100_irda *si;
 	unsigned int baudrate_mask;
-	int err = -ENOMEM;
-
-	si = kmalloc(sizeof(struct sa1100_irda), GFP_KERNEL);
-	if (!si)
-		goto out;
-
-	memset(si, 0, sizeof(*si));
+	int err;
 
-	si->dev = &sa1100ir_device.dev;
+	/* Register as a system device with sysfs */
+	err = sysdev_class_register(&sa1100ir_sysdev_class);
+	if (err)
+		goto err_sys_1;
+	
+	err = sys_device_register(&sa1100ir_device);
+	if (err)
+		goto err_sys_2;
 
 	/*
-	 * Initialise the HP-SIR buffers
+	 * Limit power level a sensible range.
 	 */
-	err = sa1100_irda_init_iobuf(&si->rx_buff, 14384);
+	if (power_level < 1)
+		power_level = 1;
+	if (power_level > 3)
+		power_level = 3;
+
+	err = request_mem_region(__PREG(Ser2UTCR0), 0x24, "IrDA") ? 0 : -EBUSY;
 	if (err)
-		goto out;
-	err = sa1100_irda_init_iobuf(&si->tx_buff, 4000);
+		goto err_mem_1;
+	err = request_mem_region(__PREG(Ser2HSCR0), 0x1c, "IrDA") ? 0 : -EBUSY;
+	if (err)
+		goto err_mem_2;
+	err = request_mem_region(__PREG(Ser2HSCR2), 0x04, "IrDA") ? 0 : -EBUSY;
 	if (err)
-		goto out_free_rx;
+		goto err_mem_3;
+
+	err = -ENOMEM;
+	dev = alloc_irdadev(sizeof(struct sa1100_irda));
+	if (!dev) 
+		goto err_mem_4;
+
+	si = dev->priv;
+	dev->irq = IRQ_Ser2ICP;
 
-	dev->priv = si;
 	dev->hard_start_xmit	= sa1100_irda_hard_xmit;
 	dev->open		= sa1100_irda_start;
 	dev->stop		= sa1100_irda_stop;
 	dev->do_ioctl		= sa1100_irda_ioctl;
 	dev->get_stats		= sa1100_irda_stats;
 
-	irda_device_setup(dev);
+	SET_MODULE_OWNER(dev);
+
+	/*
+	 * Initialise the HP-SIR buffers
+	 */
+	err = sa1100_irda_init_iobuf(&si->rx_buff, 14384);
+	if (err)
+		goto err_buf_1;
+	err = sa1100_irda_init_iobuf(&si->tx_buff, 4000);
+	if (err)
+		goto err_buf_2;
+
 	irda_init_max_qos_capabilies(&si->qos);
 
 	/*
@@ -1030,110 +1057,55 @@
 	Ser2UTCR4 = si->utcr4;
 	Ser2HSCR0 = HSCR0_UART;
 
+	err = register_netdev(dev);
+	if (err)
+		goto err_registration;
+
+	netdev = dev;
+	
 	return 0;
 
+err_registration:
 	kfree(si->tx_buff.head);
-out_free_rx:
+err_buf_2:
 	kfree(si->rx_buff.head);
-out:
-	kfree(si);
-
-	return err;
-}
+err_buf_1:
+	free_netdev(dev);
+err_mem_4:
 
-/*
- * Remove all traces of this driver module from the kernel, so we can't be
- * called.  Note that the device has already been stopped, so we don't have
- * to worry about interrupts or dma.
- */
-static void sa1100_irda_net_uninit(struct net_device *dev)
-{
-	struct sa1100_irda *si = dev->priv;
-
-	dev->hard_start_xmit	= NULL;
-	dev->open		= NULL;
-	dev->stop		= NULL;
-	dev->do_ioctl		= NULL;
-	dev->get_stats		= NULL;
-	dev->priv		= NULL;
-
-	kfree(si->tx_buff.head);
-	kfree(si->rx_buff.head);
-	kfree(si);
-}
-
-static int __init sa1100_irda_init(void)
-{
-	struct net_device *dev;
-	int err;
-
-	/*
-	 * Limit power level a sensible range.
-	 */
-	if (power_level < 1)
-		power_level = 1;
-	if (power_level > 3)
-		power_level = 3;
-
-	err = request_mem_region(__PREG(Ser2UTCR0), 0x24, "IrDA") ? 0 : -EBUSY;
-	if (err)
-		goto err_mem_1;
-	err = request_mem_region(__PREG(Ser2HSCR0), 0x1c, "IrDA") ? 0 : -EBUSY;
-	if (err)
-		goto err_mem_2;
-	err = request_mem_region(__PREG(Ser2HSCR2), 0x04, "IrDA") ? 0 : -EBUSY;
-	if (err)
-		goto err_mem_3;
-
-	driver_register(&sa1100ir_driver);
-	sys_device_register(&sa1100ir_device);
-
-	rtnl_lock();
-	dev = dev_alloc("irda%d", &err);
-	if (dev) {
-		dev->irq    = IRQ_Ser2ICP;
-		dev->init   = sa1100_irda_net_init;
-		dev->uninit = sa1100_irda_net_uninit;
-
-		err = register_netdevice(dev);
-
-		if (err)
-			kfree(dev);
-		else
-			dev_set_drvdata(&sa1100ir_device.dev, dev);
-	}
-	rtnl_unlock();
-
-	if (err) {
-		sys_device_unregister(&sa1100ir_device);
-		driver_unregister(&sa1100ir_driver);
-
-		release_mem_region(__PREG(Ser2HSCR2), 0x04);
+	release_mem_region(__PREG(Ser2HSCR2), 0x04);
 err_mem_3:
-		release_mem_region(__PREG(Ser2HSCR0), 0x1c);
+	release_mem_region(__PREG(Ser2HSCR0), 0x1c);
 err_mem_2:
-		release_mem_region(__PREG(Ser2UTCR0), 0x24);
-	}
+	release_mem_region(__PREG(Ser2UTCR0), 0x24);
 err_mem_1:
+	sys_device_unregister(&sa1100ir_device);
+err_sys_2:
+	sysdev_class_unregister(&sa1100ir_sysdev_class);
+err_sys_1:
 	return err;
 }
 
 static void __exit sa1100_irda_exit(void)
 {
-	struct net_device *dev = dev_get_drvdata(&sa1100ir_device.dev);
+	struct net_device *dev = netdev;
 
-	if (dev)
+	if (dev) {
+		struct sa1100_irda *si = dev->priv;
 		unregister_netdev(dev);
 
-	sys_device_unregister(&sa1100ir_device);
-	driver_unregister(&sa1100ir_driver);
+		kfree(si->tx_buff.head);
+		kfree(si->rx_buff.head);
+		release_mem_region(__PREG(Ser2HSCR2), 0x04);
+		release_mem_region(__PREG(Ser2HSCR0), 0x1c);
+		release_mem_region(__PREG(Ser2UTCR0), 0x24);
+		free_netdev(dev);
 
-	release_mem_region(__PREG(Ser2HSCR2), 0x04);
-	release_mem_region(__PREG(Ser2HSCR0), 0x1c);
-	release_mem_region(__PREG(Ser2UTCR0), 0x24);
+		sys_device_unregister(&sa1100ir_device);
+		sysdev_class_unregister(&sa1100ir_sysdev_class);
 
-	if(dev)
-		free_netdev(dev);
+		netdev = NULL;
+	}
 }
 
 static int __init sa1100ir_setup(char *line)

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

* Re: [PATCH] sa1100ir - fix for 2.6
  2003-12-05 23:06 [PATCH] sa1100ir - fix for 2.6 Stephen Hemminger
@ 2003-12-06  0:30 ` Jean Tourrilhes
  2003-12-06  8:38 ` Russell King
  1 sibling, 0 replies; 3+ messages in thread
From: Jean Tourrilhes @ 2003-12-06  0:30 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: Russell King, Jeff Garzik, Alexander Viro, netdev, irda-users

On Fri, Dec 05, 2003 at 03:06:01PM -0800, Stephen Hemminger wrote:
> Update the ARM SA1100 irda driver to current 2.6 network device model
>   * allocate network device with alloc_irdadev - get rid of dev_alloc
>   * change to current system device class model - looks like it was using early
>     old version of interface from 2.5
>   * better error unwind
> 
> This has been cross compiled successfully against net-drivers-2.5-exp

	I don't have the hardware, so I can't test that (and I'm not
familiar with sysfs). If you want, I can add that as part of my next
IrDA update (probably 2.6.1).
	Russel, if you do testing you may want to grab the "F-timer
fix" from my web page.
	Regards,

	Jean

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

* Re: [PATCH] sa1100ir - fix for 2.6
  2003-12-05 23:06 [PATCH] sa1100ir - fix for 2.6 Stephen Hemminger
  2003-12-06  0:30 ` Jean Tourrilhes
@ 2003-12-06  8:38 ` Russell King
  1 sibling, 0 replies; 3+ messages in thread
From: Russell King @ 2003-12-06  8:38 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: Jeff Garzik, Jean Tourrilhes, Alexander Viro, netdev, irda-users

On Fri, Dec 05, 2003 at 03:06:01PM -0800, Stephen Hemminger wrote:
> Update the ARM SA1100 irda driver to current 2.6 network device model
>   * allocate network device with alloc_irdadev - get rid of dev_alloc
>   * change to current system device class model - looks like it was using early
>     old version of interface from 2.5
>   * better error unwind

It isn't a system device though.  Please revery the sysdev changes.

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core

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

end of thread, other threads:[~2003-12-06  8:38 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-12-05 23:06 [PATCH] sa1100ir - fix for 2.6 Stephen Hemminger
2003-12-06  0:30 ` Jean Tourrilhes
2003-12-06  8:38 ` Russell King

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