• Jan Altenberg's avatar
    can: c_can: Fix tx_bytes accounting · dc760b37
    Jan Altenberg authored
    The current SocketCAN implementation for the Bosch c_can cell doesn't
    account the TX bytes correctly, because it calls
    c_can_inval_msg_object() (which clears the msg ctrl register) before
    reading the DLC value:
    
    for (/* nix */; (priv->tx_next - priv->tx_echo) > 0; priv->tx_echo++) {
            msg_obj_no = get_tx_echo_msg_obj(priv);
            c_can_inval_msg_object(dev, 0, msg_obj_no);
            val = c_can_read_reg32(priv, &priv->regs->txrqst1);
            if (!(val & (1 << msg_obj_no))) {
                    can_get_echo_skb(dev,
                                    msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST);
                    stats->tx_bytes += priv->read_reg(priv,
                                    &priv->regs->ifregs[0].msg_cntrl)
                                    & IF_MCONT_DLC_MASK;
                    stats->tx_packets++;
            }
    }
    
    So, we will always read 0 for the DLC value and "ifconfig" will report
    *0* TX Bytes.
    
    The fix is quite easy: Just move c_can_inval_msg_object() to the end of
    the if() statement. So:
          * We only call c_can_inval_msg_object() if the message was
            actually transmitted
          * We read out the DLC value _before_ clearing the msg ctrl
            register
    Signed-off-by: default avatarJan Altenberg <jan@linutronix.de>
    Acked-by: default avatarKurt Van Dijck <kurt.van.dijck@eia.be>
    Acked-by: default avatarWolfgang Grandegger <wg@grandegger.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    dc760b37
c_can.c 31.1 KB