int     status;
 
        skb->protocol = eth_type_trans (skb, dev->net);
-       dev->stats.rx_packets++;
-       dev->stats.rx_bytes += skb->len;
+       dev->net->stats.rx_packets++;
+       dev->net->stats.rx_bytes += skb->len;
 
        if (netif_msg_rx_status (dev))
                devdbg (dev, "< rx, len %zu, type 0x%x",
                if (netif_msg_rx_err (dev))
                        devdbg (dev, "drop");
 error:
-               dev->stats.rx_errors++;
+               dev->net->stats.rx_errors++;
                skb_queue_tail (&dev->done, skb);
        }
 }
        case 0:
                if (skb->len < dev->net->hard_header_len) {
                        entry->state = rx_cleanup;
-                       dev->stats.rx_errors++;
-                       dev->stats.rx_length_errors++;
+                       dev->net->stats.rx_errors++;
+                       dev->net->stats.rx_length_errors++;
                        if (netif_msg_rx_err (dev))
                                devdbg (dev, "rx length %d", skb->len);
                }
         * storm, recovering as needed.
         */
        case -EPIPE:
-               dev->stats.rx_errors++;
+               dev->net->stats.rx_errors++;
                usbnet_defer_kevent (dev, EVENT_RX_HALT);
                // FALLTHROUGH
 
        case -EPROTO:
        case -ETIME:
        case -EILSEQ:
-               dev->stats.rx_errors++;
+               dev->net->stats.rx_errors++;
                if (!timer_pending (&dev->delay)) {
                        mod_timer (&dev->delay, jiffies + THROTTLE_JIFFIES);
                        if (netif_msg_link (dev))
 
        /* data overrun ... flush fifo? */
        case -EOVERFLOW:
-               dev->stats.rx_over_errors++;
+               dev->net->stats.rx_over_errors++;
                // FALLTHROUGH
 
        default:
                entry->state = rx_cleanup;
-               dev->stats.rx_errors++;
+               dev->net->stats.rx_errors++;
                if (netif_msg_rx_err (dev))
                        devdbg (dev, "rx status %d", urb_status);
                break;
 
        if (netif_msg_ifdown (dev))
                devinfo (dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld",
-                       dev->stats.rx_packets, dev->stats.tx_packets,
-                       dev->stats.rx_errors, dev->stats.tx_errors
+                       net->stats.rx_packets, net->stats.tx_packets,
+                       net->stats.rx_errors, net->stats.tx_errors
                        );
 
        // ensure there are no more active urbs
        struct usbnet           *dev = entry->dev;
 
        if (urb->status == 0) {
-               dev->stats.tx_packets++;
-               dev->stats.tx_bytes += entry->length;
+               dev->net->stats.tx_packets++;
+               dev->net->stats.tx_bytes += entry->length;
        } else {
-               dev->stats.tx_errors++;
+               dev->net->stats.tx_errors++;
 
                switch (urb->status) {
                case -EPIPE:
                        devdbg (dev, "drop, code %d", retval);
 drop:
                retval = NET_XMIT_SUCCESS;
-               dev->stats.tx_dropped++;
+               dev->net->stats.tx_dropped++;
                if (skb)
                        dev_kfree_skb_any (skb);
                usb_free_urb (urb);