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

Reply via email to