On Mon, Nov 16, 2009 at 2:50 PM, Wolfgang Grandegger <[email protected]> 
wrote:
> Hi Paul,
>
> Paul Thomas wrote:
>> Hi, I've been working with Christian, and he's been very helpful. In
>> trying to get to the bottom of my problem I wrote a /proc/file
>> interface so I could read & write mcp251x registers from userspace.
>> I've discovered that I can only read/write resisters in one very
>> specific condition. I describe how to get there below:
>
>> 1. load the module
>> 2. run "ip link set can0 up" this creates a "RTNETLINK answers:
>> Invalid argument" error, however the driver is doing several things
>> here (attached as fcall_link-up_fail is the debug output including my
>> added debug stuff).
>
> Before you can start the device, you need to specify the bitrate:
>
>  # ip link set can0 up type can bitrate 50000
>
> or
>  # ip link set can0 type can bitrate 50000
>  # ifconfig can0 up
>
> 50 kB/s is a rather unusual and slow bit-rate. The driver's open
> function should first check if the bit-timing has been set. The
> attached patch does fix that.
>
>> 3. Now I can read/write registers. I don't even need to use my hacked
>> /proc/file to test this. This is the only time "ip link set can0 type
>> can bitrate 50000" shows a actual numbers on the CNF debug line
>> "mcp251x spi1.3: CNF: 0x09 0xbf 0x02".
>
> If the link is up, you cannot change the bit-rate.
>
>> The only way I've found to get back to this state is to unload &
>> reload the driver. I understand that you can only mess with some of
>> the mcp251x registers when CANCTRL is in configuration mode, but at
>> the very least on startup you shouldn't need the failed link up
>> command for it to work. And probably whenever the link is down in
>> should be configurable.
>>
>> I'm going through all of this because I was have a baud problems on the bus.
>
> Does the patch below already help to cure your problems?
>
> Wolfgang.
>
>
> ---
>  drivers/net/can/mcp251x.c |   12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> Index: net-next-2.6/drivers/net/can/mcp251x.c
> ===================================================================
> --- net-next-2.6.orig/drivers/net/can/mcp251x.c
> +++ net-next-2.6/drivers/net/can/mcp251x.c
> @@ -596,12 +596,6 @@ static int mcp251x_setup(struct net_devi
>  {
>        int ret;
>
> -       ret = open_candev(net);
> -       if (ret) {
> -               dev_err(&spi->dev, "unable to set initial baudrate!\n");
> -               return ret;
> -       }
> -
>        /* Enable RX0->RX1 buffer roll over and disable filters */
>        mcp251x_write_bits(spi, RXBCTRL(0),
>                           RXBCTRL_BUKT | RXBCTRL_RXM0 | RXBCTRL_RXM1,
> @@ -671,6 +665,12 @@ static int mcp251x_open(struct net_devic
>        struct mcp251x_platform_data *pdata = spi->dev.platform_data;
>        int ret;
>
> +       ret = open_candev(net);
> +       if (ret) {
> +               dev_err(&spi->dev, "unable to set initial baudrate!\n");
> +               return ret;
> +       }
> +
>        if (pdata->transceiver_enable)
>                pdata->transceiver_enable(1);
>
>

Wolfgang,

Thanks for the response. After the patch is applied the CNF: debug
line from "ip link set can0 type can bitrate 50000" always shows 0's.
As opposed to before the patch it would work only after the module was
loaded and after the failed "ip link set can0 up" command.

thanks,
Paul
_______________________________________________
Socketcan-core mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/socketcan-core

Reply via email to