2011/11/10 Wolfgang Grandegger <[email protected]>: > Hi Willy, > > On 11/09/2011 07:03 PM, Willy Lambert wrote: >> 2011/9/5 Wolfgang Grandegger <[email protected]> > ... >>> Ah, at a closer look, the PC/104-Plus is an extension of the PC/104 from >>> factor with an additional connector for PCI. It therefore still supports >>> ISA bus communication, which the IXXAT PC-I 04/104 board uses. >>> >>> Therefore I'm going to prepare a patch removing the "X86_32" restriction >>> for CONFIG_ISA above. Sorry for confusion. >>> >> >> May I bump this up ? I read your conversation on other linux ML, but I >> don't really know how it ended. > > Some time ago I posted a patch to the relevant mls removing the > restriction mentioned above. But enabling CONFIG_ISA also for x86_64 > systems is not wished mainly to avoid the expected mess with old > legacy ISA driver code. Therefore we should convert the driver to a > platform driver. I have attached the *untested* patch below. Could you > please give it a try? If it works fine, I will send it finally to the > netdev ml. > > Thanks, > > Wolfgang. > > > From dd2c8d7cf8f23a20aecd234a6cf7675b59f5779d Mon Sep 17 00:00:00 2001 > From: Wolfgang Grandegger <[email protected]> > Date: Thu, 10 Nov 2011 09:10:18 +0100 > Subject: [PATCH] can: sja1000_isa: convert to platform driver to support > x86_64 systems > > This driver is currently not supported on x86_64 systems because the > "isa_driver" interface is used. To overcome this limitation, this > driver is converted to a platform driver, similar to the serial 8250 > driver. > > Signed-off-by: Wolfgang Grandegger <[email protected]> > --- > drivers/net/can/sja1000/Kconfig | 1 - > drivers/net/can/sja1000/sja1000_isa.c | 86 > ++++++++++++++++++++++----------- > 2 files changed, 57 insertions(+), 30 deletions(-) > > diff --git a/drivers/net/can/sja1000/Kconfig b/drivers/net/can/sja1000/Kconfig > index fe9e64d..36e9d59 100644 > --- a/drivers/net/can/sja1000/Kconfig > +++ b/drivers/net/can/sja1000/Kconfig > @@ -6,7 +6,6 @@ if CAN_SJA1000 > > config CAN_SJA1000_ISA > tristate "ISA Bus based legacy SJA1000 driver" > - depends on ISA > ---help--- > This driver adds legacy support for SJA1000 chips connected to > the ISA bus using I/O port, memory mapped or indirect access. > diff --git a/drivers/net/can/sja1000/sja1000_isa.c > b/drivers/net/can/sja1000/sja1000_isa.c > index 496223e..3301031 100644 > --- a/drivers/net/can/sja1000/sja1000_isa.c > +++ b/drivers/net/can/sja1000/sja1000_isa.c > @@ -17,7 +17,7 @@ > > #include <linux/kernel.h> > #include <linux/module.h> > -#include <linux/isa.h> > +#include <linux/platform_device.h> > #include <linux/interrupt.h> > #include <linux/netdevice.h> > #include <linux/delay.h> > @@ -75,6 +75,8 @@ MODULE_PARM_DESC(ocr, "Output control register " > #define SJA1000_IOSIZE 0x20 > #define SJA1000_IOSIZE_INDIRECT 0x02 > > +static struct platform_device *sja1000_isa_devs[MAXDEV]; > + > static u8 sja1000_isa_mem_read_reg(const struct sja1000_priv *priv, int reg) > { > return readb(priv->reg_base + reg); > @@ -115,24 +117,13 @@ static void sja1000_isa_port_write_reg_indirect(const > struct sja1000_priv *priv, > outb(val, base + 1); > } > > -static int __devinit sja1000_isa_match(struct device *pdev, unsigned int idx) > -{ > - if (port[idx] || mem[idx]) { > - if (irq[idx]) > - return 1; > - } else if (idx) > - return 0; > - > - dev_err(pdev, "insufficient parameters supplied\n"); > - return 0; > -} > - > -static int __devinit sja1000_isa_probe(struct device *pdev, unsigned int idx) > +static int __devinit sja1000_isa_probe(struct platform_device *pdev) > { > struct net_device *dev; > struct sja1000_priv *priv; > void __iomem *base = NULL; > int iosize = SJA1000_IOSIZE; > + int idx = pdev->id; > int err; > > if (mem[idx]) { > @@ -203,17 +194,17 @@ static int __devinit sja1000_isa_probe(struct device > *pdev, unsigned int idx) > else > priv->cdr = CDR_DEFAULT; > > - dev_set_drvdata(pdev, dev); > - SET_NETDEV_DEV(dev, pdev); > + dev_set_drvdata(&pdev->dev, dev); > + SET_NETDEV_DEV(dev, &pdev->dev); > > err = register_sja1000dev(dev); > if (err) { > - dev_err(pdev, "registering %s failed (err=%d)\n", > + dev_err(&pdev->dev, "registering %s failed (err=%d)\n", > DRV_NAME, err); > goto exit_unmap; > } > > - dev_info(pdev, "%s device registered (reg_base=0x%p, irq=%d)\n", > + dev_info(&pdev->dev, "%s device registered (reg_base=0x%p, irq=%d)\n", > DRV_NAME, priv->reg_base, dev->irq); > return 0; > > @@ -229,13 +220,14 @@ static int __devinit sja1000_isa_probe(struct device > *pdev, unsigned int idx) > return err; > } > > -static int __devexit sja1000_isa_remove(struct device *pdev, unsigned int > idx) > +static int __devexit sja1000_isa_remove(struct platform_device *pdev) > { > - struct net_device *dev = dev_get_drvdata(pdev); > + struct net_device *dev = dev_get_drvdata(&pdev->dev); > struct sja1000_priv *priv = netdev_priv(dev); > + int idx = pdev->id; > > unregister_sja1000dev(dev); > - dev_set_drvdata(pdev, NULL); > + dev_set_drvdata(&pdev->dev, NULL); > > if (mem[idx]) { > iounmap(priv->reg_base); > @@ -251,29 +243,65 @@ static int __devexit sja1000_isa_remove(struct device > *pdev, unsigned int idx) > return 0; > } > > -static struct isa_driver sja1000_isa_driver = { > - .match = sja1000_isa_match, > +static struct platform_driver sja1000_isa_driver = { > .probe = sja1000_isa_probe, > .remove = __devexit_p(sja1000_isa_remove), > .driver = { > .name = DRV_NAME, > + .owner = THIS_MODULE, > }, > }; > > static int __init sja1000_isa_init(void) > { > - int err = isa_register_driver(&sja1000_isa_driver, MAXDEV); > + int idx, err; > + > + for (idx = 0; idx < MAXDEV; idx++) { > + if ((port[idx] || mem[idx]) && irq[idx]) { > + sja1000_isa_devs[idx] = > + platform_device_alloc(DRV_NAME, idx); > + if (!sja1000_isa_devs[idx]) { > + err = -ENOMEM; > + goto exit_free_devices; > + } > + err = platform_device_add(sja1000_isa_devs[idx]); > + if (err) { > + platform_device_put(sja1000_isa_devs[idx]); > + goto exit_free_devices; > + } > + } else { > + pr_err("%s: insufficient parameters supplied\n", > + DRV_NAME); > + goto exit_free_devices; > + } > + > + err = platform_driver_register(&sja1000_isa_driver); > + if (err) > + goto exit_free_devices; > + > + pr_info("Legacy %s driver for max. %d devices registered\n", > + DRV_NAME, MAXDEV); > + > + return 0; > + > +exit_free_devices: > + while (--idx >= 0) { > + if (sja1000_isa_devs[idx]) > + platform_device_unregister(sja1000_isa_devs[idx]); > + } > > - if (!err) > - printk(KERN_INFO > - "Legacy %s driver for max. %d devices registered\n", > - DRV_NAME, MAXDEV); > return err; > } > > static void __exit sja1000_isa_exit(void) > { > - isa_unregister_driver(&sja1000_isa_driver); > + int idx; > + > + platform_driver_unregister(&sja1000_isa_driver); > + for (idx = 0; idx < MAXDEV; idx++) { > + if (sja1000_isa_devs[idx]) > + platform_device_unregister(sja1000_isa_devs[idx]); > + } > } > > module_init(sja1000_isa_init); > -- > 1.7.4.1 > >
I failed to apply the patch, is it for 2.6.38.8 kernels ? I even try to modify the file editing by hand, by it doesn't compile. The command uI use was : ard@ard-host:~/src/linux-2.6.38.8$ patch -p1 < wg_platform_driver.Patch which I think is good because the .rej file is in the right place drivers/net/can/sja1000/sja1000_isa.c.rej _______________________________________________ Socketcan-users mailing list [email protected] https://lists.berlios.de/mailman/listinfo/socketcan-users
