bxe_stats.h revision 271782
152419Sjulian/*-
252419Sjulian * Copyright (c) 2007-2014 QLogic Corporation. All rights reserved.
3139823Simp *
4139823Simp * Redistribution and use in source and binary forms, with or without
5139823Simp * modification, are permitted provided that the following conditions
652419Sjulian * are met:
752419Sjulian *
870784Sjulian * 1. Redistributions of source code must retain the above copyright
952419Sjulian *    notice, this list of conditions and the following disclaimer.
1052419Sjulian * 2. Redistributions in binary form must reproduce the above copyright
1152419Sjulian *    notice, this list of conditions and the following disclaimer in the
1252419Sjulian *    documentation and/or other materials provided with the distribution.
1352419Sjulian *
1452419Sjulian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'
1552419Sjulian * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1652419Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1752419Sjulian * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
1852419Sjulian * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1970784Sjulian * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2052419Sjulian * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2152419Sjulian * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2252419Sjulian * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2352419Sjulian * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2452419Sjulian * THE POSSIBILITY OF SUCH DAMAGE.
2552419Sjulian */
2652419Sjulian
2752419Sjulian#ifndef BXE_STATS_H
2852419Sjulian#define BXE_STATS_H
2952419Sjulian
3052419Sjulian#include <sys/cdefs.h>
3152419Sjulian__FBSDID("$FreeBSD: head/sys/dev/bxe/bxe_stats.h 271782 2014-09-18 15:56:14Z glebius $");
3252419Sjulian
3352419Sjulian#include <sys/types.h>
3452419Sjulian
3552419Sjulianstruct nig_stats {
3652419Sjulian    uint32_t brb_discard;
3752419Sjulian    uint32_t brb_packet;
3867506Sjulian    uint32_t brb_truncate;
3952419Sjulian    uint32_t flow_ctrl_discard;
4052419Sjulian    uint32_t flow_ctrl_octets;
4152752Sjulian    uint32_t flow_ctrl_packet;
4252419Sjulian    uint32_t mng_discard;
4352419Sjulian    uint32_t mng_octet_inp;
4452419Sjulian    uint32_t mng_octet_out;
4552419Sjulian    uint32_t mng_packet_inp;
4652419Sjulian    uint32_t mng_packet_out;
4752419Sjulian    uint32_t pbf_octets;
4852419Sjulian    uint32_t pbf_packet;
4952419Sjulian    uint32_t safc_inp;
5052419Sjulian    uint32_t egress_mac_pkt0_lo;
5152419Sjulian    uint32_t egress_mac_pkt0_hi;
5252419Sjulian    uint32_t egress_mac_pkt1_lo;
5352419Sjulian    uint32_t egress_mac_pkt1_hi;
5452419Sjulian};
55132705Sglebius
5695759Stanimura
5752419Sjulianenum bxe_stats_event {
5852419Sjulian    STATS_EVENT_PMF = 0,
59132013Srwatson    STATS_EVENT_LINK_UP,
60164033Srwatson    STATS_EVENT_UPDATE,
6152419Sjulian    STATS_EVENT_STOP,
6295759Stanimura    STATS_EVENT_MAX
6352419Sjulian};
6452419Sjulian
65159590Sjhbenum bxe_stats_state {
6652419Sjulian    STATS_STATE_DISABLED = 0,
6752419Sjulian    STATS_STATE_ENABLED,
6852419Sjulian    STATS_STATE_MAX
6952419Sjulian};
7052419Sjulian
7152419Sjulianstruct bxe_eth_stats {
7252919Sjulian    uint32_t total_bytes_received_hi;
7352419Sjulian    uint32_t total_bytes_received_lo;
7452419Sjulian    uint32_t total_bytes_transmitted_hi;
7570870Sjulian    uint32_t total_bytes_transmitted_lo;
7670870Sjulian    uint32_t total_unicast_packets_received_hi;
7770870Sjulian    uint32_t total_unicast_packets_received_lo;
7870870Sjulian    uint32_t total_multicast_packets_received_hi;
7970870Sjulian    uint32_t total_multicast_packets_received_lo;
8070870Sjulian    uint32_t total_broadcast_packets_received_hi;
8170870Sjulian    uint32_t total_broadcast_packets_received_lo;
8270870Sjulian    uint32_t total_unicast_packets_transmitted_hi;
8352419Sjulian    uint32_t total_unicast_packets_transmitted_lo;
8452419Sjulian    uint32_t total_multicast_packets_transmitted_hi;
8552419Sjulian    uint32_t total_multicast_packets_transmitted_lo;
8652419Sjulian    uint32_t total_broadcast_packets_transmitted_hi;
8752419Sjulian    uint32_t total_broadcast_packets_transmitted_lo;
8852419Sjulian    uint32_t valid_bytes_received_hi;
8952419Sjulian    uint32_t valid_bytes_received_lo;
9052419Sjulian
9152419Sjulian    uint32_t error_bytes_received_hi;
9252419Sjulian    uint32_t error_bytes_received_lo;
9352419Sjulian    uint32_t etherstatsoverrsizepkts_hi;
9452419Sjulian    uint32_t etherstatsoverrsizepkts_lo;
9552419Sjulian    uint32_t no_buff_discard_hi;
9652419Sjulian    uint32_t no_buff_discard_lo;
9752419Sjulian
9852419Sjulian    uint32_t rx_stat_ifhcinbadoctets_hi;
9952419Sjulian    uint32_t rx_stat_ifhcinbadoctets_lo;
10052419Sjulian    uint32_t tx_stat_ifhcoutbadoctets_hi;
10152419Sjulian    uint32_t tx_stat_ifhcoutbadoctets_lo;
10252419Sjulian    uint32_t rx_stat_dot3statsfcserrors_hi;
10352419Sjulian    uint32_t rx_stat_dot3statsfcserrors_lo;
10452419Sjulian    uint32_t rx_stat_dot3statsalignmenterrors_hi;
10552419Sjulian    uint32_t rx_stat_dot3statsalignmenterrors_lo;
10652419Sjulian    uint32_t rx_stat_dot3statscarriersenseerrors_hi;
10752419Sjulian    uint32_t rx_stat_dot3statscarriersenseerrors_lo;
10852419Sjulian    uint32_t rx_stat_falsecarriererrors_hi;
10952419Sjulian    uint32_t rx_stat_falsecarriererrors_lo;
11052752Sjulian    uint32_t rx_stat_etherstatsundersizepkts_hi;
11152752Sjulian    uint32_t rx_stat_etherstatsundersizepkts_lo;
11270700Sjulian    uint32_t rx_stat_dot3statsframestoolong_hi;
11352752Sjulian    uint32_t rx_stat_dot3statsframestoolong_lo;
11472053Sjulian    uint32_t rx_stat_etherstatsfragments_hi;
11552752Sjulian    uint32_t rx_stat_etherstatsfragments_lo;
11652885Sjulian    uint32_t rx_stat_etherstatsjabbers_hi;
11752419Sjulian    uint32_t rx_stat_etherstatsjabbers_lo;
11852419Sjulian    uint32_t rx_stat_maccontrolframesreceived_hi;
11952419Sjulian    uint32_t rx_stat_maccontrolframesreceived_lo;
12052419Sjulian    uint32_t rx_stat_bmac_xpf_hi;
12152419Sjulian    uint32_t rx_stat_bmac_xpf_lo;
122151975Sglebius    uint32_t rx_stat_bmac_xcf_hi;
123151975Sglebius    uint32_t rx_stat_bmac_xcf_lo;
124163463Sglebius    uint32_t rx_stat_xoffstateentered_hi;
125163463Sglebius    uint32_t rx_stat_xoffstateentered_lo;
126163463Sglebius    uint32_t rx_stat_xonpauseframesreceived_hi;
12752419Sjulian    uint32_t rx_stat_xonpauseframesreceived_lo;
12852419Sjulian    uint32_t rx_stat_xoffpauseframesreceived_hi;
12952419Sjulian    uint32_t rx_stat_xoffpauseframesreceived_lo;
13052419Sjulian    uint32_t tx_stat_outxonsent_hi;
131147774Sglebius    uint32_t tx_stat_outxonsent_lo;
13252419Sjulian    uint32_t tx_stat_outxoffsent_hi;
13352419Sjulian    uint32_t tx_stat_outxoffsent_lo;
13452419Sjulian    uint32_t tx_stat_flowcontroldone_hi;
135129823Sjulian    uint32_t tx_stat_flowcontroldone_lo;
136129823Sjulian    uint32_t tx_stat_etherstatscollisions_hi;
137129823Sjulian    uint32_t tx_stat_etherstatscollisions_lo;
138129823Sjulian    uint32_t tx_stat_dot3statssinglecollisionframes_hi;
139129823Sjulian    uint32_t tx_stat_dot3statssinglecollisionframes_lo;
140129823Sjulian    uint32_t tx_stat_dot3statsmultiplecollisionframes_hi;
141129823Sjulian    uint32_t tx_stat_dot3statsmultiplecollisionframes_lo;
142129823Sjulian    uint32_t tx_stat_dot3statsdeferredtransmissions_hi;
143129823Sjulian    uint32_t tx_stat_dot3statsdeferredtransmissions_lo;
144129823Sjulian    uint32_t tx_stat_dot3statsexcessivecollisions_hi;
14552419Sjulian    uint32_t tx_stat_dot3statsexcessivecollisions_lo;
146138238Smlaier    uint32_t tx_stat_dot3statslatecollisions_hi;
14752419Sjulian    uint32_t tx_stat_dot3statslatecollisions_lo;
14852419Sjulian    uint32_t tx_stat_etherstatspkts64octets_hi;
14964512Sarchie    uint32_t tx_stat_etherstatspkts64octets_lo;
150124871Sru    uint32_t tx_stat_etherstatspkts65octetsto127octets_hi;
151124871Sru    uint32_t tx_stat_etherstatspkts65octetsto127octets_lo;
15252419Sjulian    uint32_t tx_stat_etherstatspkts128octetsto255octets_hi;
153124871Sru    uint32_t tx_stat_etherstatspkts128octetsto255octets_lo;
154125116Sru    uint32_t tx_stat_etherstatspkts256octetsto511octets_hi;
15552419Sjulian    uint32_t tx_stat_etherstatspkts256octetsto511octets_lo;
15653526Sjulian    uint32_t tx_stat_etherstatspkts512octetsto1023octets_hi;
15752419Sjulian    uint32_t tx_stat_etherstatspkts512octetsto1023octets_lo;
158131933Smarcel    uint32_t tx_stat_etherstatspkts1024octetsto1522octets_hi;
15952419Sjulian    uint32_t tx_stat_etherstatspkts1024octetsto1522octets_lo;
16052419Sjulian    uint32_t tx_stat_etherstatspktsover1522octets_hi;
16152419Sjulian    uint32_t tx_stat_etherstatspktsover1522octets_lo;
16252419Sjulian    uint32_t tx_stat_bmac_2047_hi;
16352419Sjulian    uint32_t tx_stat_bmac_2047_lo;
16452419Sjulian    uint32_t tx_stat_bmac_4095_hi;
16552419Sjulian    uint32_t tx_stat_bmac_4095_lo;
16652419Sjulian    uint32_t tx_stat_bmac_9216_hi;
16752419Sjulian    uint32_t tx_stat_bmac_9216_lo;
16883366Sjulian    uint32_t tx_stat_bmac_16383_hi;
16952419Sjulian    uint32_t tx_stat_bmac_16383_lo;
17052419Sjulian    uint32_t tx_stat_dot3statsinternalmactransmiterrors_hi;
171164033Srwatson    uint32_t tx_stat_dot3statsinternalmactransmiterrors_lo;
17252419Sjulian    uint32_t tx_stat_bmac_ufl_hi;
173164033Srwatson    uint32_t tx_stat_bmac_ufl_lo;
174164033Srwatson
175164033Srwatson    uint32_t pause_frames_received_hi;
17652419Sjulian    uint32_t pause_frames_received_lo;
17752419Sjulian    uint32_t pause_frames_sent_hi;
17852419Sjulian    uint32_t pause_frames_sent_lo;
17952419Sjulian
18052419Sjulian    uint32_t etherstatspkts1024octetsto1522octets_hi;
181157370Srwatson    uint32_t etherstatspkts1024octetsto1522octets_lo;
18252419Sjulian    uint32_t etherstatspktsover1522octets_hi;
18352419Sjulian    uint32_t etherstatspktsover1522octets_lo;
18452419Sjulian
18552419Sjulian    uint32_t brb_drop_hi;
186157370Srwatson    uint32_t brb_drop_lo;
187151975Sglebius    uint32_t brb_truncate_hi;
18852419Sjulian    uint32_t brb_truncate_lo;
18952419Sjulian
19052419Sjulian    uint32_t mac_filter_discard;
19152419Sjulian    uint32_t mf_tag_discard;
19283366Sjulian    uint32_t brb_truncate_discard;
19352419Sjulian    uint32_t mac_discard;
19452419Sjulian
195147774Sglebius    uint32_t nig_timer_max;
19652419Sjulian
19770700Sjulian    uint32_t total_tpa_aggregations_hi;
19852419Sjulian    uint32_t total_tpa_aggregations_lo;
199146317Sglebius    uint32_t total_tpa_aggregated_frames_hi;
20070700Sjulian    uint32_t total_tpa_aggregated_frames_lo;
20152419Sjulian    uint32_t total_tpa_bytes_hi;
202172806Smav    uint32_t total_tpa_bytes_lo;
20352419Sjulian
20452419Sjulian    /* PFC */
20583366Sjulian    uint32_t pfc_frames_received_hi;
20652419Sjulian    uint32_t pfc_frames_received_lo;
20752419Sjulian    uint32_t pfc_frames_sent_hi;
20852419Sjulian    uint32_t pfc_frames_sent_lo;
20952419Sjulian
21052419Sjulian    /* Recovery */
21152419Sjulian    uint32_t recoverable_error;
21252419Sjulian    uint32_t unrecoverable_error;
21352419Sjulian
21452419Sjulian    /* src: Clear-on-Read register; Will not survive PMF Migration */
21552419Sjulian    uint32_t eee_tx_lpi;
21652419Sjulian
21752419Sjulian    /* receive path driver statistics */
218163463Sglebius    uint32_t rx_calls;
21952419Sjulian    uint32_t rx_pkts;
22052419Sjulian    uint32_t rx_tpa_pkts;
22152419Sjulian    uint32_t rx_soft_errors;
22252419Sjulian    uint32_t rx_hw_csum_errors;
22352419Sjulian    uint32_t rx_ofld_frames_csum_ip;
224163463Sglebius    uint32_t rx_ofld_frames_csum_tcp_udp;
225163463Sglebius    uint32_t rx_budget_reached;
226163463Sglebius
227163463Sglebius    /* tx path driver statistics */
22852419Sjulian    uint32_t tx_pkts;
229163463Sglebius    uint32_t tx_soft_errors;
23052419Sjulian    uint32_t tx_ofld_frames_csum_ip;
23152419Sjulian    uint32_t tx_ofld_frames_csum_tcp;
23252419Sjulian    uint32_t tx_ofld_frames_csum_udp;
233163463Sglebius    uint32_t tx_ofld_frames_lso;
234163463Sglebius    uint32_t tx_ofld_frames_lso_hdr_splits;
235163463Sglebius    uint32_t tx_encap_failures;
236163463Sglebius    uint32_t tx_hw_queue_full;
23752419Sjulian    uint32_t tx_hw_max_queue_depth;
23852419Sjulian    uint32_t tx_dma_mapping_failure;
23952419Sjulian    uint32_t tx_max_drbr_queue_depth;
240163463Sglebius    uint32_t tx_window_violation_std;
241163463Sglebius    uint32_t tx_window_violation_tso;
242163463Sglebius    //uint32_t tx_unsupported_tso_request_ipv6;
243163463Sglebius    //uint32_t tx_unsupported_tso_request_not_tcp;
244163463Sglebius    uint32_t tx_chain_lost_mbuf;
24570700Sjulian    uint32_t tx_frames_deferred;
24652419Sjulian    uint32_t tx_queue_xoff;
247141308Sglebius
248163463Sglebius    /* mbuf driver statistics */
249141308Sglebius    uint32_t mbuf_defrag_attempts;
250141308Sglebius    uint32_t mbuf_defrag_failures;
251141308Sglebius    uint32_t mbuf_rx_bd_alloc_failed;
252141308Sglebius    uint32_t mbuf_rx_bd_mapping_failed;
253132705Sglebius    uint32_t mbuf_rx_tpa_alloc_failed;
254132705Sglebius    uint32_t mbuf_rx_tpa_mapping_failed;
255132705Sglebius    uint32_t mbuf_rx_sge_alloc_failed;
256132705Sglebius    uint32_t mbuf_rx_sge_mapping_failed;
257132705Sglebius
258132705Sglebius    /* track the number of allocated mbufs */
259132939Sglebius    uint32_t mbuf_alloc_tx;
260132939Sglebius    uint32_t mbuf_alloc_rx;
261132705Sglebius    uint32_t mbuf_alloc_sge;
262132705Sglebius    uint32_t mbuf_alloc_tpa;
263132705Sglebius};
264132705Sglebius
265132705Sglebius
266159590Sjhbstruct bxe_eth_q_stats {
267132705Sglebius    uint32_t total_unicast_bytes_received_hi;
268146296Sglebius    uint32_t total_unicast_bytes_received_lo;
269146296Sglebius    uint32_t total_broadcast_bytes_received_hi;
270146296Sglebius    uint32_t total_broadcast_bytes_received_lo;
271159590Sjhb    uint32_t total_multicast_bytes_received_hi;
272132705Sglebius    uint32_t total_multicast_bytes_received_lo;
273163463Sglebius    uint32_t total_bytes_received_hi;
274132705Sglebius    uint32_t total_bytes_received_lo;
275132705Sglebius    uint32_t total_unicast_bytes_transmitted_hi;
276132705Sglebius    uint32_t total_unicast_bytes_transmitted_lo;
277146296Sglebius    uint32_t total_broadcast_bytes_transmitted_hi;
278132705Sglebius    uint32_t total_broadcast_bytes_transmitted_lo;
279163463Sglebius    uint32_t total_multicast_bytes_transmitted_hi;
280159590Sjhb    uint32_t total_multicast_bytes_transmitted_lo;
281159590Sjhb    uint32_t total_bytes_transmitted_hi;
282132705Sglebius    uint32_t total_bytes_transmitted_lo;
283132705Sglebius    uint32_t total_unicast_packets_received_hi;
284132705Sglebius    uint32_t total_unicast_packets_received_lo;
285132705Sglebius    uint32_t total_multicast_packets_received_hi;
286132705Sglebius    uint32_t total_multicast_packets_received_lo;
287132705Sglebius    uint32_t total_broadcast_packets_received_hi;
288163463Sglebius    uint32_t total_broadcast_packets_received_lo;
289163463Sglebius    uint32_t total_unicast_packets_transmitted_hi;
290163463Sglebius    uint32_t total_unicast_packets_transmitted_lo;
291146296Sglebius    uint32_t total_multicast_packets_transmitted_hi;
292146317Sglebius    uint32_t total_multicast_packets_transmitted_lo;
293146317Sglebius    uint32_t total_broadcast_packets_transmitted_hi;
294146317Sglebius    uint32_t total_broadcast_packets_transmitted_lo;
295146317Sglebius    uint32_t valid_bytes_received_hi;
296146296Sglebius    uint32_t valid_bytes_received_lo;
297146317Sglebius
298146317Sglebius    uint32_t etherstatsoverrsizepkts_hi;
299146317Sglebius    uint32_t etherstatsoverrsizepkts_lo;
300146317Sglebius    uint32_t no_buff_discard_hi;
301146317Sglebius    uint32_t no_buff_discard_lo;
302146317Sglebius
303146317Sglebius    uint32_t total_packets_received_checksum_discarded_hi;
304146317Sglebius    uint32_t total_packets_received_checksum_discarded_lo;
305146317Sglebius    uint32_t total_packets_received_ttl0_discarded_hi;
30670784Sjulian    uint32_t total_packets_received_ttl0_discarded_lo;
307146317Sglebius    uint32_t total_transmitted_dropped_packets_error_hi;
308147774Sglebius    uint32_t total_transmitted_dropped_packets_error_lo;
309147774Sglebius
310147774Sglebius    uint32_t total_tpa_aggregations_hi;
311147774Sglebius    uint32_t total_tpa_aggregations_lo;
312147774Sglebius    uint32_t total_tpa_aggregated_frames_hi;
313147774Sglebius    uint32_t total_tpa_aggregated_frames_lo;
314147774Sglebius    uint32_t total_tpa_bytes_hi;
315147774Sglebius    uint32_t total_tpa_bytes_lo;
316172806Smav
317172806Smav    /* receive path driver statistics */
318172806Smav    uint32_t rx_calls;
319172806Smav    uint32_t rx_pkts;
320147774Sglebius    uint32_t rx_tpa_pkts;
321146296Sglebius    uint32_t rx_soft_errors;
322172806Smav    uint32_t rx_hw_csum_errors;
323147774Sglebius    uint32_t rx_ofld_frames_csum_ip;
324172806Smav    uint32_t rx_ofld_frames_csum_tcp_udp;
325172806Smav    uint32_t rx_budget_reached;
326172806Smav
327172806Smav    /* tx path driver statistics */
328172806Smav    uint32_t tx_pkts;
329172806Smav    uint32_t tx_soft_errors;
330172806Smav    uint32_t tx_ofld_frames_csum_ip;
331147774Sglebius    uint32_t tx_ofld_frames_csum_tcp;
33252419Sjulian    uint32_t tx_ofld_frames_csum_udp;
33352419Sjulian    uint32_t tx_ofld_frames_lso;
334163463Sglebius    uint32_t tx_ofld_frames_lso_hdr_splits;
33552419Sjulian    uint32_t tx_encap_failures;
33652419Sjulian    uint32_t tx_hw_queue_full;
33752419Sjulian    uint32_t tx_hw_max_queue_depth;
33852419Sjulian    uint32_t tx_dma_mapping_failure;
33952419Sjulian    uint32_t tx_max_drbr_queue_depth;
34052419Sjulian    uint32_t tx_window_violation_std;
34152419Sjulian    uint32_t tx_window_violation_tso;
34252419Sjulian    //uint32_t tx_unsupported_tso_request_ipv6;
34383366Sjulian    //uint32_t tx_unsupported_tso_request_not_tcp;
34452419Sjulian    uint32_t tx_chain_lost_mbuf;
34552419Sjulian    uint32_t tx_frames_deferred;
34652419Sjulian    uint32_t tx_queue_xoff;
34752419Sjulian
34852419Sjulian    /* mbuf driver statistics */
34952419Sjulian    uint32_t mbuf_defrag_attempts;
35052419Sjulian    uint32_t mbuf_defrag_failures;
35152419Sjulian    uint32_t mbuf_rx_bd_alloc_failed;
35252419Sjulian    uint32_t mbuf_rx_bd_mapping_failed;
35383366Sjulian    uint32_t mbuf_rx_tpa_alloc_failed;
35452419Sjulian    uint32_t mbuf_rx_tpa_mapping_failed;
35570700Sjulian    uint32_t mbuf_rx_sge_alloc_failed;
35670784Sjulian    uint32_t mbuf_rx_sge_mapping_failed;
35770700Sjulian
35870700Sjulian    /* track the number of allocated mbufs */
359163463Sglebius    uint32_t mbuf_alloc_tx;
36070700Sjulian    uint32_t mbuf_alloc_rx;
36152419Sjulian    uint32_t mbuf_alloc_sge;
36252419Sjulian    uint32_t mbuf_alloc_tpa;
36352419Sjulian};
36452419Sjulian
36552419Sjulianstruct bxe_eth_stats_old {
36652419Sjulian    uint32_t rx_stat_dot3statsframestoolong_hi;
36752419Sjulian    uint32_t rx_stat_dot3statsframestoolong_lo;
36883366Sjulian};
36952419Sjulian
37052419Sjulianstruct bxe_eth_q_stats_old {
37152419Sjulian    /* Fields to perserve over fw reset*/
37252419Sjulian    uint32_t total_unicast_bytes_received_hi;
37352419Sjulian    uint32_t total_unicast_bytes_received_lo;
37452419Sjulian    uint32_t total_broadcast_bytes_received_hi;
37552419Sjulian    uint32_t total_broadcast_bytes_received_lo;
37652419Sjulian    uint32_t total_multicast_bytes_received_hi;
377157370Srwatson    uint32_t total_multicast_bytes_received_lo;
37852419Sjulian    uint32_t total_unicast_bytes_transmitted_hi;
37952419Sjulian    uint32_t total_unicast_bytes_transmitted_lo;
38052419Sjulian    uint32_t total_broadcast_bytes_transmitted_hi;
38152419Sjulian    uint32_t total_broadcast_bytes_transmitted_lo;
382157558Srwatson    uint32_t total_multicast_bytes_transmitted_hi;
383151975Sglebius    uint32_t total_multicast_bytes_transmitted_lo;
38452419Sjulian    uint32_t total_tpa_bytes_hi;
38552419Sjulian    uint32_t total_tpa_bytes_lo;
38652419Sjulian
38752419Sjulian    /* Fields to perserve last of */
38883366Sjulian    uint32_t total_bytes_received_hi;
38952419Sjulian    uint32_t total_bytes_received_lo;
39052419Sjulian    uint32_t total_bytes_transmitted_hi;
39152419Sjulian    uint32_t total_bytes_transmitted_lo;
392163463Sglebius    uint32_t total_unicast_packets_received_hi;
39353498Sjulian    uint32_t total_unicast_packets_received_lo;
394125028Sharti    uint32_t total_multicast_packets_received_hi;
39552419Sjulian    uint32_t total_multicast_packets_received_lo;
39652419Sjulian    uint32_t total_broadcast_packets_received_hi;
39752419Sjulian    uint32_t total_broadcast_packets_received_lo;
39852419Sjulian    uint32_t total_unicast_packets_transmitted_hi;
39952419Sjulian    uint32_t total_unicast_packets_transmitted_lo;
40052419Sjulian    uint32_t total_multicast_packets_transmitted_hi;
40152419Sjulian    uint32_t total_multicast_packets_transmitted_lo;
40252419Sjulian    uint32_t total_broadcast_packets_transmitted_hi;
40352419Sjulian    uint32_t total_broadcast_packets_transmitted_lo;
404146718Sbz    uint32_t valid_bytes_received_hi;
405146718Sbz    uint32_t valid_bytes_received_lo;
406146718Sbz
407146718Sbz    uint32_t total_tpa_bytes_hi_old;
408146718Sbz    uint32_t total_tpa_bytes_lo_old;
409146718Sbz
41053498Sjulian    /* receive path driver statistics */
41153498Sjulian    uint32_t rx_calls_old;
41253498Sjulian    uint32_t rx_pkts_old;
41353498Sjulian    uint32_t rx_tpa_pkts_old;
414146718Sbz    uint32_t rx_soft_errors_old;
41570784Sjulian    uint32_t rx_hw_csum_errors_old;
41653498Sjulian    uint32_t rx_ofld_frames_csum_ip_old;
41753498Sjulian    uint32_t rx_ofld_frames_csum_tcp_udp_old;
41853498Sjulian    uint32_t rx_budget_reached_old;
41953498Sjulian
420163463Sglebius    /* tx path driver statistics */
42153498Sjulian    uint32_t tx_pkts_old;
42253498Sjulian    uint32_t tx_soft_errors_old;
42370784Sjulian    uint32_t tx_ofld_frames_csum_ip_old;
42453498Sjulian    uint32_t tx_ofld_frames_csum_tcp_old;
425125028Sharti    uint32_t tx_ofld_frames_csum_udp_old;
42653498Sjulian    uint32_t tx_ofld_frames_lso_old;
42753498Sjulian    uint32_t tx_ofld_frames_lso_hdr_splits_old;
42853498Sjulian    uint32_t tx_encap_failures_old;
42952419Sjulian    uint32_t tx_hw_queue_full_old;
43053498Sjulian    uint32_t tx_hw_max_queue_depth_old;
43153498Sjulian    uint32_t tx_dma_mapping_failure_old;
43253498Sjulian    uint32_t tx_max_drbr_queue_depth_old;
43353498Sjulian    uint32_t tx_window_violation_std_old;
43453498Sjulian    uint32_t tx_window_violation_tso_old;
43553498Sjulian    //uint32_t tx_unsupported_tso_request_ipv6_old;
43652419Sjulian    //uint32_t tx_unsupported_tso_request_not_tcp_old;
43753498Sjulian    uint32_t tx_chain_lost_mbuf_old;
438163463Sglebius    uint32_t tx_frames_deferred_old;
43972053Sjulian    uint32_t tx_queue_xoff_old;
44053498Sjulian
441163463Sglebius    /* mbuf driver statistics */
44272053Sjulian    uint32_t mbuf_defrag_attempts_old;
44352419Sjulian    uint32_t mbuf_defrag_failures_old;
44452419Sjulian    uint32_t mbuf_rx_bd_alloc_failed_old;
445163463Sglebius    uint32_t mbuf_rx_bd_mapping_failed_old;
446163463Sglebius    uint32_t mbuf_rx_tpa_alloc_failed_old;
44752419Sjulian    uint32_t mbuf_rx_tpa_mapping_failed_old;
44852419Sjulian    uint32_t mbuf_rx_sge_alloc_failed_old;
44952419Sjulian    uint32_t mbuf_rx_sge_mapping_failed_old;
45052419Sjulian
45152419Sjulian    /* track the number of allocated mbufs */
45252419Sjulian    int mbuf_alloc_tx_old;
45352419Sjulian    int mbuf_alloc_rx_old;
45452419Sjulian    int mbuf_alloc_sge_old;
45552419Sjulian    int mbuf_alloc_tpa_old;
45652419Sjulian};
45783366Sjulian
45852419Sjulianstruct bxe_net_stats_old {
45952419Sjulian    uint32_t rx_dropped;
46052419Sjulian};
46152419Sjulian
46252419Sjulianstruct bxe_fw_port_stats_old {
46352419Sjulian    uint32_t pfc_frames_tx_hi;
46452419Sjulian    uint32_t pfc_frames_tx_lo;
46552419Sjulian    uint32_t pfc_frames_rx_hi;
46652419Sjulian    uint32_t pfc_frames_rx_lo;
46752419Sjulian
46852419Sjulian    uint32_t mac_filter_discard;
46952419Sjulian    uint32_t mf_tag_discard;
470169462Srwatson    uint32_t brb_truncate_discard;
47152419Sjulian    uint32_t mac_discard;
47253098Sbrian};
47353098Sbrian
474151975Sglebius/* sum[hi:lo] += add[hi:lo] */
475151975Sglebius#define ADD_64(s_hi, a_hi, s_lo, a_lo)          \
47652419Sjulian    do {                                        \
47753098Sbrian        s_lo += a_lo;                           \
47853098Sbrian        s_hi += a_hi + ((s_lo < a_lo) ? 1 : 0); \
47953098Sbrian    } while (0)
48053098Sbrian
481151975Sglebius#define LE32_0 ((uint32_t) 0)
482151975Sglebius#define LE16_0 ((uint16_t) 0)
48352419Sjulian
48453098Sbrian/* The _force is for cases where high value is 0 */
485151975Sglebius#define ADD_64_LE(s_hi, a_hi_le, s_lo, a_lo_le) \
486151975Sglebius        ADD_64(s_hi, le32toh(a_hi_le),          \
487151975Sglebius               s_lo, le32toh(a_lo_le))
488151975Sglebius
48953098Sbrian#define ADD_64_LE16(s_hi, a_hi_le, s_lo, a_lo_le) \
490151975Sglebius        ADD_64(s_hi, le16toh(a_hi_le),            \
491151975Sglebius               s_lo, le16toh(a_lo_le))
49253098Sbrian
493151975Sglebius/* difference = minuend - subtrahend */
49453098Sbrian#define DIFF_64(d_hi, m_hi, s_hi, d_lo, m_lo, s_lo)  \
495151975Sglebius    do {                                             \
496151975Sglebius        if (m_lo < s_lo) {                           \
49753098Sbrian            /* underflow */                          \
498151975Sglebius            d_hi = m_hi - s_hi;                      \
499151975Sglebius            if (d_hi > 0) {                          \
500151975Sglebius                /* we can 'loan' 1 */                \
501151975Sglebius                d_hi--;                              \
502151975Sglebius                d_lo = m_lo + (UINT_MAX - s_lo) + 1; \
503151975Sglebius            } else {                                 \
504151975Sglebius                /* m_hi <= s_hi */                   \
505151975Sglebius                d_hi = 0;                            \
506151975Sglebius                d_lo = 0;                            \
507151975Sglebius            }                                        \
50852419Sjulian        } else {                                     \
50952419Sjulian            /* m_lo >= s_lo */                       \
51052419Sjulian            if (m_hi < s_hi) {                       \
51152419Sjulian                d_hi = 0;                            \
51252419Sjulian                d_lo = 0;                            \
51352419Sjulian            } else {                                 \
51452419Sjulian                /* m_hi >= s_hi */                   \
51552419Sjulian                d_hi = m_hi - s_hi;                  \
51652419Sjulian                d_lo = m_lo - s_lo;                  \
51752419Sjulian            }                                        \
51852419Sjulian        }                                            \
519151975Sglebius    } while (0)
52052419Sjulian
52152419Sjulian#define UPDATE_STAT64(s, t)                                      \
52252419Sjulian    do {                                                         \
523151975Sglebius        DIFF_64(diff.hi, new->s##_hi, pstats->mac_stx[0].t##_hi, \
524163463Sglebius            diff.lo, new->s##_lo, pstats->mac_stx[0].t##_lo);    \
525151975Sglebius        pstats->mac_stx[0].t##_hi = new->s##_hi;                 \
52652419Sjulian        pstats->mac_stx[0].t##_lo = new->s##_lo;                 \
527151975Sglebius        ADD_64(pstats->mac_stx[1].t##_hi, diff.hi,               \
528163463Sglebius               pstats->mac_stx[1].t##_lo, diff.lo);              \
52952419Sjulian    } while (0)
530151975Sglebius
53153526Sjulian#define UPDATE_STAT64_NIG(s, t)                    \
53252419Sjulian    do {                                           \
533151975Sglebius        DIFF_64(diff.hi, new->s##_hi, old->s##_hi, \
534151975Sglebius            diff.lo, new->s##_lo, old->s##_lo);    \
535151975Sglebius        ADD_64(estats->t##_hi, diff.hi,            \
536151975Sglebius               estats->t##_lo, diff.lo);           \
53752419Sjulian    } while (0)
538151975Sglebius
539151975Sglebius/* sum[hi:lo] += add */
540151975Sglebius#define ADD_EXTEND_64(s_hi, s_lo, a) \
54152419Sjulian    do {                             \
542151975Sglebius        s_lo += a;                   \
543163463Sglebius        s_hi += (s_lo < a) ? 1 : 0;  \
544151975Sglebius    } while (0)
54552419Sjulian
54652419Sjulian#define ADD_STAT64(diff, t)                                \
54752419Sjulian    do {                                                   \
548151975Sglebius        ADD_64(pstats->mac_stx[1].t##_hi, new->diff##_hi,  \
549151975Sglebius               pstats->mac_stx[1].t##_lo, new->diff##_lo); \
550151975Sglebius    } while (0)
551151975Sglebius
552147774Sglebius#define UPDATE_EXTEND_STAT(s)                    \
55352419Sjulian    do {                                         \
55452419Sjulian        ADD_EXTEND_64(pstats->mac_stx[1].s##_hi, \
55552419Sjulian                  pstats->mac_stx[1].s##_lo,     \
55652419Sjulian                  new->s);                       \
55752419Sjulian    } while (0)
55852419Sjulian
559163463Sglebius#define UPDATE_EXTEND_TSTAT_X(s, t, size)                    \
56052419Sjulian    do {                                                     \
56152419Sjulian        diff = le##size##toh(tclient->s) -                   \
56252419Sjulian               le##size##toh(old_tclient->s);                \
56352419Sjulian        old_tclient->s = tclient->s;                         \
56452419Sjulian        ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
56552419Sjulian    } while (0)
56652419Sjulian
56752419Sjulian#define UPDATE_EXTEND_TSTAT(s, t) UPDATE_EXTEND_TSTAT_X(s, t, 32)
56852419Sjulian
56952419Sjulian#define UPDATE_EXTEND_E_TSTAT(s, t, size)                    \
57052419Sjulian    do {                                                     \
57152419Sjulian        UPDATE_EXTEND_TSTAT_X(s, t, size);                   \
572163463Sglebius        ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
57352419Sjulian    } while (0)
57452419Sjulian
57552419Sjulian#define UPDATE_EXTEND_USTAT(s, t)                             \
57652419Sjulian    do {                                                      \
577163463Sglebius        diff = le32toh(uclient->s) - le32toh(old_uclient->s); \
578163463Sglebius        old_uclient->s = uclient->s;                          \
57952419Sjulian        ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff);  \
58052419Sjulian    } while (0)
581163463Sglebius
582163463Sglebius#define UPDATE_EXTEND_E_USTAT(s, t)                          \
58352419Sjulian    do {                                                     \
58452419Sjulian        UPDATE_EXTEND_USTAT(s, t);                           \
58552419Sjulian        ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
58652419Sjulian    } while (0)
58752419Sjulian
58852419Sjulian#define UPDATE_EXTEND_XSTAT(s, t)                             \
58952419Sjulian    do {                                                      \
59052419Sjulian        diff = le32toh(xclient->s) - le32toh(old_xclient->s); \
59152419Sjulian        old_xclient->s = xclient->s;                          \
59252419Sjulian        ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff);  \
59352419Sjulian    } while (0)
59452419Sjulian
595151975Sglebius#define UPDATE_QSTAT(s, t)                                   \
59652419Sjulian    do {                                                     \
597151975Sglebius        qstats->t##_hi = qstats_old->t##_hi + le32toh(s.hi); \
59852419Sjulian        qstats->t##_lo = qstats_old->t##_lo + le32toh(s.lo); \
599151975Sglebius    } while (0)
600151975Sglebius
601146290Sglebius#define UPDATE_QSTAT_OLD(f)        \
60252419Sjulian    do {                           \
60352419Sjulian        qstats_old->f = qstats->f; \
60472053Sjulian    } while (0)
60552419Sjulian
60652419Sjulian#define UPDATE_ESTAT_QSTAT_64(s)                        \
60772053Sjulian    do {                                                \
60852419Sjulian        ADD_64(estats->s##_hi, qstats->s##_hi,          \
60952419Sjulian               estats->s##_lo, qstats->s##_lo);         \
61087599Sobrien        SUB_64(estats->s##_hi, qstats_old->s##_hi_old,  \
61152419Sjulian               estats->s##_lo, qstats_old->s##_lo_old); \
612151975Sglebius        qstats_old->s##_hi_old = qstats->s##_hi;        \
613151975Sglebius        qstats_old->s##_lo_old = qstats->s##_lo;        \
614151975Sglebius    } while (0)
61552419Sjulian
616151975Sglebius#define UPDATE_ESTAT_QSTAT(s)             \
61752419Sjulian    do {                                  \
618163463Sglebius        estats->s += qstats->s;           \
61952419Sjulian        estats->s -= qstats_old->s##_old; \
62052419Sjulian        qstats_old->s##_old = qstats->s;  \
621151975Sglebius    } while (0)
622151975Sglebius
623151975Sglebius#define UPDATE_FSTAT_QSTAT(s)                       \
624151975Sglebius    do {                                            \
625151975Sglebius        ADD_64(fstats->s##_hi, qstats->s##_hi,      \
626151975Sglebius               fstats->s##_lo, qstats->s##_lo);     \
627151975Sglebius        SUB_64(fstats->s##_hi, qstats_old->s##_hi,  \
628151975Sglebius               fstats->s##_lo, qstats_old->s##_lo); \
629151975Sglebius        estats->s##_hi = fstats->s##_hi;            \
630151975Sglebius        estats->s##_lo = fstats->s##_lo;            \
631151975Sglebius        qstats_old->s##_hi = qstats->s##_hi;        \
632151975Sglebius        qstats_old->s##_lo = qstats->s##_lo;        \
633163463Sglebius    } while (0)
634151975Sglebius
635151975Sglebius#define UPDATE_FW_STAT(s)                           \
636151975Sglebius    do {                                            \
637151975Sglebius        estats->s = le32toh(tport->s) + fwstats->s; \
638151975Sglebius    } while (0)
639151975Sglebius
640151975Sglebius#define UPDATE_FW_STAT_OLD(f)   \
641151975Sglebius    do {                        \
642151975Sglebius        fwstats->f = estats->f; \
643151975Sglebius    } while (0)
644151975Sglebius
645151975Sglebius#define UPDATE_ESTAT(s, t)                          \
646151975Sglebius    do {                                            \
647151975Sglebius        SUB_64(estats->s##_hi, estats_old->t##_hi,  \
64852419Sjulian               estats->s##_lo, estats_old->t##_lo); \
64952419Sjulian        ADD_64(estats->s##_hi, estats->t##_hi,      \
650108533Sschweikh               estats->s##_lo, estats->t##_lo);     \
65152419Sjulian        estats_old->t##_hi = estats->t##_hi;        \
65252419Sjulian        estats_old->t##_lo = estats->t##_lo;        \
65352419Sjulian    } while (0)
65452419Sjulian
65552419Sjulian/* minuend -= subtrahend */
65652419Sjulian#define SUB_64(m_hi, s_hi, m_lo, s_lo)               \
65783366Sjulian    do {                                             \
65852419Sjulian        DIFF_64(m_hi, m_hi, s_hi, m_lo, m_lo, s_lo); \
65997897Sarchie    } while (0)
66052419Sjulian
66152419Sjulian/* minuend[hi:lo] -= subtrahend */
66252419Sjulian#define SUB_EXTEND_64(m_hi, m_lo, s) \
66352419Sjulian    do {                             \
66452419Sjulian        SUB_64(m_hi, 0, m_lo, s);    \
66552419Sjulian    } while (0)
66652419Sjulian
66752419Sjulian#define SUB_EXTEND_USTAT(s, t)                                \
66852419Sjulian    do {                                                      \
66952419Sjulian        diff = le32toh(uclient->s) - le32toh(old_uclient->s); \
67052419Sjulian        SUB_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff);  \
67152419Sjulian    } while (0)
67284472Sdwmalone
67352419Sjulianstruct bxe_softc;
67452419Sjulianvoid bxe_stats_init(struct bxe_softc *sc);
67552419Sjulianvoid bxe_stats_handle(struct bxe_softc *sc, enum bxe_stats_event event);
67652419Sjulianvoid bxe_save_statistics(struct bxe_softc *sc);
67752419Sjulianvoid bxe_afex_collect_stats(struct bxe_softc *sc, void *void_afex_stats, uint32_t stats_type);
67852419Sjulianuint64_t bxe_get_counter(if_t, ift_counter);
67952419Sjulian
68084472Sdwmalone#endif /* BXE_STATS_H */
68189319Salfred
68289319Salfred