162306a36Sopenharmony_ci/* bnx2x_stats.h: QLogic Everest network driver. 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * Copyright (c) 2007-2013 Broadcom Corporation 462306a36Sopenharmony_ci * Copyright (c) 2014 QLogic Corporation 562306a36Sopenharmony_ci * All rights reserved 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or modify 862306a36Sopenharmony_ci * it under the terms of the GNU General Public License as published by 962306a36Sopenharmony_ci * the Free Software Foundation. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * Maintained by: Ariel Elior <ariel.elior@qlogic.com> 1262306a36Sopenharmony_ci * Written by: Eliezer Tamir 1362306a36Sopenharmony_ci * Based on code from Michael Chan's bnx2 driver 1462306a36Sopenharmony_ci * UDP CSUM errata workaround by Arik Gendelman 1562306a36Sopenharmony_ci * Slowpath and fastpath rework by Vladislav Zolotarov 1662306a36Sopenharmony_ci * Statistics and Link management by Yitchak Gertner 1762306a36Sopenharmony_ci * 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci#ifndef BNX2X_STATS_H 2062306a36Sopenharmony_ci#define BNX2X_STATS_H 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <linux/types.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistruct nig_stats { 2562306a36Sopenharmony_ci u32 brb_discard; 2662306a36Sopenharmony_ci u32 brb_packet; 2762306a36Sopenharmony_ci u32 brb_truncate; 2862306a36Sopenharmony_ci u32 flow_ctrl_discard; 2962306a36Sopenharmony_ci u32 flow_ctrl_octets; 3062306a36Sopenharmony_ci u32 flow_ctrl_packet; 3162306a36Sopenharmony_ci u32 mng_discard; 3262306a36Sopenharmony_ci u32 mng_octet_inp; 3362306a36Sopenharmony_ci u32 mng_octet_out; 3462306a36Sopenharmony_ci u32 mng_packet_inp; 3562306a36Sopenharmony_ci u32 mng_packet_out; 3662306a36Sopenharmony_ci u32 pbf_octets; 3762306a36Sopenharmony_ci u32 pbf_packet; 3862306a36Sopenharmony_ci u32 safc_inp; 3962306a36Sopenharmony_ci struct_group(egress_mac_pkt0, 4062306a36Sopenharmony_ci u32 egress_mac_pkt0_lo; 4162306a36Sopenharmony_ci u32 egress_mac_pkt0_hi; 4262306a36Sopenharmony_ci ); 4362306a36Sopenharmony_ci struct_group(egress_mac_pkt1, 4462306a36Sopenharmony_ci u32 egress_mac_pkt1_lo; 4562306a36Sopenharmony_ci u32 egress_mac_pkt1_hi; 4662306a36Sopenharmony_ci ); 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cienum bnx2x_stats_event { 5062306a36Sopenharmony_ci STATS_EVENT_PMF = 0, 5162306a36Sopenharmony_ci STATS_EVENT_LINK_UP, 5262306a36Sopenharmony_ci STATS_EVENT_UPDATE, 5362306a36Sopenharmony_ci STATS_EVENT_STOP, 5462306a36Sopenharmony_ci STATS_EVENT_MAX 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cienum bnx2x_stats_state { 5862306a36Sopenharmony_ci STATS_STATE_DISABLED = 0, 5962306a36Sopenharmony_ci STATS_STATE_ENABLED, 6062306a36Sopenharmony_ci STATS_STATE_MAX 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct bnx2x_eth_stats { 6462306a36Sopenharmony_ci u32 total_bytes_received_hi; 6562306a36Sopenharmony_ci u32 total_bytes_received_lo; 6662306a36Sopenharmony_ci u32 total_bytes_transmitted_hi; 6762306a36Sopenharmony_ci u32 total_bytes_transmitted_lo; 6862306a36Sopenharmony_ci u32 total_unicast_packets_received_hi; 6962306a36Sopenharmony_ci u32 total_unicast_packets_received_lo; 7062306a36Sopenharmony_ci u32 total_multicast_packets_received_hi; 7162306a36Sopenharmony_ci u32 total_multicast_packets_received_lo; 7262306a36Sopenharmony_ci u32 total_broadcast_packets_received_hi; 7362306a36Sopenharmony_ci u32 total_broadcast_packets_received_lo; 7462306a36Sopenharmony_ci u32 total_unicast_packets_transmitted_hi; 7562306a36Sopenharmony_ci u32 total_unicast_packets_transmitted_lo; 7662306a36Sopenharmony_ci u32 total_multicast_packets_transmitted_hi; 7762306a36Sopenharmony_ci u32 total_multicast_packets_transmitted_lo; 7862306a36Sopenharmony_ci u32 total_broadcast_packets_transmitted_hi; 7962306a36Sopenharmony_ci u32 total_broadcast_packets_transmitted_lo; 8062306a36Sopenharmony_ci u32 valid_bytes_received_hi; 8162306a36Sopenharmony_ci u32 valid_bytes_received_lo; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci u32 error_bytes_received_hi; 8462306a36Sopenharmony_ci u32 error_bytes_received_lo; 8562306a36Sopenharmony_ci u32 etherstatsoverrsizepkts_hi; 8662306a36Sopenharmony_ci u32 etherstatsoverrsizepkts_lo; 8762306a36Sopenharmony_ci u32 no_buff_discard_hi; 8862306a36Sopenharmony_ci u32 no_buff_discard_lo; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci struct_group(shared, 9162306a36Sopenharmony_ci u32 rx_stat_ifhcinbadoctets_hi; 9262306a36Sopenharmony_ci u32 rx_stat_ifhcinbadoctets_lo; 9362306a36Sopenharmony_ci u32 tx_stat_ifhcoutbadoctets_hi; 9462306a36Sopenharmony_ci u32 tx_stat_ifhcoutbadoctets_lo; 9562306a36Sopenharmony_ci u32 rx_stat_dot3statsfcserrors_hi; 9662306a36Sopenharmony_ci u32 rx_stat_dot3statsfcserrors_lo; 9762306a36Sopenharmony_ci u32 rx_stat_dot3statsalignmenterrors_hi; 9862306a36Sopenharmony_ci u32 rx_stat_dot3statsalignmenterrors_lo; 9962306a36Sopenharmony_ci u32 rx_stat_dot3statscarriersenseerrors_hi; 10062306a36Sopenharmony_ci u32 rx_stat_dot3statscarriersenseerrors_lo; 10162306a36Sopenharmony_ci u32 rx_stat_falsecarriererrors_hi; 10262306a36Sopenharmony_ci u32 rx_stat_falsecarriererrors_lo; 10362306a36Sopenharmony_ci u32 rx_stat_etherstatsundersizepkts_hi; 10462306a36Sopenharmony_ci u32 rx_stat_etherstatsundersizepkts_lo; 10562306a36Sopenharmony_ci u32 rx_stat_dot3statsframestoolong_hi; 10662306a36Sopenharmony_ci u32 rx_stat_dot3statsframestoolong_lo; 10762306a36Sopenharmony_ci u32 rx_stat_etherstatsfragments_hi; 10862306a36Sopenharmony_ci u32 rx_stat_etherstatsfragments_lo; 10962306a36Sopenharmony_ci u32 rx_stat_etherstatsjabbers_hi; 11062306a36Sopenharmony_ci u32 rx_stat_etherstatsjabbers_lo; 11162306a36Sopenharmony_ci u32 rx_stat_maccontrolframesreceived_hi; 11262306a36Sopenharmony_ci u32 rx_stat_maccontrolframesreceived_lo; 11362306a36Sopenharmony_ci u32 rx_stat_bmac_xpf_hi; 11462306a36Sopenharmony_ci u32 rx_stat_bmac_xpf_lo; 11562306a36Sopenharmony_ci u32 rx_stat_bmac_xcf_hi; 11662306a36Sopenharmony_ci u32 rx_stat_bmac_xcf_lo; 11762306a36Sopenharmony_ci u32 rx_stat_xoffstateentered_hi; 11862306a36Sopenharmony_ci u32 rx_stat_xoffstateentered_lo; 11962306a36Sopenharmony_ci u32 rx_stat_xonpauseframesreceived_hi; 12062306a36Sopenharmony_ci u32 rx_stat_xonpauseframesreceived_lo; 12162306a36Sopenharmony_ci u32 rx_stat_xoffpauseframesreceived_hi; 12262306a36Sopenharmony_ci u32 rx_stat_xoffpauseframesreceived_lo; 12362306a36Sopenharmony_ci u32 tx_stat_outxonsent_hi; 12462306a36Sopenharmony_ci u32 tx_stat_outxonsent_lo; 12562306a36Sopenharmony_ci u32 tx_stat_outxoffsent_hi; 12662306a36Sopenharmony_ci u32 tx_stat_outxoffsent_lo; 12762306a36Sopenharmony_ci u32 tx_stat_flowcontroldone_hi; 12862306a36Sopenharmony_ci u32 tx_stat_flowcontroldone_lo; 12962306a36Sopenharmony_ci u32 tx_stat_etherstatscollisions_hi; 13062306a36Sopenharmony_ci u32 tx_stat_etherstatscollisions_lo; 13162306a36Sopenharmony_ci u32 tx_stat_dot3statssinglecollisionframes_hi; 13262306a36Sopenharmony_ci u32 tx_stat_dot3statssinglecollisionframes_lo; 13362306a36Sopenharmony_ci u32 tx_stat_dot3statsmultiplecollisionframes_hi; 13462306a36Sopenharmony_ci u32 tx_stat_dot3statsmultiplecollisionframes_lo; 13562306a36Sopenharmony_ci u32 tx_stat_dot3statsdeferredtransmissions_hi; 13662306a36Sopenharmony_ci u32 tx_stat_dot3statsdeferredtransmissions_lo; 13762306a36Sopenharmony_ci u32 tx_stat_dot3statsexcessivecollisions_hi; 13862306a36Sopenharmony_ci u32 tx_stat_dot3statsexcessivecollisions_lo; 13962306a36Sopenharmony_ci u32 tx_stat_dot3statslatecollisions_hi; 14062306a36Sopenharmony_ci u32 tx_stat_dot3statslatecollisions_lo; 14162306a36Sopenharmony_ci u32 tx_stat_etherstatspkts64octets_hi; 14262306a36Sopenharmony_ci u32 tx_stat_etherstatspkts64octets_lo; 14362306a36Sopenharmony_ci u32 tx_stat_etherstatspkts65octetsto127octets_hi; 14462306a36Sopenharmony_ci u32 tx_stat_etherstatspkts65octetsto127octets_lo; 14562306a36Sopenharmony_ci u32 tx_stat_etherstatspkts128octetsto255octets_hi; 14662306a36Sopenharmony_ci u32 tx_stat_etherstatspkts128octetsto255octets_lo; 14762306a36Sopenharmony_ci u32 tx_stat_etherstatspkts256octetsto511octets_hi; 14862306a36Sopenharmony_ci u32 tx_stat_etherstatspkts256octetsto511octets_lo; 14962306a36Sopenharmony_ci u32 tx_stat_etherstatspkts512octetsto1023octets_hi; 15062306a36Sopenharmony_ci u32 tx_stat_etherstatspkts512octetsto1023octets_lo; 15162306a36Sopenharmony_ci u32 tx_stat_etherstatspkts1024octetsto1522octets_hi; 15262306a36Sopenharmony_ci u32 tx_stat_etherstatspkts1024octetsto1522octets_lo; 15362306a36Sopenharmony_ci u32 tx_stat_etherstatspktsover1522octets_hi; 15462306a36Sopenharmony_ci u32 tx_stat_etherstatspktsover1522octets_lo; 15562306a36Sopenharmony_ci u32 tx_stat_bmac_2047_hi; 15662306a36Sopenharmony_ci u32 tx_stat_bmac_2047_lo; 15762306a36Sopenharmony_ci u32 tx_stat_bmac_4095_hi; 15862306a36Sopenharmony_ci u32 tx_stat_bmac_4095_lo; 15962306a36Sopenharmony_ci u32 tx_stat_bmac_9216_hi; 16062306a36Sopenharmony_ci u32 tx_stat_bmac_9216_lo; 16162306a36Sopenharmony_ci u32 tx_stat_bmac_16383_hi; 16262306a36Sopenharmony_ci u32 tx_stat_bmac_16383_lo; 16362306a36Sopenharmony_ci u32 tx_stat_dot3statsinternalmactransmiterrors_hi; 16462306a36Sopenharmony_ci u32 tx_stat_dot3statsinternalmactransmiterrors_lo; 16562306a36Sopenharmony_ci u32 tx_stat_bmac_ufl_hi; 16662306a36Sopenharmony_ci u32 tx_stat_bmac_ufl_lo; 16762306a36Sopenharmony_ci ); 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci u32 pause_frames_received_hi; 17062306a36Sopenharmony_ci u32 pause_frames_received_lo; 17162306a36Sopenharmony_ci u32 pause_frames_sent_hi; 17262306a36Sopenharmony_ci u32 pause_frames_sent_lo; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci u32 etherstatspkts1024octetsto1522octets_hi; 17562306a36Sopenharmony_ci u32 etherstatspkts1024octetsto1522octets_lo; 17662306a36Sopenharmony_ci u32 etherstatspktsover1522octets_hi; 17762306a36Sopenharmony_ci u32 etherstatspktsover1522octets_lo; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci u32 brb_drop_hi; 18062306a36Sopenharmony_ci u32 brb_drop_lo; 18162306a36Sopenharmony_ci u32 brb_truncate_hi; 18262306a36Sopenharmony_ci u32 brb_truncate_lo; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci u32 mac_filter_discard; 18562306a36Sopenharmony_ci u32 mf_tag_discard; 18662306a36Sopenharmony_ci u32 brb_truncate_discard; 18762306a36Sopenharmony_ci u32 mac_discard; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci u32 driver_xoff; 19062306a36Sopenharmony_ci u32 rx_err_discard_pkt; 19162306a36Sopenharmony_ci u32 rx_skb_alloc_failed; 19262306a36Sopenharmony_ci u32 hw_csum_err; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci u32 nig_timer_max; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci /* TPA */ 19762306a36Sopenharmony_ci u32 total_tpa_aggregations_hi; 19862306a36Sopenharmony_ci u32 total_tpa_aggregations_lo; 19962306a36Sopenharmony_ci u32 total_tpa_aggregated_frames_hi; 20062306a36Sopenharmony_ci u32 total_tpa_aggregated_frames_lo; 20162306a36Sopenharmony_ci u32 total_tpa_bytes_hi; 20262306a36Sopenharmony_ci u32 total_tpa_bytes_lo; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci /* PFC */ 20562306a36Sopenharmony_ci u32 pfc_frames_received_hi; 20662306a36Sopenharmony_ci u32 pfc_frames_received_lo; 20762306a36Sopenharmony_ci u32 pfc_frames_sent_hi; 20862306a36Sopenharmony_ci u32 pfc_frames_sent_lo; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci /* Recovery */ 21162306a36Sopenharmony_ci u32 recoverable_error; 21262306a36Sopenharmony_ci u32 unrecoverable_error; 21362306a36Sopenharmony_ci u32 driver_filtered_tx_pkt; 21462306a36Sopenharmony_ci /* src: Clear-on-Read register; Will not survive PMF Migration */ 21562306a36Sopenharmony_ci u32 eee_tx_lpi; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci /* PTP */ 21862306a36Sopenharmony_ci u32 ptp_skip_tx_ts; 21962306a36Sopenharmony_ci}; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cistruct bnx2x_eth_q_stats { 22262306a36Sopenharmony_ci u32 total_unicast_bytes_received_hi; 22362306a36Sopenharmony_ci u32 total_unicast_bytes_received_lo; 22462306a36Sopenharmony_ci u32 total_broadcast_bytes_received_hi; 22562306a36Sopenharmony_ci u32 total_broadcast_bytes_received_lo; 22662306a36Sopenharmony_ci u32 total_multicast_bytes_received_hi; 22762306a36Sopenharmony_ci u32 total_multicast_bytes_received_lo; 22862306a36Sopenharmony_ci u32 total_bytes_received_hi; 22962306a36Sopenharmony_ci u32 total_bytes_received_lo; 23062306a36Sopenharmony_ci u32 total_unicast_bytes_transmitted_hi; 23162306a36Sopenharmony_ci u32 total_unicast_bytes_transmitted_lo; 23262306a36Sopenharmony_ci u32 total_broadcast_bytes_transmitted_hi; 23362306a36Sopenharmony_ci u32 total_broadcast_bytes_transmitted_lo; 23462306a36Sopenharmony_ci u32 total_multicast_bytes_transmitted_hi; 23562306a36Sopenharmony_ci u32 total_multicast_bytes_transmitted_lo; 23662306a36Sopenharmony_ci u32 total_bytes_transmitted_hi; 23762306a36Sopenharmony_ci u32 total_bytes_transmitted_lo; 23862306a36Sopenharmony_ci u32 total_unicast_packets_received_hi; 23962306a36Sopenharmony_ci u32 total_unicast_packets_received_lo; 24062306a36Sopenharmony_ci u32 total_multicast_packets_received_hi; 24162306a36Sopenharmony_ci u32 total_multicast_packets_received_lo; 24262306a36Sopenharmony_ci u32 total_broadcast_packets_received_hi; 24362306a36Sopenharmony_ci u32 total_broadcast_packets_received_lo; 24462306a36Sopenharmony_ci u32 total_unicast_packets_transmitted_hi; 24562306a36Sopenharmony_ci u32 total_unicast_packets_transmitted_lo; 24662306a36Sopenharmony_ci u32 total_multicast_packets_transmitted_hi; 24762306a36Sopenharmony_ci u32 total_multicast_packets_transmitted_lo; 24862306a36Sopenharmony_ci u32 total_broadcast_packets_transmitted_hi; 24962306a36Sopenharmony_ci u32 total_broadcast_packets_transmitted_lo; 25062306a36Sopenharmony_ci u32 valid_bytes_received_hi; 25162306a36Sopenharmony_ci u32 valid_bytes_received_lo; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci u32 etherstatsoverrsizepkts_hi; 25462306a36Sopenharmony_ci u32 etherstatsoverrsizepkts_lo; 25562306a36Sopenharmony_ci u32 no_buff_discard_hi; 25662306a36Sopenharmony_ci u32 no_buff_discard_lo; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci u32 driver_xoff; 25962306a36Sopenharmony_ci u32 rx_err_discard_pkt; 26062306a36Sopenharmony_ci u32 rx_skb_alloc_failed; 26162306a36Sopenharmony_ci u32 hw_csum_err; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci u32 total_packets_received_checksum_discarded_hi; 26462306a36Sopenharmony_ci u32 total_packets_received_checksum_discarded_lo; 26562306a36Sopenharmony_ci u32 total_packets_received_ttl0_discarded_hi; 26662306a36Sopenharmony_ci u32 total_packets_received_ttl0_discarded_lo; 26762306a36Sopenharmony_ci u32 total_transmitted_dropped_packets_error_hi; 26862306a36Sopenharmony_ci u32 total_transmitted_dropped_packets_error_lo; 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci /* TPA */ 27162306a36Sopenharmony_ci u32 total_tpa_aggregations_hi; 27262306a36Sopenharmony_ci u32 total_tpa_aggregations_lo; 27362306a36Sopenharmony_ci u32 total_tpa_aggregated_frames_hi; 27462306a36Sopenharmony_ci u32 total_tpa_aggregated_frames_lo; 27562306a36Sopenharmony_ci u32 total_tpa_bytes_hi; 27662306a36Sopenharmony_ci u32 total_tpa_bytes_lo; 27762306a36Sopenharmony_ci u32 driver_filtered_tx_pkt; 27862306a36Sopenharmony_ci}; 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_cistruct bnx2x_eth_stats_old { 28162306a36Sopenharmony_ci u32 rx_stat_dot3statsframestoolong_hi; 28262306a36Sopenharmony_ci u32 rx_stat_dot3statsframestoolong_lo; 28362306a36Sopenharmony_ci}; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistruct bnx2x_eth_q_stats_old { 28662306a36Sopenharmony_ci /* Fields to perserve over fw reset*/ 28762306a36Sopenharmony_ci u32 total_unicast_bytes_received_hi; 28862306a36Sopenharmony_ci u32 total_unicast_bytes_received_lo; 28962306a36Sopenharmony_ci u32 total_broadcast_bytes_received_hi; 29062306a36Sopenharmony_ci u32 total_broadcast_bytes_received_lo; 29162306a36Sopenharmony_ci u32 total_multicast_bytes_received_hi; 29262306a36Sopenharmony_ci u32 total_multicast_bytes_received_lo; 29362306a36Sopenharmony_ci u32 total_unicast_bytes_transmitted_hi; 29462306a36Sopenharmony_ci u32 total_unicast_bytes_transmitted_lo; 29562306a36Sopenharmony_ci u32 total_broadcast_bytes_transmitted_hi; 29662306a36Sopenharmony_ci u32 total_broadcast_bytes_transmitted_lo; 29762306a36Sopenharmony_ci u32 total_multicast_bytes_transmitted_hi; 29862306a36Sopenharmony_ci u32 total_multicast_bytes_transmitted_lo; 29962306a36Sopenharmony_ci u32 total_tpa_bytes_hi; 30062306a36Sopenharmony_ci u32 total_tpa_bytes_lo; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci /* Fields to perserve last of */ 30362306a36Sopenharmony_ci u32 total_bytes_received_hi; 30462306a36Sopenharmony_ci u32 total_bytes_received_lo; 30562306a36Sopenharmony_ci u32 total_bytes_transmitted_hi; 30662306a36Sopenharmony_ci u32 total_bytes_transmitted_lo; 30762306a36Sopenharmony_ci u32 total_unicast_packets_received_hi; 30862306a36Sopenharmony_ci u32 total_unicast_packets_received_lo; 30962306a36Sopenharmony_ci u32 total_multicast_packets_received_hi; 31062306a36Sopenharmony_ci u32 total_multicast_packets_received_lo; 31162306a36Sopenharmony_ci u32 total_broadcast_packets_received_hi; 31262306a36Sopenharmony_ci u32 total_broadcast_packets_received_lo; 31362306a36Sopenharmony_ci u32 total_unicast_packets_transmitted_hi; 31462306a36Sopenharmony_ci u32 total_unicast_packets_transmitted_lo; 31562306a36Sopenharmony_ci u32 total_multicast_packets_transmitted_hi; 31662306a36Sopenharmony_ci u32 total_multicast_packets_transmitted_lo; 31762306a36Sopenharmony_ci u32 total_broadcast_packets_transmitted_hi; 31862306a36Sopenharmony_ci u32 total_broadcast_packets_transmitted_lo; 31962306a36Sopenharmony_ci u32 valid_bytes_received_hi; 32062306a36Sopenharmony_ci u32 valid_bytes_received_lo; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci u32 total_tpa_bytes_hi_old; 32362306a36Sopenharmony_ci u32 total_tpa_bytes_lo_old; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci u32 driver_xoff_old; 32662306a36Sopenharmony_ci u32 rx_err_discard_pkt_old; 32762306a36Sopenharmony_ci u32 rx_skb_alloc_failed_old; 32862306a36Sopenharmony_ci u32 hw_csum_err_old; 32962306a36Sopenharmony_ci u32 driver_filtered_tx_pkt_old; 33062306a36Sopenharmony_ci}; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistruct bnx2x_net_stats_old { 33362306a36Sopenharmony_ci u32 rx_dropped; 33462306a36Sopenharmony_ci}; 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_cistruct bnx2x_fw_port_stats_old { 33762306a36Sopenharmony_ci u32 mac_filter_discard; 33862306a36Sopenharmony_ci u32 mf_tag_discard; 33962306a36Sopenharmony_ci u32 brb_truncate_discard; 34062306a36Sopenharmony_ci u32 mac_discard; 34162306a36Sopenharmony_ci}; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci/**************************************************************************** 34462306a36Sopenharmony_ci* Macros 34562306a36Sopenharmony_ci****************************************************************************/ 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci/* sum[hi:lo] += add[hi:lo] */ 34862306a36Sopenharmony_ci#define ADD_64(s_hi, a_hi, s_lo, a_lo) \ 34962306a36Sopenharmony_ci do { \ 35062306a36Sopenharmony_ci s_lo += a_lo; \ 35162306a36Sopenharmony_ci s_hi += a_hi + ((s_lo < a_lo) ? 1 : 0); \ 35262306a36Sopenharmony_ci } while (0) 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci#define LE32_0 ((__force __le32) 0) 35562306a36Sopenharmony_ci#define LE16_0 ((__force __le16) 0) 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci/* The _force is for cases where high value is 0 */ 35862306a36Sopenharmony_ci#define ADD_64_LE(s_hi, a_hi_le, s_lo, a_lo_le) \ 35962306a36Sopenharmony_ci ADD_64(s_hi, le32_to_cpu(a_hi_le), \ 36062306a36Sopenharmony_ci s_lo, le32_to_cpu(a_lo_le)) 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci#define ADD_64_LE16(s_hi, a_hi_le, s_lo, a_lo_le) \ 36362306a36Sopenharmony_ci ADD_64(s_hi, le16_to_cpu(a_hi_le), \ 36462306a36Sopenharmony_ci s_lo, le16_to_cpu(a_lo_le)) 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci/* difference = minuend - subtrahend */ 36762306a36Sopenharmony_ci#define DIFF_64(d_hi, m_hi, s_hi, d_lo, m_lo, s_lo) \ 36862306a36Sopenharmony_ci do { \ 36962306a36Sopenharmony_ci if (m_lo < s_lo) { \ 37062306a36Sopenharmony_ci /* underflow */ \ 37162306a36Sopenharmony_ci d_hi = m_hi - s_hi; \ 37262306a36Sopenharmony_ci if (d_hi > 0) { \ 37362306a36Sopenharmony_ci /* we can 'loan' 1 */ \ 37462306a36Sopenharmony_ci d_hi--; \ 37562306a36Sopenharmony_ci d_lo = m_lo + (UINT_MAX - s_lo) + 1; \ 37662306a36Sopenharmony_ci } else { \ 37762306a36Sopenharmony_ci /* m_hi <= s_hi */ \ 37862306a36Sopenharmony_ci d_hi = 0; \ 37962306a36Sopenharmony_ci d_lo = 0; \ 38062306a36Sopenharmony_ci } \ 38162306a36Sopenharmony_ci } else { \ 38262306a36Sopenharmony_ci /* m_lo >= s_lo */ \ 38362306a36Sopenharmony_ci if (m_hi < s_hi) { \ 38462306a36Sopenharmony_ci d_hi = 0; \ 38562306a36Sopenharmony_ci d_lo = 0; \ 38662306a36Sopenharmony_ci } else { \ 38762306a36Sopenharmony_ci /* m_hi >= s_hi */ \ 38862306a36Sopenharmony_ci d_hi = m_hi - s_hi; \ 38962306a36Sopenharmony_ci d_lo = m_lo - s_lo; \ 39062306a36Sopenharmony_ci } \ 39162306a36Sopenharmony_ci } \ 39262306a36Sopenharmony_ci } while (0) 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci#define UPDATE_STAT64(s, t) \ 39562306a36Sopenharmony_ci do { \ 39662306a36Sopenharmony_ci DIFF_64(diff.hi, new->s##_hi, pstats->mac_stx[0].t##_hi, \ 39762306a36Sopenharmony_ci diff.lo, new->s##_lo, pstats->mac_stx[0].t##_lo); \ 39862306a36Sopenharmony_ci pstats->mac_stx[0].t##_hi = new->s##_hi; \ 39962306a36Sopenharmony_ci pstats->mac_stx[0].t##_lo = new->s##_lo; \ 40062306a36Sopenharmony_ci ADD_64(pstats->mac_stx[1].t##_hi, diff.hi, \ 40162306a36Sopenharmony_ci pstats->mac_stx[1].t##_lo, diff.lo); \ 40262306a36Sopenharmony_ci } while (0) 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci#define UPDATE_STAT64_NIG(s, t) \ 40562306a36Sopenharmony_ci do { \ 40662306a36Sopenharmony_ci DIFF_64(diff.hi, new->s##_hi, old->s##_hi, \ 40762306a36Sopenharmony_ci diff.lo, new->s##_lo, old->s##_lo); \ 40862306a36Sopenharmony_ci ADD_64(estats->t##_hi, diff.hi, \ 40962306a36Sopenharmony_ci estats->t##_lo, diff.lo); \ 41062306a36Sopenharmony_ci } while (0) 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci/* sum[hi:lo] += add */ 41362306a36Sopenharmony_ci#define ADD_EXTEND_64(s_hi, s_lo, a) \ 41462306a36Sopenharmony_ci do { \ 41562306a36Sopenharmony_ci s_lo += a; \ 41662306a36Sopenharmony_ci s_hi += (s_lo < a) ? 1 : 0; \ 41762306a36Sopenharmony_ci } while (0) 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci#define ADD_STAT64(diff, t) \ 42062306a36Sopenharmony_ci do { \ 42162306a36Sopenharmony_ci ADD_64(pstats->mac_stx[1].t##_hi, new->diff##_hi, \ 42262306a36Sopenharmony_ci pstats->mac_stx[1].t##_lo, new->diff##_lo); \ 42362306a36Sopenharmony_ci } while (0) 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci#define UPDATE_EXTEND_STAT(s) \ 42662306a36Sopenharmony_ci do { \ 42762306a36Sopenharmony_ci ADD_EXTEND_64(pstats->mac_stx[1].s##_hi, \ 42862306a36Sopenharmony_ci pstats->mac_stx[1].s##_lo, \ 42962306a36Sopenharmony_ci new->s); \ 43062306a36Sopenharmony_ci } while (0) 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci#define UPDATE_EXTEND_TSTAT_X(s, t, size) \ 43362306a36Sopenharmony_ci do { \ 43462306a36Sopenharmony_ci diff = le##size##_to_cpu(tclient->s) - \ 43562306a36Sopenharmony_ci le##size##_to_cpu(old_tclient->s); \ 43662306a36Sopenharmony_ci old_tclient->s = tclient->s; \ 43762306a36Sopenharmony_ci ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \ 43862306a36Sopenharmony_ci } while (0) 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci#define UPDATE_EXTEND_TSTAT(s, t) UPDATE_EXTEND_TSTAT_X(s, t, 32) 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci#define UPDATE_EXTEND_E_TSTAT(s, t, size) \ 44362306a36Sopenharmony_ci do { \ 44462306a36Sopenharmony_ci UPDATE_EXTEND_TSTAT_X(s, t, size); \ 44562306a36Sopenharmony_ci ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \ 44662306a36Sopenharmony_ci } while (0) 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci#define UPDATE_EXTEND_USTAT(s, t) \ 44962306a36Sopenharmony_ci do { \ 45062306a36Sopenharmony_ci diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \ 45162306a36Sopenharmony_ci old_uclient->s = uclient->s; \ 45262306a36Sopenharmony_ci ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \ 45362306a36Sopenharmony_ci } while (0) 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci#define UPDATE_EXTEND_E_USTAT(s, t) \ 45662306a36Sopenharmony_ci do { \ 45762306a36Sopenharmony_ci UPDATE_EXTEND_USTAT(s, t); \ 45862306a36Sopenharmony_ci ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \ 45962306a36Sopenharmony_ci } while (0) 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci#define UPDATE_EXTEND_XSTAT(s, t) \ 46262306a36Sopenharmony_ci do { \ 46362306a36Sopenharmony_ci diff = le32_to_cpu(xclient->s) - le32_to_cpu(old_xclient->s); \ 46462306a36Sopenharmony_ci old_xclient->s = xclient->s; \ 46562306a36Sopenharmony_ci ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \ 46662306a36Sopenharmony_ci } while (0) 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci#define UPDATE_QSTAT(s, t) \ 46962306a36Sopenharmony_ci do { \ 47062306a36Sopenharmony_ci qstats->t##_lo = qstats_old->t##_lo + le32_to_cpu(s.lo); \ 47162306a36Sopenharmony_ci qstats->t##_hi = qstats_old->t##_hi + le32_to_cpu(s.hi) \ 47262306a36Sopenharmony_ci + ((qstats->t##_lo < qstats_old->t##_lo) ? 1 : 0); \ 47362306a36Sopenharmony_ci } while (0) 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci#define UPDATE_QSTAT_OLD(f) \ 47662306a36Sopenharmony_ci do { \ 47762306a36Sopenharmony_ci qstats_old->f = qstats->f; \ 47862306a36Sopenharmony_ci } while (0) 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci#define UPDATE_ESTAT_QSTAT_64(s) \ 48162306a36Sopenharmony_ci do { \ 48262306a36Sopenharmony_ci ADD_64(estats->s##_hi, qstats->s##_hi, \ 48362306a36Sopenharmony_ci estats->s##_lo, qstats->s##_lo); \ 48462306a36Sopenharmony_ci SUB_64(estats->s##_hi, qstats_old->s##_hi_old, \ 48562306a36Sopenharmony_ci estats->s##_lo, qstats_old->s##_lo_old); \ 48662306a36Sopenharmony_ci qstats_old->s##_hi_old = qstats->s##_hi; \ 48762306a36Sopenharmony_ci qstats_old->s##_lo_old = qstats->s##_lo; \ 48862306a36Sopenharmony_ci } while (0) 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci#define UPDATE_ESTAT_QSTAT(s) \ 49162306a36Sopenharmony_ci do { \ 49262306a36Sopenharmony_ci estats->s += qstats->s; \ 49362306a36Sopenharmony_ci estats->s -= qstats_old->s##_old; \ 49462306a36Sopenharmony_ci qstats_old->s##_old = qstats->s; \ 49562306a36Sopenharmony_ci } while (0) 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ci#define UPDATE_FSTAT_QSTAT(s) \ 49862306a36Sopenharmony_ci do { \ 49962306a36Sopenharmony_ci ADD_64(fstats->s##_hi, qstats->s##_hi, \ 50062306a36Sopenharmony_ci fstats->s##_lo, qstats->s##_lo); \ 50162306a36Sopenharmony_ci SUB_64(fstats->s##_hi, qstats_old->s##_hi, \ 50262306a36Sopenharmony_ci fstats->s##_lo, qstats_old->s##_lo); \ 50362306a36Sopenharmony_ci estats->s##_hi = fstats->s##_hi; \ 50462306a36Sopenharmony_ci estats->s##_lo = fstats->s##_lo; \ 50562306a36Sopenharmony_ci qstats_old->s##_hi = qstats->s##_hi; \ 50662306a36Sopenharmony_ci qstats_old->s##_lo = qstats->s##_lo; \ 50762306a36Sopenharmony_ci } while (0) 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_ci#define UPDATE_FW_STAT(s) \ 51062306a36Sopenharmony_ci do { \ 51162306a36Sopenharmony_ci estats->s = le32_to_cpu(tport->s) + fwstats->s; \ 51262306a36Sopenharmony_ci } while (0) 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci#define UPDATE_FW_STAT_OLD(f) \ 51562306a36Sopenharmony_ci do { \ 51662306a36Sopenharmony_ci fwstats->f = estats->f; \ 51762306a36Sopenharmony_ci } while (0) 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci#define UPDATE_ESTAT(s, t) \ 52062306a36Sopenharmony_ci do { \ 52162306a36Sopenharmony_ci SUB_64(estats->s##_hi, estats_old->t##_hi, \ 52262306a36Sopenharmony_ci estats->s##_lo, estats_old->t##_lo); \ 52362306a36Sopenharmony_ci ADD_64(estats->s##_hi, estats->t##_hi, \ 52462306a36Sopenharmony_ci estats->s##_lo, estats->t##_lo); \ 52562306a36Sopenharmony_ci estats_old->t##_hi = estats->t##_hi; \ 52662306a36Sopenharmony_ci estats_old->t##_lo = estats->t##_lo; \ 52762306a36Sopenharmony_ci } while (0) 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_ci/* minuend -= subtrahend */ 53062306a36Sopenharmony_ci#define SUB_64(m_hi, s_hi, m_lo, s_lo) \ 53162306a36Sopenharmony_ci do { \ 53262306a36Sopenharmony_ci DIFF_64(m_hi, m_hi, s_hi, m_lo, m_lo, s_lo); \ 53362306a36Sopenharmony_ci } while (0) 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci/* minuend[hi:lo] -= subtrahend */ 53662306a36Sopenharmony_ci#define SUB_EXTEND_64(m_hi, m_lo, s) \ 53762306a36Sopenharmony_ci do { \ 53862306a36Sopenharmony_ci SUB_64(m_hi, 0, m_lo, s); \ 53962306a36Sopenharmony_ci } while (0) 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci#define SUB_EXTEND_USTAT(s, t) \ 54262306a36Sopenharmony_ci do { \ 54362306a36Sopenharmony_ci diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \ 54462306a36Sopenharmony_ci SUB_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \ 54562306a36Sopenharmony_ci } while (0) 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci/* forward */ 54862306a36Sopenharmony_cistruct bnx2x; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_civoid bnx2x_memset_stats(struct bnx2x *bp); 55162306a36Sopenharmony_civoid bnx2x_stats_init(struct bnx2x *bp); 55262306a36Sopenharmony_civoid bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event); 55362306a36Sopenharmony_ciint bnx2x_stats_safe_exec(struct bnx2x *bp, 55462306a36Sopenharmony_ci void (func_to_exec)(void *cookie), 55562306a36Sopenharmony_ci void *cookie); 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci/** 55862306a36Sopenharmony_ci * bnx2x_save_statistics - save statistics when unloading. 55962306a36Sopenharmony_ci * 56062306a36Sopenharmony_ci * @bp: driver handle 56162306a36Sopenharmony_ci */ 56262306a36Sopenharmony_civoid bnx2x_save_statistics(struct bnx2x *bp); 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_civoid bnx2x_afex_collect_stats(struct bnx2x *bp, void *void_afex_stats, 56562306a36Sopenharmony_ci u32 stats_type); 56662306a36Sopenharmony_ci#endif /* BNX2X_STATS_H */ 567