struct rx_cmp *rxcmp;
        u16 cp_cons;
        u8 cmp_type;
+       int rc;
 
        cp_cons = RING_CMP(tmp_raw_cons);
        rxcmp = (struct rx_cmp *)
                tpa_end1->rx_tpa_end_cmp_errors_v2 |=
                        cpu_to_le32(RX_TPA_END_CMP_ERRORS);
        }
-       return bnxt_rx_pkt(bp, cpr, raw_cons, event);
+       rc = bnxt_rx_pkt(bp, cpr, raw_cons, event);
+       if (rc && rc != -EBUSY)
+               cpr->sw_stats.rx.rx_netpoll_discards += 1;
+       return rc;
 }
 
 u32 bnxt_fw_health_readl(struct bnxt *bp, int reg_idx)
                stats->multicast += BNXT_GET_RING_STATS64(sw, rx_mcast_pkts);
 
                stats->tx_dropped += BNXT_GET_RING_STATS64(sw, tx_error_pkts);
+
+               stats->rx_dropped += cpr->sw_stats.rx.rx_netpoll_discards;
        }
 }
 
        stats->tx_bytes += prev_stats->tx_bytes;
        stats->rx_missed_errors += prev_stats->rx_missed_errors;
        stats->multicast += prev_stats->multicast;
+       stats->rx_dropped += prev_stats->rx_dropped;
        stats->tx_dropped += prev_stats->tx_dropped;
 }
 
 
 enum {
        RX_TOTAL_DISCARDS,
        TX_TOTAL_DISCARDS,
+       RX_NETPOLL_DISCARDS,
 };
 
 static struct {
 } bnxt_sw_func_stats[] = {
        {0, "rx_total_discard_pkts"},
        {0, "tx_total_discard_pkts"},
+       {0, "rx_total_netpoll_discards"},
 };
 
 #define NUM_RING_RX_SW_STATS           ARRAY_SIZE(bnxt_rx_sw_stats_str)
                        BNXT_GET_RING_STATS64(sw_stats, rx_discard_pkts);
                bnxt_sw_func_stats[TX_TOTAL_DISCARDS].counter +=
                        BNXT_GET_RING_STATS64(sw_stats, tx_discard_pkts);
+               bnxt_sw_func_stats[RX_NETPOLL_DISCARDS].counter +=
+                       cpr->sw_stats.rx.rx_netpoll_discards;
        }
 
        for (i = 0; i < BNXT_NUM_SW_FUNC_STATS; i++, j++)