lkml.org 
[lkml]   [2015]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 034/122] can: kvaser_usb: Fix state handling upon BUS_ERROR events
    Date
    From: "Ahmed S. Darwish" <ahmed.darwish@valeo.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit e638642b08c170d2021b706f0b1c4f4ae93d8cbd upstream.

    While being in an ERROR_WARNING state, and receiving further
    bus error events with error counters still in the ERROR_WARNING
    range of 97-127 inclusive, the state handling code erroneously
    reverts back to ERROR_ACTIVE.

    Per the CAN standard, only revert to ERROR_ACTIVE when the
    error counters are less than 96.

    Moreover, in certain Kvaser models, the BUS_ERROR flag is
    always set along with undefined bits in the M16C status
    register. Thus use bitwise operators instead of full equality
    for checking that register against bus errors.

    Signed-off-by: Ahmed S. Darwish <ahmed.darwish@valeo.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    drivers/net/can/usb/kvaser_usb.c | 7 +++----
    1 file changed, 3 insertions(+), 4 deletions(-)

    diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c
    index 5ea0de87514b..a3fb8b51038a 100644
    --- a/drivers/net/can/usb/kvaser_usb.c
    +++ b/drivers/net/can/usb/kvaser_usb.c
    @@ -690,9 +690,7 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev,
    }

    new_state = CAN_STATE_ERROR_PASSIVE;
    - }
    -
    - if (status == M16C_STATE_BUS_ERROR) {
    + } else if (status & M16C_STATE_BUS_ERROR) {
    if ((priv->can.state < CAN_STATE_ERROR_WARNING) &&
    ((txerr >= 96) || (rxerr >= 96))) {
    cf->can_id |= CAN_ERR_CRTL;
    @@ -702,7 +700,8 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev,

    priv->can.can_stats.error_warning++;
    new_state = CAN_STATE_ERROR_WARNING;
    - } else if (priv->can.state > CAN_STATE_ERROR_ACTIVE) {
    + } else if ((priv->can.state > CAN_STATE_ERROR_ACTIVE) &&
    + ((txerr < 96) && (rxerr < 96))) {
    cf->can_id |= CAN_ERR_PROT;
    cf->data[2] = CAN_ERR_PROT_ACTIVE;

    --
    2.2.2


    \
     
     \ /
      Last update: 2015-02-17 13:21    [W:4.155 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site