2011/11/12 Willy Lambert <[email protected]>: > 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 >
sorry the mail went to fast, here is the error log : patching file drivers/net/can/sja1000/sja1000_isa.c Hunk #2 succeeded at 75 with fuzz 1. Hunk #3 FAILED at 117. Hunk #4 FAILED at 205. Hunk #5 FAILED at 231. Hunk #6 FAILED at 253. 4 out of 6 hunks FAILED -- saving rejects to file drivers/net/can/sja1000/sja1000_isa.c.rej _______________________________________________ Socketcan-users mailing list [email protected] https://lists.berlios.de/mailman/listinfo/socketcan-users
