can: sja1000: fix network statistics update
authorWolfgang Grandegger <wg@grandegger.com>
Tue, 1 Sep 2009 05:29:41 +0000 (05:29 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 4 Sep 2009 09:16:15 +0000 (02:16 -0700)
The member "tx_bytes" of "struct net_device_stats" should be
incremented when the interrupt is done and an "arbitration
lost error" is a TX error and the statistics should be updated
accordingly.

Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/can/sja1000/sja1000.c

index fd7fa716a6ca712a42eac8462a629082a9090a9c..16d2ecd2a3b7b4fa08d7ce95c8e342cdc3788856 100644 (file)
@@ -242,7 +242,6 @@ static netdev_tx_t sja1000_start_xmit(struct sk_buff *skb,
                                            struct net_device *dev)
 {
        struct sja1000_priv *priv = netdev_priv(dev);
-       struct net_device_stats *stats = &dev->stats;
        struct can_frame *cf = (struct can_frame *)skb->data;
        uint8_t fi;
        uint8_t dlc;
@@ -276,7 +275,6 @@ static netdev_tx_t sja1000_start_xmit(struct sk_buff *skb,
        for (i = 0; i < dlc; i++)
                priv->write_reg(priv, dreg++, cf->data[i]);
 
-       stats->tx_bytes += dlc;
        dev->trans_start = jiffies;
 
        can_put_echo_skb(skb, dev, 0);
@@ -427,7 +425,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)
                dev_dbg(dev->dev.parent, "arbitration lost interrupt\n");
                alc = priv->read_reg(priv, REG_ALC);
                priv->can.can_stats.arbitration_lost++;
-               stats->rx_errors++;
+               stats->tx_errors++;
                cf->can_id |= CAN_ERR_LOSTARB;
                cf->data[0] = alc & 0x1f;
        }
@@ -484,6 +482,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
 
                if (isrc & IRQ_TI) {
                        /* transmission complete interrupt */
+                       stats->tx_bytes += priv->read_reg(priv, REG_FI) & 0xf;
                        stats->tx_packets++;
                        can_get_echo_skb(dev, 0);
                        netif_wake_queue(dev);