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