netdev_features_t pre_features,
                        netdev_features_t features, bool force_change);
 
-static void update_rx_stats(struct hinic_dev *nic_dev, struct hinic_rxq *rxq)
+static void gather_rx_stats(struct hinic_rxq_stats *nic_rx_stats, struct hinic_rxq *rxq)
 {
-       struct hinic_rxq_stats *nic_rx_stats = &nic_dev->rx_stats;
        struct hinic_rxq_stats rx_stats;
 
-       u64_stats_init(&rx_stats.syncp);
-
        hinic_rxq_get_stats(rxq, &rx_stats);
 
-       u64_stats_update_begin(&nic_rx_stats->syncp);
        nic_rx_stats->bytes += rx_stats.bytes;
        nic_rx_stats->pkts  += rx_stats.pkts;
        nic_rx_stats->errors += rx_stats.errors;
        nic_rx_stats->csum_errors += rx_stats.csum_errors;
        nic_rx_stats->other_errors += rx_stats.other_errors;
-       u64_stats_update_end(&nic_rx_stats->syncp);
-
-       hinic_rxq_clean_stats(rxq);
 }
 
-static void update_tx_stats(struct hinic_dev *nic_dev, struct hinic_txq *txq)
+static void gather_tx_stats(struct hinic_txq_stats *nic_tx_stats, struct hinic_txq *txq)
 {
-       struct hinic_txq_stats *nic_tx_stats = &nic_dev->tx_stats;
        struct hinic_txq_stats tx_stats;
 
-       u64_stats_init(&tx_stats.syncp);
-
        hinic_txq_get_stats(txq, &tx_stats);
 
-       u64_stats_update_begin(&nic_tx_stats->syncp);
        nic_tx_stats->bytes += tx_stats.bytes;
        nic_tx_stats->pkts += tx_stats.pkts;
        nic_tx_stats->tx_busy += tx_stats.tx_busy;
        nic_tx_stats->tx_wake += tx_stats.tx_wake;
        nic_tx_stats->tx_dropped += tx_stats.tx_dropped;
        nic_tx_stats->big_frags_pkts += tx_stats.big_frags_pkts;
-       u64_stats_update_end(&nic_tx_stats->syncp);
-
-       hinic_txq_clean_stats(txq);
 }
 
-static void update_nic_stats(struct hinic_dev *nic_dev)
+static void gather_nic_stats(struct hinic_dev *nic_dev,
+                            struct hinic_rxq_stats *nic_rx_stats,
+                            struct hinic_txq_stats *nic_tx_stats)
 {
        int i, num_qps = hinic_hwdev_num_qps(nic_dev->hwdev);
 
        for (i = 0; i < num_qps; i++)
-               update_rx_stats(nic_dev, &nic_dev->rxqs[i]);
+               gather_rx_stats(nic_rx_stats, &nic_dev->rxqs[i]);
 
        for (i = 0; i < num_qps; i++)
-               update_tx_stats(nic_dev, &nic_dev->txqs[i]);
+               gather_tx_stats(nic_tx_stats, &nic_dev->txqs[i]);
 }
 
 /**
        netif_carrier_off(netdev);
        netif_tx_disable(netdev);
 
-       update_nic_stats(nic_dev);
-
        up(&nic_dev->mgmt_lock);
 
        if (!HINIC_IS_VF(nic_dev->hwdev->hwif))
                              struct rtnl_link_stats64 *stats)
 {
        struct hinic_dev *nic_dev = netdev_priv(netdev);
-       struct hinic_rxq_stats *nic_rx_stats;
-       struct hinic_txq_stats *nic_tx_stats;
-
-       nic_rx_stats = &nic_dev->rx_stats;
-       nic_tx_stats = &nic_dev->tx_stats;
+       struct hinic_rxq_stats nic_rx_stats = {};
+       struct hinic_txq_stats nic_tx_stats = {};
 
        down(&nic_dev->mgmt_lock);
 
        if (nic_dev->flags & HINIC_INTF_UP)
-               update_nic_stats(nic_dev);
+               gather_nic_stats(nic_dev, &nic_rx_stats, &nic_tx_stats);
 
        up(&nic_dev->mgmt_lock);
 
-       stats->rx_bytes   = nic_rx_stats->bytes;
-       stats->rx_packets = nic_rx_stats->pkts;
-       stats->rx_errors  = nic_rx_stats->errors;
+       stats->rx_bytes   = nic_rx_stats.bytes;
+       stats->rx_packets = nic_rx_stats.pkts;
+       stats->rx_errors  = nic_rx_stats.errors;
 
-       stats->tx_bytes   = nic_tx_stats->bytes;
-       stats->tx_packets = nic_tx_stats->pkts;
-       stats->tx_errors  = nic_tx_stats->tx_dropped;
+       stats->tx_bytes   = nic_tx_stats.bytes;
+       stats->tx_packets = nic_tx_stats.pkts;
+       stats->tx_errors  = nic_tx_stats.tx_dropped;
 }
 
 static int hinic_set_features(struct net_device *netdev,
 static int nic_dev_init(struct pci_dev *pdev)
 {
        struct hinic_rx_mode_work *rx_mode_work;
-       struct hinic_txq_stats *tx_stats;
-       struct hinic_rxq_stats *rx_stats;
        struct hinic_dev *nic_dev;
        struct net_device *netdev;
        struct hinic_hwdev *hwdev;
 
        sema_init(&nic_dev->mgmt_lock, 1);
 
-       tx_stats = &nic_dev->tx_stats;
-       rx_stats = &nic_dev->rx_stats;
-
-       u64_stats_init(&tx_stats->syncp);
-       u64_stats_init(&rx_stats->syncp);
-
        nic_dev->vlan_bitmap = devm_bitmap_zalloc(&pdev->dev, VLAN_N_VID,
                                                  GFP_KERNEL);
        if (!nic_dev->vlan_bitmap) {