Skip to content

mcp25xxfd pending mask off by one #9

@RickMcConney

Description

@RickMcConney

I am suspecting that the code at line 1908 may have an error.
if (pending_mask)
fifo = fls(pending_mask);
else
fifo = priv->fifos.tx_fifo_start;

/* handle error - this should not happen... */
if (fifo >= priv->fifos.tx_fifo_start + priv->fifos.tx_fifos) {

If i set the bitrate of two can buses to be mismatched I get an expected bus error. However when I reset the rates to match the fifo value gets set to 32 by the if(pending_mask) returning true. I think this is because the fls will return 32 instead of the expected 31. So I think the code should be
fifo = fls(pending_mask) - 1;

If I make this change I no longer get the error and the communication resumes.

However after such an error the pending mask always remains set. I am not sure where the pending mask should get cleared.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions