18c2ecf20Sopenharmony_ci/* bnx2x_stats.h: QLogic Everest network driver.
28c2ecf20Sopenharmony_ci *
38c2ecf20Sopenharmony_ci * Copyright (c) 2007-2013 Broadcom Corporation
48c2ecf20Sopenharmony_ci * Copyright (c) 2014 QLogic Corporation
58c2ecf20Sopenharmony_ci * All rights reserved
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * This program is free software; you can redistribute it and/or modify
88c2ecf20Sopenharmony_ci * it under the terms of the GNU General Public License as published by
98c2ecf20Sopenharmony_ci * the Free Software Foundation.
108c2ecf20Sopenharmony_ci *
118c2ecf20Sopenharmony_ci * Maintained by: Ariel Elior <ariel.elior@qlogic.com>
128c2ecf20Sopenharmony_ci * Written by: Eliezer Tamir
138c2ecf20Sopenharmony_ci * Based on code from Michael Chan's bnx2 driver
148c2ecf20Sopenharmony_ci * UDP CSUM errata workaround by Arik Gendelman
158c2ecf20Sopenharmony_ci * Slowpath and fastpath rework by Vladislav Zolotarov
168c2ecf20Sopenharmony_ci * Statistics and Link management by Yitchak Gertner
178c2ecf20Sopenharmony_ci *
188c2ecf20Sopenharmony_ci */
198c2ecf20Sopenharmony_ci#ifndef BNX2X_STATS_H
208c2ecf20Sopenharmony_ci#define BNX2X_STATS_H
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#include <linux/types.h>
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_cistruct nig_stats {
258c2ecf20Sopenharmony_ci	u32 brb_discard;
268c2ecf20Sopenharmony_ci	u32 brb_packet;
278c2ecf20Sopenharmony_ci	u32 brb_truncate;
288c2ecf20Sopenharmony_ci	u32 flow_ctrl_discard;
298c2ecf20Sopenharmony_ci	u32 flow_ctrl_octets;
308c2ecf20Sopenharmony_ci	u32 flow_ctrl_packet;
318c2ecf20Sopenharmony_ci	u32 mng_discard;
328c2ecf20Sopenharmony_ci	u32 mng_octet_inp;
338c2ecf20Sopenharmony_ci	u32 mng_octet_out;
348c2ecf20Sopenharmony_ci	u32 mng_packet_inp;
358c2ecf20Sopenharmony_ci	u32 mng_packet_out;
368c2ecf20Sopenharmony_ci	u32 pbf_octets;
378c2ecf20Sopenharmony_ci	u32 pbf_packet;
388c2ecf20Sopenharmony_ci	u32 safc_inp;
398c2ecf20Sopenharmony_ci	u32 egress_mac_pkt0_lo;
408c2ecf20Sopenharmony_ci	u32 egress_mac_pkt0_hi;
418c2ecf20Sopenharmony_ci	u32 egress_mac_pkt1_lo;
428c2ecf20Sopenharmony_ci	u32 egress_mac_pkt1_hi;
438c2ecf20Sopenharmony_ci};
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cienum bnx2x_stats_event {
468c2ecf20Sopenharmony_ci	STATS_EVENT_PMF = 0,
478c2ecf20Sopenharmony_ci	STATS_EVENT_LINK_UP,
488c2ecf20Sopenharmony_ci	STATS_EVENT_UPDATE,
498c2ecf20Sopenharmony_ci	STATS_EVENT_STOP,
508c2ecf20Sopenharmony_ci	STATS_EVENT_MAX
518c2ecf20Sopenharmony_ci};
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_cienum bnx2x_stats_state {
548c2ecf20Sopenharmony_ci	STATS_STATE_DISABLED = 0,
558c2ecf20Sopenharmony_ci	STATS_STATE_ENABLED,
568c2ecf20Sopenharmony_ci	STATS_STATE_MAX
578c2ecf20Sopenharmony_ci};
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_cistruct bnx2x_eth_stats {
608c2ecf20Sopenharmony_ci	u32 total_bytes_received_hi;
618c2ecf20Sopenharmony_ci	u32 total_bytes_received_lo;
628c2ecf20Sopenharmony_ci	u32 total_bytes_transmitted_hi;
638c2ecf20Sopenharmony_ci	u32 total_bytes_transmitted_lo;
648c2ecf20Sopenharmony_ci	u32 total_unicast_packets_received_hi;
658c2ecf20Sopenharmony_ci	u32 total_unicast_packets_received_lo;
668c2ecf20Sopenharmony_ci	u32 total_multicast_packets_received_hi;
678c2ecf20Sopenharmony_ci	u32 total_multicast_packets_received_lo;
688c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_received_hi;
698c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_received_lo;
708c2ecf20Sopenharmony_ci	u32 total_unicast_packets_transmitted_hi;
718c2ecf20Sopenharmony_ci	u32 total_unicast_packets_transmitted_lo;
728c2ecf20Sopenharmony_ci	u32 total_multicast_packets_transmitted_hi;
738c2ecf20Sopenharmony_ci	u32 total_multicast_packets_transmitted_lo;
748c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_transmitted_hi;
758c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_transmitted_lo;
768c2ecf20Sopenharmony_ci	u32 valid_bytes_received_hi;
778c2ecf20Sopenharmony_ci	u32 valid_bytes_received_lo;
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	u32 error_bytes_received_hi;
808c2ecf20Sopenharmony_ci	u32 error_bytes_received_lo;
818c2ecf20Sopenharmony_ci	u32 etherstatsoverrsizepkts_hi;
828c2ecf20Sopenharmony_ci	u32 etherstatsoverrsizepkts_lo;
838c2ecf20Sopenharmony_ci	u32 no_buff_discard_hi;
848c2ecf20Sopenharmony_ci	u32 no_buff_discard_lo;
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci	u32 rx_stat_ifhcinbadoctets_hi;
878c2ecf20Sopenharmony_ci	u32 rx_stat_ifhcinbadoctets_lo;
888c2ecf20Sopenharmony_ci	u32 tx_stat_ifhcoutbadoctets_hi;
898c2ecf20Sopenharmony_ci	u32 tx_stat_ifhcoutbadoctets_lo;
908c2ecf20Sopenharmony_ci	u32 rx_stat_dot3statsfcserrors_hi;
918c2ecf20Sopenharmony_ci	u32 rx_stat_dot3statsfcserrors_lo;
928c2ecf20Sopenharmony_ci	u32 rx_stat_dot3statsalignmenterrors_hi;
938c2ecf20Sopenharmony_ci	u32 rx_stat_dot3statsalignmenterrors_lo;
948c2ecf20Sopenharmony_ci	u32 rx_stat_dot3statscarriersenseerrors_hi;
958c2ecf20Sopenharmony_ci	u32 rx_stat_dot3statscarriersenseerrors_lo;
968c2ecf20Sopenharmony_ci	u32 rx_stat_falsecarriererrors_hi;
978c2ecf20Sopenharmony_ci	u32 rx_stat_falsecarriererrors_lo;
988c2ecf20Sopenharmony_ci	u32 rx_stat_etherstatsundersizepkts_hi;
998c2ecf20Sopenharmony_ci	u32 rx_stat_etherstatsundersizepkts_lo;
1008c2ecf20Sopenharmony_ci	u32 rx_stat_dot3statsframestoolong_hi;
1018c2ecf20Sopenharmony_ci	u32 rx_stat_dot3statsframestoolong_lo;
1028c2ecf20Sopenharmony_ci	u32 rx_stat_etherstatsfragments_hi;
1038c2ecf20Sopenharmony_ci	u32 rx_stat_etherstatsfragments_lo;
1048c2ecf20Sopenharmony_ci	u32 rx_stat_etherstatsjabbers_hi;
1058c2ecf20Sopenharmony_ci	u32 rx_stat_etherstatsjabbers_lo;
1068c2ecf20Sopenharmony_ci	u32 rx_stat_maccontrolframesreceived_hi;
1078c2ecf20Sopenharmony_ci	u32 rx_stat_maccontrolframesreceived_lo;
1088c2ecf20Sopenharmony_ci	u32 rx_stat_bmac_xpf_hi;
1098c2ecf20Sopenharmony_ci	u32 rx_stat_bmac_xpf_lo;
1108c2ecf20Sopenharmony_ci	u32 rx_stat_bmac_xcf_hi;
1118c2ecf20Sopenharmony_ci	u32 rx_stat_bmac_xcf_lo;
1128c2ecf20Sopenharmony_ci	u32 rx_stat_xoffstateentered_hi;
1138c2ecf20Sopenharmony_ci	u32 rx_stat_xoffstateentered_lo;
1148c2ecf20Sopenharmony_ci	u32 rx_stat_xonpauseframesreceived_hi;
1158c2ecf20Sopenharmony_ci	u32 rx_stat_xonpauseframesreceived_lo;
1168c2ecf20Sopenharmony_ci	u32 rx_stat_xoffpauseframesreceived_hi;
1178c2ecf20Sopenharmony_ci	u32 rx_stat_xoffpauseframesreceived_lo;
1188c2ecf20Sopenharmony_ci	u32 tx_stat_outxonsent_hi;
1198c2ecf20Sopenharmony_ci	u32 tx_stat_outxonsent_lo;
1208c2ecf20Sopenharmony_ci	u32 tx_stat_outxoffsent_hi;
1218c2ecf20Sopenharmony_ci	u32 tx_stat_outxoffsent_lo;
1228c2ecf20Sopenharmony_ci	u32 tx_stat_flowcontroldone_hi;
1238c2ecf20Sopenharmony_ci	u32 tx_stat_flowcontroldone_lo;
1248c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatscollisions_hi;
1258c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatscollisions_lo;
1268c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statssinglecollisionframes_hi;
1278c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statssinglecollisionframes_lo;
1288c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statsmultiplecollisionframes_hi;
1298c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statsmultiplecollisionframes_lo;
1308c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statsdeferredtransmissions_hi;
1318c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statsdeferredtransmissions_lo;
1328c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statsexcessivecollisions_hi;
1338c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statsexcessivecollisions_lo;
1348c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statslatecollisions_hi;
1358c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statslatecollisions_lo;
1368c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts64octets_hi;
1378c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts64octets_lo;
1388c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts65octetsto127octets_hi;
1398c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts65octetsto127octets_lo;
1408c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts128octetsto255octets_hi;
1418c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts128octetsto255octets_lo;
1428c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts256octetsto511octets_hi;
1438c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts256octetsto511octets_lo;
1448c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts512octetsto1023octets_hi;
1458c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts512octetsto1023octets_lo;
1468c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts1024octetsto1522octets_hi;
1478c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspkts1024octetsto1522octets_lo;
1488c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspktsover1522octets_hi;
1498c2ecf20Sopenharmony_ci	u32 tx_stat_etherstatspktsover1522octets_lo;
1508c2ecf20Sopenharmony_ci	u32 tx_stat_bmac_2047_hi;
1518c2ecf20Sopenharmony_ci	u32 tx_stat_bmac_2047_lo;
1528c2ecf20Sopenharmony_ci	u32 tx_stat_bmac_4095_hi;
1538c2ecf20Sopenharmony_ci	u32 tx_stat_bmac_4095_lo;
1548c2ecf20Sopenharmony_ci	u32 tx_stat_bmac_9216_hi;
1558c2ecf20Sopenharmony_ci	u32 tx_stat_bmac_9216_lo;
1568c2ecf20Sopenharmony_ci	u32 tx_stat_bmac_16383_hi;
1578c2ecf20Sopenharmony_ci	u32 tx_stat_bmac_16383_lo;
1588c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statsinternalmactransmiterrors_hi;
1598c2ecf20Sopenharmony_ci	u32 tx_stat_dot3statsinternalmactransmiterrors_lo;
1608c2ecf20Sopenharmony_ci	u32 tx_stat_bmac_ufl_hi;
1618c2ecf20Sopenharmony_ci	u32 tx_stat_bmac_ufl_lo;
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	u32 pause_frames_received_hi;
1648c2ecf20Sopenharmony_ci	u32 pause_frames_received_lo;
1658c2ecf20Sopenharmony_ci	u32 pause_frames_sent_hi;
1668c2ecf20Sopenharmony_ci	u32 pause_frames_sent_lo;
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ci	u32 etherstatspkts1024octetsto1522octets_hi;
1698c2ecf20Sopenharmony_ci	u32 etherstatspkts1024octetsto1522octets_lo;
1708c2ecf20Sopenharmony_ci	u32 etherstatspktsover1522octets_hi;
1718c2ecf20Sopenharmony_ci	u32 etherstatspktsover1522octets_lo;
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci	u32 brb_drop_hi;
1748c2ecf20Sopenharmony_ci	u32 brb_drop_lo;
1758c2ecf20Sopenharmony_ci	u32 brb_truncate_hi;
1768c2ecf20Sopenharmony_ci	u32 brb_truncate_lo;
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	u32 mac_filter_discard;
1798c2ecf20Sopenharmony_ci	u32 mf_tag_discard;
1808c2ecf20Sopenharmony_ci	u32 brb_truncate_discard;
1818c2ecf20Sopenharmony_ci	u32 mac_discard;
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ci	u32 driver_xoff;
1848c2ecf20Sopenharmony_ci	u32 rx_err_discard_pkt;
1858c2ecf20Sopenharmony_ci	u32 rx_skb_alloc_failed;
1868c2ecf20Sopenharmony_ci	u32 hw_csum_err;
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci	u32 nig_timer_max;
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_ci	/* TPA */
1918c2ecf20Sopenharmony_ci	u32 total_tpa_aggregations_hi;
1928c2ecf20Sopenharmony_ci	u32 total_tpa_aggregations_lo;
1938c2ecf20Sopenharmony_ci	u32 total_tpa_aggregated_frames_hi;
1948c2ecf20Sopenharmony_ci	u32 total_tpa_aggregated_frames_lo;
1958c2ecf20Sopenharmony_ci	u32 total_tpa_bytes_hi;
1968c2ecf20Sopenharmony_ci	u32 total_tpa_bytes_lo;
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ci	/* PFC */
1998c2ecf20Sopenharmony_ci	u32 pfc_frames_received_hi;
2008c2ecf20Sopenharmony_ci	u32 pfc_frames_received_lo;
2018c2ecf20Sopenharmony_ci	u32 pfc_frames_sent_hi;
2028c2ecf20Sopenharmony_ci	u32 pfc_frames_sent_lo;
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ci	/* Recovery */
2058c2ecf20Sopenharmony_ci	u32 recoverable_error;
2068c2ecf20Sopenharmony_ci	u32 unrecoverable_error;
2078c2ecf20Sopenharmony_ci	u32 driver_filtered_tx_pkt;
2088c2ecf20Sopenharmony_ci	/* src: Clear-on-Read register; Will not survive PMF Migration */
2098c2ecf20Sopenharmony_ci	u32 eee_tx_lpi;
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ci	/* PTP */
2128c2ecf20Sopenharmony_ci	u32 ptp_skip_tx_ts;
2138c2ecf20Sopenharmony_ci};
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_cistruct bnx2x_eth_q_stats {
2168c2ecf20Sopenharmony_ci	u32 total_unicast_bytes_received_hi;
2178c2ecf20Sopenharmony_ci	u32 total_unicast_bytes_received_lo;
2188c2ecf20Sopenharmony_ci	u32 total_broadcast_bytes_received_hi;
2198c2ecf20Sopenharmony_ci	u32 total_broadcast_bytes_received_lo;
2208c2ecf20Sopenharmony_ci	u32 total_multicast_bytes_received_hi;
2218c2ecf20Sopenharmony_ci	u32 total_multicast_bytes_received_lo;
2228c2ecf20Sopenharmony_ci	u32 total_bytes_received_hi;
2238c2ecf20Sopenharmony_ci	u32 total_bytes_received_lo;
2248c2ecf20Sopenharmony_ci	u32 total_unicast_bytes_transmitted_hi;
2258c2ecf20Sopenharmony_ci	u32 total_unicast_bytes_transmitted_lo;
2268c2ecf20Sopenharmony_ci	u32 total_broadcast_bytes_transmitted_hi;
2278c2ecf20Sopenharmony_ci	u32 total_broadcast_bytes_transmitted_lo;
2288c2ecf20Sopenharmony_ci	u32 total_multicast_bytes_transmitted_hi;
2298c2ecf20Sopenharmony_ci	u32 total_multicast_bytes_transmitted_lo;
2308c2ecf20Sopenharmony_ci	u32 total_bytes_transmitted_hi;
2318c2ecf20Sopenharmony_ci	u32 total_bytes_transmitted_lo;
2328c2ecf20Sopenharmony_ci	u32 total_unicast_packets_received_hi;
2338c2ecf20Sopenharmony_ci	u32 total_unicast_packets_received_lo;
2348c2ecf20Sopenharmony_ci	u32 total_multicast_packets_received_hi;
2358c2ecf20Sopenharmony_ci	u32 total_multicast_packets_received_lo;
2368c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_received_hi;
2378c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_received_lo;
2388c2ecf20Sopenharmony_ci	u32 total_unicast_packets_transmitted_hi;
2398c2ecf20Sopenharmony_ci	u32 total_unicast_packets_transmitted_lo;
2408c2ecf20Sopenharmony_ci	u32 total_multicast_packets_transmitted_hi;
2418c2ecf20Sopenharmony_ci	u32 total_multicast_packets_transmitted_lo;
2428c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_transmitted_hi;
2438c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_transmitted_lo;
2448c2ecf20Sopenharmony_ci	u32 valid_bytes_received_hi;
2458c2ecf20Sopenharmony_ci	u32 valid_bytes_received_lo;
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci	u32 etherstatsoverrsizepkts_hi;
2488c2ecf20Sopenharmony_ci	u32 etherstatsoverrsizepkts_lo;
2498c2ecf20Sopenharmony_ci	u32 no_buff_discard_hi;
2508c2ecf20Sopenharmony_ci	u32 no_buff_discard_lo;
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_ci	u32 driver_xoff;
2538c2ecf20Sopenharmony_ci	u32 rx_err_discard_pkt;
2548c2ecf20Sopenharmony_ci	u32 rx_skb_alloc_failed;
2558c2ecf20Sopenharmony_ci	u32 hw_csum_err;
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ci	u32 total_packets_received_checksum_discarded_hi;
2588c2ecf20Sopenharmony_ci	u32 total_packets_received_checksum_discarded_lo;
2598c2ecf20Sopenharmony_ci	u32 total_packets_received_ttl0_discarded_hi;
2608c2ecf20Sopenharmony_ci	u32 total_packets_received_ttl0_discarded_lo;
2618c2ecf20Sopenharmony_ci	u32 total_transmitted_dropped_packets_error_hi;
2628c2ecf20Sopenharmony_ci	u32 total_transmitted_dropped_packets_error_lo;
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_ci	/* TPA */
2658c2ecf20Sopenharmony_ci	u32 total_tpa_aggregations_hi;
2668c2ecf20Sopenharmony_ci	u32 total_tpa_aggregations_lo;
2678c2ecf20Sopenharmony_ci	u32 total_tpa_aggregated_frames_hi;
2688c2ecf20Sopenharmony_ci	u32 total_tpa_aggregated_frames_lo;
2698c2ecf20Sopenharmony_ci	u32 total_tpa_bytes_hi;
2708c2ecf20Sopenharmony_ci	u32 total_tpa_bytes_lo;
2718c2ecf20Sopenharmony_ci	u32 driver_filtered_tx_pkt;
2728c2ecf20Sopenharmony_ci};
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_cistruct bnx2x_eth_stats_old {
2758c2ecf20Sopenharmony_ci	u32 rx_stat_dot3statsframestoolong_hi;
2768c2ecf20Sopenharmony_ci	u32 rx_stat_dot3statsframestoolong_lo;
2778c2ecf20Sopenharmony_ci};
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_cistruct bnx2x_eth_q_stats_old {
2808c2ecf20Sopenharmony_ci	/* Fields to perserve over fw reset*/
2818c2ecf20Sopenharmony_ci	u32 total_unicast_bytes_received_hi;
2828c2ecf20Sopenharmony_ci	u32 total_unicast_bytes_received_lo;
2838c2ecf20Sopenharmony_ci	u32 total_broadcast_bytes_received_hi;
2848c2ecf20Sopenharmony_ci	u32 total_broadcast_bytes_received_lo;
2858c2ecf20Sopenharmony_ci	u32 total_multicast_bytes_received_hi;
2868c2ecf20Sopenharmony_ci	u32 total_multicast_bytes_received_lo;
2878c2ecf20Sopenharmony_ci	u32 total_unicast_bytes_transmitted_hi;
2888c2ecf20Sopenharmony_ci	u32 total_unicast_bytes_transmitted_lo;
2898c2ecf20Sopenharmony_ci	u32 total_broadcast_bytes_transmitted_hi;
2908c2ecf20Sopenharmony_ci	u32 total_broadcast_bytes_transmitted_lo;
2918c2ecf20Sopenharmony_ci	u32 total_multicast_bytes_transmitted_hi;
2928c2ecf20Sopenharmony_ci	u32 total_multicast_bytes_transmitted_lo;
2938c2ecf20Sopenharmony_ci	u32 total_tpa_bytes_hi;
2948c2ecf20Sopenharmony_ci	u32 total_tpa_bytes_lo;
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_ci	/* Fields to perserve last of */
2978c2ecf20Sopenharmony_ci	u32 total_bytes_received_hi;
2988c2ecf20Sopenharmony_ci	u32 total_bytes_received_lo;
2998c2ecf20Sopenharmony_ci	u32 total_bytes_transmitted_hi;
3008c2ecf20Sopenharmony_ci	u32 total_bytes_transmitted_lo;
3018c2ecf20Sopenharmony_ci	u32 total_unicast_packets_received_hi;
3028c2ecf20Sopenharmony_ci	u32 total_unicast_packets_received_lo;
3038c2ecf20Sopenharmony_ci	u32 total_multicast_packets_received_hi;
3048c2ecf20Sopenharmony_ci	u32 total_multicast_packets_received_lo;
3058c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_received_hi;
3068c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_received_lo;
3078c2ecf20Sopenharmony_ci	u32 total_unicast_packets_transmitted_hi;
3088c2ecf20Sopenharmony_ci	u32 total_unicast_packets_transmitted_lo;
3098c2ecf20Sopenharmony_ci	u32 total_multicast_packets_transmitted_hi;
3108c2ecf20Sopenharmony_ci	u32 total_multicast_packets_transmitted_lo;
3118c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_transmitted_hi;
3128c2ecf20Sopenharmony_ci	u32 total_broadcast_packets_transmitted_lo;
3138c2ecf20Sopenharmony_ci	u32 valid_bytes_received_hi;
3148c2ecf20Sopenharmony_ci	u32 valid_bytes_received_lo;
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ci	u32 total_tpa_bytes_hi_old;
3178c2ecf20Sopenharmony_ci	u32 total_tpa_bytes_lo_old;
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_ci	u32 driver_xoff_old;
3208c2ecf20Sopenharmony_ci	u32 rx_err_discard_pkt_old;
3218c2ecf20Sopenharmony_ci	u32 rx_skb_alloc_failed_old;
3228c2ecf20Sopenharmony_ci	u32 hw_csum_err_old;
3238c2ecf20Sopenharmony_ci	u32 driver_filtered_tx_pkt_old;
3248c2ecf20Sopenharmony_ci};
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_cistruct bnx2x_net_stats_old {
3278c2ecf20Sopenharmony_ci	 u32 rx_dropped;
3288c2ecf20Sopenharmony_ci};
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_cistruct bnx2x_fw_port_stats_old {
3318c2ecf20Sopenharmony_ci	 u32 mac_filter_discard;
3328c2ecf20Sopenharmony_ci	 u32 mf_tag_discard;
3338c2ecf20Sopenharmony_ci	 u32 brb_truncate_discard;
3348c2ecf20Sopenharmony_ci	 u32 mac_discard;
3358c2ecf20Sopenharmony_ci};
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ci/****************************************************************************
3388c2ecf20Sopenharmony_ci* Macros
3398c2ecf20Sopenharmony_ci****************************************************************************/
3408c2ecf20Sopenharmony_ci
3418c2ecf20Sopenharmony_ci/* sum[hi:lo] += add[hi:lo] */
3428c2ecf20Sopenharmony_ci#define ADD_64(s_hi, a_hi, s_lo, a_lo) \
3438c2ecf20Sopenharmony_ci	do { \
3448c2ecf20Sopenharmony_ci		s_lo += a_lo; \
3458c2ecf20Sopenharmony_ci		s_hi += a_hi + ((s_lo < a_lo) ? 1 : 0); \
3468c2ecf20Sopenharmony_ci	} while (0)
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ci#define LE32_0 ((__force __le32) 0)
3498c2ecf20Sopenharmony_ci#define LE16_0 ((__force __le16) 0)
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_ci/* The _force is for cases where high value is 0 */
3528c2ecf20Sopenharmony_ci#define ADD_64_LE(s_hi, a_hi_le, s_lo, a_lo_le) \
3538c2ecf20Sopenharmony_ci		ADD_64(s_hi, le32_to_cpu(a_hi_le), \
3548c2ecf20Sopenharmony_ci		       s_lo, le32_to_cpu(a_lo_le))
3558c2ecf20Sopenharmony_ci
3568c2ecf20Sopenharmony_ci#define ADD_64_LE16(s_hi, a_hi_le, s_lo, a_lo_le) \
3578c2ecf20Sopenharmony_ci		ADD_64(s_hi, le16_to_cpu(a_hi_le), \
3588c2ecf20Sopenharmony_ci		       s_lo, le16_to_cpu(a_lo_le))
3598c2ecf20Sopenharmony_ci
3608c2ecf20Sopenharmony_ci/* difference = minuend - subtrahend */
3618c2ecf20Sopenharmony_ci#define DIFF_64(d_hi, m_hi, s_hi, d_lo, m_lo, s_lo) \
3628c2ecf20Sopenharmony_ci	do { \
3638c2ecf20Sopenharmony_ci		if (m_lo < s_lo) { \
3648c2ecf20Sopenharmony_ci			/* underflow */ \
3658c2ecf20Sopenharmony_ci			d_hi = m_hi - s_hi; \
3668c2ecf20Sopenharmony_ci			if (d_hi > 0) { \
3678c2ecf20Sopenharmony_ci				/* we can 'loan' 1 */ \
3688c2ecf20Sopenharmony_ci				d_hi--; \
3698c2ecf20Sopenharmony_ci				d_lo = m_lo + (UINT_MAX - s_lo) + 1; \
3708c2ecf20Sopenharmony_ci			} else { \
3718c2ecf20Sopenharmony_ci				/* m_hi <= s_hi */ \
3728c2ecf20Sopenharmony_ci				d_hi = 0; \
3738c2ecf20Sopenharmony_ci				d_lo = 0; \
3748c2ecf20Sopenharmony_ci			} \
3758c2ecf20Sopenharmony_ci		} else { \
3768c2ecf20Sopenharmony_ci			/* m_lo >= s_lo */ \
3778c2ecf20Sopenharmony_ci			if (m_hi < s_hi) { \
3788c2ecf20Sopenharmony_ci				d_hi = 0; \
3798c2ecf20Sopenharmony_ci				d_lo = 0; \
3808c2ecf20Sopenharmony_ci			} else { \
3818c2ecf20Sopenharmony_ci				/* m_hi >= s_hi */ \
3828c2ecf20Sopenharmony_ci				d_hi = m_hi - s_hi; \
3838c2ecf20Sopenharmony_ci				d_lo = m_lo - s_lo; \
3848c2ecf20Sopenharmony_ci			} \
3858c2ecf20Sopenharmony_ci		} \
3868c2ecf20Sopenharmony_ci	} while (0)
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_ci#define UPDATE_STAT64(s, t) \
3898c2ecf20Sopenharmony_ci	do { \
3908c2ecf20Sopenharmony_ci		DIFF_64(diff.hi, new->s##_hi, pstats->mac_stx[0].t##_hi, \
3918c2ecf20Sopenharmony_ci			diff.lo, new->s##_lo, pstats->mac_stx[0].t##_lo); \
3928c2ecf20Sopenharmony_ci		pstats->mac_stx[0].t##_hi = new->s##_hi; \
3938c2ecf20Sopenharmony_ci		pstats->mac_stx[0].t##_lo = new->s##_lo; \
3948c2ecf20Sopenharmony_ci		ADD_64(pstats->mac_stx[1].t##_hi, diff.hi, \
3958c2ecf20Sopenharmony_ci		       pstats->mac_stx[1].t##_lo, diff.lo); \
3968c2ecf20Sopenharmony_ci	} while (0)
3978c2ecf20Sopenharmony_ci
3988c2ecf20Sopenharmony_ci#define UPDATE_STAT64_NIG(s, t) \
3998c2ecf20Sopenharmony_ci	do { \
4008c2ecf20Sopenharmony_ci		DIFF_64(diff.hi, new->s##_hi, old->s##_hi, \
4018c2ecf20Sopenharmony_ci			diff.lo, new->s##_lo, old->s##_lo); \
4028c2ecf20Sopenharmony_ci		ADD_64(estats->t##_hi, diff.hi, \
4038c2ecf20Sopenharmony_ci		       estats->t##_lo, diff.lo); \
4048c2ecf20Sopenharmony_ci	} while (0)
4058c2ecf20Sopenharmony_ci
4068c2ecf20Sopenharmony_ci/* sum[hi:lo] += add */
4078c2ecf20Sopenharmony_ci#define ADD_EXTEND_64(s_hi, s_lo, a) \
4088c2ecf20Sopenharmony_ci	do { \
4098c2ecf20Sopenharmony_ci		s_lo += a; \
4108c2ecf20Sopenharmony_ci		s_hi += (s_lo < a) ? 1 : 0; \
4118c2ecf20Sopenharmony_ci	} while (0)
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci#define ADD_STAT64(diff, t) \
4148c2ecf20Sopenharmony_ci	do { \
4158c2ecf20Sopenharmony_ci		ADD_64(pstats->mac_stx[1].t##_hi, new->diff##_hi, \
4168c2ecf20Sopenharmony_ci		       pstats->mac_stx[1].t##_lo, new->diff##_lo); \
4178c2ecf20Sopenharmony_ci	} while (0)
4188c2ecf20Sopenharmony_ci
4198c2ecf20Sopenharmony_ci#define UPDATE_EXTEND_STAT(s) \
4208c2ecf20Sopenharmony_ci	do { \
4218c2ecf20Sopenharmony_ci		ADD_EXTEND_64(pstats->mac_stx[1].s##_hi, \
4228c2ecf20Sopenharmony_ci			      pstats->mac_stx[1].s##_lo, \
4238c2ecf20Sopenharmony_ci			      new->s); \
4248c2ecf20Sopenharmony_ci	} while (0)
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci#define UPDATE_EXTEND_TSTAT_X(s, t, size) \
4278c2ecf20Sopenharmony_ci	do { \
4288c2ecf20Sopenharmony_ci		diff = le##size##_to_cpu(tclient->s) - \
4298c2ecf20Sopenharmony_ci		       le##size##_to_cpu(old_tclient->s); \
4308c2ecf20Sopenharmony_ci		old_tclient->s = tclient->s; \
4318c2ecf20Sopenharmony_ci		ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
4328c2ecf20Sopenharmony_ci	} while (0)
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci#define UPDATE_EXTEND_TSTAT(s, t) UPDATE_EXTEND_TSTAT_X(s, t, 32)
4358c2ecf20Sopenharmony_ci
4368c2ecf20Sopenharmony_ci#define UPDATE_EXTEND_E_TSTAT(s, t, size) \
4378c2ecf20Sopenharmony_ci	do { \
4388c2ecf20Sopenharmony_ci		UPDATE_EXTEND_TSTAT_X(s, t, size); \
4398c2ecf20Sopenharmony_ci		ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
4408c2ecf20Sopenharmony_ci	} while (0)
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci#define UPDATE_EXTEND_USTAT(s, t) \
4438c2ecf20Sopenharmony_ci	do { \
4448c2ecf20Sopenharmony_ci		diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \
4458c2ecf20Sopenharmony_ci		old_uclient->s = uclient->s; \
4468c2ecf20Sopenharmony_ci		ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
4478c2ecf20Sopenharmony_ci	} while (0)
4488c2ecf20Sopenharmony_ci
4498c2ecf20Sopenharmony_ci#define UPDATE_EXTEND_E_USTAT(s, t) \
4508c2ecf20Sopenharmony_ci	do { \
4518c2ecf20Sopenharmony_ci		UPDATE_EXTEND_USTAT(s, t); \
4528c2ecf20Sopenharmony_ci		ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
4538c2ecf20Sopenharmony_ci	} while (0)
4548c2ecf20Sopenharmony_ci
4558c2ecf20Sopenharmony_ci#define UPDATE_EXTEND_XSTAT(s, t) \
4568c2ecf20Sopenharmony_ci	do { \
4578c2ecf20Sopenharmony_ci		diff = le32_to_cpu(xclient->s) - le32_to_cpu(old_xclient->s); \
4588c2ecf20Sopenharmony_ci		old_xclient->s = xclient->s; \
4598c2ecf20Sopenharmony_ci		ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
4608c2ecf20Sopenharmony_ci	} while (0)
4618c2ecf20Sopenharmony_ci
4628c2ecf20Sopenharmony_ci#define UPDATE_QSTAT(s, t) \
4638c2ecf20Sopenharmony_ci	do { \
4648c2ecf20Sopenharmony_ci		qstats->t##_lo = qstats_old->t##_lo + le32_to_cpu(s.lo); \
4658c2ecf20Sopenharmony_ci		qstats->t##_hi = qstats_old->t##_hi + le32_to_cpu(s.hi) \
4668c2ecf20Sopenharmony_ci			+ ((qstats->t##_lo < qstats_old->t##_lo) ? 1 : 0); \
4678c2ecf20Sopenharmony_ci	} while (0)
4688c2ecf20Sopenharmony_ci
4698c2ecf20Sopenharmony_ci#define UPDATE_QSTAT_OLD(f) \
4708c2ecf20Sopenharmony_ci	do { \
4718c2ecf20Sopenharmony_ci		qstats_old->f = qstats->f; \
4728c2ecf20Sopenharmony_ci	} while (0)
4738c2ecf20Sopenharmony_ci
4748c2ecf20Sopenharmony_ci#define UPDATE_ESTAT_QSTAT_64(s) \
4758c2ecf20Sopenharmony_ci	do { \
4768c2ecf20Sopenharmony_ci		ADD_64(estats->s##_hi, qstats->s##_hi, \
4778c2ecf20Sopenharmony_ci		       estats->s##_lo, qstats->s##_lo); \
4788c2ecf20Sopenharmony_ci		SUB_64(estats->s##_hi, qstats_old->s##_hi_old, \
4798c2ecf20Sopenharmony_ci		       estats->s##_lo, qstats_old->s##_lo_old); \
4808c2ecf20Sopenharmony_ci		qstats_old->s##_hi_old = qstats->s##_hi; \
4818c2ecf20Sopenharmony_ci		qstats_old->s##_lo_old = qstats->s##_lo; \
4828c2ecf20Sopenharmony_ci	} while (0)
4838c2ecf20Sopenharmony_ci
4848c2ecf20Sopenharmony_ci#define UPDATE_ESTAT_QSTAT(s) \
4858c2ecf20Sopenharmony_ci	do { \
4868c2ecf20Sopenharmony_ci		estats->s += qstats->s; \
4878c2ecf20Sopenharmony_ci		estats->s -= qstats_old->s##_old; \
4888c2ecf20Sopenharmony_ci		qstats_old->s##_old = qstats->s; \
4898c2ecf20Sopenharmony_ci	} while (0)
4908c2ecf20Sopenharmony_ci
4918c2ecf20Sopenharmony_ci#define UPDATE_FSTAT_QSTAT(s) \
4928c2ecf20Sopenharmony_ci	do { \
4938c2ecf20Sopenharmony_ci		ADD_64(fstats->s##_hi, qstats->s##_hi, \
4948c2ecf20Sopenharmony_ci		       fstats->s##_lo, qstats->s##_lo); \
4958c2ecf20Sopenharmony_ci		SUB_64(fstats->s##_hi, qstats_old->s##_hi, \
4968c2ecf20Sopenharmony_ci		       fstats->s##_lo, qstats_old->s##_lo); \
4978c2ecf20Sopenharmony_ci		estats->s##_hi = fstats->s##_hi; \
4988c2ecf20Sopenharmony_ci		estats->s##_lo = fstats->s##_lo; \
4998c2ecf20Sopenharmony_ci		qstats_old->s##_hi = qstats->s##_hi; \
5008c2ecf20Sopenharmony_ci		qstats_old->s##_lo = qstats->s##_lo; \
5018c2ecf20Sopenharmony_ci	} while (0)
5028c2ecf20Sopenharmony_ci
5038c2ecf20Sopenharmony_ci#define UPDATE_FW_STAT(s) \
5048c2ecf20Sopenharmony_ci	do { \
5058c2ecf20Sopenharmony_ci		estats->s = le32_to_cpu(tport->s) + fwstats->s; \
5068c2ecf20Sopenharmony_ci	} while (0)
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci#define UPDATE_FW_STAT_OLD(f) \
5098c2ecf20Sopenharmony_ci	do { \
5108c2ecf20Sopenharmony_ci		fwstats->f = estats->f; \
5118c2ecf20Sopenharmony_ci	} while (0)
5128c2ecf20Sopenharmony_ci
5138c2ecf20Sopenharmony_ci#define UPDATE_ESTAT(s, t) \
5148c2ecf20Sopenharmony_ci	do { \
5158c2ecf20Sopenharmony_ci		SUB_64(estats->s##_hi, estats_old->t##_hi, \
5168c2ecf20Sopenharmony_ci		       estats->s##_lo, estats_old->t##_lo); \
5178c2ecf20Sopenharmony_ci		ADD_64(estats->s##_hi, estats->t##_hi, \
5188c2ecf20Sopenharmony_ci		       estats->s##_lo, estats->t##_lo); \
5198c2ecf20Sopenharmony_ci		estats_old->t##_hi = estats->t##_hi; \
5208c2ecf20Sopenharmony_ci		estats_old->t##_lo = estats->t##_lo; \
5218c2ecf20Sopenharmony_ci	} while (0)
5228c2ecf20Sopenharmony_ci
5238c2ecf20Sopenharmony_ci/* minuend -= subtrahend */
5248c2ecf20Sopenharmony_ci#define SUB_64(m_hi, s_hi, m_lo, s_lo) \
5258c2ecf20Sopenharmony_ci	do { \
5268c2ecf20Sopenharmony_ci		DIFF_64(m_hi, m_hi, s_hi, m_lo, m_lo, s_lo); \
5278c2ecf20Sopenharmony_ci	} while (0)
5288c2ecf20Sopenharmony_ci
5298c2ecf20Sopenharmony_ci/* minuend[hi:lo] -= subtrahend */
5308c2ecf20Sopenharmony_ci#define SUB_EXTEND_64(m_hi, m_lo, s) \
5318c2ecf20Sopenharmony_ci	do { \
5328c2ecf20Sopenharmony_ci		SUB_64(m_hi, 0, m_lo, s); \
5338c2ecf20Sopenharmony_ci	} while (0)
5348c2ecf20Sopenharmony_ci
5358c2ecf20Sopenharmony_ci#define SUB_EXTEND_USTAT(s, t) \
5368c2ecf20Sopenharmony_ci	do { \
5378c2ecf20Sopenharmony_ci		diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \
5388c2ecf20Sopenharmony_ci		SUB_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
5398c2ecf20Sopenharmony_ci	} while (0)
5408c2ecf20Sopenharmony_ci
5418c2ecf20Sopenharmony_ci/* forward */
5428c2ecf20Sopenharmony_cistruct bnx2x;
5438c2ecf20Sopenharmony_ci
5448c2ecf20Sopenharmony_civoid bnx2x_memset_stats(struct bnx2x *bp);
5458c2ecf20Sopenharmony_civoid bnx2x_stats_init(struct bnx2x *bp);
5468c2ecf20Sopenharmony_civoid bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event);
5478c2ecf20Sopenharmony_ciint bnx2x_stats_safe_exec(struct bnx2x *bp,
5488c2ecf20Sopenharmony_ci			  void (func_to_exec)(void *cookie),
5498c2ecf20Sopenharmony_ci			  void *cookie);
5508c2ecf20Sopenharmony_ci
5518c2ecf20Sopenharmony_ci/**
5528c2ecf20Sopenharmony_ci * bnx2x_save_statistics - save statistics when unloading.
5538c2ecf20Sopenharmony_ci *
5548c2ecf20Sopenharmony_ci * @bp:		driver handle
5558c2ecf20Sopenharmony_ci */
5568c2ecf20Sopenharmony_civoid bnx2x_save_statistics(struct bnx2x *bp);
5578c2ecf20Sopenharmony_ci
5588c2ecf20Sopenharmony_civoid bnx2x_afex_collect_stats(struct bnx2x *bp, void *void_afex_stats,
5598c2ecf20Sopenharmony_ci			      u32 stats_type);
5608c2ecf20Sopenharmony_ci#endif /* BNX2X_STATS_H */
561