np->ioaddr = ioaddr;
        np->chip_id = chip_idx;
        np->pdev = pdev;
+
+       spin_lock_init(&np->stats_lock);
        spin_lock_init (&np->tx_lock);
        spin_lock_init (&np->rx_lock);
 
        frame_id = (tx_status & 0xffff0000);
        printk (KERN_ERR "%s: Transmit error, TxStatus %4.4x, FrameId %d.\n",
                dev->name, tx_status, frame_id);
-       dev->stats.tx_errors++;
        /* Ttransmit Underrun */
        if (tx_status & 0x10) {
                dev->stats.tx_fifo_errors++;
                rio_set_led_mode(dev);
                /* Let TxStartThresh stay default value */
        }
+
+       spin_lock(&np->stats_lock);
        /* Maximum Collisions */
        if (tx_status & 0x08)
                dev->stats.collisions++;
+
+       dev->stats.tx_errors++;
+       spin_unlock(&np->stats_lock);
+
        /* Restart the Tx */
        dw32(MACCtrl, dr16(MACCtrl) | TxEnable);
 }
        int i;
 #endif
        unsigned int stat_reg;
+       unsigned long flags;
 
+       spin_lock_irqsave(&np->stats_lock, flags);
        /* All statistics registers need to be acknowledged,
           else statistic overflow could cause problems */
 
        dr16(TCPCheckSumErrors);
        dr16(UDPCheckSumErrors);
        dr16(IPCheckSumErrors);
+
+       spin_unlock_irqrestore(&np->stats_lock, flags);
+
        return &dev->stats;
 }