diff options
author | Yitchak Gertner <gertner@broadcom.com> | 2008-08-13 18:49:05 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-08-13 19:01:31 -0400 |
commit | 66e855f3f5197fec1162c5235fdb5f92b956d618 (patch) | |
tree | 2f19f96c48f50cd703b66d35e19312b208acd3bd | |
parent | 1adcd8bee37f494e22aee856467e994ae086ae45 (diff) |
bnx2x: Statistics
Statistics
- Making sure that each drop is accounted for in the driver statistics
- Clearing the FW statistics when driver is loaded to prevent
inconsistency with HW statistics
- Once error is detected (bnx2x_panic_dump), stop the statistics
before other actions (currently it is stopped last and can corrupt
the data) - Adding HW checksum error counter to the statistics
- Removing unused variable stats_ticks
- Using macros instead of magic numbers to indicate which statistics are
shared per port and which are per function
Signed-off-by: Yitchak Gertner <gertner@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/bnx2x.h | 11 | ||||
-rw-r--r-- | drivers/net/bnx2x_fw_defs.h | 6 | ||||
-rw-r--r-- | drivers/net/bnx2x_main.c | 228 | ||||
-rw-r--r-- | drivers/net/bnx2x_reg.h | 3 |
4 files changed, 154 insertions, 94 deletions
diff --git a/drivers/net/bnx2x.h b/drivers/net/bnx2x.h index dc54602494fb..9cbf0e82ef38 100644 --- a/drivers/net/bnx2x.h +++ b/drivers/net/bnx2x.h | |||
@@ -258,8 +258,7 @@ struct bnx2x_fastpath { | |||
258 | 258 | ||
259 | unsigned long tx_pkt, | 259 | unsigned long tx_pkt, |
260 | rx_pkt, | 260 | rx_pkt, |
261 | rx_calls, | 261 | rx_calls; |
262 | rx_alloc_failed; | ||
263 | /* TPA related */ | 262 | /* TPA related */ |
264 | struct sw_rx_bd tpa_pool[ETH_MAX_AGGREGATION_QUEUES_E1H]; | 263 | struct sw_rx_bd tpa_pool[ETH_MAX_AGGREGATION_QUEUES_E1H]; |
265 | u8 tpa_state[ETH_MAX_AGGREGATION_QUEUES_E1H]; | 264 | u8 tpa_state[ETH_MAX_AGGREGATION_QUEUES_E1H]; |
@@ -655,6 +654,8 @@ struct bnx2x_eth_stats { | |||
655 | 654 | ||
656 | u32 brb_drop_hi; | 655 | u32 brb_drop_hi; |
657 | u32 brb_drop_lo; | 656 | u32 brb_drop_lo; |
657 | u32 brb_truncate_hi; | ||
658 | u32 brb_truncate_lo; | ||
658 | 659 | ||
659 | u32 jabber_packets_received; | 660 | u32 jabber_packets_received; |
660 | 661 | ||
@@ -671,6 +672,9 @@ struct bnx2x_eth_stats { | |||
671 | u32 mac_discard; | 672 | u32 mac_discard; |
672 | 673 | ||
673 | u32 driver_xoff; | 674 | u32 driver_xoff; |
675 | u32 rx_err_discard_pkt; | ||
676 | u32 rx_skb_alloc_failed; | ||
677 | u32 hw_csum_err; | ||
674 | }; | 678 | }; |
675 | 679 | ||
676 | #define STATS_OFFSET32(stat_name) \ | 680 | #define STATS_OFFSET32(stat_name) \ |
@@ -844,7 +848,6 @@ struct bnx2x { | |||
844 | u16 rx_ticks_int; | 848 | u16 rx_ticks_int; |
845 | u16 rx_ticks; | 849 | u16 rx_ticks; |
846 | 850 | ||
847 | u32 stats_ticks; | ||
848 | u32 lin_cnt; | 851 | u32 lin_cnt; |
849 | 852 | ||
850 | int state; | 853 | int state; |
@@ -984,7 +987,7 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms, | |||
984 | #define PCICFG_LINK_SPEED_SHIFT 16 | 987 | #define PCICFG_LINK_SPEED_SHIFT 16 |
985 | 988 | ||
986 | 989 | ||
987 | #define BNX2X_NUM_STATS 39 | 990 | #define BNX2X_NUM_STATS 42 |
988 | #define BNX2X_NUM_TESTS 8 | 991 | #define BNX2X_NUM_TESTS 8 |
989 | 992 | ||
990 | #define BNX2X_MAC_LOOPBACK 0 | 993 | #define BNX2X_MAC_LOOPBACK 0 |
diff --git a/drivers/net/bnx2x_fw_defs.h b/drivers/net/bnx2x_fw_defs.h index e3da7f69d27b..6e35761fc7dc 100644 --- a/drivers/net/bnx2x_fw_defs.h +++ b/drivers/net/bnx2x_fw_defs.h | |||
@@ -79,6 +79,9 @@ | |||
79 | #define TSTORM_MAC_FILTER_CONFIG_OFFSET(function) \ | 79 | #define TSTORM_MAC_FILTER_CONFIG_OFFSET(function) \ |
80 | (IS_E1H_OFFSET? (0x3008 + (function * 0x38)) : (0x1508 + \ | 80 | (IS_E1H_OFFSET? (0x3008 + (function * 0x38)) : (0x1508 + \ |
81 | (function * 0x38))) | 81 | (function * 0x38))) |
82 | #define TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, stats_counter_id) \ | ||
83 | (IS_E1H_OFFSET ? (0x2010 + (port * 0x5b0) + (stats_counter_id * \ | ||
84 | 0x50)) : (0x4000 + (port * 0x3f0) + (stats_counter_id * 0x38))) | ||
82 | #define TSTORM_RX_PRODS_OFFSET(port, client_id) \ | 85 | #define TSTORM_RX_PRODS_OFFSET(port, client_id) \ |
83 | (IS_E1H_OFFSET? (0x3350 + (port * 0x3e8) + (client_id * 0x28)) : \ | 86 | (IS_E1H_OFFSET? (0x3350 + (port * 0x3e8) + (client_id * 0x28)) : \ |
84 | (0x9c0 + (port * 0x2f8) + (client_id * 0x28))) | 87 | (0x9c0 + (port * 0x2f8) + (client_id * 0x28))) |
@@ -157,6 +160,9 @@ | |||
157 | (IS_E1H_OFFSET? 0x2ac8 : 0xffffffff) | 160 | (IS_E1H_OFFSET? 0x2ac8 : 0xffffffff) |
158 | #define XSTORM_HC_BTR_OFFSET(port) \ | 161 | #define XSTORM_HC_BTR_OFFSET(port) \ |
159 | (IS_E1H_OFFSET? (0xa144 + (port * 0x30)) : (0x1454 + (port * 0x18))) | 162 | (IS_E1H_OFFSET? (0xa144 + (port * 0x30)) : (0x1454 + (port * 0x18))) |
163 | #define XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, stats_counter_id) \ | ||
164 | (IS_E1H_OFFSET ? (0xc000 + (port * 0x3f0) + (stats_counter_id * \ | ||
165 | 0x38)) : (0x3378 + (port * 0x3f0) + (stats_counter_id * 0x38))) | ||
160 | #define XSTORM_RATE_SHAPING_PER_VN_VARS_OFFSET(function) \ | 166 | #define XSTORM_RATE_SHAPING_PER_VN_VARS_OFFSET(function) \ |
161 | (IS_E1H_OFFSET? (0x2528 + (function * 0x70)) : (0x3c20 + \ | 167 | (IS_E1H_OFFSET? (0x2528 + (function * 0x70)) : (0x3c20 + \ |
162 | (function * 0x70))) | 168 | (function * 0x70))) |
diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c index b9d376d972ca..ac46228cc9d0 100644 --- a/drivers/net/bnx2x_main.c +++ b/drivers/net/bnx2x_main.c | |||
@@ -501,6 +501,9 @@ static void bnx2x_panic_dump(struct bnx2x *bp) | |||
501 | int i; | 501 | int i; |
502 | u16 j, start, end; | 502 | u16 j, start, end; |
503 | 503 | ||
504 | bp->stats_state = STATS_STATE_DISABLED; | ||
505 | DP(BNX2X_MSG_STATS, "stats_state - DISABLED\n"); | ||
506 | |||
504 | BNX2X_ERR("begin crash dump -----------------\n"); | 507 | BNX2X_ERR("begin crash dump -----------------\n"); |
505 | 508 | ||
506 | for_each_queue(bp, i) { | 509 | for_each_queue(bp, i) { |
@@ -511,17 +514,20 @@ static void bnx2x_panic_dump(struct bnx2x *bp) | |||
511 | " tx_bd_prod(%x) tx_bd_cons(%x) *tx_cons_sb(%x)\n", | 514 | " tx_bd_prod(%x) tx_bd_cons(%x) *tx_cons_sb(%x)\n", |
512 | i, fp->tx_pkt_prod, fp->tx_pkt_cons, fp->tx_bd_prod, | 515 | i, fp->tx_pkt_prod, fp->tx_pkt_cons, fp->tx_bd_prod, |
513 | fp->tx_bd_cons, le16_to_cpu(*fp->tx_cons_sb)); | 516 | fp->tx_bd_cons, le16_to_cpu(*fp->tx_cons_sb)); |
514 | BNX2X_ERR(" rx_comp_prod(%x) rx_comp_cons(%x)" | 517 | BNX2X_ERR(" rx_bd_prod(%x) rx_bd_cons(%x)" |
515 | " *rx_cons_sb(%x) *rx_bd_cons_sb(%x)" | 518 | " *rx_bd_cons_sb(%x) rx_comp_prod(%x)" |
516 | " rx_sge_prod(%x) last_max_sge(%x)\n", | 519 | " rx_comp_cons(%x) *rx_cons_sb(%x)\n", |
517 | fp->rx_comp_prod, fp->rx_comp_cons, | 520 | fp->rx_bd_prod, fp->rx_bd_cons, |
518 | le16_to_cpu(*fp->rx_cons_sb), | 521 | le16_to_cpu(*fp->rx_bd_cons_sb), fp->rx_comp_prod, |
519 | le16_to_cpu(*fp->rx_bd_cons_sb), | 522 | fp->rx_comp_cons, le16_to_cpu(*fp->rx_cons_sb)); |
520 | fp->rx_sge_prod, fp->last_max_sge); | 523 | BNX2X_ERR(" rx_sge_prod(%x) last_max_sge(%x)" |
521 | BNX2X_ERR(" fp_c_idx(%x) fp_u_idx(%x)" | 524 | " fp_c_idx(%x) *sb_c_idx(%x) fp_u_idx(%x)" |
522 | " bd data(%x,%x) rx_alloc_failed(%lx)\n", | 525 | " *sb_u_idx(%x) bd data(%x,%x)\n", |
523 | fp->fp_c_idx, fp->fp_u_idx, hw_prods->packets_prod, | 526 | fp->rx_sge_prod, fp->last_max_sge, fp->fp_c_idx, |
524 | hw_prods->bds_prod, fp->rx_alloc_failed); | 527 | fp->status_blk->c_status_block.status_block_index, |
528 | fp->fp_u_idx, | ||
529 | fp->status_blk->u_status_block.status_block_index, | ||
530 | hw_prods->packets_prod, hw_prods->bds_prod); | ||
525 | 531 | ||
526 | start = TX_BD(le16_to_cpu(*fp->tx_cons_sb) - 10); | 532 | start = TX_BD(le16_to_cpu(*fp->tx_cons_sb) - 10); |
527 | end = TX_BD(le16_to_cpu(*fp->tx_cons_sb) + 245); | 533 | end = TX_BD(le16_to_cpu(*fp->tx_cons_sb) + 245); |
@@ -580,9 +586,6 @@ static void bnx2x_panic_dump(struct bnx2x *bp) | |||
580 | bnx2x_fw_dump(bp); | 586 | bnx2x_fw_dump(bp); |
581 | bnx2x_mc_assert(bp); | 587 | bnx2x_mc_assert(bp); |
582 | BNX2X_ERR("end crash dump -----------------\n"); | 588 | BNX2X_ERR("end crash dump -----------------\n"); |
583 | |||
584 | bp->stats_state = STATS_STATE_DISABLED; | ||
585 | DP(BNX2X_MSG_STATS, "stats_state - DISABLED\n"); | ||
586 | } | 589 | } |
587 | 590 | ||
588 | static void bnx2x_int_enable(struct bnx2x *bp) | 591 | static void bnx2x_int_enable(struct bnx2x *bp) |
@@ -1259,7 +1262,7 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp, | |||
1259 | where we are and drop the whole packet */ | 1262 | where we are and drop the whole packet */ |
1260 | err = bnx2x_alloc_rx_sge(bp, fp, sge_idx); | 1263 | err = bnx2x_alloc_rx_sge(bp, fp, sge_idx); |
1261 | if (unlikely(err)) { | 1264 | if (unlikely(err)) { |
1262 | fp->rx_alloc_failed++; | 1265 | bp->eth_stats.rx_skb_alloc_failed++; |
1263 | return err; | 1266 | return err; |
1264 | } | 1267 | } |
1265 | 1268 | ||
@@ -1295,14 +1298,13 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp, | |||
1295 | pci_unmap_single(bp->pdev, pci_unmap_addr(rx_buf, mapping), | 1298 | pci_unmap_single(bp->pdev, pci_unmap_addr(rx_buf, mapping), |
1296 | bp->rx_buf_use_size, PCI_DMA_FROMDEVICE); | 1299 | bp->rx_buf_use_size, PCI_DMA_FROMDEVICE); |
1297 | 1300 | ||
1298 | /* if alloc failed drop the packet and keep the buffer in the bin */ | ||
1299 | if (likely(new_skb)) { | 1301 | if (likely(new_skb)) { |
1302 | /* fix ip xsum and give it to the stack */ | ||
1303 | /* (no need to map the new skb) */ | ||
1300 | 1304 | ||
1301 | prefetch(skb); | 1305 | prefetch(skb); |
1302 | prefetch(((char *)(skb)) + 128); | 1306 | prefetch(((char *)(skb)) + 128); |
1303 | 1307 | ||
1304 | /* else fix ip xsum and give it to the stack */ | ||
1305 | /* (no need to map the new skb) */ | ||
1306 | #ifdef BNX2X_STOP_ON_ERROR | 1308 | #ifdef BNX2X_STOP_ON_ERROR |
1307 | if (pad + len > bp->rx_buf_size) { | 1309 | if (pad + len > bp->rx_buf_size) { |
1308 | BNX2X_ERR("skb_put is about to fail... " | 1310 | BNX2X_ERR("skb_put is about to fail... " |
@@ -1351,9 +1353,10 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp, | |||
1351 | fp->tpa_pool[queue].skb = new_skb; | 1353 | fp->tpa_pool[queue].skb = new_skb; |
1352 | 1354 | ||
1353 | } else { | 1355 | } else { |
1356 | /* else drop the packet and keep the buffer in the bin */ | ||
1354 | DP(NETIF_MSG_RX_STATUS, | 1357 | DP(NETIF_MSG_RX_STATUS, |
1355 | "Failed to allocate new skb - dropping packet!\n"); | 1358 | "Failed to allocate new skb - dropping packet!\n"); |
1356 | fp->rx_alloc_failed++; | 1359 | bp->eth_stats.rx_skb_alloc_failed++; |
1357 | } | 1360 | } |
1358 | 1361 | ||
1359 | fp->tpa_state[queue] = BNX2X_TPA_STOP; | 1362 | fp->tpa_state[queue] = BNX2X_TPA_STOP; |
@@ -1504,7 +1507,7 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) | |||
1504 | DP(NETIF_MSG_RX_ERR, | 1507 | DP(NETIF_MSG_RX_ERR, |
1505 | "ERROR flags %x rx packet %u\n", | 1508 | "ERROR flags %x rx packet %u\n", |
1506 | cqe_fp_flags, sw_comp_cons); | 1509 | cqe_fp_flags, sw_comp_cons); |
1507 | /* TBD make sure MC counts this as a drop */ | 1510 | bp->eth_stats.rx_err_discard_pkt++; |
1508 | goto reuse_rx; | 1511 | goto reuse_rx; |
1509 | } | 1512 | } |
1510 | 1513 | ||
@@ -1521,7 +1524,7 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) | |||
1521 | DP(NETIF_MSG_RX_ERR, | 1524 | DP(NETIF_MSG_RX_ERR, |
1522 | "ERROR packet dropped " | 1525 | "ERROR packet dropped " |
1523 | "because of alloc failure\n"); | 1526 | "because of alloc failure\n"); |
1524 | fp->rx_alloc_failed++; | 1527 | bp->eth_stats.rx_skb_alloc_failed++; |
1525 | goto reuse_rx; | 1528 | goto reuse_rx; |
1526 | } | 1529 | } |
1527 | 1530 | ||
@@ -1547,7 +1550,7 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) | |||
1547 | DP(NETIF_MSG_RX_ERR, | 1550 | DP(NETIF_MSG_RX_ERR, |
1548 | "ERROR packet dropped because " | 1551 | "ERROR packet dropped because " |
1549 | "of alloc failure\n"); | 1552 | "of alloc failure\n"); |
1550 | fp->rx_alloc_failed++; | 1553 | bp->eth_stats.rx_skb_alloc_failed++; |
1551 | reuse_rx: | 1554 | reuse_rx: |
1552 | bnx2x_reuse_rx_skb(fp, skb, bd_cons, bd_prod); | 1555 | bnx2x_reuse_rx_skb(fp, skb, bd_cons, bd_prod); |
1553 | goto next_rx; | 1556 | goto next_rx; |
@@ -1556,10 +1559,12 @@ reuse_rx: | |||
1556 | skb->protocol = eth_type_trans(skb, bp->dev); | 1559 | skb->protocol = eth_type_trans(skb, bp->dev); |
1557 | 1560 | ||
1558 | skb->ip_summed = CHECKSUM_NONE; | 1561 | skb->ip_summed = CHECKSUM_NONE; |
1559 | if (bp->rx_csum) | 1562 | if (bp->rx_csum) { |
1560 | if (likely(BNX2X_RX_CSUM_OK(cqe))) | 1563 | if (likely(BNX2X_RX_CSUM_OK(cqe))) |
1561 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 1564 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
1562 | 1565 | else | |
1566 | bp->eth_stats.hw_csum_err++; | ||
1567 | } | ||
1563 | } | 1568 | } |
1564 | 1569 | ||
1565 | #ifdef BCM_VLAN | 1570 | #ifdef BCM_VLAN |
@@ -3039,6 +3044,8 @@ static void bnx2x_stats_init(struct bnx2x *bp) | |||
3039 | memset(&(bp->port.old_nig_stats), 0, sizeof(struct nig_stats)); | 3044 | memset(&(bp->port.old_nig_stats), 0, sizeof(struct nig_stats)); |
3040 | bp->port.old_nig_stats.brb_discard = | 3045 | bp->port.old_nig_stats.brb_discard = |
3041 | REG_RD(bp, NIG_REG_STAT0_BRB_DISCARD + port*0x38); | 3046 | REG_RD(bp, NIG_REG_STAT0_BRB_DISCARD + port*0x38); |
3047 | bp->port.old_nig_stats.brb_truncate = | ||
3048 | REG_RD(bp, NIG_REG_STAT0_BRB_TRUNCATE + port*0x38); | ||
3042 | REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT0 + port*0x50, | 3049 | REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT0 + port*0x50, |
3043 | &(bp->port.old_nig_stats.egress_mac_pkt0_lo), 2); | 3050 | &(bp->port.old_nig_stats.egress_mac_pkt0_lo), 2); |
3044 | REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT1 + port*0x50, | 3051 | REG_RD_DMAE(bp, NIG_REG_STAT0_EGRESS_MAC_PKT1 + port*0x50, |
@@ -3458,8 +3465,7 @@ static void bnx2x_bmac_stats_update(struct bnx2x *bp) | |||
3458 | UPDATE_STAT64(rx_stat_grovr, rx_stat_dot3statsframestoolong); | 3465 | UPDATE_STAT64(rx_stat_grovr, rx_stat_dot3statsframestoolong); |
3459 | UPDATE_STAT64(rx_stat_grfrg, rx_stat_etherstatsfragments); | 3466 | UPDATE_STAT64(rx_stat_grfrg, rx_stat_etherstatsfragments); |
3460 | UPDATE_STAT64(rx_stat_grjbr, rx_stat_etherstatsjabbers); | 3467 | UPDATE_STAT64(rx_stat_grjbr, rx_stat_etherstatsjabbers); |
3461 | UPDATE_STAT64(rx_stat_grxpf, rx_stat_bmac_xpf); | 3468 | UPDATE_STAT64(rx_stat_grxcf, rx_stat_maccontrolframesreceived); |
3462 | UPDATE_STAT64(rx_stat_grxcf, rx_stat_bmac_xcf); | ||
3463 | UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffstateentered); | 3469 | UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffstateentered); |
3464 | UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffpauseframesreceived); | 3470 | UPDATE_STAT64(rx_stat_grxpf, rx_stat_xoffpauseframesreceived); |
3465 | UPDATE_STAT64(tx_stat_gtxpf, tx_stat_outxoffsent); | 3471 | UPDATE_STAT64(tx_stat_gtxpf, tx_stat_outxoffsent); |
@@ -3543,6 +3549,8 @@ static int bnx2x_hw_stats_update(struct bnx2x *bp) | |||
3543 | 3549 | ||
3544 | ADD_EXTEND_64(pstats->brb_drop_hi, pstats->brb_drop_lo, | 3550 | ADD_EXTEND_64(pstats->brb_drop_hi, pstats->brb_drop_lo, |
3545 | new->brb_discard - old->brb_discard); | 3551 | new->brb_discard - old->brb_discard); |
3552 | ADD_EXTEND_64(estats->brb_truncate_hi, estats->brb_truncate_lo, | ||
3553 | new->brb_truncate - old->brb_truncate); | ||
3546 | 3554 | ||
3547 | UPDATE_STAT64_NIG(egress_mac_pkt0, | 3555 | UPDATE_STAT64_NIG(egress_mac_pkt0, |
3548 | etherstatspkts1024octetsto1522octets); | 3556 | etherstatspkts1024octetsto1522octets); |
@@ -3720,8 +3728,7 @@ static void bnx2x_net_stats_update(struct bnx2x *bp) | |||
3720 | nstats->rx_length_errors = | 3728 | nstats->rx_length_errors = |
3721 | estats->rx_stat_etherstatsundersizepkts_lo + | 3729 | estats->rx_stat_etherstatsundersizepkts_lo + |
3722 | estats->jabber_packets_received; | 3730 | estats->jabber_packets_received; |
3723 | nstats->rx_over_errors = estats->brb_drop_lo + | 3731 | nstats->rx_over_errors = estats->brb_drop_lo + estats->brb_truncate_lo; |
3724 | estats->brb_truncate_discard; | ||
3725 | nstats->rx_crc_errors = estats->rx_stat_dot3statsfcserrors_lo; | 3732 | nstats->rx_crc_errors = estats->rx_stat_dot3statsfcserrors_lo; |
3726 | nstats->rx_frame_errors = estats->rx_stat_dot3statsalignmenterrors_lo; | 3733 | nstats->rx_frame_errors = estats->rx_stat_dot3statsalignmenterrors_lo; |
3727 | nstats->rx_fifo_errors = old_tclient->no_buff_discard; | 3734 | nstats->rx_fifo_errors = old_tclient->no_buff_discard; |
@@ -4201,6 +4208,7 @@ static void bnx2x_init_def_sb(struct bnx2x *bp, | |||
4201 | XSTORM_DEF_SB_HC_DISABLE_OFFSET(func, index), 1); | 4208 | XSTORM_DEF_SB_HC_DISABLE_OFFSET(func, index), 1); |
4202 | 4209 | ||
4203 | bp->stats_pending = 0; | 4210 | bp->stats_pending = 0; |
4211 | bp->set_mac_pending = 0; | ||
4204 | 4212 | ||
4205 | bnx2x_ack_sb(bp, sb_id, CSTORM_ID, 0, IGU_INT_ENABLE, 0); | 4213 | bnx2x_ack_sb(bp, sb_id, CSTORM_ID, 0, IGU_INT_ENABLE, 0); |
4206 | } | 4214 | } |
@@ -4370,13 +4378,13 @@ static void bnx2x_init_rx_rings(struct bnx2x *bp) | |||
4370 | fp->rx_sge_prod = ring_prod; | 4378 | fp->rx_sge_prod = ring_prod; |
4371 | 4379 | ||
4372 | /* Allocate BDs and initialize BD ring */ | 4380 | /* Allocate BDs and initialize BD ring */ |
4373 | fp->rx_comp_cons = fp->rx_alloc_failed = 0; | 4381 | fp->rx_comp_cons = 0; |
4374 | cqe_ring_prod = ring_prod = 0; | 4382 | cqe_ring_prod = ring_prod = 0; |
4375 | for (i = 0; i < bp->rx_ring_size; i++) { | 4383 | for (i = 0; i < bp->rx_ring_size; i++) { |
4376 | if (bnx2x_alloc_rx_skb(bp, fp, ring_prod) < 0) { | 4384 | if (bnx2x_alloc_rx_skb(bp, fp, ring_prod) < 0) { |
4377 | BNX2X_ERR("was only able to allocate " | 4385 | BNX2X_ERR("was only able to allocate " |
4378 | "%d rx skbs\n", i); | 4386 | "%d rx skbs\n", i); |
4379 | fp->rx_alloc_failed++; | 4387 | bp->eth_stats.rx_skb_alloc_failed++; |
4380 | break; | 4388 | break; |
4381 | } | 4389 | } |
4382 | ring_prod = NEXT_RX_IDX(ring_prod); | 4390 | ring_prod = NEXT_RX_IDX(ring_prod); |
@@ -4542,7 +4550,7 @@ static void bnx2x_set_client_config(struct bnx2x *bp) | |||
4542 | int i; | 4550 | int i; |
4543 | 4551 | ||
4544 | tstorm_client.mtu = bp->dev->mtu + ETH_OVREHEAD; | 4552 | tstorm_client.mtu = bp->dev->mtu + ETH_OVREHEAD; |
4545 | tstorm_client.statistics_counter_id = 0; | 4553 | tstorm_client.statistics_counter_id = BP_CL_ID(bp); |
4546 | tstorm_client.config_flags = | 4554 | tstorm_client.config_flags = |
4547 | TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE; | 4555 | TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE; |
4548 | #ifdef BCM_VLAN | 4556 | #ifdef BCM_VLAN |
@@ -4649,25 +4657,50 @@ static void bnx2x_init_internal(struct bnx2x *bp) | |||
4649 | bp->rx_mode = BNX2X_RX_MODE_NONE; /* no rx until link is up */ | 4657 | bp->rx_mode = BNX2X_RX_MODE_NONE; /* no rx until link is up */ |
4650 | bnx2x_set_storm_rx_mode(bp); | 4658 | bnx2x_set_storm_rx_mode(bp); |
4651 | 4659 | ||
4660 | /* reset xstorm per client statistics */ | ||
4661 | for (i = 0; i < sizeof(struct xstorm_per_client_stats) / 4; i++) { | ||
4662 | REG_WR(bp, BAR_XSTRORM_INTMEM + | ||
4663 | XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, BP_CL_ID(bp)) + | ||
4664 | i*4, 0); | ||
4665 | } | ||
4666 | /* reset tstorm per client statistics */ | ||
4667 | for (i = 0; i < sizeof(struct tstorm_per_client_stats) / 4; i++) { | ||
4668 | REG_WR(bp, BAR_TSTRORM_INTMEM + | ||
4669 | TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, BP_CL_ID(bp)) + | ||
4670 | i*4, 0); | ||
4671 | } | ||
4672 | |||
4673 | /* Init statistics related context */ | ||
4652 | stats_flags.collect_eth = 1; | 4674 | stats_flags.collect_eth = 1; |
4653 | 4675 | ||
4654 | REG_WR(bp, BAR_XSTRORM_INTMEM + XSTORM_STATS_FLAGS_OFFSET(port), | 4676 | REG_WR(bp, BAR_XSTRORM_INTMEM + XSTORM_STATS_FLAGS_OFFSET(func), |
4655 | ((u32 *)&stats_flags)[0]); | 4677 | ((u32 *)&stats_flags)[0]); |
4656 | REG_WR(bp, BAR_XSTRORM_INTMEM + XSTORM_STATS_FLAGS_OFFSET(port) + 4, | 4678 | REG_WR(bp, BAR_XSTRORM_INTMEM + XSTORM_STATS_FLAGS_OFFSET(func) + 4, |
4657 | ((u32 *)&stats_flags)[1]); | 4679 | ((u32 *)&stats_flags)[1]); |
4658 | 4680 | ||
4659 | REG_WR(bp, BAR_TSTRORM_INTMEM + TSTORM_STATS_FLAGS_OFFSET(port), | 4681 | REG_WR(bp, BAR_TSTRORM_INTMEM + TSTORM_STATS_FLAGS_OFFSET(func), |
4660 | ((u32 *)&stats_flags)[0]); | 4682 | ((u32 *)&stats_flags)[0]); |
4661 | REG_WR(bp, BAR_TSTRORM_INTMEM + TSTORM_STATS_FLAGS_OFFSET(port) + 4, | 4683 | REG_WR(bp, BAR_TSTRORM_INTMEM + TSTORM_STATS_FLAGS_OFFSET(func) + 4, |
4662 | ((u32 *)&stats_flags)[1]); | 4684 | ((u32 *)&stats_flags)[1]); |
4663 | 4685 | ||
4664 | REG_WR(bp, BAR_CSTRORM_INTMEM + CSTORM_STATS_FLAGS_OFFSET(port), | 4686 | REG_WR(bp, BAR_CSTRORM_INTMEM + CSTORM_STATS_FLAGS_OFFSET(func), |
4665 | ((u32 *)&stats_flags)[0]); | 4687 | ((u32 *)&stats_flags)[0]); |
4666 | REG_WR(bp, BAR_CSTRORM_INTMEM + CSTORM_STATS_FLAGS_OFFSET(port) + 4, | 4688 | REG_WR(bp, BAR_CSTRORM_INTMEM + CSTORM_STATS_FLAGS_OFFSET(func) + 4, |
4667 | ((u32 *)&stats_flags)[1]); | 4689 | ((u32 *)&stats_flags)[1]); |
4668 | 4690 | ||
4669 | /* DP(NETIF_MSG_IFUP, "stats_flags: 0x%08x 0x%08x\n", | 4691 | REG_WR(bp, BAR_XSTRORM_INTMEM + |
4670 | ((u32 *)&stats_flags)[0], ((u32 *)&stats_flags)[1]); */ | 4692 | XSTORM_ETH_STATS_QUERY_ADDR_OFFSET(func), |
4693 | U64_LO(bnx2x_sp_mapping(bp, fw_stats))); | ||
4694 | REG_WR(bp, BAR_XSTRORM_INTMEM + | ||
4695 | XSTORM_ETH_STATS_QUERY_ADDR_OFFSET(func) + 4, | ||
4696 | U64_HI(bnx2x_sp_mapping(bp, fw_stats))); | ||
4697 | |||
4698 | REG_WR(bp, BAR_TSTRORM_INTMEM + | ||
4699 | TSTORM_ETH_STATS_QUERY_ADDR_OFFSET(func), | ||
4700 | U64_LO(bnx2x_sp_mapping(bp, fw_stats))); | ||
4701 | REG_WR(bp, BAR_TSTRORM_INTMEM + | ||
4702 | TSTORM_ETH_STATS_QUERY_ADDR_OFFSET(func) + 4, | ||
4703 | U64_HI(bnx2x_sp_mapping(bp, fw_stats))); | ||
4671 | 4704 | ||
4672 | if (CHIP_IS_E1H(bp)) { | 4705 | if (CHIP_IS_E1H(bp)) { |
4673 | REG_WR8(bp, BAR_XSTRORM_INTMEM + XSTORM_FUNCTION_MODE_OFFSET, | 4706 | REG_WR8(bp, BAR_XSTRORM_INTMEM + XSTORM_FUNCTION_MODE_OFFSET, |
@@ -7386,8 +7419,6 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) | |||
7386 | bp->tx_ticks = 50; | 7419 | bp->tx_ticks = 50; |
7387 | bp->rx_ticks = 25; | 7420 | bp->rx_ticks = 25; |
7388 | 7421 | ||
7389 | bp->stats_ticks = 1000000 & 0xffff00; | ||
7390 | |||
7391 | bp->timer_interval = (CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ); | 7422 | bp->timer_interval = (CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ); |
7392 | bp->current_interval = (poll ? poll : bp->timer_interval); | 7423 | bp->current_interval = (poll ? poll : bp->timer_interval); |
7393 | 7424 | ||
@@ -8137,7 +8168,6 @@ static int bnx2x_get_coalesce(struct net_device *dev, | |||
8137 | 8168 | ||
8138 | coal->rx_coalesce_usecs = bp->rx_ticks; | 8169 | coal->rx_coalesce_usecs = bp->rx_ticks; |
8139 | coal->tx_coalesce_usecs = bp->tx_ticks; | 8170 | coal->tx_coalesce_usecs = bp->tx_ticks; |
8140 | coal->stats_block_coalesce_usecs = bp->stats_ticks; | ||
8141 | 8171 | ||
8142 | return 0; | 8172 | return 0; |
8143 | } | 8173 | } |
@@ -8155,11 +8185,6 @@ static int bnx2x_set_coalesce(struct net_device *dev, | |||
8155 | if (bp->tx_ticks > 0x3000) | 8185 | if (bp->tx_ticks > 0x3000) |
8156 | bp->tx_ticks = 0x3000; | 8186 | bp->tx_ticks = 0x3000; |
8157 | 8187 | ||
8158 | bp->stats_ticks = coal->stats_block_coalesce_usecs; | ||
8159 | if (bp->stats_ticks > 0xffff00) | ||
8160 | bp->stats_ticks = 0xffff00; | ||
8161 | bp->stats_ticks &= 0xffff00; | ||
8162 | |||
8163 | if (netif_running(dev)) | 8188 | if (netif_running(dev)) |
8164 | bnx2x_update_coalesce(bp); | 8189 | bnx2x_update_coalesce(bp); |
8165 | 8190 | ||
@@ -8836,76 +8861,99 @@ static const struct { | |||
8836 | long offset; | 8861 | long offset; |
8837 | int size; | 8862 | int size; |
8838 | u32 flags; | 8863 | u32 flags; |
8839 | char string[ETH_GSTRING_LEN]; | 8864 | #define STATS_FLAGS_PORT 1 |
8865 | #define STATS_FLAGS_FUNC 2 | ||
8866 | u8 string[ETH_GSTRING_LEN]; | ||
8840 | } bnx2x_stats_arr[BNX2X_NUM_STATS] = { | 8867 | } bnx2x_stats_arr[BNX2X_NUM_STATS] = { |
8841 | /* 1 */ { STATS_OFFSET32(valid_bytes_received_hi), 8, 1, "rx_bytes" }, | 8868 | /* 1 */ { STATS_OFFSET32(valid_bytes_received_hi), |
8842 | { STATS_OFFSET32(error_bytes_received_hi), 8, 1, "rx_error_bytes" }, | 8869 | 8, STATS_FLAGS_FUNC, "rx_bytes" }, |
8843 | { STATS_OFFSET32(total_bytes_transmitted_hi), 8, 1, "tx_bytes" }, | 8870 | { STATS_OFFSET32(error_bytes_received_hi), |
8844 | { STATS_OFFSET32(tx_stat_ifhcoutbadoctets_hi), 8, 0, "tx_error_bytes" }, | 8871 | 8, STATS_FLAGS_FUNC, "rx_error_bytes" }, |
8872 | { STATS_OFFSET32(total_bytes_transmitted_hi), | ||
8873 | 8, STATS_FLAGS_FUNC, "tx_bytes" }, | ||
8874 | { STATS_OFFSET32(tx_stat_ifhcoutbadoctets_hi), | ||
8875 | 8, STATS_FLAGS_PORT, "tx_error_bytes" }, | ||
8845 | { STATS_OFFSET32(total_unicast_packets_received_hi), | 8876 | { STATS_OFFSET32(total_unicast_packets_received_hi), |
8846 | 8, 1, "rx_ucast_packets" }, | 8877 | 8, STATS_FLAGS_FUNC, "rx_ucast_packets" }, |
8847 | { STATS_OFFSET32(total_multicast_packets_received_hi), | 8878 | { STATS_OFFSET32(total_multicast_packets_received_hi), |
8848 | 8, 1, "rx_mcast_packets" }, | 8879 | 8, STATS_FLAGS_FUNC, "rx_mcast_packets" }, |
8849 | { STATS_OFFSET32(total_broadcast_packets_received_hi), | 8880 | { STATS_OFFSET32(total_broadcast_packets_received_hi), |
8850 | 8, 1, "rx_bcast_packets" }, | 8881 | 8, STATS_FLAGS_FUNC, "rx_bcast_packets" }, |
8851 | { STATS_OFFSET32(total_unicast_packets_transmitted_hi), | 8882 | { STATS_OFFSET32(total_unicast_packets_transmitted_hi), |
8852 | 8, 1, "tx_packets" }, | 8883 | 8, STATS_FLAGS_FUNC, "tx_packets" }, |
8853 | { STATS_OFFSET32(tx_stat_dot3statsinternalmactransmiterrors_hi), | 8884 | { STATS_OFFSET32(tx_stat_dot3statsinternalmactransmiterrors_hi), |
8854 | 8, 0, "tx_mac_errors" }, | 8885 | 8, STATS_FLAGS_PORT, "tx_mac_errors" }, |
8855 | /* 10 */{ STATS_OFFSET32(rx_stat_dot3statscarriersenseerrors_hi), | 8886 | /* 10 */{ STATS_OFFSET32(rx_stat_dot3statscarriersenseerrors_hi), |
8856 | 8, 0, "tx_carrier_errors" }, | 8887 | 8, STATS_FLAGS_PORT, "tx_carrier_errors" }, |
8857 | { STATS_OFFSET32(rx_stat_dot3statsfcserrors_hi), | 8888 | { STATS_OFFSET32(rx_stat_dot3statsfcserrors_hi), |
8858 | 8, 0, "rx_crc_errors" }, | 8889 | 8, STATS_FLAGS_PORT, "rx_crc_errors" }, |
8859 | { STATS_OFFSET32(rx_stat_dot3statsalignmenterrors_hi), | 8890 | { STATS_OFFSET32(rx_stat_dot3statsalignmenterrors_hi), |
8860 | 8, 0, "rx_align_errors" }, | 8891 | 8, STATS_FLAGS_PORT, "rx_align_errors" }, |
8861 | { STATS_OFFSET32(tx_stat_dot3statssinglecollisionframes_hi), | 8892 | { STATS_OFFSET32(tx_stat_dot3statssinglecollisionframes_hi), |
8862 | 8, 0, "tx_single_collisions" }, | 8893 | 8, STATS_FLAGS_PORT, "tx_single_collisions" }, |
8863 | { STATS_OFFSET32(tx_stat_dot3statsmultiplecollisionframes_hi), | 8894 | { STATS_OFFSET32(tx_stat_dot3statsmultiplecollisionframes_hi), |
8864 | 8, 0, "tx_multi_collisions" }, | 8895 | 8, STATS_FLAGS_PORT, "tx_multi_collisions" }, |
8865 | { STATS_OFFSET32(tx_stat_dot3statsdeferredtransmissions_hi), | 8896 | { STATS_OFFSET32(tx_stat_dot3statsdeferredtransmissions_hi), |
8866 | 8, 0, "tx_deferred" }, | 8897 | 8, STATS_FLAGS_PORT, "tx_deferred" }, |
8867 | { STATS_OFFSET32(tx_stat_dot3statsexcessivecollisions_hi), | 8898 | { STATS_OFFSET32(tx_stat_dot3statsexcessivecollisions_hi), |
8868 | 8, 0, "tx_excess_collisions" }, | 8899 | 8, STATS_FLAGS_PORT, "tx_excess_collisions" }, |
8869 | { STATS_OFFSET32(tx_stat_dot3statslatecollisions_hi), | 8900 | { STATS_OFFSET32(tx_stat_dot3statslatecollisions_hi), |
8870 | 8, 0, "tx_late_collisions" }, | 8901 | 8, STATS_FLAGS_PORT, "tx_late_collisions" }, |
8871 | { STATS_OFFSET32(tx_stat_etherstatscollisions_hi), | 8902 | { STATS_OFFSET32(tx_stat_etherstatscollisions_hi), |
8872 | 8, 0, "tx_total_collisions" }, | 8903 | 8, STATS_FLAGS_PORT, "tx_total_collisions" }, |
8873 | { STATS_OFFSET32(rx_stat_etherstatsfragments_hi), | 8904 | { STATS_OFFSET32(rx_stat_etherstatsfragments_hi), |
8874 | 8, 0, "rx_fragments" }, | 8905 | 8, STATS_FLAGS_PORT, "rx_fragments" }, |
8875 | /* 20 */{ STATS_OFFSET32(rx_stat_etherstatsjabbers_hi), 8, 0, "rx_jabbers" }, | 8906 | /* 20 */{ STATS_OFFSET32(rx_stat_etherstatsjabbers_hi), |
8907 | 8, STATS_FLAGS_PORT, "rx_jabbers" }, | ||
8876 | { STATS_OFFSET32(rx_stat_etherstatsundersizepkts_hi), | 8908 | { STATS_OFFSET32(rx_stat_etherstatsundersizepkts_hi), |
8877 | 8, 0, "rx_undersize_packets" }, | 8909 | 8, STATS_FLAGS_PORT, "rx_undersize_packets" }, |
8878 | { STATS_OFFSET32(jabber_packets_received), | 8910 | { STATS_OFFSET32(jabber_packets_received), |
8879 | 4, 1, "rx_oversize_packets" }, | 8911 | 4, STATS_FLAGS_FUNC, "rx_oversize_packets" }, |
8880 | { STATS_OFFSET32(tx_stat_etherstatspkts64octets_hi), | 8912 | { STATS_OFFSET32(tx_stat_etherstatspkts64octets_hi), |
8881 | 8, 0, "tx_64_byte_packets" }, | 8913 | 8, STATS_FLAGS_PORT, "tx_64_byte_packets" }, |
8882 | { STATS_OFFSET32(tx_stat_etherstatspkts65octetsto127octets_hi), | 8914 | { STATS_OFFSET32(tx_stat_etherstatspkts65octetsto127octets_hi), |
8883 | 8, 0, "tx_65_to_127_byte_packets" }, | 8915 | 8, STATS_FLAGS_PORT, "tx_65_to_127_byte_packets" }, |
8884 | { STATS_OFFSET32(tx_stat_etherstatspkts128octetsto255octets_hi), | 8916 | { STATS_OFFSET32(tx_stat_etherstatspkts128octetsto255octets_hi), |
8885 | 8, 0, "tx_128_to_255_byte_packets" }, | 8917 | 8, STATS_FLAGS_PORT, "tx_128_to_255_byte_packets" }, |
8886 | { STATS_OFFSET32(tx_stat_etherstatspkts256octetsto511octets_hi), | 8918 | { STATS_OFFSET32(tx_stat_etherstatspkts256octetsto511octets_hi), |
8887 | 8, 0, "tx_256_to_511_byte_packets" }, | 8919 | 8, STATS_FLAGS_PORT, "tx_256_to_511_byte_packets" }, |
8888 | { STATS_OFFSET32(tx_stat_etherstatspkts512octetsto1023octets_hi), | 8920 | { STATS_OFFSET32(tx_stat_etherstatspkts512octetsto1023octets_hi), |
8889 | 8, 0, "tx_512_to_1023_byte_packets" }, | 8921 | 8, STATS_FLAGS_PORT, "tx_512_to_1023_byte_packets" }, |
8890 | { STATS_OFFSET32(etherstatspkts1024octetsto1522octets_hi), | 8922 | { STATS_OFFSET32(etherstatspkts1024octetsto1522octets_hi), |
8891 | 8, 0, "tx_1024_to_1522_byte_packets" }, | 8923 | 8, STATS_FLAGS_PORT, "tx_1024_to_1522_byte_packets" }, |
8892 | { STATS_OFFSET32(etherstatspktsover1522octets_hi), | 8924 | { STATS_OFFSET32(etherstatspktsover1522octets_hi), |
8893 | 8, 0, "tx_1523_to_9022_byte_packets" }, | 8925 | 8, STATS_FLAGS_PORT, "tx_1523_to_9022_byte_packets" }, |
8894 | /* 30 */{ STATS_OFFSET32(rx_stat_xonpauseframesreceived_hi), | 8926 | /* 30 */{ STATS_OFFSET32(rx_stat_xonpauseframesreceived_hi), |
8895 | 8, 0, "rx_xon_frames" }, | 8927 | 8, STATS_FLAGS_PORT, "rx_xon_frames" }, |
8896 | { STATS_OFFSET32(rx_stat_xoffpauseframesreceived_hi), | 8928 | { STATS_OFFSET32(rx_stat_xoffpauseframesreceived_hi), |
8897 | 8, 0, "rx_xoff_frames" }, | 8929 | 8, STATS_FLAGS_PORT, "rx_xoff_frames" }, |
8898 | { STATS_OFFSET32(tx_stat_outxonsent_hi), 8, 0, "tx_xon_frames" }, | 8930 | { STATS_OFFSET32(tx_stat_outxonsent_hi), |
8899 | { STATS_OFFSET32(tx_stat_outxoffsent_hi), 8, 0, "tx_xoff_frames" }, | 8931 | 8, STATS_FLAGS_PORT, "tx_xon_frames" }, |
8932 | { STATS_OFFSET32(tx_stat_outxoffsent_hi), | ||
8933 | 8, STATS_FLAGS_PORT, "tx_xoff_frames" }, | ||
8900 | { STATS_OFFSET32(rx_stat_maccontrolframesreceived_hi), | 8934 | { STATS_OFFSET32(rx_stat_maccontrolframesreceived_hi), |
8901 | 8, 0, "rx_mac_ctrl_frames" }, | 8935 | 8, STATS_FLAGS_PORT, "rx_mac_ctrl_frames" }, |
8902 | { STATS_OFFSET32(mac_filter_discard), 4, 1, "rx_filtered_packets" }, | 8936 | { STATS_OFFSET32(mac_filter_discard), |
8903 | { STATS_OFFSET32(no_buff_discard), 4, 1, "rx_discards" }, | 8937 | 4, STATS_FLAGS_PORT, "rx_filtered_packets" }, |
8904 | { STATS_OFFSET32(xxoverflow_discard), 4, 1, "rx_fw_discards" }, | 8938 | { STATS_OFFSET32(no_buff_discard), |
8905 | { STATS_OFFSET32(brb_drop_hi), 8, 1, "brb_discard" }, | 8939 | 4, STATS_FLAGS_FUNC, "rx_discards" }, |
8906 | /* 39 */{ STATS_OFFSET32(brb_truncate_discard), 8, 1, "brb_truncate" } | 8940 | { STATS_OFFSET32(xxoverflow_discard), |
8941 | 4, STATS_FLAGS_PORT, "rx_fw_discards" }, | ||
8942 | { STATS_OFFSET32(brb_drop_hi), | ||
8943 | 8, STATS_FLAGS_PORT, "brb_discard" }, | ||
8944 | { STATS_OFFSET32(brb_truncate_hi), | ||
8945 | 8, STATS_FLAGS_PORT, "brb_truncate" }, | ||
8946 | /* 40 */{ STATS_OFFSET32(rx_err_discard_pkt), | ||
8947 | 4, STATS_FLAGS_FUNC, "rx_phy_ip_err_discards"}, | ||
8948 | { STATS_OFFSET32(rx_skb_alloc_failed), | ||
8949 | 4, STATS_FLAGS_FUNC, "rx_skb_alloc_discard" }, | ||
8950 | /* 42 */{ STATS_OFFSET32(hw_csum_err), | ||
8951 | 4, STATS_FLAGS_FUNC, "rx_csum_offload_errors" } | ||
8907 | }; | 8952 | }; |
8908 | 8953 | ||
8954 | #define IS_NOT_E1HMF_STAT(bp, i) \ | ||
8955 | (IS_E1HMF(bp) && (bnx2x_stats_arr[i].flags & STATS_FLAGS_PORT)) | ||
8956 | |||
8909 | static void bnx2x_get_strings(struct net_device *dev, u32 stringset, u8 *buf) | 8957 | static void bnx2x_get_strings(struct net_device *dev, u32 stringset, u8 *buf) |
8910 | { | 8958 | { |
8911 | struct bnx2x *bp = netdev_priv(dev); | 8959 | struct bnx2x *bp = netdev_priv(dev); |
@@ -8914,7 +8962,7 @@ static void bnx2x_get_strings(struct net_device *dev, u32 stringset, u8 *buf) | |||
8914 | switch (stringset) { | 8962 | switch (stringset) { |
8915 | case ETH_SS_STATS: | 8963 | case ETH_SS_STATS: |
8916 | for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { | 8964 | for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { |
8917 | if (IS_E1HMF(bp) && (!bnx2x_stats_arr[i].flags)) | 8965 | if (IS_NOT_E1HMF_STAT(bp, i)) |
8918 | continue; | 8966 | continue; |
8919 | strcpy(buf + j*ETH_GSTRING_LEN, | 8967 | strcpy(buf + j*ETH_GSTRING_LEN, |
8920 | bnx2x_stats_arr[i].string); | 8968 | bnx2x_stats_arr[i].string); |
@@ -8934,7 +8982,7 @@ static int bnx2x_get_stats_count(struct net_device *dev) | |||
8934 | int i, num_stats = 0; | 8982 | int i, num_stats = 0; |
8935 | 8983 | ||
8936 | for (i = 0; i < BNX2X_NUM_STATS; i++) { | 8984 | for (i = 0; i < BNX2X_NUM_STATS; i++) { |
8937 | if (IS_E1HMF(bp) && (!bnx2x_stats_arr[i].flags)) | 8985 | if (IS_NOT_E1HMF_STAT(bp, i)) |
8938 | continue; | 8986 | continue; |
8939 | num_stats++; | 8987 | num_stats++; |
8940 | } | 8988 | } |
@@ -8949,7 +8997,7 @@ static void bnx2x_get_ethtool_stats(struct net_device *dev, | |||
8949 | int i, j; | 8997 | int i, j; |
8950 | 8998 | ||
8951 | for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { | 8999 | for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { |
8952 | if (IS_E1HMF(bp) && (!bnx2x_stats_arr[i].flags)) | 9000 | if (IS_NOT_E1HMF_STAT(bp, i)) |
8953 | continue; | 9001 | continue; |
8954 | 9002 | ||
8955 | if (bnx2x_stats_arr[i].size == 0) { | 9003 | if (bnx2x_stats_arr[i].size == 0) { |
diff --git a/drivers/net/bnx2x_reg.h b/drivers/net/bnx2x_reg.h index 15c9a9946724..40c3a7735d25 100644 --- a/drivers/net/bnx2x_reg.h +++ b/drivers/net/bnx2x_reg.h | |||
@@ -1727,6 +1727,9 @@ | |||
1727 | /* [R 32] Rx statistics : In user packets discarded due to BRB backpressure | 1727 | /* [R 32] Rx statistics : In user packets discarded due to BRB backpressure |
1728 | for port0 */ | 1728 | for port0 */ |
1729 | #define NIG_REG_STAT0_BRB_DISCARD 0x105f0 | 1729 | #define NIG_REG_STAT0_BRB_DISCARD 0x105f0 |
1730 | /* [R 32] Rx statistics : In user packets truncated due to BRB backpressure | ||
1731 | for port0 */ | ||
1732 | #define NIG_REG_STAT0_BRB_TRUNCATE 0x105f8 | ||
1730 | /* [WB_R 36] Tx statistics : Number of packets from emac0 or bmac0 that | 1733 | /* [WB_R 36] Tx statistics : Number of packets from emac0 or bmac0 that |
1731 | between 1024 and 1522 bytes for port0 */ | 1734 | between 1024 and 1522 bytes for port0 */ |
1732 | #define NIG_REG_STAT0_EGRESS_MAC_PKT0 0x10750 | 1735 | #define NIG_REG_STAT0_EGRESS_MAC_PKT0 0x10750 |