net/enic: fix Rx drop counters
[dpdk.git] / drivers / net / enic / enic_main.c
index bbbe660..c002ef3 100644 (file)
@@ -211,15 +211,30 @@ void enic_send_pkt(struct enic *enic, struct vnic_wq *wq,
                          0 /*wrid*/);
 }
 
+static void enic_clear_soft_stats(struct enic *enic)
+{
+       struct enic_soft_stats *soft_stats = &enic->soft_stats;
+       rte_atomic64_clear(&soft_stats->rx_nombuf);
+}
+
+static void enic_init_soft_stats(struct enic *enic)
+{
+       struct enic_soft_stats *soft_stats = &enic->soft_stats;
+       rte_atomic64_init(&soft_stats->rx_nombuf);
+       enic_clear_soft_stats(enic);
+}
+
 void enic_dev_stats_clear(struct enic *enic)
 {
        if (vnic_dev_stats_clear(enic->vdev))
                dev_err(enic, "Error in clearing stats\n");
+       enic_clear_soft_stats(enic);
 }
 
 void enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)
 {
        struct vnic_stats *stats;
+       struct enic_soft_stats *soft_stats;
 
        if (vnic_dev_stats_dump(enic->vdev, &stats)) {
                dev_err(enic, "Error in getting stats\n");
@@ -232,12 +247,13 @@ void enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)
        r_stats->ibytes = stats->rx.rx_bytes_ok;
        r_stats->obytes = stats->tx.tx_bytes_ok;
 
-       r_stats->ierrors = stats->rx.rx_errors;
+       r_stats->ierrors = stats->rx.rx_errors + stats->rx.rx_drop;
        r_stats->oerrors = stats->tx.tx_errors;
 
-       r_stats->imissed = stats->rx.rx_drop;
+       r_stats->imissed = stats->rx.rx_no_bufs;
 
-       r_stats->rx_nombuf = stats->rx.rx_no_bufs;
+       soft_stats = &enic->soft_stats;
+       r_stats->rx_nombuf = rte_atomic64_read(&soft_stats->rx_nombuf);
 }
 
 void enic_del_mac_address(struct enic *enic)
@@ -795,6 +811,8 @@ int enic_setup_finish(struct enic *enic)
 {
        int ret;
 
+       enic_init_soft_stats(enic);
+
        ret = enic_set_rss_nic_cfg(enic);
        if (ret) {
                dev_err(enic, "Failed to config nic, aborting.\n");