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 /drivers/net/bnx2x_main.c | |
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>
Diffstat (limited to 'drivers/net/bnx2x_main.c')
-rw-r--r-- | drivers/net/bnx2x_main.c | 228 |
1 files changed, 138 insertions, 90 deletions
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) { |