diff options
author | Edward Cree <ecree@solarflare.com> | 2014-07-15 06:58:12 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-07-16 01:53:34 -0400 |
commit | e4d112e4f9502083fd27f9ac1a4cd690e3f01421 (patch) | |
tree | 1e6d9f30d787d9df8214378923ea621af2afb0be | |
parent | d762d038497c9df51c19fcbe69b094b3bf8e5568 (diff) |
sfc: add extra RX drop counters for nodesc_trunc and noskb_drop
Added a counter rx_noskb_drop for failure to allocate an skb.
Summed the per-channel rx_nodesc_trunc counters earlier so that they can
be included in rx_dropped.
Signed-off-by: Edward Cree <ecree@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/sfc/ef10.c | 14 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/efx.c | 11 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/efx.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/ethtool.c | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/falcon.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/net_driver.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/nic.h | 13 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/rx.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/siena.c | 9 |
9 files changed, 56 insertions, 10 deletions
diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c index b5ed30a39144..002d4cdc319f 100644 --- a/drivers/net/ethernet/sfc/ef10.c +++ b/drivers/net/ethernet/sfc/ef10.c | |||
@@ -755,6 +755,8 @@ static int efx_ef10_reset(struct efx_nic *efx, enum reset_type reset_type) | |||
755 | { NULL, 64, 8 * MC_CMD_MAC_ ## mcdi_name } | 755 | { NULL, 64, 8 * MC_CMD_MAC_ ## mcdi_name } |
756 | #define EF10_OTHER_STAT(ext_name) \ | 756 | #define EF10_OTHER_STAT(ext_name) \ |
757 | [EF10_STAT_ ## ext_name] = { #ext_name, 0, 0 } | 757 | [EF10_STAT_ ## ext_name] = { #ext_name, 0, 0 } |
758 | #define GENERIC_SW_STAT(ext_name) \ | ||
759 | [GENERIC_STAT_ ## ext_name] = { #ext_name, 0, 0 } | ||
758 | 760 | ||
759 | static const struct efx_hw_stat_desc efx_ef10_stat_desc[EF10_STAT_COUNT] = { | 761 | static const struct efx_hw_stat_desc efx_ef10_stat_desc[EF10_STAT_COUNT] = { |
760 | EF10_DMA_STAT(tx_bytes, TX_BYTES), | 762 | EF10_DMA_STAT(tx_bytes, TX_BYTES), |
@@ -798,6 +800,8 @@ static const struct efx_hw_stat_desc efx_ef10_stat_desc[EF10_STAT_COUNT] = { | |||
798 | EF10_DMA_STAT(rx_align_error, RX_ALIGN_ERROR_PKTS), | 800 | EF10_DMA_STAT(rx_align_error, RX_ALIGN_ERROR_PKTS), |
799 | EF10_DMA_STAT(rx_length_error, RX_LENGTH_ERROR_PKTS), | 801 | EF10_DMA_STAT(rx_length_error, RX_LENGTH_ERROR_PKTS), |
800 | EF10_DMA_STAT(rx_nodesc_drops, RX_NODESC_DROPS), | 802 | EF10_DMA_STAT(rx_nodesc_drops, RX_NODESC_DROPS), |
803 | GENERIC_SW_STAT(rx_nodesc_trunc), | ||
804 | GENERIC_SW_STAT(rx_noskb_drops), | ||
801 | EF10_DMA_STAT(rx_pm_trunc_bb_overflow, PM_TRUNC_BB_OVERFLOW), | 805 | EF10_DMA_STAT(rx_pm_trunc_bb_overflow, PM_TRUNC_BB_OVERFLOW), |
802 | EF10_DMA_STAT(rx_pm_discard_bb_overflow, PM_DISCARD_BB_OVERFLOW), | 806 | EF10_DMA_STAT(rx_pm_discard_bb_overflow, PM_DISCARD_BB_OVERFLOW), |
803 | EF10_DMA_STAT(rx_pm_trunc_vfifo_full, PM_TRUNC_VFIFO_FULL), | 807 | EF10_DMA_STAT(rx_pm_trunc_vfifo_full, PM_TRUNC_VFIFO_FULL), |
@@ -841,7 +845,9 @@ static const struct efx_hw_stat_desc efx_ef10_stat_desc[EF10_STAT_COUNT] = { | |||
841 | (1ULL << EF10_STAT_rx_gtjumbo) | \ | 845 | (1ULL << EF10_STAT_rx_gtjumbo) | \ |
842 | (1ULL << EF10_STAT_rx_bad_gtjumbo) | \ | 846 | (1ULL << EF10_STAT_rx_bad_gtjumbo) | \ |
843 | (1ULL << EF10_STAT_rx_overflow) | \ | 847 | (1ULL << EF10_STAT_rx_overflow) | \ |
844 | (1ULL << EF10_STAT_rx_nodesc_drops)) | 848 | (1ULL << EF10_STAT_rx_nodesc_drops) | \ |
849 | (1ULL << GENERIC_STAT_rx_nodesc_trunc) | \ | ||
850 | (1ULL << GENERIC_STAT_rx_noskb_drops)) | ||
845 | 851 | ||
846 | /* These statistics are only provided by the 10G MAC. For a 10G/40G | 852 | /* These statistics are only provided by the 10G MAC. For a 10G/40G |
847 | * switchable port we do not expose these because they might not | 853 | * switchable port we do not expose these because they might not |
@@ -951,7 +957,7 @@ static int efx_ef10_try_update_nic_stats(struct efx_nic *efx) | |||
951 | stats[EF10_STAT_rx_bytes_minus_good_bytes]; | 957 | stats[EF10_STAT_rx_bytes_minus_good_bytes]; |
952 | efx_update_diff_stat(&stats[EF10_STAT_rx_bad_bytes], | 958 | efx_update_diff_stat(&stats[EF10_STAT_rx_bad_bytes], |
953 | stats[EF10_STAT_rx_bytes_minus_good_bytes]); | 959 | stats[EF10_STAT_rx_bytes_minus_good_bytes]); |
954 | 960 | efx_update_sw_stats(efx, stats); | |
955 | return 0; | 961 | return 0; |
956 | } | 962 | } |
957 | 963 | ||
@@ -990,7 +996,9 @@ static size_t efx_ef10_update_stats(struct efx_nic *efx, u64 *full_stats, | |||
990 | core_stats->tx_packets = stats[EF10_STAT_tx_packets]; | 996 | core_stats->tx_packets = stats[EF10_STAT_tx_packets]; |
991 | core_stats->rx_bytes = stats[EF10_STAT_rx_bytes]; | 997 | core_stats->rx_bytes = stats[EF10_STAT_rx_bytes]; |
992 | core_stats->tx_bytes = stats[EF10_STAT_tx_bytes]; | 998 | core_stats->tx_bytes = stats[EF10_STAT_tx_bytes]; |
993 | core_stats->rx_dropped = stats[EF10_STAT_rx_nodesc_drops]; | 999 | core_stats->rx_dropped = stats[EF10_STAT_rx_nodesc_drops] + |
1000 | stats[GENERIC_STAT_rx_nodesc_trunc] + | ||
1001 | stats[GENERIC_STAT_rx_noskb_drops]; | ||
994 | core_stats->multicast = stats[EF10_STAT_rx_multicast]; | 1002 | core_stats->multicast = stats[EF10_STAT_rx_multicast]; |
995 | core_stats->rx_length_errors = | 1003 | core_stats->rx_length_errors = |
996 | stats[EF10_STAT_rx_gtjumbo] + | 1004 | stats[EF10_STAT_rx_gtjumbo] + |
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c index 2d8622430012..4b80c0be6e57 100644 --- a/drivers/net/ethernet/sfc/efx.c +++ b/drivers/net/ethernet/sfc/efx.c | |||
@@ -2724,6 +2724,17 @@ static void efx_fini_struct(struct efx_nic *efx) | |||
2724 | } | 2724 | } |
2725 | } | 2725 | } |
2726 | 2726 | ||
2727 | void efx_update_sw_stats(struct efx_nic *efx, u64 *stats) | ||
2728 | { | ||
2729 | u64 n_rx_nodesc_trunc = 0; | ||
2730 | struct efx_channel *channel; | ||
2731 | |||
2732 | efx_for_each_channel(channel, efx) | ||
2733 | n_rx_nodesc_trunc += channel->n_rx_nodesc_trunc; | ||
2734 | stats[GENERIC_STAT_rx_nodesc_trunc] = n_rx_nodesc_trunc; | ||
2735 | stats[GENERIC_STAT_rx_noskb_drops] = atomic_read(&efx->n_rx_noskb_drops); | ||
2736 | } | ||
2737 | |||
2727 | /************************************************************************** | 2738 | /************************************************************************** |
2728 | * | 2739 | * |
2729 | * PCI interface | 2740 | * PCI interface |
diff --git a/drivers/net/ethernet/sfc/efx.h b/drivers/net/ethernet/sfc/efx.h index 99032581336f..b41601e052d6 100644 --- a/drivers/net/ethernet/sfc/efx.h +++ b/drivers/net/ethernet/sfc/efx.h | |||
@@ -199,6 +199,9 @@ void efx_get_irq_moderation(struct efx_nic *efx, unsigned int *tx_usecs, | |||
199 | int efx_port_dummy_op_int(struct efx_nic *efx); | 199 | int efx_port_dummy_op_int(struct efx_nic *efx); |
200 | void efx_port_dummy_op_void(struct efx_nic *efx); | 200 | void efx_port_dummy_op_void(struct efx_nic *efx); |
201 | 201 | ||
202 | /* Update the generic software stats in the passed stats array */ | ||
203 | void efx_update_sw_stats(struct efx_nic *efx, u64 *stats); | ||
204 | |||
202 | /* MTD */ | 205 | /* MTD */ |
203 | #ifdef CONFIG_SFC_MTD | 206 | #ifdef CONFIG_SFC_MTD |
204 | int efx_mtd_add(struct efx_nic *efx, struct efx_mtd_partition *parts, | 207 | int efx_mtd_add(struct efx_nic *efx, struct efx_mtd_partition *parts, |
diff --git a/drivers/net/ethernet/sfc/ethtool.c b/drivers/net/ethernet/sfc/ethtool.c index 74739c4b9997..03fe4e715024 100644 --- a/drivers/net/ethernet/sfc/ethtool.c +++ b/drivers/net/ethernet/sfc/ethtool.c | |||
@@ -77,7 +77,6 @@ static const struct efx_sw_stat_desc efx_sw_stat_desc[] = { | |||
77 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tcp_udp_chksum_err), | 77 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tcp_udp_chksum_err), |
78 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_mcast_mismatch), | 78 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_mcast_mismatch), |
79 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_frm_trunc), | 79 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_frm_trunc), |
80 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_nodesc_trunc), | ||
81 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_merge_events), | 80 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_merge_events), |
82 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_merge_packets), | 81 | EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_merge_packets), |
83 | }; | 82 | }; |
diff --git a/drivers/net/ethernet/sfc/falcon.c b/drivers/net/ethernet/sfc/falcon.c index fae25a418647..157037546d30 100644 --- a/drivers/net/ethernet/sfc/falcon.c +++ b/drivers/net/ethernet/sfc/falcon.c | |||
@@ -142,6 +142,8 @@ | |||
142 | hw_name ## _ ## offset } | 142 | hw_name ## _ ## offset } |
143 | #define FALCON_OTHER_STAT(ext_name) \ | 143 | #define FALCON_OTHER_STAT(ext_name) \ |
144 | [FALCON_STAT_ ## ext_name] = { #ext_name, 0, 0 } | 144 | [FALCON_STAT_ ## ext_name] = { #ext_name, 0, 0 } |
145 | #define GENERIC_SW_STAT(ext_name) \ | ||
146 | [GENERIC_STAT_ ## ext_name] = { #ext_name, 0, 0 } | ||
145 | 147 | ||
146 | static const struct efx_hw_stat_desc falcon_stat_desc[FALCON_STAT_COUNT] = { | 148 | static const struct efx_hw_stat_desc falcon_stat_desc[FALCON_STAT_COUNT] = { |
147 | FALCON_DMA_STAT(tx_bytes, XgTxOctets), | 149 | FALCON_DMA_STAT(tx_bytes, XgTxOctets), |
@@ -191,6 +193,8 @@ static const struct efx_hw_stat_desc falcon_stat_desc[FALCON_STAT_COUNT] = { | |||
191 | FALCON_DMA_STAT(rx_length_error, XgRxLengthError), | 193 | FALCON_DMA_STAT(rx_length_error, XgRxLengthError), |
192 | FALCON_DMA_STAT(rx_internal_error, XgRxInternalMACError), | 194 | FALCON_DMA_STAT(rx_internal_error, XgRxInternalMACError), |
193 | FALCON_OTHER_STAT(rx_nodesc_drop_cnt), | 195 | FALCON_OTHER_STAT(rx_nodesc_drop_cnt), |
196 | GENERIC_SW_STAT(rx_nodesc_trunc), | ||
197 | GENERIC_SW_STAT(rx_noskb_drops), | ||
194 | }; | 198 | }; |
195 | static const unsigned long falcon_stat_mask[] = { | 199 | static const unsigned long falcon_stat_mask[] = { |
196 | [0 ... BITS_TO_LONGS(FALCON_STAT_COUNT) - 1] = ~0UL, | 200 | [0 ... BITS_TO_LONGS(FALCON_STAT_COUNT) - 1] = ~0UL, |
@@ -2574,6 +2578,7 @@ static size_t falcon_update_nic_stats(struct efx_nic *efx, u64 *full_stats, | |||
2574 | stats[FALCON_STAT_rx_bytes] - | 2578 | stats[FALCON_STAT_rx_bytes] - |
2575 | stats[FALCON_STAT_rx_good_bytes] - | 2579 | stats[FALCON_STAT_rx_good_bytes] - |
2576 | stats[FALCON_STAT_rx_control] * 64); | 2580 | stats[FALCON_STAT_rx_control] * 64); |
2581 | efx_update_sw_stats(efx, stats); | ||
2577 | } | 2582 | } |
2578 | 2583 | ||
2579 | if (full_stats) | 2584 | if (full_stats) |
@@ -2584,7 +2589,9 @@ static size_t falcon_update_nic_stats(struct efx_nic *efx, u64 *full_stats, | |||
2584 | core_stats->tx_packets = stats[FALCON_STAT_tx_packets]; | 2589 | core_stats->tx_packets = stats[FALCON_STAT_tx_packets]; |
2585 | core_stats->rx_bytes = stats[FALCON_STAT_rx_bytes]; | 2590 | core_stats->rx_bytes = stats[FALCON_STAT_rx_bytes]; |
2586 | core_stats->tx_bytes = stats[FALCON_STAT_tx_bytes]; | 2591 | core_stats->tx_bytes = stats[FALCON_STAT_tx_bytes]; |
2587 | core_stats->rx_dropped = stats[FALCON_STAT_rx_nodesc_drop_cnt]; | 2592 | core_stats->rx_dropped = stats[FALCON_STAT_rx_nodesc_drop_cnt] + |
2593 | stats[GENERIC_STAT_rx_nodesc_trunc] + | ||
2594 | stats[GENERIC_STAT_rx_noskb_drops]; | ||
2588 | core_stats->multicast = stats[FALCON_STAT_rx_multicast]; | 2595 | core_stats->multicast = stats[FALCON_STAT_rx_multicast]; |
2589 | core_stats->rx_length_errors = | 2596 | core_stats->rx_length_errors = |
2590 | stats[FALCON_STAT_rx_gtjumbo] + | 2597 | stats[FALCON_STAT_rx_gtjumbo] + |
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h index 5bdae8ed7c57..8a02d45ed667 100644 --- a/drivers/net/ethernet/sfc/net_driver.h +++ b/drivers/net/ethernet/sfc/net_driver.h | |||
@@ -777,6 +777,7 @@ struct vfdi_status; | |||
777 | * interrupt has occurred. | 777 | * interrupt has occurred. |
778 | * @stats_lock: Statistics update lock. Must be held when calling | 778 | * @stats_lock: Statistics update lock. Must be held when calling |
779 | * efx_nic_type::{update,start,stop}_stats. | 779 | * efx_nic_type::{update,start,stop}_stats. |
780 | * @n_rx_noskb_drops: Count of RX packets dropped due to failure to allocate an skb | ||
780 | * | 781 | * |
781 | * This is stored in the private area of the &struct net_device. | 782 | * This is stored in the private area of the &struct net_device. |
782 | */ | 783 | */ |
@@ -930,6 +931,7 @@ struct efx_nic { | |||
930 | spinlock_t biu_lock; | 931 | spinlock_t biu_lock; |
931 | int last_irq_cpu; | 932 | int last_irq_cpu; |
932 | spinlock_t stats_lock; | 933 | spinlock_t stats_lock; |
934 | atomic_t n_rx_noskb_drops; | ||
933 | }; | 935 | }; |
934 | 936 | ||
935 | static inline int efx_dev_registered(struct efx_nic *efx) | 937 | static inline int efx_dev_registered(struct efx_nic *efx) |
diff --git a/drivers/net/ethernet/sfc/nic.h b/drivers/net/ethernet/sfc/nic.h index d3ad8ed8d901..60f85149fc4c 100644 --- a/drivers/net/ethernet/sfc/nic.h +++ b/drivers/net/ethernet/sfc/nic.h | |||
@@ -135,6 +135,13 @@ enum { | |||
135 | /* Size and alignment of buffer table entries (same) */ | 135 | /* Size and alignment of buffer table entries (same) */ |
136 | #define EFX_BUF_SIZE EFX_PAGE_SIZE | 136 | #define EFX_BUF_SIZE EFX_PAGE_SIZE |
137 | 137 | ||
138 | /* NIC-generic software stats */ | ||
139 | enum { | ||
140 | GENERIC_STAT_rx_noskb_drops, | ||
141 | GENERIC_STAT_rx_nodesc_trunc, | ||
142 | GENERIC_STAT_COUNT | ||
143 | }; | ||
144 | |||
138 | /** | 145 | /** |
139 | * struct falcon_board_type - board operations and type information | 146 | * struct falcon_board_type - board operations and type information |
140 | * @id: Board type id, as found in NVRAM | 147 | * @id: Board type id, as found in NVRAM |
@@ -205,7 +212,7 @@ static inline bool falcon_spi_present(const struct falcon_spi_device *spi) | |||
205 | } | 212 | } |
206 | 213 | ||
207 | enum { | 214 | enum { |
208 | FALCON_STAT_tx_bytes, | 215 | FALCON_STAT_tx_bytes = GENERIC_STAT_COUNT, |
209 | FALCON_STAT_tx_packets, | 216 | FALCON_STAT_tx_packets, |
210 | FALCON_STAT_tx_pause, | 217 | FALCON_STAT_tx_pause, |
211 | FALCON_STAT_tx_control, | 218 | FALCON_STAT_tx_control, |
@@ -290,7 +297,7 @@ static inline struct falcon_board *falcon_board(struct efx_nic *efx) | |||
290 | } | 297 | } |
291 | 298 | ||
292 | enum { | 299 | enum { |
293 | SIENA_STAT_tx_bytes, | 300 | SIENA_STAT_tx_bytes = GENERIC_STAT_COUNT, |
294 | SIENA_STAT_tx_good_bytes, | 301 | SIENA_STAT_tx_good_bytes, |
295 | SIENA_STAT_tx_bad_bytes, | 302 | SIENA_STAT_tx_bad_bytes, |
296 | SIENA_STAT_tx_packets, | 303 | SIENA_STAT_tx_packets, |
@@ -361,7 +368,7 @@ struct siena_nic_data { | |||
361 | }; | 368 | }; |
362 | 369 | ||
363 | enum { | 370 | enum { |
364 | EF10_STAT_tx_bytes, | 371 | EF10_STAT_tx_bytes = GENERIC_STAT_COUNT, |
365 | EF10_STAT_tx_packets, | 372 | EF10_STAT_tx_packets, |
366 | EF10_STAT_tx_pause, | 373 | EF10_STAT_tx_pause, |
367 | EF10_STAT_tx_control, | 374 | EF10_STAT_tx_control, |
diff --git a/drivers/net/ethernet/sfc/rx.c b/drivers/net/ethernet/sfc/rx.c index 48588ddf81b0..bf537a2a901f 100644 --- a/drivers/net/ethernet/sfc/rx.c +++ b/drivers/net/ethernet/sfc/rx.c | |||
@@ -480,8 +480,10 @@ static struct sk_buff *efx_rx_mk_skb(struct efx_channel *channel, | |||
480 | skb = netdev_alloc_skb(efx->net_dev, | 480 | skb = netdev_alloc_skb(efx->net_dev, |
481 | efx->rx_ip_align + efx->rx_prefix_size + | 481 | efx->rx_ip_align + efx->rx_prefix_size + |
482 | hdr_len); | 482 | hdr_len); |
483 | if (unlikely(skb == NULL)) | 483 | if (unlikely(skb == NULL)) { |
484 | atomic_inc(&efx->n_rx_noskb_drops); | ||
484 | return NULL; | 485 | return NULL; |
486 | } | ||
485 | 487 | ||
486 | EFX_BUG_ON_PARANOID(rx_buf->len < hdr_len); | 488 | EFX_BUG_ON_PARANOID(rx_buf->len < hdr_len); |
487 | 489 | ||
diff --git a/drivers/net/ethernet/sfc/siena.c b/drivers/net/ethernet/sfc/siena.c index 50ffefed492c..ae696855f21a 100644 --- a/drivers/net/ethernet/sfc/siena.c +++ b/drivers/net/ethernet/sfc/siena.c | |||
@@ -424,6 +424,8 @@ static void siena_remove_nic(struct efx_nic *efx) | |||
424 | { #ext_name, 64, 8 * MC_CMD_MAC_ ## mcdi_name } | 424 | { #ext_name, 64, 8 * MC_CMD_MAC_ ## mcdi_name } |
425 | #define SIENA_OTHER_STAT(ext_name) \ | 425 | #define SIENA_OTHER_STAT(ext_name) \ |
426 | [SIENA_STAT_ ## ext_name] = { #ext_name, 0, 0 } | 426 | [SIENA_STAT_ ## ext_name] = { #ext_name, 0, 0 } |
427 | #define GENERIC_SW_STAT(ext_name) \ | ||
428 | [GENERIC_STAT_ ## ext_name] = { #ext_name, 0, 0 } | ||
427 | 429 | ||
428 | static const struct efx_hw_stat_desc siena_stat_desc[SIENA_STAT_COUNT] = { | 430 | static const struct efx_hw_stat_desc siena_stat_desc[SIENA_STAT_COUNT] = { |
429 | SIENA_DMA_STAT(tx_bytes, TX_BYTES), | 431 | SIENA_DMA_STAT(tx_bytes, TX_BYTES), |
@@ -483,6 +485,8 @@ static const struct efx_hw_stat_desc siena_stat_desc[SIENA_STAT_COUNT] = { | |||
483 | SIENA_DMA_STAT(rx_length_error, RX_LENGTH_ERROR_PKTS), | 485 | SIENA_DMA_STAT(rx_length_error, RX_LENGTH_ERROR_PKTS), |
484 | SIENA_DMA_STAT(rx_internal_error, RX_INTERNAL_ERROR_PKTS), | 486 | SIENA_DMA_STAT(rx_internal_error, RX_INTERNAL_ERROR_PKTS), |
485 | SIENA_DMA_STAT(rx_nodesc_drop_cnt, RX_NODESC_DROPS), | 487 | SIENA_DMA_STAT(rx_nodesc_drop_cnt, RX_NODESC_DROPS), |
488 | GENERIC_SW_STAT(rx_nodesc_trunc), | ||
489 | GENERIC_SW_STAT(rx_noskb_drops), | ||
486 | }; | 490 | }; |
487 | static const unsigned long siena_stat_mask[] = { | 491 | static const unsigned long siena_stat_mask[] = { |
488 | [0 ... BITS_TO_LONGS(SIENA_STAT_COUNT) - 1] = ~0UL, | 492 | [0 ... BITS_TO_LONGS(SIENA_STAT_COUNT) - 1] = ~0UL, |
@@ -528,6 +532,7 @@ static int siena_try_update_nic_stats(struct efx_nic *efx) | |||
528 | efx_update_diff_stat(&stats[SIENA_STAT_rx_good_bytes], | 532 | efx_update_diff_stat(&stats[SIENA_STAT_rx_good_bytes], |
529 | stats[SIENA_STAT_rx_bytes] - | 533 | stats[SIENA_STAT_rx_bytes] - |
530 | stats[SIENA_STAT_rx_bad_bytes]); | 534 | stats[SIENA_STAT_rx_bad_bytes]); |
535 | efx_update_sw_stats(efx, stats); | ||
531 | return 0; | 536 | return 0; |
532 | } | 537 | } |
533 | 538 | ||
@@ -554,7 +559,9 @@ static size_t siena_update_nic_stats(struct efx_nic *efx, u64 *full_stats, | |||
554 | core_stats->tx_packets = stats[SIENA_STAT_tx_packets]; | 559 | core_stats->tx_packets = stats[SIENA_STAT_tx_packets]; |
555 | core_stats->rx_bytes = stats[SIENA_STAT_rx_bytes]; | 560 | core_stats->rx_bytes = stats[SIENA_STAT_rx_bytes]; |
556 | core_stats->tx_bytes = stats[SIENA_STAT_tx_bytes]; | 561 | core_stats->tx_bytes = stats[SIENA_STAT_tx_bytes]; |
557 | core_stats->rx_dropped = stats[SIENA_STAT_rx_nodesc_drop_cnt]; | 562 | core_stats->rx_dropped = stats[SIENA_STAT_rx_nodesc_drop_cnt] + |
563 | stats[GENERIC_STAT_rx_nodesc_trunc] + | ||
564 | stats[GENERIC_STAT_rx_noskb_drops]; | ||
558 | core_stats->multicast = stats[SIENA_STAT_rx_multicast]; | 565 | core_stats->multicast = stats[SIENA_STAT_rx_multicast]; |
559 | core_stats->collisions = stats[SIENA_STAT_tx_collision]; | 566 | core_stats->collisions = stats[SIENA_STAT_tx_collision]; |
560 | core_stats->rx_length_errors = | 567 | core_stats->rx_length_errors = |