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: releng/10.3/sys/dev/bxe/bxe_stats.h 293787 2016-01-12 22:58:46Z 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;
266255736Sdavidch};
267255736Sdavidch
268255736Sdavidch
269255736Sdavidchstruct bxe_eth_q_stats {
270255736Sdavidch    uint32_t total_unicast_bytes_received_hi;
271255736Sdavidch    uint32_t total_unicast_bytes_received_lo;
272255736Sdavidch    uint32_t total_broadcast_bytes_received_hi;
273255736Sdavidch    uint32_t total_broadcast_bytes_received_lo;
274255736Sdavidch    uint32_t total_multicast_bytes_received_hi;
275255736Sdavidch    uint32_t total_multicast_bytes_received_lo;
276255736Sdavidch    uint32_t total_bytes_received_hi;
277255736Sdavidch    uint32_t total_bytes_received_lo;
278255736Sdavidch    uint32_t total_unicast_bytes_transmitted_hi;
279255736Sdavidch    uint32_t total_unicast_bytes_transmitted_lo;
280255736Sdavidch    uint32_t total_broadcast_bytes_transmitted_hi;
281255736Sdavidch    uint32_t total_broadcast_bytes_transmitted_lo;
282255736Sdavidch    uint32_t total_multicast_bytes_transmitted_hi;
283255736Sdavidch    uint32_t total_multicast_bytes_transmitted_lo;
284255736Sdavidch    uint32_t total_bytes_transmitted_hi;
285255736Sdavidch    uint32_t total_bytes_transmitted_lo;
286255736Sdavidch    uint32_t total_unicast_packets_received_hi;
287255736Sdavidch    uint32_t total_unicast_packets_received_lo;
288255736Sdavidch    uint32_t total_multicast_packets_received_hi;
289255736Sdavidch    uint32_t total_multicast_packets_received_lo;
290255736Sdavidch    uint32_t total_broadcast_packets_received_hi;
291255736Sdavidch    uint32_t total_broadcast_packets_received_lo;
292255736Sdavidch    uint32_t total_unicast_packets_transmitted_hi;
293255736Sdavidch    uint32_t total_unicast_packets_transmitted_lo;
294255736Sdavidch    uint32_t total_multicast_packets_transmitted_hi;
295255736Sdavidch    uint32_t total_multicast_packets_transmitted_lo;
296255736Sdavidch    uint32_t total_broadcast_packets_transmitted_hi;
297255736Sdavidch    uint32_t total_broadcast_packets_transmitted_lo;
298255736Sdavidch    uint32_t valid_bytes_received_hi;
299255736Sdavidch    uint32_t valid_bytes_received_lo;
300255736Sdavidch
301255736Sdavidch    uint32_t etherstatsoverrsizepkts_hi;
302255736Sdavidch    uint32_t etherstatsoverrsizepkts_lo;
303255736Sdavidch    uint32_t no_buff_discard_hi;
304255736Sdavidch    uint32_t no_buff_discard_lo;
305255736Sdavidch
306255736Sdavidch    uint32_t total_packets_received_checksum_discarded_hi;
307255736Sdavidch    uint32_t total_packets_received_checksum_discarded_lo;
308255736Sdavidch    uint32_t total_packets_received_ttl0_discarded_hi;
309255736Sdavidch    uint32_t total_packets_received_ttl0_discarded_lo;
310255736Sdavidch    uint32_t total_transmitted_dropped_packets_error_hi;
311255736Sdavidch    uint32_t total_transmitted_dropped_packets_error_lo;
312255736Sdavidch
313255736Sdavidch    uint32_t total_tpa_aggregations_hi;
314255736Sdavidch    uint32_t total_tpa_aggregations_lo;
315255736Sdavidch    uint32_t total_tpa_aggregated_frames_hi;
316255736Sdavidch    uint32_t total_tpa_aggregated_frames_lo;
317255736Sdavidch    uint32_t total_tpa_bytes_hi;
318255736Sdavidch    uint32_t total_tpa_bytes_lo;
319255736Sdavidch
320255736Sdavidch    /* receive path driver statistics */
321255736Sdavidch    uint32_t rx_calls;
322255736Sdavidch    uint32_t rx_pkts;
323255736Sdavidch    uint32_t rx_tpa_pkts;
324293787Sdavidcs    uint32_t rx_erroneous_jumbo_sge_pkts;
325293787Sdavidcs    uint32_t rx_bxe_service_rxsgl;
326283755Sdavidcs    uint32_t rx_jumbo_sge_pkts;
327255736Sdavidch    uint32_t rx_soft_errors;
328255736Sdavidch    uint32_t rx_hw_csum_errors;
329255736Sdavidch    uint32_t rx_ofld_frames_csum_ip;
330255736Sdavidch    uint32_t rx_ofld_frames_csum_tcp_udp;
331255736Sdavidch    uint32_t rx_budget_reached;
332255736Sdavidch
333255736Sdavidch    /* tx path driver statistics */
334255736Sdavidch    uint32_t tx_pkts;
335255736Sdavidch    uint32_t tx_soft_errors;
336255736Sdavidch    uint32_t tx_ofld_frames_csum_ip;
337255736Sdavidch    uint32_t tx_ofld_frames_csum_tcp;
338255736Sdavidch    uint32_t tx_ofld_frames_csum_udp;
339255736Sdavidch    uint32_t tx_ofld_frames_lso;
340255736Sdavidch    uint32_t tx_ofld_frames_lso_hdr_splits;
341255736Sdavidch    uint32_t tx_encap_failures;
342255736Sdavidch    uint32_t tx_hw_queue_full;
343255736Sdavidch    uint32_t tx_hw_max_queue_depth;
344255736Sdavidch    uint32_t tx_dma_mapping_failure;
345255736Sdavidch    uint32_t tx_max_drbr_queue_depth;
346255736Sdavidch    uint32_t tx_window_violation_std;
347255736Sdavidch    uint32_t tx_window_violation_tso;
348255736Sdavidch    //uint32_t tx_unsupported_tso_request_ipv6;
349255736Sdavidch    //uint32_t tx_unsupported_tso_request_not_tcp;
350255736Sdavidch    uint32_t tx_chain_lost_mbuf;
351255736Sdavidch    uint32_t tx_frames_deferred;
352255736Sdavidch    uint32_t tx_queue_xoff;
353255736Sdavidch
354255736Sdavidch    /* mbuf driver statistics */
355255736Sdavidch    uint32_t mbuf_defrag_attempts;
356255736Sdavidch    uint32_t mbuf_defrag_failures;
357255736Sdavidch    uint32_t mbuf_rx_bd_alloc_failed;
358255736Sdavidch    uint32_t mbuf_rx_bd_mapping_failed;
359255736Sdavidch    uint32_t mbuf_rx_tpa_alloc_failed;
360255736Sdavidch    uint32_t mbuf_rx_tpa_mapping_failed;
361255736Sdavidch    uint32_t mbuf_rx_sge_alloc_failed;
362255736Sdavidch    uint32_t mbuf_rx_sge_mapping_failed;
363255736Sdavidch
364255736Sdavidch    /* track the number of allocated mbufs */
365255736Sdavidch    uint32_t mbuf_alloc_tx;
366255736Sdavidch    uint32_t mbuf_alloc_rx;
367255736Sdavidch    uint32_t mbuf_alloc_sge;
368255736Sdavidch    uint32_t mbuf_alloc_tpa;
369255736Sdavidch};
370255736Sdavidch
371255736Sdavidchstruct bxe_eth_stats_old {
372255736Sdavidch    uint32_t rx_stat_dot3statsframestoolong_hi;
373255736Sdavidch    uint32_t rx_stat_dot3statsframestoolong_lo;
374255736Sdavidch};
375255736Sdavidch
376255736Sdavidchstruct bxe_eth_q_stats_old {
377255736Sdavidch    /* Fields to perserve over fw reset*/
378255736Sdavidch    uint32_t total_unicast_bytes_received_hi;
379255736Sdavidch    uint32_t total_unicast_bytes_received_lo;
380255736Sdavidch    uint32_t total_broadcast_bytes_received_hi;
381255736Sdavidch    uint32_t total_broadcast_bytes_received_lo;
382255736Sdavidch    uint32_t total_multicast_bytes_received_hi;
383255736Sdavidch    uint32_t total_multicast_bytes_received_lo;
384255736Sdavidch    uint32_t total_unicast_bytes_transmitted_hi;
385255736Sdavidch    uint32_t total_unicast_bytes_transmitted_lo;
386255736Sdavidch    uint32_t total_broadcast_bytes_transmitted_hi;
387255736Sdavidch    uint32_t total_broadcast_bytes_transmitted_lo;
388255736Sdavidch    uint32_t total_multicast_bytes_transmitted_hi;
389255736Sdavidch    uint32_t total_multicast_bytes_transmitted_lo;
390255736Sdavidch    uint32_t total_tpa_bytes_hi;
391255736Sdavidch    uint32_t total_tpa_bytes_lo;
392255736Sdavidch
393255736Sdavidch    /* Fields to perserve last of */
394255736Sdavidch    uint32_t total_bytes_received_hi;
395255736Sdavidch    uint32_t total_bytes_received_lo;
396255736Sdavidch    uint32_t total_bytes_transmitted_hi;
397255736Sdavidch    uint32_t total_bytes_transmitted_lo;
398255736Sdavidch    uint32_t total_unicast_packets_received_hi;
399255736Sdavidch    uint32_t total_unicast_packets_received_lo;
400255736Sdavidch    uint32_t total_multicast_packets_received_hi;
401255736Sdavidch    uint32_t total_multicast_packets_received_lo;
402255736Sdavidch    uint32_t total_broadcast_packets_received_hi;
403255736Sdavidch    uint32_t total_broadcast_packets_received_lo;
404255736Sdavidch    uint32_t total_unicast_packets_transmitted_hi;
405255736Sdavidch    uint32_t total_unicast_packets_transmitted_lo;
406255736Sdavidch    uint32_t total_multicast_packets_transmitted_hi;
407255736Sdavidch    uint32_t total_multicast_packets_transmitted_lo;
408255736Sdavidch    uint32_t total_broadcast_packets_transmitted_hi;
409255736Sdavidch    uint32_t total_broadcast_packets_transmitted_lo;
410255736Sdavidch    uint32_t valid_bytes_received_hi;
411255736Sdavidch    uint32_t valid_bytes_received_lo;
412255736Sdavidch
413255736Sdavidch    uint32_t total_tpa_bytes_hi_old;
414255736Sdavidch    uint32_t total_tpa_bytes_lo_old;
415255736Sdavidch
416255736Sdavidch    /* receive path driver statistics */
417255736Sdavidch    uint32_t rx_calls_old;
418255736Sdavidch    uint32_t rx_pkts_old;
419255736Sdavidch    uint32_t rx_tpa_pkts_old;
420293787Sdavidcs    uint32_t rx_erroneous_jumbo_sge_pkts_old;
421293787Sdavidcs    uint32_t rx_bxe_service_rxsgl_old;
422283755Sdavidcs    uint32_t rx_jumbo_sge_pkts_old;
423255736Sdavidch    uint32_t rx_soft_errors_old;
424255736Sdavidch    uint32_t rx_hw_csum_errors_old;
425255736Sdavidch    uint32_t rx_ofld_frames_csum_ip_old;
426255736Sdavidch    uint32_t rx_ofld_frames_csum_tcp_udp_old;
427255736Sdavidch    uint32_t rx_budget_reached_old;
428255736Sdavidch
429255736Sdavidch    /* tx path driver statistics */
430255736Sdavidch    uint32_t tx_pkts_old;
431255736Sdavidch    uint32_t tx_soft_errors_old;
432255736Sdavidch    uint32_t tx_ofld_frames_csum_ip_old;
433255736Sdavidch    uint32_t tx_ofld_frames_csum_tcp_old;
434255736Sdavidch    uint32_t tx_ofld_frames_csum_udp_old;
435255736Sdavidch    uint32_t tx_ofld_frames_lso_old;
436255736Sdavidch    uint32_t tx_ofld_frames_lso_hdr_splits_old;
437255736Sdavidch    uint32_t tx_encap_failures_old;
438255736Sdavidch    uint32_t tx_hw_queue_full_old;
439255736Sdavidch    uint32_t tx_hw_max_queue_depth_old;
440255736Sdavidch    uint32_t tx_dma_mapping_failure_old;
441255736Sdavidch    uint32_t tx_max_drbr_queue_depth_old;
442255736Sdavidch    uint32_t tx_window_violation_std_old;
443255736Sdavidch    uint32_t tx_window_violation_tso_old;
444255736Sdavidch    //uint32_t tx_unsupported_tso_request_ipv6_old;
445255736Sdavidch    //uint32_t tx_unsupported_tso_request_not_tcp_old;
446255736Sdavidch    uint32_t tx_chain_lost_mbuf_old;
447255736Sdavidch    uint32_t tx_frames_deferred_old;
448255736Sdavidch    uint32_t tx_queue_xoff_old;
449255736Sdavidch
450255736Sdavidch    /* mbuf driver statistics */
451255736Sdavidch    uint32_t mbuf_defrag_attempts_old;
452255736Sdavidch    uint32_t mbuf_defrag_failures_old;
453255736Sdavidch    uint32_t mbuf_rx_bd_alloc_failed_old;
454255736Sdavidch    uint32_t mbuf_rx_bd_mapping_failed_old;
455255736Sdavidch    uint32_t mbuf_rx_tpa_alloc_failed_old;
456255736Sdavidch    uint32_t mbuf_rx_tpa_mapping_failed_old;
457255736Sdavidch    uint32_t mbuf_rx_sge_alloc_failed_old;
458255736Sdavidch    uint32_t mbuf_rx_sge_mapping_failed_old;
459255736Sdavidch
460255736Sdavidch    /* track the number of allocated mbufs */
461255736Sdavidch    int mbuf_alloc_tx_old;
462255736Sdavidch    int mbuf_alloc_rx_old;
463255736Sdavidch    int mbuf_alloc_sge_old;
464255736Sdavidch    int mbuf_alloc_tpa_old;
465255736Sdavidch};
466255736Sdavidch
467255736Sdavidchstruct bxe_net_stats_old {
468255736Sdavidch    uint32_t rx_dropped;
469255736Sdavidch};
470255736Sdavidch
471255736Sdavidchstruct bxe_fw_port_stats_old {
472255736Sdavidch    uint32_t pfc_frames_tx_hi;
473255736Sdavidch    uint32_t pfc_frames_tx_lo;
474255736Sdavidch    uint32_t pfc_frames_rx_hi;
475255736Sdavidch    uint32_t pfc_frames_rx_lo;
476255736Sdavidch
477255736Sdavidch    uint32_t mac_filter_discard;
478255736Sdavidch    uint32_t mf_tag_discard;
479255736Sdavidch    uint32_t brb_truncate_discard;
480255736Sdavidch    uint32_t mac_discard;
481255736Sdavidch};
482255736Sdavidch
483255736Sdavidch/* sum[hi:lo] += add[hi:lo] */
484255736Sdavidch#define ADD_64(s_hi, a_hi, s_lo, a_lo)          \
485255736Sdavidch    do {                                        \
486255736Sdavidch        s_lo += a_lo;                           \
487255736Sdavidch        s_hi += a_hi + ((s_lo < a_lo) ? 1 : 0); \
488255736Sdavidch    } while (0)
489255736Sdavidch
490255736Sdavidch#define LE32_0 ((uint32_t) 0)
491255736Sdavidch#define LE16_0 ((uint16_t) 0)
492255736Sdavidch
493255736Sdavidch/* The _force is for cases where high value is 0 */
494255736Sdavidch#define ADD_64_LE(s_hi, a_hi_le, s_lo, a_lo_le) \
495255736Sdavidch        ADD_64(s_hi, le32toh(a_hi_le),          \
496255736Sdavidch               s_lo, le32toh(a_lo_le))
497255736Sdavidch
498255736Sdavidch#define ADD_64_LE16(s_hi, a_hi_le, s_lo, a_lo_le) \
499255736Sdavidch        ADD_64(s_hi, le16toh(a_hi_le),            \
500255736Sdavidch               s_lo, le16toh(a_lo_le))
501255736Sdavidch
502255736Sdavidch/* difference = minuend - subtrahend */
503255736Sdavidch#define DIFF_64(d_hi, m_hi, s_hi, d_lo, m_lo, s_lo)  \
504255736Sdavidch    do {                                             \
505255736Sdavidch        if (m_lo < s_lo) {                           \
506255736Sdavidch            /* underflow */                          \
507255736Sdavidch            d_hi = m_hi - s_hi;                      \
508255736Sdavidch            if (d_hi > 0) {                          \
509255736Sdavidch                /* we can 'loan' 1 */                \
510255736Sdavidch                d_hi--;                              \
511255736Sdavidch                d_lo = m_lo + (UINT_MAX - s_lo) + 1; \
512255736Sdavidch            } else {                                 \
513255736Sdavidch                /* m_hi <= s_hi */                   \
514255736Sdavidch                d_hi = 0;                            \
515255736Sdavidch                d_lo = 0;                            \
516255736Sdavidch            }                                        \
517255736Sdavidch        } else {                                     \
518255736Sdavidch            /* m_lo >= s_lo */                       \
519255736Sdavidch            if (m_hi < s_hi) {                       \
520255736Sdavidch                d_hi = 0;                            \
521255736Sdavidch                d_lo = 0;                            \
522255736Sdavidch            } else {                                 \
523255736Sdavidch                /* m_hi >= s_hi */                   \
524255736Sdavidch                d_hi = m_hi - s_hi;                  \
525255736Sdavidch                d_lo = m_lo - s_lo;                  \
526255736Sdavidch            }                                        \
527255736Sdavidch        }                                            \
528255736Sdavidch    } while (0)
529255736Sdavidch
530255736Sdavidch#define UPDATE_STAT64(s, t)                                      \
531255736Sdavidch    do {                                                         \
532255736Sdavidch        DIFF_64(diff.hi, new->s##_hi, pstats->mac_stx[0].t##_hi, \
533255736Sdavidch            diff.lo, new->s##_lo, pstats->mac_stx[0].t##_lo);    \
534255736Sdavidch        pstats->mac_stx[0].t##_hi = new->s##_hi;                 \
535255736Sdavidch        pstats->mac_stx[0].t##_lo = new->s##_lo;                 \
536255736Sdavidch        ADD_64(pstats->mac_stx[1].t##_hi, diff.hi,               \
537255736Sdavidch               pstats->mac_stx[1].t##_lo, diff.lo);              \
538255736Sdavidch    } while (0)
539255736Sdavidch
540255736Sdavidch#define UPDATE_STAT64_NIG(s, t)                    \
541255736Sdavidch    do {                                           \
542255736Sdavidch        DIFF_64(diff.hi, new->s##_hi, old->s##_hi, \
543255736Sdavidch            diff.lo, new->s##_lo, old->s##_lo);    \
544255736Sdavidch        ADD_64(estats->t##_hi, diff.hi,            \
545255736Sdavidch               estats->t##_lo, diff.lo);           \
546255736Sdavidch    } while (0)
547255736Sdavidch
548255736Sdavidch/* sum[hi:lo] += add */
549255736Sdavidch#define ADD_EXTEND_64(s_hi, s_lo, a) \
550255736Sdavidch    do {                             \
551255736Sdavidch        s_lo += a;                   \
552255736Sdavidch        s_hi += (s_lo < a) ? 1 : 0;  \
553255736Sdavidch    } while (0)
554255736Sdavidch
555255736Sdavidch#define ADD_STAT64(diff, t)                                \
556255736Sdavidch    do {                                                   \
557255736Sdavidch        ADD_64(pstats->mac_stx[1].t##_hi, new->diff##_hi,  \
558255736Sdavidch               pstats->mac_stx[1].t##_lo, new->diff##_lo); \
559255736Sdavidch    } while (0)
560255736Sdavidch
561255736Sdavidch#define UPDATE_EXTEND_STAT(s)                    \
562255736Sdavidch    do {                                         \
563255736Sdavidch        ADD_EXTEND_64(pstats->mac_stx[1].s##_hi, \
564255736Sdavidch                  pstats->mac_stx[1].s##_lo,     \
565255736Sdavidch                  new->s);                       \
566255736Sdavidch    } while (0)
567255736Sdavidch
568255736Sdavidch#define UPDATE_EXTEND_TSTAT_X(s, t, size)                    \
569255736Sdavidch    do {                                                     \
570255736Sdavidch        diff = le##size##toh(tclient->s) -                   \
571255736Sdavidch               le##size##toh(old_tclient->s);                \
572255736Sdavidch        old_tclient->s = tclient->s;                         \
573255736Sdavidch        ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
574255736Sdavidch    } while (0)
575255736Sdavidch
576255736Sdavidch#define UPDATE_EXTEND_TSTAT(s, t) UPDATE_EXTEND_TSTAT_X(s, t, 32)
577255736Sdavidch
578255736Sdavidch#define UPDATE_EXTEND_E_TSTAT(s, t, size)                    \
579255736Sdavidch    do {                                                     \
580255736Sdavidch        UPDATE_EXTEND_TSTAT_X(s, t, size);                   \
581255736Sdavidch        ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
582255736Sdavidch    } while (0)
583255736Sdavidch
584255736Sdavidch#define UPDATE_EXTEND_USTAT(s, t)                             \
585255736Sdavidch    do {                                                      \
586255736Sdavidch        diff = le32toh(uclient->s) - le32toh(old_uclient->s); \
587255736Sdavidch        old_uclient->s = uclient->s;                          \
588255736Sdavidch        ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff);  \
589255736Sdavidch    } while (0)
590255736Sdavidch
591255736Sdavidch#define UPDATE_EXTEND_E_USTAT(s, t)                          \
592255736Sdavidch    do {                                                     \
593255736Sdavidch        UPDATE_EXTEND_USTAT(s, t);                           \
594255736Sdavidch        ADD_EXTEND_64(estats->t##_hi, estats->t##_lo, diff); \
595255736Sdavidch    } while (0)
596255736Sdavidch
597255736Sdavidch#define UPDATE_EXTEND_XSTAT(s, t)                             \
598255736Sdavidch    do {                                                      \
599255736Sdavidch        diff = le32toh(xclient->s) - le32toh(old_xclient->s); \
600255736Sdavidch        old_xclient->s = xclient->s;                          \
601255736Sdavidch        ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff);  \
602255736Sdavidch    } while (0)
603255736Sdavidch
604255736Sdavidch#define UPDATE_QSTAT(s, t)                                   \
605255736Sdavidch    do {                                                     \
606255736Sdavidch        qstats->t##_hi = qstats_old->t##_hi + le32toh(s.hi); \
607255736Sdavidch        qstats->t##_lo = qstats_old->t##_lo + le32toh(s.lo); \
608255736Sdavidch    } while (0)
609255736Sdavidch
610255736Sdavidch#define UPDATE_QSTAT_OLD(f)        \
611255736Sdavidch    do {                           \
612255736Sdavidch        qstats_old->f = qstats->f; \
613255736Sdavidch    } while (0)
614255736Sdavidch
615255736Sdavidch#define UPDATE_ESTAT_QSTAT_64(s)                        \
616255736Sdavidch    do {                                                \
617255736Sdavidch        ADD_64(estats->s##_hi, qstats->s##_hi,          \
618255736Sdavidch               estats->s##_lo, qstats->s##_lo);         \
619255736Sdavidch        SUB_64(estats->s##_hi, qstats_old->s##_hi_old,  \
620255736Sdavidch               estats->s##_lo, qstats_old->s##_lo_old); \
621255736Sdavidch        qstats_old->s##_hi_old = qstats->s##_hi;        \
622255736Sdavidch        qstats_old->s##_lo_old = qstats->s##_lo;        \
623255736Sdavidch    } while (0)
624255736Sdavidch
625255736Sdavidch#define UPDATE_ESTAT_QSTAT(s)             \
626255736Sdavidch    do {                                  \
627255736Sdavidch        estats->s += qstats->s;           \
628255736Sdavidch        estats->s -= qstats_old->s##_old; \
629255736Sdavidch        qstats_old->s##_old = qstats->s;  \
630255736Sdavidch    } while (0)
631255736Sdavidch
632255736Sdavidch#define UPDATE_FSTAT_QSTAT(s)                       \
633255736Sdavidch    do {                                            \
634255736Sdavidch        ADD_64(fstats->s##_hi, qstats->s##_hi,      \
635255736Sdavidch               fstats->s##_lo, qstats->s##_lo);     \
636255736Sdavidch        SUB_64(fstats->s##_hi, qstats_old->s##_hi,  \
637255736Sdavidch               fstats->s##_lo, qstats_old->s##_lo); \
638255736Sdavidch        estats->s##_hi = fstats->s##_hi;            \
639255736Sdavidch        estats->s##_lo = fstats->s##_lo;            \
640255736Sdavidch        qstats_old->s##_hi = qstats->s##_hi;        \
641255736Sdavidch        qstats_old->s##_lo = qstats->s##_lo;        \
642255736Sdavidch    } while (0)
643255736Sdavidch
644255736Sdavidch#define UPDATE_FW_STAT(s)                           \
645255736Sdavidch    do {                                            \
646255736Sdavidch        estats->s = le32toh(tport->s) + fwstats->s; \
647255736Sdavidch    } while (0)
648255736Sdavidch
649255736Sdavidch#define UPDATE_FW_STAT_OLD(f)   \
650255736Sdavidch    do {                        \
651255736Sdavidch        fwstats->f = estats->f; \
652255736Sdavidch    } while (0)
653255736Sdavidch
654255736Sdavidch#define UPDATE_ESTAT(s, t)                          \
655255736Sdavidch    do {                                            \
656255736Sdavidch        SUB_64(estats->s##_hi, estats_old->t##_hi,  \
657255736Sdavidch               estats->s##_lo, estats_old->t##_lo); \
658255736Sdavidch        ADD_64(estats->s##_hi, estats->t##_hi,      \
659255736Sdavidch               estats->s##_lo, estats->t##_lo);     \
660255736Sdavidch        estats_old->t##_hi = estats->t##_hi;        \
661255736Sdavidch        estats_old->t##_lo = estats->t##_lo;        \
662255736Sdavidch    } while (0)
663255736Sdavidch
664255736Sdavidch/* minuend -= subtrahend */
665255736Sdavidch#define SUB_64(m_hi, s_hi, m_lo, s_lo)               \
666255736Sdavidch    do {                                             \
667255736Sdavidch        DIFF_64(m_hi, m_hi, s_hi, m_lo, m_lo, s_lo); \
668255736Sdavidch    } while (0)
669255736Sdavidch
670255736Sdavidch/* minuend[hi:lo] -= subtrahend */
671255736Sdavidch#define SUB_EXTEND_64(m_hi, m_lo, s) \
672255736Sdavidch    do {                             \
673255736Sdavidch        SUB_64(m_hi, 0, m_lo, s);    \
674255736Sdavidch    } while (0)
675255736Sdavidch
676255736Sdavidch#define SUB_EXTEND_USTAT(s, t)                                \
677255736Sdavidch    do {                                                      \
678255736Sdavidch        diff = le32toh(uclient->s) - le32toh(old_uclient->s); \
679255736Sdavidch        SUB_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff);  \
680255736Sdavidch    } while (0)
681255736Sdavidch
682255736Sdavidchstruct bxe_softc;
683255736Sdavidchvoid bxe_stats_init(struct bxe_softc *sc);
684255736Sdavidchvoid bxe_stats_handle(struct bxe_softc *sc, enum bxe_stats_event event);
685255736Sdavidchvoid bxe_save_statistics(struct bxe_softc *sc);
686255736Sdavidchvoid bxe_afex_collect_stats(struct bxe_softc *sc, void *void_afex_stats, uint32_t stats_type);
687255736Sdavidch
688255736Sdavidch#endif /* BXE_STATS_H */
689255736Sdavidch
690