1*acd884deSSumit Saxena /*
2*acd884deSSumit Saxena * Copyright (c) 2015-2024, Broadcom. All rights reserved. The term
3*acd884deSSumit Saxena * Broadcom refers to Broadcom Limited and/or its subsidiaries.
4*acd884deSSumit Saxena *
5*acd884deSSumit Saxena * Redistribution and use in source and binary forms, with or without
6*acd884deSSumit Saxena * modification, are permitted provided that the following conditions
7*acd884deSSumit Saxena * are met:
8*acd884deSSumit Saxena *
9*acd884deSSumit Saxena * 1. Redistributions of source code must retain the above copyright
10*acd884deSSumit Saxena * notice, this list of conditions and the following disclaimer.
11*acd884deSSumit Saxena * 2. Redistributions in binary form must reproduce the above copyright
12*acd884deSSumit Saxena * notice, this list of conditions and the following disclaimer in
13*acd884deSSumit Saxena * the documentation and/or other materials provided with the
14*acd884deSSumit Saxena * distribution.
15*acd884deSSumit Saxena *
16*acd884deSSumit Saxena * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
17*acd884deSSumit Saxena * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18*acd884deSSumit Saxena * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19*acd884deSSumit Saxena * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
20*acd884deSSumit Saxena * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*acd884deSSumit Saxena * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*acd884deSSumit Saxena * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23*acd884deSSumit Saxena * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24*acd884deSSumit Saxena * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25*acd884deSSumit Saxena * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26*acd884deSSumit Saxena * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*acd884deSSumit Saxena *
28*acd884deSSumit Saxena * Description: statistics related functions
29*acd884deSSumit Saxena */
30*acd884deSSumit Saxena
31*acd884deSSumit Saxena #include "bnxt_re.h"
32*acd884deSSumit Saxena #include "bnxt.h"
33*acd884deSSumit Saxena
bnxt_re_get_flow_stats_from_service_pf(struct bnxt_re_dev * rdev,struct bnxt_re_flow_counters * stats,struct bnxt_qplib_query_stats_info * sinfo)34*acd884deSSumit Saxena int bnxt_re_get_flow_stats_from_service_pf(struct bnxt_re_dev *rdev,
35*acd884deSSumit Saxena struct bnxt_re_flow_counters *stats,
36*acd884deSSumit Saxena struct bnxt_qplib_query_stats_info *sinfo)
37*acd884deSSumit Saxena {
38*acd884deSSumit Saxena struct hwrm_cfa_flow_stats_output resp = {};
39*acd884deSSumit Saxena struct hwrm_cfa_flow_stats_input req = {};
40*acd884deSSumit Saxena struct bnxt_en_dev *en_dev = rdev->en_dev;
41*acd884deSSumit Saxena struct bnxt_fw_msg fw_msg = {};
42*acd884deSSumit Saxena u16 target_id;
43*acd884deSSumit Saxena int rc = 0;
44*acd884deSSumit Saxena
45*acd884deSSumit Saxena if (sinfo->function_id == 0xFFFFFFFF)
46*acd884deSSumit Saxena target_id = -1;
47*acd884deSSumit Saxena else
48*acd884deSSumit Saxena target_id = sinfo->function_id + 1;
49*acd884deSSumit Saxena
50*acd884deSSumit Saxena /* Issue HWRM cmd to read flow counters for CNP tx and rx */
51*acd884deSSumit Saxena bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_CFA_FLOW_STATS, -1, target_id);
52*acd884deSSumit Saxena req.num_flows = cpu_to_le16(6);
53*acd884deSSumit Saxena req.flow_handle_0 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_CNP_CNT);
54*acd884deSSumit Saxena req.flow_handle_1 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_CNP_CNT |
55*acd884deSSumit Saxena HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_DIR_RX);
56*acd884deSSumit Saxena req.flow_handle_2 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_ROCEV1_CNT);
57*acd884deSSumit Saxena req.flow_handle_3 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_ROCEV1_CNT |
58*acd884deSSumit Saxena HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_DIR_RX);
59*acd884deSSumit Saxena req.flow_handle_4 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_ROCEV2_CNT);
60*acd884deSSumit Saxena req.flow_handle_5 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_ROCEV2_CNT |
61*acd884deSSumit Saxena HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_DIR_RX);
62*acd884deSSumit Saxena bnxt_re_fill_fw_msg(&fw_msg, &req, sizeof(req), &resp,
63*acd884deSSumit Saxena sizeof(resp), BNXT_RE_HWRM_CMD_TIMEOUT(rdev));
64*acd884deSSumit Saxena rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
65*acd884deSSumit Saxena if (rc) {
66*acd884deSSumit Saxena dev_err(rdev_to_dev(rdev),
67*acd884deSSumit Saxena "Failed to get CFA Flow stats : rc = 0x%x\n", rc);
68*acd884deSSumit Saxena return rc;
69*acd884deSSumit Saxena }
70*acd884deSSumit Saxena
71*acd884deSSumit Saxena stats->cnp_stats.cnp_tx_pkts = le64_to_cpu(resp.packet_0);
72*acd884deSSumit Saxena stats->cnp_stats.cnp_tx_bytes = le64_to_cpu(resp.byte_0);
73*acd884deSSumit Saxena stats->cnp_stats.cnp_rx_pkts = le64_to_cpu(resp.packet_1);
74*acd884deSSumit Saxena stats->cnp_stats.cnp_rx_bytes = le64_to_cpu(resp.byte_1);
75*acd884deSSumit Saxena
76*acd884deSSumit Saxena stats->ro_stats.tx_pkts = le64_to_cpu(resp.packet_2) +
77*acd884deSSumit Saxena le64_to_cpu(resp.packet_4);
78*acd884deSSumit Saxena stats->ro_stats.tx_bytes = le64_to_cpu(resp.byte_2) +
79*acd884deSSumit Saxena le64_to_cpu(resp.byte_4);
80*acd884deSSumit Saxena stats->ro_stats.rx_pkts = le64_to_cpu(resp.packet_3) +
81*acd884deSSumit Saxena le64_to_cpu(resp.packet_5);
82*acd884deSSumit Saxena stats->ro_stats.rx_bytes = le64_to_cpu(resp.byte_3) +
83*acd884deSSumit Saxena le64_to_cpu(resp.byte_5);
84*acd884deSSumit Saxena
85*acd884deSSumit Saxena return 0;
86*acd884deSSumit Saxena }
87*acd884deSSumit Saxena
bnxt_re_get_qos_stats(struct bnxt_re_dev * rdev)88*acd884deSSumit Saxena int bnxt_re_get_qos_stats(struct bnxt_re_dev *rdev)
89*acd884deSSumit Saxena {
90*acd884deSSumit Saxena struct bnxt_re_ro_counters roce_only_tmp[2] = {{}, {}};
91*acd884deSSumit Saxena struct bnxt_re_cnp_counters tmp_counters[2] = {{}, {}};
92*acd884deSSumit Saxena struct hwrm_cfa_flow_stats_output resp = {};
93*acd884deSSumit Saxena struct hwrm_cfa_flow_stats_input req = {};
94*acd884deSSumit Saxena struct bnxt_en_dev *en_dev = rdev->en_dev;
95*acd884deSSumit Saxena struct bnxt_fw_msg fw_msg = {};
96*acd884deSSumit Saxena struct bnxt_re_cc_stat *cnps;
97*acd884deSSumit Saxena struct bnxt_re_rstat *dstat;
98*acd884deSSumit Saxena int rc = 0;
99*acd884deSSumit Saxena u64 bytes;
100*acd884deSSumit Saxena u64 pkts;
101*acd884deSSumit Saxena
102*acd884deSSumit Saxena /* Issue HWRM cmd to read flow counters for CNP tx and rx */
103*acd884deSSumit Saxena bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_CFA_FLOW_STATS, -1, -1);
104*acd884deSSumit Saxena req.num_flows = cpu_to_le16(6);
105*acd884deSSumit Saxena req.flow_handle_0 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_CNP_CNT);
106*acd884deSSumit Saxena req.flow_handle_1 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_CNP_CNT |
107*acd884deSSumit Saxena HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_DIR_RX);
108*acd884deSSumit Saxena req.flow_handle_2 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_ROCEV1_CNT);
109*acd884deSSumit Saxena req.flow_handle_3 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_ROCEV1_CNT |
110*acd884deSSumit Saxena HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_DIR_RX);
111*acd884deSSumit Saxena req.flow_handle_4 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_ROCEV2_CNT);
112*acd884deSSumit Saxena req.flow_handle_5 = cpu_to_le16(HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_ROCEV2_CNT |
113*acd884deSSumit Saxena HWRM_CFA_FLOW_INFO_INPUT_FLOW_HANDLE_DIR_RX);
114*acd884deSSumit Saxena bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
115*acd884deSSumit Saxena sizeof(resp), BNXT_RE_HWRM_CMD_TIMEOUT(rdev));
116*acd884deSSumit Saxena rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
117*acd884deSSumit Saxena if (rc) {
118*acd884deSSumit Saxena dev_err(rdev_to_dev(rdev),
119*acd884deSSumit Saxena "Failed to get CFA Flow stats : rc = 0x%x\n", rc);
120*acd884deSSumit Saxena goto done;
121*acd884deSSumit Saxena }
122*acd884deSSumit Saxena
123*acd884deSSumit Saxena tmp_counters[0].cnp_tx_pkts = le64_to_cpu(resp.packet_0);
124*acd884deSSumit Saxena tmp_counters[0].cnp_tx_bytes = le64_to_cpu(resp.byte_0);
125*acd884deSSumit Saxena tmp_counters[0].cnp_rx_pkts = le64_to_cpu(resp.packet_1);
126*acd884deSSumit Saxena tmp_counters[0].cnp_rx_bytes = le64_to_cpu(resp.byte_1);
127*acd884deSSumit Saxena
128*acd884deSSumit Saxena roce_only_tmp[0].tx_pkts = le64_to_cpu(resp.packet_2) +
129*acd884deSSumit Saxena le64_to_cpu(resp.packet_4);
130*acd884deSSumit Saxena roce_only_tmp[0].tx_bytes = le64_to_cpu(resp.byte_2) +
131*acd884deSSumit Saxena le64_to_cpu(resp.byte_4);
132*acd884deSSumit Saxena roce_only_tmp[0].rx_pkts = le64_to_cpu(resp.packet_3) +
133*acd884deSSumit Saxena le64_to_cpu(resp.packet_5);
134*acd884deSSumit Saxena roce_only_tmp[0].rx_bytes = le64_to_cpu(resp.byte_3) +
135*acd884deSSumit Saxena le64_to_cpu(resp.byte_5);
136*acd884deSSumit Saxena
137*acd884deSSumit Saxena cnps = &rdev->stats.cnps;
138*acd884deSSumit Saxena dstat = &rdev->stats.dstat;
139*acd884deSSumit Saxena if (!cnps->is_first) {
140*acd884deSSumit Saxena /* First query done.. */
141*acd884deSSumit Saxena cnps->is_first = true;
142*acd884deSSumit Saxena cnps->prev[0].cnp_tx_pkts = tmp_counters[0].cnp_tx_pkts;
143*acd884deSSumit Saxena cnps->prev[0].cnp_tx_bytes = tmp_counters[0].cnp_tx_bytes;
144*acd884deSSumit Saxena cnps->prev[0].cnp_rx_pkts = tmp_counters[0].cnp_rx_pkts;
145*acd884deSSumit Saxena cnps->prev[0].cnp_rx_bytes = tmp_counters[0].cnp_rx_bytes;
146*acd884deSSumit Saxena
147*acd884deSSumit Saxena cnps->prev[1].cnp_tx_pkts = tmp_counters[1].cnp_tx_pkts;
148*acd884deSSumit Saxena cnps->prev[1].cnp_tx_bytes = tmp_counters[1].cnp_tx_bytes;
149*acd884deSSumit Saxena cnps->prev[1].cnp_rx_pkts = tmp_counters[1].cnp_rx_pkts;
150*acd884deSSumit Saxena cnps->prev[1].cnp_rx_bytes = tmp_counters[1].cnp_rx_bytes;
151*acd884deSSumit Saxena
152*acd884deSSumit Saxena dstat->prev[0].tx_pkts = roce_only_tmp[0].tx_pkts;
153*acd884deSSumit Saxena dstat->prev[0].tx_bytes = roce_only_tmp[0].tx_bytes;
154*acd884deSSumit Saxena dstat->prev[0].rx_pkts = roce_only_tmp[0].rx_pkts;
155*acd884deSSumit Saxena dstat->prev[0].rx_bytes = roce_only_tmp[0].rx_bytes;
156*acd884deSSumit Saxena
157*acd884deSSumit Saxena dstat->prev[1].tx_pkts = roce_only_tmp[1].tx_pkts;
158*acd884deSSumit Saxena dstat->prev[1].tx_bytes = roce_only_tmp[1].tx_bytes;
159*acd884deSSumit Saxena dstat->prev[1].rx_pkts = roce_only_tmp[1].rx_pkts;
160*acd884deSSumit Saxena dstat->prev[1].rx_bytes = roce_only_tmp[1].rx_bytes;
161*acd884deSSumit Saxena } else {
162*acd884deSSumit Saxena u64 byte_mask, pkts_mask;
163*acd884deSSumit Saxena u64 diff;
164*acd884deSSumit Saxena
165*acd884deSSumit Saxena byte_mask = bnxt_re_get_cfa_stat_mask(rdev->chip_ctx,
166*acd884deSSumit Saxena BYTE_MASK);
167*acd884deSSumit Saxena pkts_mask = bnxt_re_get_cfa_stat_mask(rdev->chip_ctx,
168*acd884deSSumit Saxena PKTS_MASK);
169*acd884deSSumit Saxena /*
170*acd884deSSumit Saxena * Calculate the number of cnp packets and use
171*acd884deSSumit Saxena * the value to calculate the CRC bytes.
172*acd884deSSumit Saxena * Multply pkts with 4 and add it to total bytes
173*acd884deSSumit Saxena */
174*acd884deSSumit Saxena pkts = bnxt_re_stat_diff(tmp_counters[0].cnp_tx_pkts,
175*acd884deSSumit Saxena &cnps->prev[0].cnp_tx_pkts,
176*acd884deSSumit Saxena pkts_mask);
177*acd884deSSumit Saxena cnps->cur[0].cnp_tx_pkts += pkts;
178*acd884deSSumit Saxena diff = bnxt_re_stat_diff(tmp_counters[0].cnp_tx_bytes,
179*acd884deSSumit Saxena &cnps->prev[0].cnp_tx_bytes,
180*acd884deSSumit Saxena byte_mask);
181*acd884deSSumit Saxena bytes = diff + pkts * 4;
182*acd884deSSumit Saxena cnps->cur[0].cnp_tx_bytes += bytes;
183*acd884deSSumit Saxena pkts = bnxt_re_stat_diff(tmp_counters[0].cnp_rx_pkts,
184*acd884deSSumit Saxena &cnps->prev[0].cnp_rx_pkts,
185*acd884deSSumit Saxena pkts_mask);
186*acd884deSSumit Saxena cnps->cur[0].cnp_rx_pkts += pkts;
187*acd884deSSumit Saxena bytes = bnxt_re_stat_diff(tmp_counters[0].cnp_rx_bytes,
188*acd884deSSumit Saxena &cnps->prev[0].cnp_rx_bytes,
189*acd884deSSumit Saxena byte_mask);
190*acd884deSSumit Saxena cnps->cur[0].cnp_rx_bytes += bytes;
191*acd884deSSumit Saxena
192*acd884deSSumit Saxena /*
193*acd884deSSumit Saxena * Calculate the number of cnp packets and use
194*acd884deSSumit Saxena * the value to calculate the CRC bytes.
195*acd884deSSumit Saxena * Multply pkts with 4 and add it to total bytes
196*acd884deSSumit Saxena */
197*acd884deSSumit Saxena pkts = bnxt_re_stat_diff(tmp_counters[1].cnp_tx_pkts,
198*acd884deSSumit Saxena &cnps->prev[1].cnp_tx_pkts,
199*acd884deSSumit Saxena pkts_mask);
200*acd884deSSumit Saxena cnps->cur[1].cnp_tx_pkts += pkts;
201*acd884deSSumit Saxena diff = bnxt_re_stat_diff(tmp_counters[1].cnp_tx_bytes,
202*acd884deSSumit Saxena &cnps->prev[1].cnp_tx_bytes,
203*acd884deSSumit Saxena byte_mask);
204*acd884deSSumit Saxena cnps->cur[1].cnp_tx_bytes += diff + pkts * 4;
205*acd884deSSumit Saxena pkts = bnxt_re_stat_diff(tmp_counters[1].cnp_rx_pkts,
206*acd884deSSumit Saxena &cnps->prev[1].cnp_rx_pkts,
207*acd884deSSumit Saxena pkts_mask);
208*acd884deSSumit Saxena cnps->cur[1].cnp_rx_pkts += pkts;
209*acd884deSSumit Saxena bytes = bnxt_re_stat_diff(tmp_counters[1].cnp_rx_bytes,
210*acd884deSSumit Saxena &cnps->prev[1].cnp_rx_bytes,
211*acd884deSSumit Saxena byte_mask);
212*acd884deSSumit Saxena cnps->cur[1].cnp_rx_bytes += bytes;
213*acd884deSSumit Saxena
214*acd884deSSumit Saxena pkts = bnxt_re_stat_diff(roce_only_tmp[0].tx_pkts,
215*acd884deSSumit Saxena &dstat->prev[0].tx_pkts,
216*acd884deSSumit Saxena pkts_mask);
217*acd884deSSumit Saxena dstat->cur[0].tx_pkts += pkts;
218*acd884deSSumit Saxena diff = bnxt_re_stat_diff(roce_only_tmp[0].tx_bytes,
219*acd884deSSumit Saxena &dstat->prev[0].tx_bytes,
220*acd884deSSumit Saxena byte_mask);
221*acd884deSSumit Saxena dstat->cur[0].tx_bytes += diff + pkts * 4;
222*acd884deSSumit Saxena pkts = bnxt_re_stat_diff(roce_only_tmp[0].rx_pkts,
223*acd884deSSumit Saxena &dstat->prev[0].rx_pkts,
224*acd884deSSumit Saxena pkts_mask);
225*acd884deSSumit Saxena dstat->cur[0].rx_pkts += pkts;
226*acd884deSSumit Saxena
227*acd884deSSumit Saxena bytes = bnxt_re_stat_diff(roce_only_tmp[0].rx_bytes,
228*acd884deSSumit Saxena &dstat->prev[0].rx_bytes,
229*acd884deSSumit Saxena byte_mask);
230*acd884deSSumit Saxena dstat->cur[0].rx_bytes += bytes;
231*acd884deSSumit Saxena pkts = bnxt_re_stat_diff(roce_only_tmp[1].tx_pkts,
232*acd884deSSumit Saxena &dstat->prev[1].tx_pkts,
233*acd884deSSumit Saxena pkts_mask);
234*acd884deSSumit Saxena dstat->cur[1].tx_pkts += pkts;
235*acd884deSSumit Saxena diff = bnxt_re_stat_diff(roce_only_tmp[1].tx_bytes,
236*acd884deSSumit Saxena &dstat->prev[1].tx_bytes,
237*acd884deSSumit Saxena byte_mask);
238*acd884deSSumit Saxena dstat->cur[1].tx_bytes += diff + pkts * 4;
239*acd884deSSumit Saxena pkts = bnxt_re_stat_diff(roce_only_tmp[1].rx_pkts,
240*acd884deSSumit Saxena &dstat->prev[1].rx_pkts,
241*acd884deSSumit Saxena pkts_mask);
242*acd884deSSumit Saxena dstat->cur[1].rx_pkts += pkts;
243*acd884deSSumit Saxena bytes = bnxt_re_stat_diff(roce_only_tmp[1].rx_bytes,
244*acd884deSSumit Saxena &dstat->prev[1].rx_bytes,
245*acd884deSSumit Saxena byte_mask);
246*acd884deSSumit Saxena dstat->cur[1].rx_bytes += bytes;
247*acd884deSSumit Saxena }
248*acd884deSSumit Saxena done:
249*acd884deSSumit Saxena return rc;
250*acd884deSSumit Saxena }
251*acd884deSSumit Saxena
bnxt_re_copy_ext_stats(struct bnxt_re_dev * rdev,u8 indx,struct bnxt_qplib_ext_stat * s)252*acd884deSSumit Saxena static void bnxt_re_copy_ext_stats(struct bnxt_re_dev *rdev,
253*acd884deSSumit Saxena u8 indx, struct bnxt_qplib_ext_stat *s)
254*acd884deSSumit Saxena {
255*acd884deSSumit Saxena struct bnxt_re_ext_roce_stats *e_errs;
256*acd884deSSumit Saxena struct bnxt_re_cnp_counters *cnp;
257*acd884deSSumit Saxena struct bnxt_re_ext_rstat *ext_d;
258*acd884deSSumit Saxena struct bnxt_re_ro_counters *ro;
259*acd884deSSumit Saxena
260*acd884deSSumit Saxena cnp = &rdev->stats.cnps.cur[indx];
261*acd884deSSumit Saxena ro = &rdev->stats.dstat.cur[indx];
262*acd884deSSumit Saxena ext_d = &rdev->stats.dstat.ext_rstat[indx];
263*acd884deSSumit Saxena e_errs = &rdev->stats.dstat.e_errs;
264*acd884deSSumit Saxena
265*acd884deSSumit Saxena cnp->cnp_tx_pkts = s->tx_cnp;
266*acd884deSSumit Saxena cnp->cnp_rx_pkts = s->rx_cnp;
267*acd884deSSumit Saxena /* In bonding mode do not duplicate other stats */
268*acd884deSSumit Saxena if (indx)
269*acd884deSSumit Saxena return;
270*acd884deSSumit Saxena cnp->ecn_marked = s->rx_ecn_marked;
271*acd884deSSumit Saxena
272*acd884deSSumit Saxena ro->tx_pkts = s->tx_roce_pkts;
273*acd884deSSumit Saxena ro->tx_bytes = s->tx_roce_bytes;
274*acd884deSSumit Saxena ro->rx_pkts = s->rx_roce_pkts;
275*acd884deSSumit Saxena ro->rx_bytes = s->rx_roce_bytes;
276*acd884deSSumit Saxena
277*acd884deSSumit Saxena ext_d->tx.atomic_req = s->tx_atomic_req;
278*acd884deSSumit Saxena ext_d->tx.read_req = s->tx_read_req;
279*acd884deSSumit Saxena ext_d->tx.read_resp = s->tx_read_res;
280*acd884deSSumit Saxena ext_d->tx.write_req = s->tx_write_req;
281*acd884deSSumit Saxena ext_d->tx.send_req = s->tx_send_req;
282*acd884deSSumit Saxena ext_d->rx.atomic_req = s->rx_atomic_req;
283*acd884deSSumit Saxena ext_d->rx.read_req = s->rx_read_req;
284*acd884deSSumit Saxena ext_d->rx.read_resp = s->rx_read_res;
285*acd884deSSumit Saxena ext_d->rx.write_req = s->rx_write_req;
286*acd884deSSumit Saxena ext_d->rx.send_req = s->rx_send_req;
287*acd884deSSumit Saxena ext_d->grx.rx_pkts = s->rx_roce_good_pkts;
288*acd884deSSumit Saxena ext_d->grx.rx_bytes = s->rx_roce_good_bytes;
289*acd884deSSumit Saxena ext_d->rx_dcn_payload_cut = s->rx_dcn_payload_cut;
290*acd884deSSumit Saxena ext_d->te_bypassed = s->te_bypassed;
291*acd884deSSumit Saxena e_errs->oob = s->rx_out_of_buffer;
292*acd884deSSumit Saxena e_errs->oos = s->rx_out_of_sequence;
293*acd884deSSumit Saxena e_errs->seq_err_naks_rcvd = s->seq_err_naks_rcvd;
294*acd884deSSumit Saxena e_errs->rnr_naks_rcvd = s->rnr_naks_rcvd;
295*acd884deSSumit Saxena e_errs->missing_resp = s->missing_resp;
296*acd884deSSumit Saxena e_errs->to_retransmits = s->to_retransmits;
297*acd884deSSumit Saxena e_errs->dup_req = s->dup_req;
298*acd884deSSumit Saxena }
299*acd884deSSumit Saxena
bnxt_re_get_ext_stat(struct bnxt_re_dev * rdev)300*acd884deSSumit Saxena static int bnxt_re_get_ext_stat(struct bnxt_re_dev *rdev)
301*acd884deSSumit Saxena {
302*acd884deSSumit Saxena struct bnxt_qplib_ext_stat estat[2] = {{}, {}};
303*acd884deSSumit Saxena struct bnxt_qplib_query_stats_info sinfo;
304*acd884deSSumit Saxena u32 fid;
305*acd884deSSumit Saxena int rc;
306*acd884deSSumit Saxena
307*acd884deSSumit Saxena fid = PCI_FUNC(rdev->en_dev->pdev->devfn);
308*acd884deSSumit Saxena /* Set default values for sinfo */
309*acd884deSSumit Saxena sinfo.function_id = 0xFFFFFFFF;
310*acd884deSSumit Saxena sinfo.collection_id = 0xFF;
311*acd884deSSumit Saxena sinfo.vf_valid = false;
312*acd884deSSumit Saxena rc = bnxt_qplib_qext_stat(&rdev->rcfw, fid, &estat[0], &sinfo);
313*acd884deSSumit Saxena if (rc)
314*acd884deSSumit Saxena goto done;
315*acd884deSSumit Saxena bnxt_re_copy_ext_stats(rdev, 0, &estat[0]);
316*acd884deSSumit Saxena
317*acd884deSSumit Saxena done:
318*acd884deSSumit Saxena return rc;
319*acd884deSSumit Saxena }
320*acd884deSSumit Saxena
bnxt_re_copy_rstat(struct bnxt_re_rdata_counters * d,struct ctx_hw_stats_ext * s,bool is_thor)321*acd884deSSumit Saxena static void bnxt_re_copy_rstat(struct bnxt_re_rdata_counters *d,
322*acd884deSSumit Saxena struct ctx_hw_stats_ext *s,
323*acd884deSSumit Saxena bool is_thor)
324*acd884deSSumit Saxena {
325*acd884deSSumit Saxena d->tx_ucast_pkts = le64_to_cpu(s->tx_ucast_pkts);
326*acd884deSSumit Saxena d->tx_mcast_pkts = le64_to_cpu(s->tx_mcast_pkts);
327*acd884deSSumit Saxena d->tx_bcast_pkts = le64_to_cpu(s->tx_bcast_pkts);
328*acd884deSSumit Saxena d->tx_discard_pkts = le64_to_cpu(s->tx_discard_pkts);
329*acd884deSSumit Saxena d->tx_error_pkts = le64_to_cpu(s->tx_error_pkts);
330*acd884deSSumit Saxena d->tx_ucast_bytes = le64_to_cpu(s->tx_ucast_bytes);
331*acd884deSSumit Saxena /* Add four bytes of CRC bytes per packet */
332*acd884deSSumit Saxena d->tx_ucast_bytes += d->tx_ucast_pkts * 4;
333*acd884deSSumit Saxena d->tx_mcast_bytes = le64_to_cpu(s->tx_mcast_bytes);
334*acd884deSSumit Saxena d->tx_bcast_bytes = le64_to_cpu(s->tx_bcast_bytes);
335*acd884deSSumit Saxena d->rx_ucast_pkts = le64_to_cpu(s->rx_ucast_pkts);
336*acd884deSSumit Saxena d->rx_mcast_pkts = le64_to_cpu(s->rx_mcast_pkts);
337*acd884deSSumit Saxena d->rx_bcast_pkts = le64_to_cpu(s->rx_bcast_pkts);
338*acd884deSSumit Saxena d->rx_discard_pkts = le64_to_cpu(s->rx_discard_pkts);
339*acd884deSSumit Saxena d->rx_error_pkts = le64_to_cpu(s->rx_error_pkts);
340*acd884deSSumit Saxena d->rx_ucast_bytes = le64_to_cpu(s->rx_ucast_bytes);
341*acd884deSSumit Saxena d->rx_mcast_bytes = le64_to_cpu(s->rx_mcast_bytes);
342*acd884deSSumit Saxena d->rx_bcast_bytes = le64_to_cpu(s->rx_bcast_bytes);
343*acd884deSSumit Saxena if (is_thor) {
344*acd884deSSumit Saxena d->rx_agg_pkts = le64_to_cpu(s->rx_tpa_pkt);
345*acd884deSSumit Saxena d->rx_agg_bytes = le64_to_cpu(s->rx_tpa_bytes);
346*acd884deSSumit Saxena d->rx_agg_events = le64_to_cpu(s->rx_tpa_events);
347*acd884deSSumit Saxena d->rx_agg_aborts = le64_to_cpu(s->rx_tpa_errors);
348*acd884deSSumit Saxena }
349*acd884deSSumit Saxena }
350*acd884deSSumit Saxena
bnxt_re_get_roce_data_stats(struct bnxt_re_dev * rdev)351*acd884deSSumit Saxena static void bnxt_re_get_roce_data_stats(struct bnxt_re_dev *rdev)
352*acd884deSSumit Saxena {
353*acd884deSSumit Saxena bool is_thor = _is_chip_gen_p5_p7(rdev->chip_ctx);
354*acd884deSSumit Saxena struct bnxt_re_rdata_counters *rstat;
355*acd884deSSumit Saxena
356*acd884deSSumit Saxena rstat = &rdev->stats.dstat.rstat[0];
357*acd884deSSumit Saxena bnxt_re_copy_rstat(rstat, rdev->qplib_res.hctx->stats.dma, is_thor);
358*acd884deSSumit Saxena
359*acd884deSSumit Saxena }
360*acd884deSSumit Saxena
bnxt_re_get_device_stats(struct bnxt_re_dev * rdev)361*acd884deSSumit Saxena int bnxt_re_get_device_stats(struct bnxt_re_dev *rdev)
362*acd884deSSumit Saxena {
363*acd884deSSumit Saxena struct bnxt_qplib_query_stats_info sinfo;
364*acd884deSSumit Saxena int rc = 0;
365*acd884deSSumit Saxena
366*acd884deSSumit Saxena /* Stats are in 1s cadence */
367*acd884deSSumit Saxena if (test_bit(BNXT_RE_FLAG_ISSUE_CFA_FLOW_STATS, &rdev->flags)) {
368*acd884deSSumit Saxena if (bnxt_ext_stats_supported(rdev->chip_ctx, rdev->dev_attr->dev_cap_flags,
369*acd884deSSumit Saxena rdev->is_virtfn))
370*acd884deSSumit Saxena rc = bnxt_re_get_ext_stat(rdev);
371*acd884deSSumit Saxena else
372*acd884deSSumit Saxena rc = bnxt_re_get_qos_stats(rdev);
373*acd884deSSumit Saxena
374*acd884deSSumit Saxena if (rc && rc != -ENOMEM)
375*acd884deSSumit Saxena clear_bit(BNXT_RE_FLAG_ISSUE_CFA_FLOW_STATS,
376*acd884deSSumit Saxena &rdev->flags);
377*acd884deSSumit Saxena }
378*acd884deSSumit Saxena
379*acd884deSSumit Saxena if (test_bit(BNXT_RE_FLAG_ISSUE_ROCE_STATS, &rdev->flags)) {
380*acd884deSSumit Saxena bnxt_re_get_roce_data_stats(rdev);
381*acd884deSSumit Saxena
382*acd884deSSumit Saxena /* Set default values for sinfo */
383*acd884deSSumit Saxena sinfo.function_id = 0xFFFFFFFF;
384*acd884deSSumit Saxena sinfo.collection_id = 0xFF;
385*acd884deSSumit Saxena sinfo.vf_valid = false;
386*acd884deSSumit Saxena rc = bnxt_qplib_get_roce_error_stats(&rdev->rcfw,
387*acd884deSSumit Saxena &rdev->stats.dstat.errs,
388*acd884deSSumit Saxena &sinfo);
389*acd884deSSumit Saxena if (rc && rc != -ENOMEM)
390*acd884deSSumit Saxena clear_bit(BNXT_RE_FLAG_ISSUE_ROCE_STATS,
391*acd884deSSumit Saxena &rdev->flags);
392*acd884deSSumit Saxena }
393*acd884deSSumit Saxena
394*acd884deSSumit Saxena return rc;
395*acd884deSSumit Saxena }
396*acd884deSSumit Saxena
397*acd884deSSumit Saxena static const char * const bnxt_re_stat_descs[] = {
398*acd884deSSumit Saxena "link_state",
399*acd884deSSumit Saxena "max_qp",
400*acd884deSSumit Saxena "max_srq",
401*acd884deSSumit Saxena "max_cq",
402*acd884deSSumit Saxena "max_mr",
403*acd884deSSumit Saxena "max_mw",
404*acd884deSSumit Saxena "max_ah",
405*acd884deSSumit Saxena "max_pd",
406*acd884deSSumit Saxena "active_qp",
407*acd884deSSumit Saxena "active_rc_qp",
408*acd884deSSumit Saxena "active_ud_qp",
409*acd884deSSumit Saxena "active_srq",
410*acd884deSSumit Saxena "active_cq",
411*acd884deSSumit Saxena "active_mr",
412*acd884deSSumit Saxena "active_mw",
413*acd884deSSumit Saxena "active_ah",
414*acd884deSSumit Saxena "active_pd",
415*acd884deSSumit Saxena "qp_watermark",
416*acd884deSSumit Saxena "rc_qp_watermark",
417*acd884deSSumit Saxena "ud_qp_watermark",
418*acd884deSSumit Saxena "srq_watermark",
419*acd884deSSumit Saxena "cq_watermark",
420*acd884deSSumit Saxena "mr_watermark",
421*acd884deSSumit Saxena "mw_watermark",
422*acd884deSSumit Saxena "ah_watermark",
423*acd884deSSumit Saxena "pd_watermark",
424*acd884deSSumit Saxena "resize_cq_count",
425*acd884deSSumit Saxena "hw_retransmission",
426*acd884deSSumit Saxena "recoverable_errors",
427*acd884deSSumit Saxena "rx_pkts",
428*acd884deSSumit Saxena "rx_bytes",
429*acd884deSSumit Saxena "tx_pkts",
430*acd884deSSumit Saxena "tx_bytes",
431*acd884deSSumit Saxena "cnp_tx_pkts",
432*acd884deSSumit Saxena "cnp_tx_bytes",
433*acd884deSSumit Saxena "cnp_rx_pkts",
434*acd884deSSumit Saxena "cnp_rx_bytes",
435*acd884deSSumit Saxena "roce_only_rx_pkts",
436*acd884deSSumit Saxena "roce_only_rx_bytes",
437*acd884deSSumit Saxena "roce_only_tx_pkts",
438*acd884deSSumit Saxena "roce_only_tx_bytes",
439*acd884deSSumit Saxena "rx_roce_error_pkts",
440*acd884deSSumit Saxena "rx_roce_discard_pkts",
441*acd884deSSumit Saxena "tx_roce_error_pkts",
442*acd884deSSumit Saxena "tx_roce_discards_pkts",
443*acd884deSSumit Saxena "res_oob_drop_count",
444*acd884deSSumit Saxena "tx_atomic_req",
445*acd884deSSumit Saxena "rx_atomic_req",
446*acd884deSSumit Saxena "tx_read_req",
447*acd884deSSumit Saxena "tx_read_resp",
448*acd884deSSumit Saxena "rx_read_req",
449*acd884deSSumit Saxena "rx_read_resp",
450*acd884deSSumit Saxena "tx_write_req",
451*acd884deSSumit Saxena "rx_write_req",
452*acd884deSSumit Saxena "tx_send_req",
453*acd884deSSumit Saxena "rx_send_req",
454*acd884deSSumit Saxena "rx_good_pkts",
455*acd884deSSumit Saxena "rx_good_bytes",
456*acd884deSSumit Saxena "rx_dcn_payload_cut",
457*acd884deSSumit Saxena "te_bypassed",
458*acd884deSSumit Saxena "rx_ecn_marked_pkts",
459*acd884deSSumit Saxena "max_retry_exceeded",
460*acd884deSSumit Saxena "to_retransmits",
461*acd884deSSumit Saxena "seq_err_naks_rcvd",
462*acd884deSSumit Saxena "rnr_naks_rcvd",
463*acd884deSSumit Saxena "missing_resp",
464*acd884deSSumit Saxena "dup_reqs",
465*acd884deSSumit Saxena "unrecoverable_err",
466*acd884deSSumit Saxena "bad_resp_err",
467*acd884deSSumit Saxena "local_qp_op_err",
468*acd884deSSumit Saxena "local_protection_err",
469*acd884deSSumit Saxena "mem_mgmt_op_err",
470*acd884deSSumit Saxena "remote_invalid_req_err",
471*acd884deSSumit Saxena "remote_access_err",
472*acd884deSSumit Saxena "remote_op_err",
473*acd884deSSumit Saxena "res_exceed_max",
474*acd884deSSumit Saxena "res_length_mismatch",
475*acd884deSSumit Saxena "res_exceeds_wqe",
476*acd884deSSumit Saxena "res_opcode_err",
477*acd884deSSumit Saxena "res_rx_invalid_rkey",
478*acd884deSSumit Saxena "res_rx_domain_err",
479*acd884deSSumit Saxena "res_rx_no_perm",
480*acd884deSSumit Saxena "res_rx_range_err",
481*acd884deSSumit Saxena "res_tx_invalid_rkey",
482*acd884deSSumit Saxena "res_tx_domain_err",
483*acd884deSSumit Saxena "res_tx_no_perm",
484*acd884deSSumit Saxena "res_tx_range_err",
485*acd884deSSumit Saxena "res_irrq_oflow",
486*acd884deSSumit Saxena "res_unsup_opcode",
487*acd884deSSumit Saxena "res_unaligned_atomic",
488*acd884deSSumit Saxena "res_rem_inv_err",
489*acd884deSSumit Saxena "res_mem_error64",
490*acd884deSSumit Saxena "res_srq_err",
491*acd884deSSumit Saxena "res_cmp_err",
492*acd884deSSumit Saxena "res_invalid_dup_rkey",
493*acd884deSSumit Saxena "res_wqe_format_err",
494*acd884deSSumit Saxena "res_cq_load_err",
495*acd884deSSumit Saxena "res_srq_load_err",
496*acd884deSSumit Saxena "res_tx_pci_err",
497*acd884deSSumit Saxena "res_rx_pci_err",
498*acd884deSSumit Saxena "res_oos_drop_count",
499*acd884deSSumit Saxena "num_irq_started",
500*acd884deSSumit Saxena "num_irq_stopped",
501*acd884deSSumit Saxena "poll_in_intr_en",
502*acd884deSSumit Saxena "poll_in_intr_dis",
503*acd884deSSumit Saxena "cmdq_full_dbg_cnt",
504*acd884deSSumit Saxena "fw_service_prof_type_sup",
505*acd884deSSumit Saxena "dbq_int_recv",
506*acd884deSSumit Saxena "dbq_int_en",
507*acd884deSSumit Saxena "dbq_pacing_resched",
508*acd884deSSumit Saxena "dbq_pacing_complete",
509*acd884deSSumit Saxena "dbq_pacing_alerts",
510*acd884deSSumit Saxena "dbq_dbr_fifo_reg"
511*acd884deSSumit Saxena
512*acd884deSSumit Saxena };
513*acd884deSSumit Saxena
bnxt_re_print_ext_stat(struct bnxt_re_dev * rdev,struct rdma_hw_stats * stats)514*acd884deSSumit Saxena static void bnxt_re_print_ext_stat(struct bnxt_re_dev *rdev,
515*acd884deSSumit Saxena struct rdma_hw_stats *stats)
516*acd884deSSumit Saxena {
517*acd884deSSumit Saxena struct bnxt_re_cnp_counters *cnp;
518*acd884deSSumit Saxena struct bnxt_re_ext_rstat *ext_s;
519*acd884deSSumit Saxena
520*acd884deSSumit Saxena ext_s = &rdev->stats.dstat.ext_rstat[0];
521*acd884deSSumit Saxena cnp = &rdev->stats.cnps.cur[0];
522*acd884deSSumit Saxena
523*acd884deSSumit Saxena stats->value[BNXT_RE_TX_ATOMIC_REQ] = ext_s->tx.atomic_req;
524*acd884deSSumit Saxena stats->value[BNXT_RE_RX_ATOMIC_REQ] = ext_s->rx.atomic_req;
525*acd884deSSumit Saxena stats->value[BNXT_RE_TX_READ_REQ] = ext_s->tx.read_req;
526*acd884deSSumit Saxena stats->value[BNXT_RE_TX_READ_RESP] = ext_s->tx.read_resp;
527*acd884deSSumit Saxena stats->value[BNXT_RE_RX_READ_REQ] = ext_s->rx.read_req;
528*acd884deSSumit Saxena stats->value[BNXT_RE_RX_READ_RESP] = ext_s->rx.read_resp;
529*acd884deSSumit Saxena stats->value[BNXT_RE_TX_WRITE_REQ] = ext_s->tx.write_req;
530*acd884deSSumit Saxena stats->value[BNXT_RE_RX_WRITE_REQ] = ext_s->rx.write_req;
531*acd884deSSumit Saxena stats->value[BNXT_RE_TX_SEND_REQ] = ext_s->tx.send_req;
532*acd884deSSumit Saxena stats->value[BNXT_RE_RX_SEND_REQ] = ext_s->rx.send_req;
533*acd884deSSumit Saxena stats->value[BNXT_RE_RX_GOOD_PKTS] = ext_s->grx.rx_pkts;
534*acd884deSSumit Saxena stats->value[BNXT_RE_RX_GOOD_BYTES] = ext_s->grx.rx_bytes;
535*acd884deSSumit Saxena if (_is_chip_p7(rdev->chip_ctx)) {
536*acd884deSSumit Saxena stats->value[BNXT_RE_RX_DCN_PAYLOAD_CUT] = ext_s->rx_dcn_payload_cut;
537*acd884deSSumit Saxena stats->value[BNXT_RE_TE_BYPASSED] = ext_s->te_bypassed;
538*acd884deSSumit Saxena }
539*acd884deSSumit Saxena stats->value[BNXT_RE_RX_ECN_MARKED_PKTS] = cnp->ecn_marked;
540*acd884deSSumit Saxena }
541*acd884deSSumit Saxena
bnxt_re_print_roce_only_counters(struct bnxt_re_dev * rdev,struct rdma_hw_stats * stats)542*acd884deSSumit Saxena static void bnxt_re_print_roce_only_counters(struct bnxt_re_dev *rdev,
543*acd884deSSumit Saxena struct rdma_hw_stats *stats)
544*acd884deSSumit Saxena {
545*acd884deSSumit Saxena struct bnxt_re_ro_counters *roce_only = &rdev->stats.dstat.cur[0];
546*acd884deSSumit Saxena
547*acd884deSSumit Saxena stats->value[BNXT_RE_ROCE_ONLY_RX_PKTS] = roce_only->rx_pkts;
548*acd884deSSumit Saxena stats->value[BNXT_RE_ROCE_ONLY_RX_BYTES] = roce_only->rx_bytes;
549*acd884deSSumit Saxena stats->value[BNXT_RE_ROCE_ONLY_TX_PKTS] = roce_only->tx_pkts;
550*acd884deSSumit Saxena stats->value[BNXT_RE_ROCE_ONLY_TX_BYTES] = roce_only->tx_bytes;
551*acd884deSSumit Saxena }
552*acd884deSSumit Saxena
bnxt_re_print_normal_total_counters(struct bnxt_re_dev * rdev,struct rdma_hw_stats * stats)553*acd884deSSumit Saxena static void bnxt_re_print_normal_total_counters(struct bnxt_re_dev *rdev,
554*acd884deSSumit Saxena struct rdma_hw_stats *stats)
555*acd884deSSumit Saxena {
556*acd884deSSumit Saxena struct bnxt_re_ro_counters *roce_only;
557*acd884deSSumit Saxena struct bnxt_re_cc_stat *cnps;
558*acd884deSSumit Saxena
559*acd884deSSumit Saxena cnps = &rdev->stats.cnps;
560*acd884deSSumit Saxena roce_only = &rdev->stats.dstat.cur[0];
561*acd884deSSumit Saxena
562*acd884deSSumit Saxena stats->value[BNXT_RE_RX_PKTS] = cnps->cur[0].cnp_rx_pkts + roce_only->rx_pkts;
563*acd884deSSumit Saxena stats->value[BNXT_RE_RX_BYTES] = cnps->cur[0].cnp_rx_bytes + roce_only->rx_bytes;
564*acd884deSSumit Saxena stats->value[BNXT_RE_TX_PKTS] = cnps->cur[0].cnp_tx_pkts + roce_only->tx_pkts;
565*acd884deSSumit Saxena stats->value[BNXT_RE_TX_BYTES] = cnps->cur[0].cnp_tx_bytes + roce_only->tx_bytes;
566*acd884deSSumit Saxena }
567*acd884deSSumit Saxena
bnxt_re_print_normal_counters(struct bnxt_re_dev * rdev,struct rdma_hw_stats * rstats)568*acd884deSSumit Saxena static void bnxt_re_print_normal_counters(struct bnxt_re_dev *rdev,
569*acd884deSSumit Saxena struct rdma_hw_stats *rstats)
570*acd884deSSumit Saxena {
571*acd884deSSumit Saxena struct bnxt_re_rdata_counters *stats;
572*acd884deSSumit Saxena struct bnxt_re_cc_stat *cnps;
573*acd884deSSumit Saxena bool en_disp;
574*acd884deSSumit Saxena
575*acd884deSSumit Saxena stats = &rdev->stats.dstat.rstat[0];
576*acd884deSSumit Saxena cnps = &rdev->stats.cnps;
577*acd884deSSumit Saxena en_disp = !_is_chip_gen_p5_p7(rdev->chip_ctx);
578*acd884deSSumit Saxena
579*acd884deSSumit Saxena bnxt_re_print_normal_total_counters(rdev, rstats);
580*acd884deSSumit Saxena if (!rdev->is_virtfn) {
581*acd884deSSumit Saxena rstats->value[BNXT_RE_CNP_TX_PKTS] = cnps->cur[0].cnp_tx_pkts;
582*acd884deSSumit Saxena if (en_disp)
583*acd884deSSumit Saxena rstats->value[BNXT_RE_CNP_TX_BYTES] = cnps->cur[0].cnp_tx_bytes;
584*acd884deSSumit Saxena rstats->value[BNXT_RE_CNP_RX_PKTS] = cnps->cur[0].cnp_rx_pkts;
585*acd884deSSumit Saxena if (en_disp)
586*acd884deSSumit Saxena rstats->value[BNXT_RE_CNP_RX_BYTES] = cnps->cur[0].cnp_rx_bytes;
587*acd884deSSumit Saxena }
588*acd884deSSumit Saxena /* Print RoCE only bytes.. CNP counters include RoCE packets also */
589*acd884deSSumit Saxena bnxt_re_print_roce_only_counters(rdev, rstats);
590*acd884deSSumit Saxena
591*acd884deSSumit Saxena rstats->value[BNXT_RE_RX_ROCE_ERROR_PKTS] = stats ? stats->rx_error_pkts : 0;
592*acd884deSSumit Saxena rstats->value[BNXT_RE_RX_ROCE_DISCARD_PKTS] = stats ? stats->rx_discard_pkts : 0;
593*acd884deSSumit Saxena if (!en_disp) {
594*acd884deSSumit Saxena rstats->value[BNXT_RE_TX_ROCE_ERROR_PKTS] = stats ? stats->tx_error_pkts : 0;
595*acd884deSSumit Saxena rstats->value[BNXT_RE_TX_ROCE_DISCARDS_PKTS] = stats ? stats->tx_discard_pkts : 0;
596*acd884deSSumit Saxena }
597*acd884deSSumit Saxena
598*acd884deSSumit Saxena if (bnxt_ext_stats_supported(rdev->chip_ctx, rdev->dev_attr->dev_cap_flags,
599*acd884deSSumit Saxena rdev->is_virtfn)) {
600*acd884deSSumit Saxena rstats->value[BNXT_RE_RES_OOB_DROP_COUNT] = rdev->stats.dstat.e_errs.oob;
601*acd884deSSumit Saxena bnxt_re_print_ext_stat(rdev, rstats);
602*acd884deSSumit Saxena }
603*acd884deSSumit Saxena }
604*acd884deSSumit Saxena
bnxt_re_copy_db_pacing_stats(struct bnxt_re_dev * rdev,struct rdma_hw_stats * stats)605*acd884deSSumit Saxena static void bnxt_re_copy_db_pacing_stats(struct bnxt_re_dev *rdev,
606*acd884deSSumit Saxena struct rdma_hw_stats *stats)
607*acd884deSSumit Saxena {
608*acd884deSSumit Saxena struct bnxt_re_dbr_sw_stats *dbr_sw_stats = rdev->dbr_sw_stats;
609*acd884deSSumit Saxena
610*acd884deSSumit Saxena stats->value[BNXT_RE_DBQ_PACING_RESCHED] = dbr_sw_stats->dbq_pacing_resched;
611*acd884deSSumit Saxena stats->value[BNXT_RE_DBQ_PACING_CMPL] = dbr_sw_stats->dbq_pacing_complete;
612*acd884deSSumit Saxena stats->value[BNXT_RE_DBQ_PACING_ALERT] = dbr_sw_stats->dbq_pacing_alerts;
613*acd884deSSumit Saxena stats->value[BNXT_RE_DBQ_DBR_FIFO_REG] = readl_fbsd(rdev->en_dev->softc,
614*acd884deSSumit Saxena rdev->dbr_db_fifo_reg_off, 0);
615*acd884deSSumit Saxena }
616*acd884deSSumit Saxena
bnxt_re_get_hw_stats(struct ib_device * ibdev,struct rdma_hw_stats * stats,u8 port,int index)617*acd884deSSumit Saxena int bnxt_re_get_hw_stats(struct ib_device *ibdev,
618*acd884deSSumit Saxena struct rdma_hw_stats *stats,
619*acd884deSSumit Saxena u8 port, int index)
620*acd884deSSumit Saxena {
621*acd884deSSumit Saxena struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
622*acd884deSSumit Saxena struct bnxt_re_ext_roce_stats *e_errs;
623*acd884deSSumit Saxena struct bnxt_re_rdata_counters *rstat;
624*acd884deSSumit Saxena struct bnxt_qplib_roce_stats *errs;
625*acd884deSSumit Saxena unsigned long tstamp_diff;
626*acd884deSSumit Saxena struct pci_dev *pdev;
627*acd884deSSumit Saxena int sched_msec;
628*acd884deSSumit Saxena int rc = 0;
629*acd884deSSumit Saxena
630*acd884deSSumit Saxena if (!port || !stats)
631*acd884deSSumit Saxena return -EINVAL;
632*acd884deSSumit Saxena
633*acd884deSSumit Saxena if (!rdev)
634*acd884deSSumit Saxena return -ENODEV;
635*acd884deSSumit Saxena
636*acd884deSSumit Saxena if (!__bnxt_re_is_rdev_valid(rdev)) {
637*acd884deSSumit Saxena return -ENODEV;
638*acd884deSSumit Saxena }
639*acd884deSSumit Saxena
640*acd884deSSumit Saxena pdev = rdev->en_dev->pdev;
641*acd884deSSumit Saxena errs = &rdev->stats.dstat.errs;
642*acd884deSSumit Saxena rstat = &rdev->stats.dstat.rstat[0];
643*acd884deSSumit Saxena e_errs = &rdev->stats.dstat.e_errs;
644*acd884deSSumit Saxena #define BNXT_RE_STATS_CTX_UPDATE_TIMER 250
645*acd884deSSumit Saxena sched_msec = BNXT_RE_STATS_CTX_UPDATE_TIMER;
646*acd884deSSumit Saxena tstamp_diff = jiffies - rdev->stats.read_tstamp;
647*acd884deSSumit Saxena if (test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags)) {
648*acd884deSSumit Saxena if (/* restrict_stats && */ tstamp_diff < msecs_to_jiffies(sched_msec))
649*acd884deSSumit Saxena goto skip_query;
650*acd884deSSumit Saxena rc = bnxt_re_get_device_stats(rdev);
651*acd884deSSumit Saxena if (rc)
652*acd884deSSumit Saxena dev_err(rdev_to_dev(rdev),
653*acd884deSSumit Saxena "Failed to query device stats\n");
654*acd884deSSumit Saxena rdev->stats.read_tstamp = jiffies;
655*acd884deSSumit Saxena }
656*acd884deSSumit Saxena
657*acd884deSSumit Saxena if (rdev->dbr_pacing)
658*acd884deSSumit Saxena bnxt_re_copy_db_pacing_stats(rdev, stats);
659*acd884deSSumit Saxena
660*acd884deSSumit Saxena skip_query:
661*acd884deSSumit Saxena
662*acd884deSSumit Saxena if (rdev->netdev)
663*acd884deSSumit Saxena stats->value[BNXT_RE_LINK_STATE] = bnxt_re_link_state(rdev);
664*acd884deSSumit Saxena stats->value[BNXT_RE_MAX_QP] = rdev->dev_attr->max_qp;
665*acd884deSSumit Saxena stats->value[BNXT_RE_MAX_SRQ] = rdev->dev_attr->max_srq;
666*acd884deSSumit Saxena stats->value[BNXT_RE_MAX_CQ] = rdev->dev_attr->max_cq;
667*acd884deSSumit Saxena stats->value[BNXT_RE_MAX_MR] = rdev->dev_attr->max_mr;
668*acd884deSSumit Saxena stats->value[BNXT_RE_MAX_MW] = rdev->dev_attr->max_mw;
669*acd884deSSumit Saxena stats->value[BNXT_RE_MAX_AH] = rdev->dev_attr->max_ah;
670*acd884deSSumit Saxena stats->value[BNXT_RE_MAX_PD] = rdev->dev_attr->max_pd;
671*acd884deSSumit Saxena stats->value[BNXT_RE_ACTIVE_QP] = atomic_read(&rdev->stats.rsors.qp_count);
672*acd884deSSumit Saxena stats->value[BNXT_RE_ACTIVE_RC_QP] = atomic_read(&rdev->stats.rsors.rc_qp_count);
673*acd884deSSumit Saxena stats->value[BNXT_RE_ACTIVE_UD_QP] = atomic_read(&rdev->stats.rsors.ud_qp_count);
674*acd884deSSumit Saxena stats->value[BNXT_RE_ACTIVE_SRQ] = atomic_read(&rdev->stats.rsors.srq_count);
675*acd884deSSumit Saxena stats->value[BNXT_RE_ACTIVE_CQ] = atomic_read(&rdev->stats.rsors.cq_count);
676*acd884deSSumit Saxena stats->value[BNXT_RE_ACTIVE_MR] = atomic_read(&rdev->stats.rsors.mr_count);
677*acd884deSSumit Saxena stats->value[BNXT_RE_ACTIVE_MW] = atomic_read(&rdev->stats.rsors.mw_count);
678*acd884deSSumit Saxena stats->value[BNXT_RE_ACTIVE_AH] = atomic_read(&rdev->stats.rsors.ah_count);
679*acd884deSSumit Saxena stats->value[BNXT_RE_ACTIVE_PD] = atomic_read(&rdev->stats.rsors.pd_count);
680*acd884deSSumit Saxena stats->value[BNXT_RE_QP_WATERMARK] = atomic_read(&rdev->stats.rsors.max_qp_count);
681*acd884deSSumit Saxena stats->value[BNXT_RE_RC_QP_WATERMARK] = atomic_read(&rdev->stats.rsors.max_rc_qp_count);
682*acd884deSSumit Saxena stats->value[BNXT_RE_UD_QP_WATERMARK] = atomic_read(&rdev->stats.rsors.max_ud_qp_count);
683*acd884deSSumit Saxena stats->value[BNXT_RE_SRQ_WATERMARK] = atomic_read(&rdev->stats.rsors.max_srq_count);
684*acd884deSSumit Saxena stats->value[BNXT_RE_CQ_WATERMARK] = atomic_read(&rdev->stats.rsors.max_cq_count);
685*acd884deSSumit Saxena stats->value[BNXT_RE_MR_WATERMARK] = atomic_read(&rdev->stats.rsors.max_mr_count);
686*acd884deSSumit Saxena stats->value[BNXT_RE_MW_WATERMARK] = atomic_read(&rdev->stats.rsors.max_mw_count);
687*acd884deSSumit Saxena stats->value[BNXT_RE_AH_WATERMARK] = atomic_read(&rdev->stats.rsors.max_ah_count);
688*acd884deSSumit Saxena stats->value[BNXT_RE_PD_WATERMARK] = atomic_read(&rdev->stats.rsors.max_pd_count);
689*acd884deSSumit Saxena stats->value[BNXT_RE_RESIZE_CQ_COUNT] = atomic_read(&rdev->stats.rsors.resize_count);
690*acd884deSSumit Saxena stats->value[BNXT_RE_HW_RETRANSMISSION] = BNXT_RE_HW_RETX(rdev->dev_attr->dev_cap_flags) ? 1 : 0;
691*acd884deSSumit Saxena stats->value[BNXT_RE_RECOVERABLE_ERRORS] = rstat ? rstat->tx_bcast_pkts : 0;
692*acd884deSSumit Saxena
693*acd884deSSumit Saxena bnxt_re_print_normal_counters(rdev, stats);
694*acd884deSSumit Saxena
695*acd884deSSumit Saxena
696*acd884deSSumit Saxena stats->value[BNXT_RE_MAX_RETRY_EXCEEDED] = errs->max_retry_exceeded;
697*acd884deSSumit Saxena if (bnxt_ext_stats_supported(rdev->chip_ctx, rdev->dev_attr->dev_cap_flags,
698*acd884deSSumit Saxena rdev->is_virtfn) &&
699*acd884deSSumit Saxena _is_hw_retx_supported(rdev->dev_attr->dev_cap_flags)) {
700*acd884deSSumit Saxena stats->value[BNXT_RE_TO_RETRANSMITS] = e_errs->to_retransmits;
701*acd884deSSumit Saxena stats->value[BNXT_RE_SEQ_ERR_NAKS_RCVD] = e_errs->seq_err_naks_rcvd;
702*acd884deSSumit Saxena stats->value[BNXT_RE_RNR_NAKS_RCVD] = e_errs->rnr_naks_rcvd;
703*acd884deSSumit Saxena stats->value[BNXT_RE_MISSING_RESP] = e_errs->missing_resp;
704*acd884deSSumit Saxena stats->value[BNXT_RE_DUP_REQS] = e_errs->dup_req;
705*acd884deSSumit Saxena } else {
706*acd884deSSumit Saxena stats->value[BNXT_RE_TO_RETRANSMITS] = errs->to_retransmits;
707*acd884deSSumit Saxena stats->value[BNXT_RE_SEQ_ERR_NAKS_RCVD] = errs->seq_err_naks_rcvd;
708*acd884deSSumit Saxena stats->value[BNXT_RE_RNR_NAKS_RCVD] = errs->rnr_naks_rcvd;
709*acd884deSSumit Saxena stats->value[BNXT_RE_MISSING_RESP] = errs->missing_resp;
710*acd884deSSumit Saxena stats->value[BNXT_RE_DUP_REQS] = errs->dup_req;
711*acd884deSSumit Saxena }
712*acd884deSSumit Saxena
713*acd884deSSumit Saxena stats->value[BNXT_RE_UNRECOVERABLE_ERR] = errs->unrecoverable_err;
714*acd884deSSumit Saxena stats->value[BNXT_RE_BAD_RESP_ERR] = errs->bad_resp_err;
715*acd884deSSumit Saxena stats->value[BNXT_RE_LOCAL_QP_OP_ERR] = errs->local_qp_op_err;
716*acd884deSSumit Saxena stats->value[BNXT_RE_LOCAL_PROTECTION_ERR] = errs->local_protection_err;
717*acd884deSSumit Saxena stats->value[BNXT_RE_MEM_MGMT_OP_ERR] = errs->mem_mgmt_op_err;
718*acd884deSSumit Saxena stats->value[BNXT_RE_REMOTE_INVALID_REQ_ERR] = errs->remote_invalid_req_err;
719*acd884deSSumit Saxena stats->value[BNXT_RE_REMOTE_ACCESS_ERR] = errs->remote_access_err;
720*acd884deSSumit Saxena stats->value[BNXT_RE_REMOTE_OP_ERR] = errs->remote_op_err;
721*acd884deSSumit Saxena stats->value[BNXT_RE_RES_EXCEED_MAX] = errs->res_exceed_max;
722*acd884deSSumit Saxena stats->value[BNXT_RE_RES_LENGTH_MISMATCH] = errs->res_length_mismatch;
723*acd884deSSumit Saxena stats->value[BNXT_RE_RES_EXCEEDS_WQE] = errs->res_exceeds_wqe;
724*acd884deSSumit Saxena stats->value[BNXT_RE_RES_OPCODE_ERR] = errs->res_opcode_err;
725*acd884deSSumit Saxena stats->value[BNXT_RE_RES_RX_INVALID_RKEY] = errs->res_rx_invalid_rkey;
726*acd884deSSumit Saxena stats->value[BNXT_RE_RES_RX_DOMAIN_ERR] = errs->res_rx_domain_err;
727*acd884deSSumit Saxena stats->value[BNXT_RE_RES_RX_NO_PERM] = errs->res_rx_no_perm;
728*acd884deSSumit Saxena stats->value[BNXT_RE_RES_RX_RANGE_ERR] = errs->res_rx_range_err;
729*acd884deSSumit Saxena stats->value[BNXT_RE_RES_TX_INVALID_RKEY] = errs->res_tx_invalid_rkey;
730*acd884deSSumit Saxena stats->value[BNXT_RE_RES_TX_DOMAIN_ERR] = errs->res_tx_domain_err;
731*acd884deSSumit Saxena stats->value[BNXT_RE_RES_TX_NO_PERM] = errs->res_tx_no_perm;
732*acd884deSSumit Saxena stats->value[BNXT_RE_RES_TX_RANGE_ERR] = errs->res_tx_range_err;
733*acd884deSSumit Saxena stats->value[BNXT_RE_RES_IRRQ_OFLOW] = errs->res_irrq_oflow;
734*acd884deSSumit Saxena stats->value[BNXT_RE_RES_UNSUP_OPCODE] = errs->res_unsup_opcode;
735*acd884deSSumit Saxena stats->value[BNXT_RE_RES_UNALIGNED_ATOMIC] = errs->res_unaligned_atomic;
736*acd884deSSumit Saxena stats->value[BNXT_RE_RES_REM_INV_ERR] = errs->res_rem_inv_err;
737*acd884deSSumit Saxena stats->value[BNXT_RE_RES_MEM_ERROR64] = errs->res_mem_error;
738*acd884deSSumit Saxena stats->value[BNXT_RE_RES_SRQ_ERR] = errs->res_srq_err;
739*acd884deSSumit Saxena stats->value[BNXT_RE_RES_CMP_ERR] = errs->res_cmp_err;
740*acd884deSSumit Saxena stats->value[BNXT_RE_RES_INVALID_DUP_RKEY] = errs->res_invalid_dup_rkey;
741*acd884deSSumit Saxena stats->value[BNXT_RE_RES_WQE_FORMAT_ERR] = errs->res_wqe_format_err;
742*acd884deSSumit Saxena stats->value[BNXT_RE_RES_CQ_LOAD_ERR] = errs->res_cq_load_err;
743*acd884deSSumit Saxena stats->value[BNXT_RE_RES_SRQ_LOAD_ERR] = errs->res_srq_load_err;
744*acd884deSSumit Saxena stats->value[BNXT_RE_RES_TX_PCI_ERR] = errs->res_tx_pci_err;
745*acd884deSSumit Saxena stats->value[BNXT_RE_RES_RX_PCI_ERR] = errs->res_rx_pci_err;
746*acd884deSSumit Saxena
747*acd884deSSumit Saxena
748*acd884deSSumit Saxena if (bnxt_ext_stats_supported(rdev->chip_ctx, rdev->dev_attr->dev_cap_flags,
749*acd884deSSumit Saxena rdev->is_virtfn)) {
750*acd884deSSumit Saxena stats->value[BNXT_RE_RES_OOS_DROP_COUNT] = e_errs->oos;
751*acd884deSSumit Saxena } else {
752*acd884deSSumit Saxena /* Display on function 0 as OOS counters are chip-wide */
753*acd884deSSumit Saxena if (PCI_FUNC(pdev->devfn) == 0)
754*acd884deSSumit Saxena stats->value[BNXT_RE_RES_OOS_DROP_COUNT] = errs->res_oos_drop_count;
755*acd884deSSumit Saxena }
756*acd884deSSumit Saxena stats->value[BNXT_RE_NUM_IRQ_STARTED] = rdev->rcfw.num_irq_started;
757*acd884deSSumit Saxena stats->value[BNXT_RE_NUM_IRQ_STOPPED] = rdev->rcfw.num_irq_stopped;
758*acd884deSSumit Saxena stats->value[BNXT_RE_POLL_IN_INTR_EN] = rdev->rcfw.poll_in_intr_en;
759*acd884deSSumit Saxena stats->value[BNXT_RE_POLL_IN_INTR_DIS] = rdev->rcfw.poll_in_intr_dis;
760*acd884deSSumit Saxena stats->value[BNXT_RE_CMDQ_FULL_DBG_CNT] = rdev->rcfw.cmdq_full_dbg;
761*acd884deSSumit Saxena if (!rdev->is_virtfn)
762*acd884deSSumit Saxena stats->value[BNXT_RE_FW_SERVICE_PROF_TYPE_SUP] = is_qport_service_type_supported(rdev);
763*acd884deSSumit Saxena
764*acd884deSSumit Saxena return ARRAY_SIZE(bnxt_re_stat_descs);
765*acd884deSSumit Saxena }
766*acd884deSSumit Saxena
bnxt_re_alloc_hw_port_stats(struct ib_device * ibdev,u8 port_num)767*acd884deSSumit Saxena struct rdma_hw_stats *bnxt_re_alloc_hw_port_stats(struct ib_device *ibdev,
768*acd884deSSumit Saxena u8 port_num)
769*acd884deSSumit Saxena {
770*acd884deSSumit Saxena return rdma_alloc_hw_stats_struct(bnxt_re_stat_descs,
771*acd884deSSumit Saxena ARRAY_SIZE(bnxt_re_stat_descs),
772*acd884deSSumit Saxena RDMA_HW_STATS_DEFAULT_LIFESPAN);
773*acd884deSSumit Saxena }
774