1255736Sdavidch/*-
2265797Sdavidcs * Copyright (c) 2007-2014 QLogic Corporation. All rights reserved.
3255736Sdavidch *
4255736Sdavidch * Redistribution and use in source and binary forms, with or without
5255736Sdavidch * modification, are permitted provided that the following conditions
6255736Sdavidch * are met:
7255736Sdavidch *
8255736Sdavidch * 1. Redistributions of source code must retain the above copyright
9255736Sdavidch *    notice, this list of conditions and the following disclaimer.
10255736Sdavidch * 2. Redistributions in binary form must reproduce the above copyright
11255736Sdavidch *    notice, this list of conditions and the following disclaimer in the
12255736Sdavidch *    documentation and/or other materials provided with the distribution.
13255736Sdavidch *
14255736Sdavidch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'
15255736Sdavidch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16255736Sdavidch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17255736Sdavidch * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
18255736Sdavidch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19255736Sdavidch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20255736Sdavidch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21255736Sdavidch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22255736Sdavidch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23255736Sdavidch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24255736Sdavidch * THE POSSIBILITY OF SUCH DAMAGE.
25255736Sdavidch */
26255736Sdavidch
27255736Sdavidch#ifndef BXE_STATS_H
28255736Sdavidch#define BXE_STATS_H
29255736Sdavidch
30255736Sdavidch#include <sys/cdefs.h>
31255736Sdavidch__FBSDID("$FreeBSD: stable/10/sys/dev/bxe/bxe_stats.h 315882 2017-03-24 03:11:11Z davidcs $");
32255736Sdavidch
33255736Sdavidch#include <sys/types.h>
34255736Sdavidch
35255736Sdavidchstruct nig_stats {
36255736Sdavidch    uint32_t brb_discard;
37255736Sdavidch    uint32_t brb_packet;
38255736Sdavidch    uint32_t brb_truncate;
39255736Sdavidch    uint32_t flow_ctrl_discard;
40255736Sdavidch    uint32_t flow_ctrl_octets;
41255736Sdavidch    uint32_t flow_ctrl_packet;
42255736Sdavidch    uint32_t mng_discard;
43255736Sdavidch    uint32_t mng_octet_inp;
44255736Sdavidch    uint32_t mng_octet_out;
45255736Sdavidch    uint32_t mng_packet_inp;
46255736Sdavidch    uint32_t mng_packet_out;
47255736Sdavidch    uint32_t pbf_octets;
48255736Sdavidch    uint32_t pbf_packet;
49255736Sdavidch    uint32_t safc_inp;
50255736Sdavidch    uint32_t egress_mac_pkt0_lo;
51255736Sdavidch    uint32_t egress_mac_pkt0_hi;
52255736Sdavidch    uint32_t egress_mac_pkt1_lo;
53255736Sdavidch    uint32_t egress_mac_pkt1_hi;
54255736Sdavidch};
55255736Sdavidch
56255736Sdavidch
57255736Sdavidchenum bxe_stats_event {
58255736Sdavidch    STATS_EVENT_PMF = 0,
59255736Sdavidch    STATS_EVENT_LINK_UP,
60255736Sdavidch    STATS_EVENT_UPDATE,
61255736Sdavidch    STATS_EVENT_STOP,
62255736Sdavidch    STATS_EVENT_MAX
63255736Sdavidch};
64255736Sdavidch
65255736Sdavidchenum bxe_stats_state {
66255736Sdavidch    STATS_STATE_DISABLED = 0,
67255736Sdavidch    STATS_STATE_ENABLED,
68255736Sdavidch    STATS_STATE_MAX
69255736Sdavidch};
70255736Sdavidch
71255736Sdavidchstruct bxe_eth_stats {
72255736Sdavidch    uint32_t total_bytes_received_hi;
73255736Sdavidch    uint32_t total_bytes_received_lo;
74255736Sdavidch    uint32_t total_bytes_transmitted_hi;
75255736Sdavidch    uint32_t total_bytes_transmitted_lo;
76255736Sdavidch    uint32_t total_unicast_packets_received_hi;
77255736Sdavidch    uint32_t total_unicast_packets_received_lo;
78255736Sdavidch    uint32_t total_multicast_packets_received_hi;
79255736Sdavidch    uint32_t total_multicast_packets_received_lo;
80255736Sdavidch    uint32_t total_broadcast_packets_received_hi;
81255736Sdavidch    uint32_t total_broadcast_packets_received_lo;
82255736Sdavidch    uint32_t total_unicast_packets_transmitted_hi;
83255736Sdavidch    uint32_t total_unicast_packets_transmitted_lo;
84255736Sdavidch    uint32_t total_multicast_packets_transmitted_hi;
85255736Sdavidch    uint32_t total_multicast_packets_transmitted_lo;
86255736Sdavidch    uint32_t total_broadcast_packets_transmitted_hi;
87255736Sdavidch    uint32_t total_broadcast_packets_transmitted_lo;
88255736Sdavidch    uint32_t valid_bytes_received_hi;
89255736Sdavidch    uint32_t valid_bytes_received_lo;
90255736Sdavidch
91255736Sdavidch    uint32_t error_bytes_received_hi;
92255736Sdavidch    uint32_t error_bytes_received_lo;
93255736Sdavidch    uint32_t etherstatsoverrsizepkts_hi;
94255736Sdavidch    uint32_t etherstatsoverrsizepkts_lo;
95255736Sdavidch    uint32_t no_buff_discard_hi;
96255736Sdavidch    uint32_t no_buff_discard_lo;
97255736Sdavidch
98255736Sdavidch    uint32_t rx_stat_ifhcinbadoctets_hi;
99255736Sdavidch    uint32_t rx_stat_ifhcinbadoctets_lo;
100255736Sdavidch    uint32_t tx_stat_ifhcoutbadoctets_hi;
101255736Sdavidch    uint32_t tx_stat_ifhcoutbadoctets_lo;
102255736Sdavidch    uint32_t rx_stat_dot3statsfcserrors_hi;
103255736Sdavidch    uint32_t rx_stat_dot3statsfcserrors_lo;
104255736Sdavidch    uint32_t rx_stat_dot3statsalignmenterrors_hi;
105255736Sdavidch    uint32_t rx_stat_dot3statsalignmenterrors_lo;
106255736Sdavidch    uint32_t rx_stat_dot3statscarriersenseerrors_hi;
107255736Sdavidch    uint32_t rx_stat_dot3statscarriersenseerrors_lo;
108255736Sdavidch    uint32_t rx_stat_falsecarriererrors_hi;
109255736Sdavidch    uint32_t rx_stat_falsecarriererrors_lo;
110255736Sdavidch    uint32_t rx_stat_etherstatsundersizepkts_hi;
111255736Sdavidch    uint32_t rx_stat_etherstatsundersizepkts_lo;
112255736Sdavidch    uint32_t rx_stat_dot3statsframestoolong_hi;
113255736Sdavidch    uint32_t rx_stat_dot3statsframestoolong_lo;
114255736Sdavidch    uint32_t rx_stat_etherstatsfragments_hi;
115255736Sdavidch    uint32_t rx_stat_etherstatsfragments_lo;
116255736Sdavidch    uint32_t rx_stat_etherstatsjabbers_hi;
117255736Sdavidch    uint32_t rx_stat_etherstatsjabbers_lo;
118255736Sdavidch    uint32_t rx_stat_maccontrolframesreceived_hi;
119255736Sdavidch    uint32_t rx_stat_maccontrolframesreceived_lo;
120255736Sdavidch    uint32_t rx_stat_bmac_xpf_hi;
121255736Sdavidch    uint32_t rx_stat_bmac_xpf_lo;
122255736Sdavidch    uint32_t rx_stat_bmac_xcf_hi;
123255736Sdavidch    uint32_t rx_stat_bmac_xcf_lo;
124255736Sdavidch    uint32_t rx_stat_xoffstateentered_hi;
125255736Sdavidch    uint32_t rx_stat_xoffstateentered_lo;
126255736Sdavidch    uint32_t rx_stat_xonpauseframesreceived_hi;
127255736Sdavidch    uint32_t rx_stat_xonpauseframesreceived_lo;
128255736Sdavidch    uint32_t rx_stat_xoffpauseframesreceived_hi;
129255736Sdavidch    uint32_t rx_stat_xoffpauseframesreceived_lo;
130255736Sdavidch    uint32_t tx_stat_outxonsent_hi;
131255736Sdavidch    uint32_t tx_stat_outxonsent_lo;
132255736Sdavidch    uint32_t tx_stat_outxoffsent_hi;
133255736Sdavidch    uint32_t tx_stat_outxoffsent_lo;
134255736Sdavidch    uint32_t tx_stat_flowcontroldone_hi;
135255736Sdavidch    uint32_t tx_stat_flowcontroldone_lo;
136255736Sdavidch    uint32_t tx_stat_etherstatscollisions_hi;
137255736Sdavidch    uint32_t tx_stat_etherstatscollisions_lo;
138255736Sdavidch    uint32_t tx_stat_dot3statssinglecollisionframes_hi;
139255736Sdavidch    uint32_t tx_stat_dot3statssinglecollisionframes_lo;
140255736Sdavidch    uint32_t tx_stat_dot3statsmultiplecollisionframes_hi;
141255736Sdavidch    uint32_t tx_stat_dot3statsmultiplecollisionframes_lo;
142255736Sdavidch    uint32_t tx_stat_dot3statsdeferredtransmissions_hi;
143255736Sdavidch    uint32_t tx_stat_dot3statsdeferredtransmissions_lo;
144255736Sdavidch    uint32_t tx_stat_dot3statsexcessivecollisions_hi;
145255736Sdavidch    uint32_t tx_stat_dot3statsexcessivecollisions_lo;
146255736Sdavidch    uint32_t tx_stat_dot3statslatecollisions_hi;
147255736Sdavidch    uint32_t tx_stat_dot3statslatecollisions_lo;
148255736Sdavidch    uint32_t tx_stat_etherstatspkts64octets_hi;
149255736Sdavidch    uint32_t tx_stat_etherstatspkts64octets_lo;
150255736Sdavidch    uint32_t tx_stat_etherstatspkts65octetsto127octets_hi;
151255736Sdavidch    uint32_t tx_stat_etherstatspkts65octetsto127octets_lo;
152255736Sdavidch    uint32_t tx_stat_etherstatspkts128octetsto255octets_hi;
153255736Sdavidch    uint32_t tx_stat_etherstatspkts128octetsto255octets_lo;
154255736Sdavidch    uint32_t tx_stat_etherstatspkts256octetsto511octets_hi;
155255736Sdavidch    uint32_t tx_stat_etherstatspkts256octetsto511octets_lo;
156255736Sdavidch    uint32_t tx_stat_etherstatspkts512octetsto1023octets_hi;
157255736Sdavidch    uint32_t tx_stat_etherstatspkts512octetsto1023octets_lo;
158255736Sdavidch    uint32_t tx_stat_etherstatspkts1024octetsto1522octets_hi;
159255736Sdavidch    uint32_t tx_stat_etherstatspkts1024octetsto1522octets_lo;
160255736Sdavidch    uint32_t tx_stat_etherstatspktsover1522octets_hi;
161255736Sdavidch    uint32_t tx_stat_etherstatspktsover1522octets_lo;
162255736Sdavidch    uint32_t tx_stat_bmac_2047_hi;
163255736Sdavidch    uint32_t tx_stat_bmac_2047_lo;
164255736Sdavidch    uint32_t tx_stat_bmac_4095_hi;
165255736Sdavidch    uint32_t tx_stat_bmac_4095_lo;
166255736Sdavidch    uint32_t tx_stat_bmac_9216_hi;
167255736Sdavidch    uint32_t tx_stat_bmac_9216_lo;
168255736Sdavidch    uint32_t tx_stat_bmac_16383_hi;
169255736Sdavidch    uint32_t tx_stat_bmac_16383_lo;
170255736Sdavidch    uint32_t tx_stat_dot3statsinternalmactransmiterrors_hi;
171255736Sdavidch    uint32_t tx_stat_dot3statsinternalmactransmiterrors_lo;
172255736Sdavidch    uint32_t tx_stat_bmac_ufl_hi;
173255736Sdavidch    uint32_t tx_stat_bmac_ufl_lo;
174255736Sdavidch
175255736Sdavidch    uint32_t pause_frames_received_hi;
176255736Sdavidch    uint32_t pause_frames_received_lo;
177255736Sdavidch    uint32_t pause_frames_sent_hi;
178255736Sdavidch    uint32_t pause_frames_sent_lo;
179255736Sdavidch
180255736Sdavidch    uint32_t etherstatspkts1024octetsto1522octets_hi;
181255736Sdavidch    uint32_t etherstatspkts1024octetsto1522octets_lo;
182255736Sdavidch    uint32_t etherstatspktsover1522octets_hi;
183255736Sdavidch    uint32_t etherstatspktsover1522octets_lo;
184255736Sdavidch
185255736Sdavidch    uint32_t brb_drop_hi;
186255736Sdavidch    uint32_t brb_drop_lo;
187255736Sdavidch    uint32_t brb_truncate_hi;
188255736Sdavidch    uint32_t brb_truncate_lo;
189255736Sdavidch
190255736Sdavidch    uint32_t mac_filter_discard;
191255736Sdavidch    uint32_t mf_tag_discard;
192255736Sdavidch    uint32_t brb_truncate_discard;
193255736Sdavidch    uint32_t mac_discard;
194255736Sdavidch
195255736Sdavidch    uint32_t nig_timer_max;
196255736Sdavidch
197255736Sdavidch    uint32_t total_tpa_aggregations_hi;
198255736Sdavidch    uint32_t total_tpa_aggregations_lo;
199255736Sdavidch    uint32_t total_tpa_aggregated_frames_hi;
200255736Sdavidch    uint32_t total_tpa_aggregated_frames_lo;
201255736Sdavidch    uint32_t total_tpa_bytes_hi;
202255736Sdavidch    uint32_t total_tpa_bytes_lo;
203255736Sdavidch
204255736Sdavidch    /* PFC */
205255736Sdavidch    uint32_t pfc_frames_received_hi;
206255736Sdavidch    uint32_t pfc_frames_received_lo;
207255736Sdavidch    uint32_t pfc_frames_sent_hi;
208255736Sdavidch    uint32_t pfc_frames_sent_lo;
209255736Sdavidch
210255736Sdavidch    /* Recovery */
211255736Sdavidch    uint32_t recoverable_error;
212255736Sdavidch    uint32_t unrecoverable_error;
213255736Sdavidch
214255736Sdavidch    /* src: Clear-on-Read register; Will not survive PMF Migration */
215255736Sdavidch    uint32_t eee_tx_lpi;
216255736Sdavidch
217255736Sdavidch    /* receive path driver statistics */
218255736Sdavidch    uint32_t rx_calls;
219255736Sdavidch    uint32_t rx_pkts;
220255736Sdavidch    uint32_t rx_tpa_pkts;
221293787Sdavidcs    uint32_t rx_erroneous_jumbo_sge_pkts;
222293787Sdavidcs    uint32_t rx_bxe_service_rxsgl;
223283755Sdavidcs    uint32_t rx_jumbo_sge_pkts;
224255736Sdavidch    uint32_t rx_soft_errors;
225255736Sdavidch    uint32_t rx_hw_csum_errors;
226255736Sdavidch    uint32_t rx_ofld_frames_csum_ip;
227255736Sdavidch    uint32_t rx_ofld_frames_csum_tcp_udp;
228255736Sdavidch    uint32_t rx_budget_reached;
229255736Sdavidch
230255736Sdavidch    /* tx path driver statistics */
231255736Sdavidch    uint32_t tx_pkts;
232255736Sdavidch    uint32_t tx_soft_errors;
233255736Sdavidch    uint32_t tx_ofld_frames_csum_ip;
234255736Sdavidch    uint32_t tx_ofld_frames_csum_tcp;
235255736Sdavidch    uint32_t tx_ofld_frames_csum_udp;
236255736Sdavidch    uint32_t tx_ofld_frames_lso;
237255736Sdavidch    uint32_t tx_ofld_frames_lso_hdr_splits;
238255736Sdavidch    uint32_t tx_encap_failures;
239255736Sdavidch    uint32_t tx_hw_queue_full;
240255736Sdavidch    uint32_t tx_hw_max_queue_depth;
241255736Sdavidch    uint32_t tx_dma_mapping_failure;
242255736Sdavidch    uint32_t tx_max_drbr_queue_depth;
243255736Sdavidch    uint32_t tx_window_violation_std;
244255736Sdavidch    uint32_t tx_window_violation_tso;
245255736Sdavidch    //uint32_t tx_unsupported_tso_request_ipv6;
246255736Sdavidch    //uint32_t tx_unsupported_tso_request_not_tcp;
247255736Sdavidch    uint32_t tx_chain_lost_mbuf;
248255736Sdavidch    uint32_t tx_frames_deferred;
249255736Sdavidch    uint32_t tx_queue_xoff;
250255736Sdavidch
251255736Sdavidch    /* mbuf driver statistics */
252255736Sdavidch    uint32_t mbuf_defrag_attempts;
253255736Sdavidch    uint32_t mbuf_defrag_failures;
254255736Sdavidch    uint32_t mbuf_rx_bd_alloc_failed;
255255736Sdavidch    uint32_t mbuf_rx_bd_mapping_failed;
256255736Sdavidch    uint32_t mbuf_rx_tpa_alloc_failed;
257255736Sdavidch    uint32_t mbuf_rx_tpa_mapping_failed;
258255736Sdavidch    uint32_t mbuf_rx_sge_alloc_failed;
259255736Sdavidch    uint32_t mbuf_rx_sge_mapping_failed;
260255736Sdavidch
261255736Sdavidch    /* track the number of allocated mbufs */
262255736Sdavidch    uint32_t mbuf_alloc_tx;
263255736Sdavidch    uint32_t mbuf_alloc_rx;
264255736Sdavidch    uint32_t mbuf_alloc_sge;
265255736Sdavidch    uint32_t mbuf_alloc_tpa;
266298281Sdavidcs
267298281Sdavidcs    /* num. of times tx queue full occured */
268298281Sdavidcs    uint32_t tx_queue_full_return;
269307973Sdavidcs    /* debug stats */
270315882Sdavidcs    uint32_t bxe_tx_mq_sc_state_failures;
271307973Sdavidcs    uint32_t tx_request_link_down_failures;
272307973Sdavidcs    uint32_t bd_avail_too_less_failures;
273307973Sdavidcs    uint32_t tx_mq_not_empty;
274315882Sdavidcs    uint32_t nsegs_path1_errors;
275315882Sdavidcs    uint32_t nsegs_path2_errors;
276315882Sdavidcs
277255736Sdavidch};
278255736Sdavidch
279255736Sdavidch
280255736Sdavidchstruct bxe_eth_q_stats {
281255736Sdavidch    uint32_t total_unicast_bytes_received_hi;
282255736Sdavidch    uint32_t total_unicast_bytes_received_lo;
283255736Sdavidch    uint32_t total_broadcast_bytes_received_hi;
284255736Sdavidch    uint32_t total_broadcast_bytes_received_lo;
285255736Sdavidch    uint32_t total_multicast_bytes_received_hi;
286255736Sdavidch    uint32_t total_multicast_bytes_received_lo;
287255736Sdavidch    uint32_t total_bytes_received_hi;
288255736Sdavidch    uint32_t total_bytes_received_lo;
289255736Sdavidch    uint32_t total_unicast_bytes_transmitted_hi;
290255736Sdavidch    uint32_t total_unicast_bytes_transmitted_lo;
291255736Sdavidch    uint32_t total_broadcast_bytes_transmitted_hi;
292255736Sdavidch    uint32_t total_broadcast_bytes_transmitted_lo;
293255736Sdavidch    uint32_t total_multicast_bytes_transmitted_hi;
294255736Sdavidch    uint32_t total_multicast_bytes_transmitted_lo;
295255736Sdavidch    uint32_t total_bytes_transmitted_hi;
296255736Sdavidch    uint32_t total_bytes_transmitted_lo;
297255736Sdavidch    uint32_t total_unicast_packets_received_hi;
298255736Sdavidch    uint32_t total_unicast_packets_received_lo;
299255736Sdavidch    uint32_t total_multicast_packets_received_hi;
300255736Sdavidch    uint32_t total_multicast_packets_received_lo;
301255736Sdavidch    uint32_t total_broadcast_packets_received_hi;
302255736Sdavidch    uint32_t total_broadcast_packets_received_lo;
303255736Sdavidch    uint32_t total_unicast_packets_transmitted_hi;
304255736Sdavidch    uint32_t total_unicast_packets_transmitted_lo;
305255736Sdavidch    uint32_t total_multicast_packets_transmitted_hi;
306255736Sdavidch    uint32_t total_multicast_packets_transmitted_lo;
307255736Sdavidch    uint32_t total_broadcast_packets_transmitted_hi;
308255736Sdavidch    uint32_t total_broadcast_packets_transmitted_lo;
309255736Sdavidch    uint32_t valid_bytes_received_hi;
310255736Sdavidch    uint32_t valid_bytes_received_lo;
311255736Sdavidch
312255736Sdavidch    uint32_t etherstatsoverrsizepkts_hi;
313255736Sdavidch    uint32_t etherstatsoverrsizepkts_lo;
314255736Sdavidch    uint32_t no_buff_discard_hi;
315255736Sdavidch    uint32_t no_buff_discard_lo;
316255736Sdavidch
317255736Sdavidch    uint32_t total_packets_received_checksum_discarded_hi;
318255736Sdavidch    uint32_t total_packets_received_checksum_discarded_lo;
319255736Sdavidch    uint32_t total_packets_received_ttl0_discarded_hi;
320255736Sdavidch    uint32_t total_packets_received_ttl0_discarded_lo;
321255736Sdavidch    uint32_t total_transmitted_dropped_packets_error_hi;
322255736Sdavidch    uint32_t total_transmitted_dropped_packets_error_lo;
323255736Sdavidch
324255736Sdavidch    uint32_t total_tpa_aggregations_hi;
325255736Sdavidch    uint32_t total_tpa_aggregations_lo;
326255736Sdavidch    uint32_t total_tpa_aggregated_frames_hi;
327255736Sdavidch    uint32_t total_tpa_aggregated_frames_lo;
328255736Sdavidch    uint32_t total_tpa_bytes_hi;
329255736Sdavidch    uint32_t total_tpa_bytes_lo;
330255736Sdavidch
331255736Sdavidch    /* receive path driver statistics */
332255736Sdavidch    uint32_t rx_calls;
333255736Sdavidch    uint32_t rx_pkts;
334255736Sdavidch    uint32_t rx_tpa_pkts;
335293787Sdavidcs    uint32_t rx_erroneous_jumbo_sge_pkts;
336293787Sdavidcs    uint32_t rx_bxe_service_rxsgl;
337283755Sdavidcs    uint32_t rx_jumbo_sge_pkts;
338255736Sdavidch    uint32_t rx_soft_errors;
339255736Sdavidch    uint32_t rx_hw_csum_errors;
340255736Sdavidch    uint32_t rx_ofld_frames_csum_ip;
341255736Sdavidch    uint32_t rx_ofld_frames_csum_tcp_udp;
342255736Sdavidch    uint32_t rx_budget_reached;
343255736Sdavidch
344255736Sdavidch    /* tx path driver statistics */
345255736Sdavidch    uint32_t tx_pkts;
346255736Sdavidch    uint32_t tx_soft_errors;
347255736Sdavidch    uint32_t tx_ofld_frames_csum_ip;
348255736Sdavidch    uint32_t tx_ofld_frames_csum_tcp;
349255736Sdavidch    uint32_t tx_ofld_frames_csum_udp;
350255736Sdavidch    uint32_t tx_ofld_frames_lso;
351255736Sdavidch    uint32_t tx_ofld_frames_lso_hdr_splits;
352255736Sdavidch    uint32_t tx_encap_failures;
353255736Sdavidch    uint32_t tx_hw_queue_full;
354255736Sdavidch    uint32_t tx_hw_max_queue_depth;
355255736Sdavidch    uint32_t tx_dma_mapping_failure;
356255736Sdavidch    uint32_t tx_max_drbr_queue_depth;
357255736Sdavidch    uint32_t tx_window_violation_std;
358255736Sdavidch    uint32_t tx_window_violation_tso;
359255736Sdavidch    //uint32_t tx_unsupported_tso_request_ipv6;
360255736Sdavidch    //uint32_t tx_unsupported_tso_request_not_tcp;
361255736Sdavidch    uint32_t tx_chain_lost_mbuf;
362255736Sdavidch    uint32_t tx_frames_deferred;
363255736Sdavidch    uint32_t tx_queue_xoff;
364255736Sdavidch
365255736Sdavidch    /* mbuf driver statistics */
366255736Sdavidch    uint32_t mbuf_defrag_attempts;
367255736Sdavidch    uint32_t mbuf_defrag_failures;
368255736Sdavidch    uint32_t mbuf_rx_bd_alloc_failed;
369255736Sdavidch    uint32_t mbuf_rx_bd_mapping_failed;
370255736Sdavidch    uint32_t mbuf_rx_tpa_alloc_failed;
371255736Sdavidch    uint32_t mbuf_rx_tpa_mapping_failed;
372255736Sdavidch    uint32_t mbuf_rx_sge_alloc_failed;
373255736Sdavidch    uint32_t mbuf_rx_sge_mapping_failed;
374255736Sdavidch
375255736Sdavidch    /* track the number of allocated mbufs */
376255736Sdavidch    uint32_t mbuf_alloc_tx;
377255736Sdavidch    uint32_t mbuf_alloc_rx;
378255736Sdavidch    uint32_t mbuf_alloc_sge;
379255736Sdavidch    uint32_t mbuf_alloc_tpa;
380298281Sdavidcs
381298281Sdavidcs    /* num. of times tx queue full occured */
382298281Sdavidcs    uint32_t tx_queue_full_return;
383307973Sdavidcs
384307973Sdavidcs    /* debug stats */
385315882Sdavidcs    uint32_t bxe_tx_mq_sc_state_failures;
386307973Sdavidcs    uint32_t tx_request_link_down_failures;
387307973Sdavidcs    uint32_t bd_avail_too_less_failures;
388307973Sdavidcs    uint32_t tx_mq_not_empty;
389315882Sdavidcs    uint32_t nsegs_path1_errors;
390315882Sdavidcs    uint32_t nsegs_path2_errors;
391315882Sdavidcs
392255736Sdavidch};
393255736Sdavidch
394255736Sdavidchstruct bxe_eth_stats_old {
395255736Sdavidch    uint32_t rx_stat_dot3statsframestoolong_hi;
396255736Sdavidch    uint32_t rx_stat_dot3statsframestoolong_lo;
397255736Sdavidch};
398255736Sdavidch
399255736Sdavidchstruct bxe_eth_q_stats_old {
400255736Sdavidch    /* Fields to perserve over fw reset*/
401255736Sdavidch    uint32_t total_unicast_bytes_received_hi;
402255736Sdavidch    uint32_t total_unicast_bytes_received_lo;
403255736Sdavidch    uint32_t total_broadcast_bytes_received_hi;
404255736Sdavidch    uint32_t total_broadcast_bytes_received_lo;
405255736Sdavidch    uint32_t total_multicast_bytes_received_hi;
406255736Sdavidch    uint32_t total_multicast_bytes_received_lo;
407255736Sdavidch    uint32_t total_unicast_bytes_transmitted_hi;
408255736Sdavidch    uint32_t total_unicast_bytes_transmitted_lo;
409255736Sdavidch    uint32_t total_broadcast_bytes_transmitted_hi;
410255736Sdavidch    uint32_t total_broadcast_bytes_transmitted_lo;
411255736Sdavidch    uint32_t total_multicast_bytes_transmitted_hi;
412255736Sdavidch    uint32_t total_multicast_bytes_transmitted_lo;
413255736Sdavidch    uint32_t total_tpa_bytes_hi;
414255736Sdavidch    uint32_t total_tpa_bytes_lo;
415255736Sdavidch
416255736Sdavidch    /* Fields to perserve last of */
417255736Sdavidch    uint32_t total_bytes_received_hi;
418255736Sdavidch    uint32_t total_bytes_received_lo;
419255736Sdavidch    uint32_t total_bytes_transmitted_hi;
420255736Sdavidch    uint32_t total_bytes_transmitted_lo;
421255736Sdavidch    uint32_t total_unicast_packets_received_hi;
422255736Sdavidch    uint32_t total_unicast_packets_received_lo;
423255736Sdavidch    uint32_t total_multicast_packets_received_hi;
424255736Sdavidch    uint32_t total_multicast_packets_received_lo;
425255736Sdavidch    uint32_t total_broadcast_packets_received_hi;
426255736Sdavidch    uint32_t total_broadcast_packets_received_lo;
427255736Sdavidch    uint32_t total_unicast_packets_transmitted_hi;
428255736Sdavidch    uint32_t total_unicast_packets_transmitted_lo;
429255736Sdavidch    uint32_t total_multicast_packets_transmitted_hi;
430255736Sdavidch    uint32_t total_multicast_packets_transmitted_lo;
431255736Sdavidch    uint32_t total_broadcast_packets_transmitted_hi;
432255736Sdavidch    uint32_t total_broadcast_packets_transmitted_lo;
433255736Sdavidch    uint32_t valid_bytes_received_hi;
434255736Sdavidch    uint32_t valid_bytes_received_lo;
435255736Sdavidch
436255736Sdavidch    uint32_t total_tpa_bytes_hi_old;
437255736Sdavidch    uint32_t total_tpa_bytes_lo_old;
438255736Sdavidch
439255736Sdavidch    /* receive path driver statistics */
440255736Sdavidch    uint32_t rx_calls_old;
441255736Sdavidch    uint32_t rx_pkts_old;
442255736Sdavidch    uint32_t rx_tpa_pkts_old;
443293787Sdavidcs    uint32_t rx_erroneous_jumbo_sge_pkts_old;
444293787Sdavidcs    uint32_t rx_bxe_service_rxsgl_old;
445283755Sdavidcs    uint32_t rx_jumbo_sge_pkts_old;
446255736Sdavidch    uint32_t rx_soft_errors_old;
447255736Sdavidch    uint32_t rx_hw_csum_errors_old;
448255736Sdavidch    uint32_t rx_ofld_frames_csum_ip_old;
449255736Sdavidch    uint32_t rx_ofld_frames_csum_tcp_udp_old;
450255736Sdavidch    uint32_t rx_budget_reached_old;
451255736Sdavidch
452255736Sdavidch    /* tx path driver statistics */
453255736Sdavidch    uint32_t tx_pkts_old;
454255736Sdavidch    uint32_t tx_soft_errors_old;
455255736Sdavidch    uint32_t tx_ofld_frames_csum_ip_old;
456255736Sdavidch    uint32_t tx_ofld_frames_csum_tcp_old;
457255736Sdavidch    uint32_t tx_ofld_frames_csum_udp_old;
458255736Sdavidch    uint32_t tx_ofld_frames_lso_old;
459255736Sdavidch    uint32_t tx_ofld_frames_lso_hdr_splits_old;
460255736Sdavidch    uint32_t tx_encap_failures_old;
461255736Sdavidch    uint32_t tx_hw_queue_full_old;
462255736Sdavidch    uint32_t tx_hw_max_queue_depth_old;
463255736Sdavidch    uint32_t tx_dma_mapping_failure_old;
464255736Sdavidch    uint32_t tx_max_drbr_queue_depth_old;
465255736Sdavidch    uint32_t tx_window_violation_std_old;
466255736Sdavidch    uint32_t tx_window_violation_tso_old;
467255736Sdavidch    //uint32_t tx_unsupported_tso_request_ipv6_old;
468255736Sdavidch    //uint32_t tx_unsupported_tso_request_not_tcp_old;
469255736Sdavidch    uint32_t tx_chain_lost_mbuf_old;
470255736Sdavidch    uint32_t tx_frames_deferred_old;
471255736Sdavidch    uint32_t tx_queue_xoff_old;
472255736Sdavidch
473255736Sdavidch    /* mbuf driver statistics */
474255736Sdavidch    uint32_t mbuf_defrag_attempts_old;
475255736Sdavidch    uint32_t mbuf_defrag_failures_old;
476255736Sdavidch    uint32_t mbuf_rx_bd_alloc_failed_old;
477255736Sdavidch    uint32_t mbuf_rx_bd_mapping_failed_old;
478255736Sdavidch    uint32_t mbuf_rx_tpa_alloc_failed_old;
479255736Sdavidch    uint32_t mbuf_rx_tpa_mapping_failed_old;
480255736Sdavidch    uint32_t mbuf_rx_sge_alloc_failed_old;
481255736Sdavidch    uint32_t mbuf_rx_sge_mapping_failed_old;
482255736Sdavidch
483255736Sdavidch    /* track the number of allocated mbufs */
484255736Sdavidch    int mbuf_alloc_tx_old;
485255736Sdavidch    int mbuf_alloc_rx_old;
486255736Sdavidch    int mbuf_alloc_sge_old;
487255736Sdavidch    int mbuf_alloc_tpa_old;
488255736Sdavidch};
489255736Sdavidch
490255736Sdavidchstruct bxe_net_stats_old {
491255736Sdavidch    uint32_t rx_dropped;
492255736Sdavidch};
493255736Sdavidch
494255736Sdavidchstruct bxe_fw_port_stats_old {
495255736Sdavidch    uint32_t pfc_frames_tx_hi;
496255736Sdavidch    uint32_t pfc_frames_tx_lo;
497255736Sdavidch    uint32_t pfc_frames_rx_hi;
498255736Sdavidch    uint32_t pfc_frames_rx_lo;
499255736Sdavidch
500255736Sdavidch    uint32_t mac_filter_discard;
501255736Sdavidch    uint32_t mf_tag_discard;
502255736Sdavidch    uint32_t brb_truncate_discard;
503255736Sdavidch    uint32_t mac_discard;
504255736Sdavidch};
505255736Sdavidch
506255736Sdavidch/* sum[hi:lo] += add[hi:lo] */
507255736Sdavidch#define ADD_64(s_hi, a_hi, s_lo, a_lo)          \
508255736Sdavidch    do {                                        \
509255736Sdavidch        s_lo += a_lo;                           \
510255736Sdavidch        s_hi += a_hi + ((s_lo < a_lo) ? 1 : 0); \
511255736Sdavidch    } while (0)
512255736Sdavidch
513255736Sdavidch#define LE32_0 ((uint32_t) 0)
514255736Sdavidch#define LE16_0 ((uint16_t) 0)
515255736Sdavidch
516255736Sdavidch/* The _force is for cases where high value is 0 */
517255736Sdavidch#define ADD_64_LE(s_hi, a_hi_le, s_lo, a_lo_le) \
518255736Sdavidch        ADD_64(s_hi, le32toh(a_hi_le),          \
519255736Sdavidch               s_lo, le32toh(a_lo_le))
520255736Sdavidch
521255736Sdavidch#define ADD_64_LE16(s_hi, a_hi_le, s_lo, a_lo_le) \
522255736Sdavidch        ADD_64(s_hi, le16toh(a_hi_le),            \
523255736Sdavidch               s_lo, le16toh(a_lo_le))
524255736Sdavidch
525255736Sdavidch/* difference = minuend - subtrahend */
526255736Sdavidch#define DIFF_64(d_hi, m_hi, s_hi, d_lo, m_lo, s_lo)  \
527255736Sdavidch    do {                                             \
528255736Sdavidch        if (m_lo < s_lo) {                           \
529255736Sdavidch            /* underflow */                          \
530255736Sdavidch            d_hi = m_hi - s_hi;                      \
531255736Sdavidch            if (d_hi > 0) {                          \
532255736Sdavidch                /* we can 'loan' 1 */                \
533255736Sdavidch                d_hi--;                              \
534255736Sdavidch                d_lo = m_lo + (UINT_MAX - s_lo) + 1; \
535255736Sdavidch            } else {                                 \
536255736Sdavidch                /* m_hi <= s_hi */                   \
537255736Sdavidch                d_hi = 0;                            \
538255736Sdavidch                d_lo = 0;                            \
539255736Sdavidch            }                                        \
540255736Sdavidch        } else {                                     \
541255736Sdavidch            /* m_lo >= s_lo */                       \
542255736Sdavidch            if (m_hi < s_hi) {                       \
543255736Sdavidch                d_hi = 0;                            \
544255736Sdavidch                d_lo = 0;                            \
545255736Sdavidch            } else {                                 \
546255736Sdavidch                /* m_hi >= s_hi */                   \
547255736Sdavidch                d_hi = m_hi - s_hi;                  \
548255736Sdavidch                d_lo = m_lo - s_lo;                  \
549255736Sdavidch            }                                        \
550255736Sdavidch        }                                            \
551255736Sdavidch    } while (0)
552255736Sdavidch
553255736Sdavidch#define UPDATE_STAT64(s, t)                                      \
554255736Sdavidch    do {                                                         \
555255736Sdavidch        DIFF_64(diff.hi, new->s##_hi, pstats->mac_stx[0].t##_hi, \
556255736Sdavidch            diff.lo, new->s##_lo, pstats->mac_stx[0].t##_lo);    \
557255736Sdavidch        pstats->mac_stx[0].t##_hi = new->s##_hi;                 \
558255736Sdavidch        pstats->mac_stx[0].t##_lo = new->s##_lo;                 \
559255736Sdavidch        ADD_64(pstats->mac_stx[1].t##_hi, diff.hi,               \
560255736Sdavidch               pstats->mac_stx[1].t##_lo, diff.lo);              \
561255736Sdavidch    } while (0)
562255736Sdavidch
563255736Sdavidch#define UPDATE_STAT64_NIG(s, t)                    \
564255736Sdavidch    do {                                           \
565255736Sdavidch        DIFF_64(diff.hi, new->s##_hi, old->s##_hi, \
566255736Sdavidch            diff.lo, new->s##_lo, old->s##_lo);    \
567255736Sdavidch        ADD_64(estats->t##_hi, diff.hi,            \
568255736Sdavidch               estats->t##_lo, diff.lo);           \
569255736Sdavidch    } while (0)
570255736Sdavidch
571255736Sdavidch/* sum[hi:lo] += add */
572255736Sdavidch#define ADD_EXTEND_64(s_hi, s_lo, a) \
573255736Sdavidch    do {                             \
574255736Sdavidch        s_lo += a;                   \
575255736Sdavidch        s_hi += (s_lo < a) ? 1 : 0;  \
576255736Sdavidch    } while (0)
577255736Sdavidch
578255736Sdavidch#define ADD_STAT64(diff, t)                                \
579255736Sdavidch    do {                                                   \
580255736Sdavidch        ADD_64(pstats->mac_stx[1].t##_hi, new->diff##_hi,  \
581255736Sdavidch               pstats->mac_stx[1].t##_lo, new->diff##_lo); \
582255736Sdavidch    } while (0)
583255736Sdavidch
584255736Sdavidch#define UPDATE_EXTEND_STAT(s)                    \
585255736Sdavidch    do {                                         \
586255736Sdavidch        ADD_EXTEND_64(pstats->mac_stx[1].s##_hi, \
587255736Sdavidch                  pstats->mac_stx[1].s##_lo,     \
588255736Sdavidch                  new->s);                       \
589255736Sdavidch    } while (0)
590255736Sdavidch
591255736Sdavidch#define UPDATE_EXTEND_TSTAT_X(s, t, size)                    \
592255736Sdavidch    do {                                                     \
593255736Sdavidch        diff = le##size##toh(tclient->s) -                   \
594255736Sdavidch               le##size##toh(old_tclient->s);                \
595255736Sdavidch        old_tclient->s = tclient->s;                         \
596255736Sdavidch        ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
597255736Sdavidch    } while (0)
598255736Sdavidch
599255736Sdavidch#define UPDATE_EXTEND_TSTAT(s, t) UPDATE_EXTEND_TSTAT_X(s, t, 32)
600255736Sdavidch
601255736Sdavidch#define UPDATE_EXTEND_E_TSTAT(s, t, size)                    \
602255736Sdavidch    do {                                                     \
603255736Sdavidch        UPDATE_EXTEND_TSTAT_X(s, t, size);                   \
604255736Sdavidch        ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
605255736Sdavidch    } while (0)
606255736Sdavidch
607255736Sdavidch#define UPDATE_EXTEND_USTAT(s, t)                             \
608255736Sdavidch    do {                                                      \
609255736Sdavidch        diff = le32toh(uclient->s) - le32toh(old_uclient->s); \
610255736Sdavidch        old_uclient->s = uclient->s;                          \
611255736Sdavidch        ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff);  \
612255736Sdavidch    } while (0)
613255736Sdavidch
614255736Sdavidch#define UPDATE_EXTEND_E_USTAT(s, t)                          \
615255736Sdavidch    do {                                                     \
616255736Sdavidch        UPDATE_EXTEND_USTAT(s, t);                           \
617255736Sdavidch        ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
618255736Sdavidch    } while (0)
619255736Sdavidch
620255736Sdavidch#define UPDATE_EXTEND_XSTAT(s, t)                             \
621255736Sdavidch    do {                                                      \
622255736Sdavidch        diff = le32toh(xclient->s) - le32toh(old_xclient->s); \
623255736Sdavidch        old_xclient->s = xclient->s;                          \
624255736Sdavidch        ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff);  \
625255736Sdavidch    } while (0)
626255736Sdavidch
627255736Sdavidch#define UPDATE_QSTAT(s, t)                                   \
628255736Sdavidch    do {                                                     \
629255736Sdavidch        qstats->t##_hi = qstats_old->t##_hi + le32toh(s.hi); \
630255736Sdavidch        qstats->t##_lo = qstats_old->t##_lo + le32toh(s.lo); \
631255736Sdavidch    } while (0)
632255736Sdavidch
633255736Sdavidch#define UPDATE_QSTAT_OLD(f)        \
634255736Sdavidch    do {                           \
635255736Sdavidch        qstats_old->f = qstats->f; \
636255736Sdavidch    } while (0)
637255736Sdavidch
638255736Sdavidch#define UPDATE_ESTAT_QSTAT_64(s)                        \
639255736Sdavidch    do {                                                \
640255736Sdavidch        ADD_64(estats->s##_hi, qstats->s##_hi,          \
641255736Sdavidch               estats->s##_lo, qstats->s##_lo);         \
642255736Sdavidch        SUB_64(estats->s##_hi, qstats_old->s##_hi_old,  \
643255736Sdavidch               estats->s##_lo, qstats_old->s##_lo_old); \
644255736Sdavidch        qstats_old->s##_hi_old = qstats->s##_hi;        \
645255736Sdavidch        qstats_old->s##_lo_old = qstats->s##_lo;        \
646255736Sdavidch    } while (0)
647255736Sdavidch
648255736Sdavidch#define UPDATE_ESTAT_QSTAT(s)             \
649255736Sdavidch    do {                                  \
650255736Sdavidch        estats->s += qstats->s;           \
651255736Sdavidch        estats->s -= qstats_old->s##_old; \
652255736Sdavidch        qstats_old->s##_old = qstats->s;  \
653255736Sdavidch    } while (0)
654255736Sdavidch
655255736Sdavidch#define UPDATE_FSTAT_QSTAT(s)                       \
656255736Sdavidch    do {                                            \
657255736Sdavidch        ADD_64(fstats->s##_hi, qstats->s##_hi,      \
658255736Sdavidch               fstats->s##_lo, qstats->s##_lo);     \
659255736Sdavidch        SUB_64(fstats->s##_hi, qstats_old->s##_hi,  \
660255736Sdavidch               fstats->s##_lo, qstats_old->s##_lo); \
661255736Sdavidch        estats->s##_hi = fstats->s##_hi;            \
662255736Sdavidch        estats->s##_lo = fstats->s##_lo;            \
663255736Sdavidch        qstats_old->s##_hi = qstats->s##_hi;        \
664255736Sdavidch        qstats_old->s##_lo = qstats->s##_lo;        \
665255736Sdavidch    } while (0)
666255736Sdavidch
667255736Sdavidch#define UPDATE_FW_STAT(s)                           \
668255736Sdavidch    do {                                            \
669255736Sdavidch        estats->s = le32toh(tport->s) + fwstats->s; \
670255736Sdavidch    } while (0)
671255736Sdavidch
672255736Sdavidch#define UPDATE_FW_STAT_OLD(f)   \
673255736Sdavidch    do {                        \
674255736Sdavidch        fwstats->f = estats->f; \
675255736Sdavidch    } while (0)
676255736Sdavidch
677255736Sdavidch#define UPDATE_ESTAT(s, t)                          \
678255736Sdavidch    do {                                            \
679255736Sdavidch        SUB_64(estats->s##_hi, estats_old->t##_hi,  \
680255736Sdavidch               estats->s##_lo, estats_old->t##_lo); \
681255736Sdavidch        ADD_64(estats->s##_hi, estats->t##_hi,      \
682255736Sdavidch               estats->s##_lo, estats->t##_lo);     \
683255736Sdavidch        estats_old->t##_hi = estats->t##_hi;        \
684255736Sdavidch        estats_old->t##_lo = estats->t##_lo;        \
685255736Sdavidch    } while (0)
686255736Sdavidch
687255736Sdavidch/* minuend -= subtrahend */
688255736Sdavidch#define SUB_64(m_hi, s_hi, m_lo, s_lo)               \
689255736Sdavidch    do {                                             \
690255736Sdavidch        DIFF_64(m_hi, m_hi, s_hi, m_lo, m_lo, s_lo); \
691255736Sdavidch    } while (0)
692255736Sdavidch
693255736Sdavidch/* minuend[hi:lo] -= subtrahend */
694255736Sdavidch#define SUB_EXTEND_64(m_hi, m_lo, s) \
695255736Sdavidch    do {                             \
696255736Sdavidch        SUB_64(m_hi, 0, m_lo, s);    \
697255736Sdavidch    } while (0)
698255736Sdavidch
699255736Sdavidch#define SUB_EXTEND_USTAT(s, t)                                \
700255736Sdavidch    do {                                                      \
701255736Sdavidch        diff = le32toh(uclient->s) - le32toh(old_uclient->s); \
702255736Sdavidch        SUB_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff);  \
703255736Sdavidch    } while (0)
704255736Sdavidch
705255736Sdavidchstruct bxe_softc;
706255736Sdavidchvoid bxe_stats_init(struct bxe_softc *sc);
707255736Sdavidchvoid bxe_stats_handle(struct bxe_softc *sc, enum bxe_stats_event event);
708255736Sdavidchvoid bxe_save_statistics(struct bxe_softc *sc);
709255736Sdavidchvoid bxe_afex_collect_stats(struct bxe_softc *sc, void *void_afex_stats, uint32_t stats_type);
710255736Sdavidch
711255736Sdavidch#endif /* BXE_STATS_H */
712255736Sdavidch
713