1*7e6ad469SVishal Kulkarni /*
2*7e6ad469SVishal Kulkarni  * This file and its contents are supplied under the terms of the
3*7e6ad469SVishal Kulkarni  * Common Development and Distribution License ("CDDL"), version 1.0.
4*7e6ad469SVishal Kulkarni  * You may only use this file in accordance with the terms of version
5*7e6ad469SVishal Kulkarni  * 1.0 of the CDDL.
6*7e6ad469SVishal Kulkarni  *
7*7e6ad469SVishal Kulkarni  * A full copy of the text of the CDDL should have accompanied this
8*7e6ad469SVishal Kulkarni  * source. A copy of the CDDL is also available via the Internet at
9*7e6ad469SVishal Kulkarni  * http://www.illumos.org/license/CDDL.
10*7e6ad469SVishal Kulkarni  */
11*7e6ad469SVishal Kulkarni 
12*7e6ad469SVishal Kulkarni /*-
13*7e6ad469SVishal Kulkarni  * Copyright (c) 2017 Chelsio Communications, Inc.
14*7e6ad469SVishal Kulkarni  * All rights reserved.
15*7e6ad469SVishal Kulkarni  *
16*7e6ad469SVishal Kulkarni  * Redistribution and use in source and binary forms, with or without
17*7e6ad469SVishal Kulkarni  * modification, are permitted provided that the following conditions
18*7e6ad469SVishal Kulkarni  * are met:
19*7e6ad469SVishal Kulkarni  * 1. Redistributions of source code must retain the above copyright
20*7e6ad469SVishal Kulkarni  *    notice, this list of conditions and the following disclaimer.
21*7e6ad469SVishal Kulkarni  * 2. Redistributions in binary form must reproduce the above copyright
22*7e6ad469SVishal Kulkarni  *    notice, this list of conditions and the following disclaimer in the
23*7e6ad469SVishal Kulkarni  *    documentation and/or other materials provided with the distribution.
24*7e6ad469SVishal Kulkarni  *
25*7e6ad469SVishal Kulkarni  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
26*7e6ad469SVishal Kulkarni  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27*7e6ad469SVishal Kulkarni  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28*7e6ad469SVishal Kulkarni  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
29*7e6ad469SVishal Kulkarni  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30*7e6ad469SVishal Kulkarni  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31*7e6ad469SVishal Kulkarni  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32*7e6ad469SVishal Kulkarni  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33*7e6ad469SVishal Kulkarni  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34*7e6ad469SVishal Kulkarni  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35*7e6ad469SVishal Kulkarni  * SUCH DAMAGE.
36*7e6ad469SVishal Kulkarni  */
37*7e6ad469SVishal Kulkarni 
38*7e6ad469SVishal Kulkarni #include <sys/types.h>
39*7e6ad469SVishal Kulkarni #include <sys/param.h>
40*7e6ad469SVishal Kulkarni 
41*7e6ad469SVishal Kulkarni #include "common/common.h"
42*7e6ad469SVishal Kulkarni #include "common/t4_regs.h"
43*7e6ad469SVishal Kulkarni #include "cudbg.h"
44*7e6ad469SVishal Kulkarni #include "cudbg_lib_common.h"
45*7e6ad469SVishal Kulkarni #include "cudbg_entity.h"
46*7e6ad469SVishal Kulkarni 
47*7e6ad469SVishal Kulkarni int collect_wtp_data(struct cudbg_init *pdbg_init,
48*7e6ad469SVishal Kulkarni 		     struct cudbg_buffer *dbg_buff,
49*7e6ad469SVishal Kulkarni 		     struct cudbg_error *cudbg_err);
50*7e6ad469SVishal Kulkarni /*SGE_DEBUG Registers.*/
51*7e6ad469SVishal Kulkarni #define TP_MIB_SIZE	    0x5e
52*7e6ad469SVishal Kulkarni 
53*7e6ad469SVishal Kulkarni struct sge_debug_reg_data {
54*7e6ad469SVishal Kulkarni 	/*indx0*/
55*7e6ad469SVishal Kulkarni 	u32 reserved1:4;
56*7e6ad469SVishal Kulkarni 	u32 reserved2:4;
57*7e6ad469SVishal Kulkarni 	u32 debug_uP_SOP_cnt:4;
58*7e6ad469SVishal Kulkarni 	u32 debug_uP_EOP_cnt:4;
59*7e6ad469SVishal Kulkarni 	u32 debug_CIM_SOP1_cnt:4;
60*7e6ad469SVishal Kulkarni 	u32 debug_CIM_EOP1_cnt:4;
61*7e6ad469SVishal Kulkarni 	u32 debug_CIM_SOP0_cnt:4;
62*7e6ad469SVishal Kulkarni 	u32 debug_CIM_EOP0_cnt:4;
63*7e6ad469SVishal Kulkarni 
64*7e6ad469SVishal Kulkarni 	/*indx1*/
65*7e6ad469SVishal Kulkarni 	u32 reserved3:32;
66*7e6ad469SVishal Kulkarni 
67*7e6ad469SVishal Kulkarni 	/*indx2*/
68*7e6ad469SVishal Kulkarni 	u32 debug_T_Rx_SOP1_cnt:4;
69*7e6ad469SVishal Kulkarni 	u32 debug_T_Rx_EOP1_cnt:4;
70*7e6ad469SVishal Kulkarni 	u32 debug_T_Rx_SOP0_cnt:4;
71*7e6ad469SVishal Kulkarni 	u32 debug_T_Rx_EOP0_cnt:4;
72*7e6ad469SVishal Kulkarni 	u32 debug_U_Rx_SOP1_cnt:4;
73*7e6ad469SVishal Kulkarni 	u32 debug_U_Rx_EOP1_cnt:4;
74*7e6ad469SVishal Kulkarni 	u32 debug_U_Rx_SOP0_cnt:4;
75*7e6ad469SVishal Kulkarni 	u32 debug_U_Rx_EOP0_cnt:4;
76*7e6ad469SVishal Kulkarni 
77*7e6ad469SVishal Kulkarni 	/*indx3*/
78*7e6ad469SVishal Kulkarni 	u32 reserved4:32;
79*7e6ad469SVishal Kulkarni 
80*7e6ad469SVishal Kulkarni 	/*indx4*/
81*7e6ad469SVishal Kulkarni 	u32 debug_UD_Rx_SOP3_cnt:4;
82*7e6ad469SVishal Kulkarni 	u32 debug_UD_Rx_EOP3_cnt:4;
83*7e6ad469SVishal Kulkarni 	u32 debug_UD_Rx_SOP2_cnt:4;
84*7e6ad469SVishal Kulkarni 	u32 debug_UD_Rx_EOP2_cnt:4;
85*7e6ad469SVishal Kulkarni 	u32 debug_UD_Rx_SOP1_cnt:4;
86*7e6ad469SVishal Kulkarni 	u32 debug_UD_Rx_EOP1_cnt:4;
87*7e6ad469SVishal Kulkarni 	u32 debug_UD_Rx_SOP0_cnt:4;
88*7e6ad469SVishal Kulkarni 	u32 debug_UD_Rx_EOP0_cnt:4;
89*7e6ad469SVishal Kulkarni 
90*7e6ad469SVishal Kulkarni 	/*indx5*/
91*7e6ad469SVishal Kulkarni 	u32 reserved5:32;
92*7e6ad469SVishal Kulkarni 
93*7e6ad469SVishal Kulkarni 	/*indx6*/
94*7e6ad469SVishal Kulkarni 	u32 debug_U_Tx_SOP3_cnt:4;
95*7e6ad469SVishal Kulkarni 	u32 debug_U_Tx_EOP3_cnt:4;
96*7e6ad469SVishal Kulkarni 	u32 debug_U_Tx_SOP2_cnt:4;
97*7e6ad469SVishal Kulkarni 	u32 debug_U_Tx_EOP2_cnt:4;
98*7e6ad469SVishal Kulkarni 	u32 debug_U_Tx_SOP1_cnt:4;
99*7e6ad469SVishal Kulkarni 	u32 debug_U_Tx_EOP1_cnt:4;
100*7e6ad469SVishal Kulkarni 	u32 debug_U_Tx_SOP0_cnt:4;
101*7e6ad469SVishal Kulkarni 	u32 debug_U_Tx_EOP0_cnt:4;
102*7e6ad469SVishal Kulkarni 
103*7e6ad469SVishal Kulkarni 	/*indx7*/
104*7e6ad469SVishal Kulkarni 	u32 reserved6:32;
105*7e6ad469SVishal Kulkarni 
106*7e6ad469SVishal Kulkarni 	/*indx8*/
107*7e6ad469SVishal Kulkarni 	u32  debug_PC_Rsp_SOP1_cnt:4;
108*7e6ad469SVishal Kulkarni 	u32  debug_PC_Rsp_EOP1_cnt:4;
109*7e6ad469SVishal Kulkarni 	u32  debug_PC_Rsp_SOP0_cnt:4;
110*7e6ad469SVishal Kulkarni 	u32  debug_PC_Rsp_EOP0_cnt:4;
111*7e6ad469SVishal Kulkarni 	u32  debug_PC_Req_SOP1_cnt:4;
112*7e6ad469SVishal Kulkarni 	u32  debug_PC_Req_EOP1_cnt:4;
113*7e6ad469SVishal Kulkarni 	u32  debug_PC_Req_SOP0_cnt:4;
114*7e6ad469SVishal Kulkarni 	u32  debug_PC_Req_EOP0_cnt:4;
115*7e6ad469SVishal Kulkarni 
116*7e6ad469SVishal Kulkarni 	/*indx9*/
117*7e6ad469SVishal Kulkarni 	u32 reserved7:32;
118*7e6ad469SVishal Kulkarni 
119*7e6ad469SVishal Kulkarni 	/*indx10*/
120*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_SOP3_cnt:4;
121*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_EOP3_cnt:4;
122*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_SOP2_cnt:4;
123*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_EOP2_cnt:4;
124*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_SOP1_cnt:4;
125*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_EOP1_cnt:4;
126*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_SOP0_cnt:4;
127*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_EOP0_cnt:4;
128*7e6ad469SVishal Kulkarni 
129*7e6ad469SVishal Kulkarni 	/*indx11*/
130*7e6ad469SVishal Kulkarni 	u32 reserved8:32;
131*7e6ad469SVishal Kulkarni 
132*7e6ad469SVishal Kulkarni 	/*indx12*/
133*7e6ad469SVishal Kulkarni 	u32  debug_PD_Rsp_SOP3_cnt:4;
134*7e6ad469SVishal Kulkarni 	u32  debug_PD_Rsp_EOP3_cnt:4;
135*7e6ad469SVishal Kulkarni 	u32  debug_PD_Rsp_SOP2_cnt:4;
136*7e6ad469SVishal Kulkarni 	u32  debug_PD_Rsp_EOP2_cnt:4;
137*7e6ad469SVishal Kulkarni 	u32  debug_PD_Rsp_SOP1_cnt:4;
138*7e6ad469SVishal Kulkarni 	u32  debug_PD_Rsp_EOP1_cnt:4;
139*7e6ad469SVishal Kulkarni 	u32  debug_PD_Rsp_SOP0_cnt:4;
140*7e6ad469SVishal Kulkarni 	u32  debug_PD_Rsp_EOP0_cnt:4;
141*7e6ad469SVishal Kulkarni 
142*7e6ad469SVishal Kulkarni 	/*indx13*/
143*7e6ad469SVishal Kulkarni 	u32 reserved9:32;
144*7e6ad469SVishal Kulkarni 
145*7e6ad469SVishal Kulkarni 	/*indx14*/
146*7e6ad469SVishal Kulkarni 	u32  debug_CPLSW_TP_Rx_SOP1_cnt:4;
147*7e6ad469SVishal Kulkarni 	u32  debug_CPLSW_TP_Rx_EOP1_cnt:4;
148*7e6ad469SVishal Kulkarni 	u32  debug_CPLSW_TP_Rx_SOP0_cnt:4;
149*7e6ad469SVishal Kulkarni 	u32  debug_CPLSW_TP_Rx_EOP0_cnt:4;
150*7e6ad469SVishal Kulkarni 	u32  debug_CPLSW_CIM_SOP1_cnt:4;
151*7e6ad469SVishal Kulkarni 	u32  debug_CPLSW_CIM_EOP1_cnt:4;
152*7e6ad469SVishal Kulkarni 	u32  debug_CPLSW_CIM_SOP0_cnt:4;
153*7e6ad469SVishal Kulkarni 	u32  debug_CPLSW_CIM_EOP0_cnt:4;
154*7e6ad469SVishal Kulkarni 
155*7e6ad469SVishal Kulkarni 	/*indx15*/
156*7e6ad469SVishal Kulkarni 	u32 reserved10:32;
157*7e6ad469SVishal Kulkarni 
158*7e6ad469SVishal Kulkarni 	/*indx16*/
159*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_Rd3_cnt:4;
160*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_Rd2_cnt:4;
161*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_Rd1_cnt:4;
162*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_Rd0_cnt:4;
163*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_Int3_cnt:4;
164*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_Int2_cnt:4;
165*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_Int1_cnt:4;
166*7e6ad469SVishal Kulkarni 	u32  debug_PD_Req_Int0_cnt:4;
167*7e6ad469SVishal Kulkarni 
168*7e6ad469SVishal Kulkarni };
169*7e6ad469SVishal Kulkarni 
170*7e6ad469SVishal Kulkarni struct tp_mib_type tp_mib[] = {
171*7e6ad469SVishal Kulkarni 	{"tp_mib_mac_in_err_0", 0x0},
172*7e6ad469SVishal Kulkarni 	{"tp_mib_mac_in_err_1", 0x1},
173*7e6ad469SVishal Kulkarni 	{"tp_mib_mac_in_err_2", 0x2},
174*7e6ad469SVishal Kulkarni 	{"tp_mib_mac_in_err_3", 0x3},
175*7e6ad469SVishal Kulkarni 	{"tp_mib_hdr_in_err_0", 0x4},
176*7e6ad469SVishal Kulkarni 	{"tp_mib_hdr_in_err_1", 0x5},
177*7e6ad469SVishal Kulkarni 	{"tp_mib_hdr_in_err_2", 0x6},
178*7e6ad469SVishal Kulkarni 	{"tp_mib_hdr_in_err_3", 0x7},
179*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_in_err_0", 0x8},
180*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_in_err_1", 0x9},
181*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_in_err_2", 0xa},
182*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_in_err_3", 0xb},
183*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_out_rst", 0xc},
184*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_in_seg_hi", 0x10},
185*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_in_seg_lo", 0x11},
186*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_out_seg_hi", 0x12},
187*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_out_seg_lo", 0x13},
188*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_rxt_seg_hi", 0x14},
189*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_rxt_seg_lo", 0x15},
190*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_cng_drop_0", 0x18},
191*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_cng_drop_1", 0x19},
192*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_cng_drop_2", 0x1a},
193*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_cng_drop_3", 0x1b},
194*7e6ad469SVishal Kulkarni 	{"tp_mib_ofd_chn_drop_0", 0x1c},
195*7e6ad469SVishal Kulkarni 	{"tp_mib_ofd_chn_drop_1", 0x1d},
196*7e6ad469SVishal Kulkarni 	{"tp_mib_ofd_chn_drop_2", 0x1e},
197*7e6ad469SVishal Kulkarni 	{"tp_mib_ofd_chn_drop_3", 0x1f},
198*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_out_pkt_0", 0x20},
199*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_out_pkt_1", 0x21},
200*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_out_pkt_2", 0x22},
201*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_out_pkt_3", 0x23},
202*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_in_pkt_0", 0x24},
203*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_in_pkt_1", 0x25},
204*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_in_pkt_2", 0x26},
205*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_in_pkt_3", 0x27},
206*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6in_err_0", 0x28},
207*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6in_err_1", 0x29},
208*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6in_err_2", 0x2a},
209*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6in_err_3", 0x2b},
210*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6out_rst", 0x2c},
211*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6in_seg_hi", 0x30},
212*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6in_seg_lo", 0x31},
213*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6out_seg_hi", 0x32},
214*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6out_seg_lo", 0x33},
215*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6rxt_seg_hi", 0x34},
216*7e6ad469SVishal Kulkarni 	{"tp_mib_tcp_v6rxt_seg_lo", 0x35},
217*7e6ad469SVishal Kulkarni 	{"tp_mib_ofd_arp_drop", 0x36},
218*7e6ad469SVishal Kulkarni 	{"tp_mib_ofd_dfr_drop", 0x37},
219*7e6ad469SVishal Kulkarni 	{"tp_mib_cpl_in_req_0", 0x38},
220*7e6ad469SVishal Kulkarni 	{"tp_mib_cpl_in_req_1", 0x39},
221*7e6ad469SVishal Kulkarni 	{"tp_mib_cpl_in_req_2", 0x3a},
222*7e6ad469SVishal Kulkarni 	{"tp_mib_cpl_in_req_3", 0x3b},
223*7e6ad469SVishal Kulkarni 	{"tp_mib_cpl_out_rsp_0", 0x3c},
224*7e6ad469SVishal Kulkarni 	{"tp_mib_cpl_out_rsp_1", 0x3d},
225*7e6ad469SVishal Kulkarni 	{"tp_mib_cpl_out_rsp_2", 0x3e},
226*7e6ad469SVishal Kulkarni 	{"tp_mib_cpl_out_rsp_3", 0x3f},
227*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_lpbk_0", 0x40},
228*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_lpbk_1", 0x41},
229*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_lpbk_2", 0x42},
230*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_lpbk_3", 0x43},
231*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_drop_0", 0x44},
232*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_drop_1", 0x45},
233*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_drop_2", 0x46},
234*7e6ad469SVishal Kulkarni 	{"tp_mib_tnl_drop_3", 0x47},
235*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_ddp_0", 0x48},
236*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_ddp_1", 0x49},
237*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_ddp_2", 0x4a},
238*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_ddp_3", 0x4b},
239*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_drop_0", 0x4c},
240*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_drop_1", 0x4d},
241*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_drop_2", 0x4e},
242*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_drop_3", 0x4f},
243*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_byte_0_hi", 0x50},
244*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_byte_0_lo", 0x51},
245*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_byte_1_hi", 0x52},
246*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_byte_1_lo", 0x53},
247*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_byte_2_hi", 0x54},
248*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_byte_2_lo", 0x55},
249*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_byte_3_hi", 0x56},
250*7e6ad469SVishal Kulkarni 	{"tp_mib_fcoe_byte_3_lo", 0x57},
251*7e6ad469SVishal Kulkarni 	{"tp_mib_ofd_vln_drop_0", 0x58},
252*7e6ad469SVishal Kulkarni 	{"tp_mib_ofd_vln_drop_1", 0x59},
253*7e6ad469SVishal Kulkarni 	{"tp_mib_ofd_vln_drop_2", 0x5a},
254*7e6ad469SVishal Kulkarni 	{"tp_mib_ofd_vln_drop_3", 0x5b},
255*7e6ad469SVishal Kulkarni 	{"tp_mib_usm_pkts", 0x5c},
256*7e6ad469SVishal Kulkarni 	{"tp_mib_usm_drop", 0x5d},
257*7e6ad469SVishal Kulkarni 	{"tp_mib_usm_bytes_hi", 0x5e},
258*7e6ad469SVishal Kulkarni 	{"tp_mib_usm_bytes_lo", 0x5f},
259*7e6ad469SVishal Kulkarni 	{"tp_mib_tid_del", 0x60},
260*7e6ad469SVishal Kulkarni 	{"tp_mib_tid_inv", 0x61},
261*7e6ad469SVishal Kulkarni 	{"tp_mib_tid_act", 0x62},
262*7e6ad469SVishal Kulkarni 	{"tp_mib_tid_pas", 0x63},
263*7e6ad469SVishal Kulkarni 	{"tp_mib_rqe_dfr_mod", 0x64},
264*7e6ad469SVishal Kulkarni 	{"tp_mib_rqe_dfr_pkt", 0x65}
265*7e6ad469SVishal Kulkarni };
266*7e6ad469SVishal Kulkarni 
267*7e6ad469SVishal Kulkarni static u32
read_sge_debug_data(struct cudbg_init * pdbg_init,u32 * sge_dbg_reg)268*7e6ad469SVishal Kulkarni read_sge_debug_data(struct cudbg_init *pdbg_init, u32 *sge_dbg_reg)
269*7e6ad469SVishal Kulkarni {
270*7e6ad469SVishal Kulkarni 	struct adapter *padap = pdbg_init->adap;
271*7e6ad469SVishal Kulkarni 	u32 value;
272*7e6ad469SVishal Kulkarni 	int i = 0;
273*7e6ad469SVishal Kulkarni 
274*7e6ad469SVishal Kulkarni 	for (i = 0; i <= 15; i++) {
275*7e6ad469SVishal Kulkarni 		t4_write_reg(padap, A_SGE_DEBUG_INDEX, (u32)i);
276*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, A_SGE_DEBUG_DATA_LOW);
277*7e6ad469SVishal Kulkarni 		/*printf("LOW	 0x%08x\n", value);*/
278*7e6ad469SVishal Kulkarni 		sge_dbg_reg[(i << 1) | 1] = HTONL_NIBBLE(value);
279*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH);
280*7e6ad469SVishal Kulkarni 		/*printf("HIGH	 0x%08x\n", value);*/
281*7e6ad469SVishal Kulkarni 		sge_dbg_reg[(i << 1)] = HTONL_NIBBLE(value);
282*7e6ad469SVishal Kulkarni 	}
283*7e6ad469SVishal Kulkarni 	return 0;
284*7e6ad469SVishal Kulkarni }
285*7e6ad469SVishal Kulkarni 
286*7e6ad469SVishal Kulkarni static u32
read_tp_mib_data(struct cudbg_init * pdbg_init,struct tp_mib_data ** ppTp_Mib)287*7e6ad469SVishal Kulkarni read_tp_mib_data(struct cudbg_init *pdbg_init,
288*7e6ad469SVishal Kulkarni 		 struct tp_mib_data **ppTp_Mib)
289*7e6ad469SVishal Kulkarni {
290*7e6ad469SVishal Kulkarni 	struct adapter *padap = pdbg_init->adap;
291*7e6ad469SVishal Kulkarni 	u32 i = 0;
292*7e6ad469SVishal Kulkarni 
293*7e6ad469SVishal Kulkarni 	for (i = 0; i < TP_MIB_SIZE; i++) {
294*7e6ad469SVishal Kulkarni 		t4_tp_mib_read(padap, &tp_mib[i].value, 1,
295*7e6ad469SVishal Kulkarni 				  (u32)tp_mib[i].addr, true);
296*7e6ad469SVishal Kulkarni 	}
297*7e6ad469SVishal Kulkarni 	*ppTp_Mib = (struct tp_mib_data *)&tp_mib[0];
298*7e6ad469SVishal Kulkarni 
299*7e6ad469SVishal Kulkarni 	return 0;
300*7e6ad469SVishal Kulkarni }
301*7e6ad469SVishal Kulkarni 
302*7e6ad469SVishal Kulkarni static int
t5_wtp_data(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)303*7e6ad469SVishal Kulkarni t5_wtp_data(struct cudbg_init *pdbg_init,
304*7e6ad469SVishal Kulkarni 	    struct cudbg_buffer *dbg_buff,
305*7e6ad469SVishal Kulkarni 	    struct cudbg_error *cudbg_err)
306*7e6ad469SVishal Kulkarni {
307*7e6ad469SVishal Kulkarni 	struct adapter *padap = pdbg_init->adap;
308*7e6ad469SVishal Kulkarni 	struct sge_debug_reg_data *sge_dbg_reg = NULL;
309*7e6ad469SVishal Kulkarni 	struct cudbg_buffer scratch_buff;
310*7e6ad469SVishal Kulkarni 	struct tp_mib_data *ptp_mib = NULL;
311*7e6ad469SVishal Kulkarni 	struct wtp_data *wtp;
312*7e6ad469SVishal Kulkarni 	u32 Sge_Dbg[32] = {0};
313*7e6ad469SVishal Kulkarni 	u32 value = 0;
314*7e6ad469SVishal Kulkarni 	u32 i = 0;
315*7e6ad469SVishal Kulkarni 	u32 drop = 0;
316*7e6ad469SVishal Kulkarni 	u32 err = 0;
317*7e6ad469SVishal Kulkarni 	u32 offset;
318*7e6ad469SVishal Kulkarni 	int rc = 0;
319*7e6ad469SVishal Kulkarni 
320*7e6ad469SVishal Kulkarni 	rc = get_scratch_buff(dbg_buff, sizeof(struct wtp_data), &scratch_buff);
321*7e6ad469SVishal Kulkarni 
322*7e6ad469SVishal Kulkarni 	if (rc)
323*7e6ad469SVishal Kulkarni 		goto err;
324*7e6ad469SVishal Kulkarni 
325*7e6ad469SVishal Kulkarni 	offset = scratch_buff.offset;
326*7e6ad469SVishal Kulkarni 	wtp = (struct wtp_data *)((char *)scratch_buff.data + offset);
327*7e6ad469SVishal Kulkarni 
328*7e6ad469SVishal Kulkarni 	read_sge_debug_data(pdbg_init, Sge_Dbg);
329*7e6ad469SVishal Kulkarni 	read_tp_mib_data(pdbg_init, &ptp_mib);
330*7e6ad469SVishal Kulkarni 
331*7e6ad469SVishal Kulkarni 	sge_dbg_reg = (struct sge_debug_reg_data *) &Sge_Dbg[0];
332*7e6ad469SVishal Kulkarni 
333*7e6ad469SVishal Kulkarni 	/*#######################################################################*/
334*7e6ad469SVishal Kulkarni 	/*# TX PATH, starting from pcie*/
335*7e6ad469SVishal Kulkarni 	/*#######################################################################*/
336*7e6ad469SVishal Kulkarni 
337*7e6ad469SVishal Kulkarni 	/* Get Reqests of commmands from SGE to PCIE*/
338*7e6ad469SVishal Kulkarni 
339*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_cmd_req.sop[0] =	sge_dbg_reg->debug_PC_Req_SOP0_cnt;
340*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_cmd_req.sop[1] =	sge_dbg_reg->debug_PC_Req_SOP1_cnt;
341*7e6ad469SVishal Kulkarni 
342*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_cmd_req.eop[0] =	sge_dbg_reg->debug_PC_Req_EOP0_cnt;
343*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_cmd_req.eop[1] =	sge_dbg_reg->debug_PC_Req_EOP1_cnt;
344*7e6ad469SVishal Kulkarni 
345*7e6ad469SVishal Kulkarni 	/* Get Reqests of commmands from PCIE to core*/
346*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_PCIE_CMDR_REQ_CNT);
347*7e6ad469SVishal Kulkarni 
348*7e6ad469SVishal Kulkarni 	wtp->pcie_core_cmd_req.sop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
349*7e6ad469SVishal Kulkarni 	wtp->pcie_core_cmd_req.sop[1] = ((value >> 8) & 0xFF); /*bit 8:15*/
350*7e6ad469SVishal Kulkarni 	/* there is no EOP for this, so we fake it.*/
351*7e6ad469SVishal Kulkarni 	wtp->pcie_core_cmd_req.eop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
352*7e6ad469SVishal Kulkarni 	wtp->pcie_core_cmd_req.eop[1] = ((value >> 8) & 0xFF); /*bit 8:15*/
353*7e6ad469SVishal Kulkarni 
354*7e6ad469SVishal Kulkarni 	/* Get DMA stats*/
355*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
356*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, A_PCIE_T5_DMA_STAT3 + (i * 0x10));
357*7e6ad469SVishal Kulkarni 		wtp->pcie_t5_dma_stat3.sop[i] = value & 0xFF;
358*7e6ad469SVishal Kulkarni 		wtp->pcie_t5_dma_stat3.eop[i] = ((value >> 16) & 0xFF);
359*7e6ad469SVishal Kulkarni 	}
360*7e6ad469SVishal Kulkarni 
361*7e6ad469SVishal Kulkarni 	/* Get SGE debug data high index 6*/
362*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_6);
363*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_6.sop[0] = ((value >> 4) & 0x0F);
364*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_6.eop[0] = ((value >> 0) & 0x0F);
365*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_6.sop[1] = ((value >> 12) & 0x0F);
366*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_6.eop[1] = ((value >> 8) & 0x0F);
367*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_6.sop[2] = ((value >> 20) & 0x0F);
368*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_6.eop[2] = ((value >> 16) & 0x0F);
369*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_6.sop[3] = ((value >> 28) & 0x0F);
370*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_6.eop[3] = ((value >> 24) & 0x0F);
371*7e6ad469SVishal Kulkarni 
372*7e6ad469SVishal Kulkarni 	/* Get SGE debug data high index 3*/
373*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_3);
374*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_3.sop[0] = ((value >> 4) & 0x0F);
375*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_3.eop[0] = ((value >> 0) & 0x0F);
376*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_3.sop[1] = ((value >> 12) & 0x0F);
377*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_3.eop[1] = ((value >> 8) & 0x0F);
378*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_3.sop[2] = ((value >> 20) & 0x0F);
379*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_3.eop[2] = ((value >> 16) & 0x0F);
380*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_3.sop[3] = ((value >> 28) & 0x0F);
381*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_index_3.eop[3] = ((value >> 24) & 0x0F);
382*7e6ad469SVishal Kulkarni 
383*7e6ad469SVishal Kulkarni 	/* Get ULP SE CNT CHx*/
384*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
385*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, A_ULP_TX_SE_CNT_CH0 + (i * 4));
386*7e6ad469SVishal Kulkarni 		wtp->ulp_se_cnt_chx.sop[i] = ((value >> 28) & 0x0F);
387*7e6ad469SVishal Kulkarni 		wtp->ulp_se_cnt_chx.eop[i] = ((value >> 24) & 0x0F);
388*7e6ad469SVishal Kulkarni 	}
389*7e6ad469SVishal Kulkarni 
390*7e6ad469SVishal Kulkarni 	/* Get MAC PORTx PKT COUNT*/
391*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
392*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, 0x3081c + ((i * 4) << 12));
393*7e6ad469SVishal Kulkarni 		wtp->mac_portx_pkt_count.sop[i] = ((value >> 24) & 0xFF);
394*7e6ad469SVishal Kulkarni 		wtp->mac_portx_pkt_count.eop[i] = ((value >> 16) & 0xFF);
395*7e6ad469SVishal Kulkarni 		wtp->mac_porrx_pkt_count.sop[i] = ((value >> 8) & 0xFF);
396*7e6ad469SVishal Kulkarni 		wtp->mac_porrx_pkt_count.eop[i] = ((value >> 0) & 0xFF);
397*7e6ad469SVishal Kulkarni 	}
398*7e6ad469SVishal Kulkarni 
399*7e6ad469SVishal Kulkarni 	/* Get mac portx aFramesTransmittedok*/
400*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
401*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, 0x30a80 + ((i * 4) << 12));
402*7e6ad469SVishal Kulkarni 		wtp->mac_portx_aframestra_ok.sop[i] = (value & 0xFF);
403*7e6ad469SVishal Kulkarni 		wtp->mac_portx_aframestra_ok.eop[i] = (value & 0xFF);
404*7e6ad469SVishal Kulkarni 	}
405*7e6ad469SVishal Kulkarni 
406*7e6ad469SVishal Kulkarni 	/* Get command respones from core to PCIE*/
407*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_PCIE_CMDR_RSP_CNT);
408*7e6ad469SVishal Kulkarni 
409*7e6ad469SVishal Kulkarni 	wtp->core_pcie_cmd_rsp.sop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
410*7e6ad469SVishal Kulkarni 	wtp->core_pcie_cmd_rsp.sop[1] = ((value >> 16) & 0xFF); /*bit 16:23*/
411*7e6ad469SVishal Kulkarni 
412*7e6ad469SVishal Kulkarni 	wtp->core_pcie_cmd_rsp.eop[0] = ((value >> 8) & 0xFF); /*bit 8:15*/
413*7e6ad469SVishal Kulkarni 	wtp->core_pcie_cmd_rsp.eop[1] = ((value >> 24) & 0xFF); /*bit 24:31*/
414*7e6ad469SVishal Kulkarni 
415*7e6ad469SVishal Kulkarni 	/*Get command Resposes from PCIE to SGE*/
416*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_cmd_rsp.sop[0] = sge_dbg_reg->debug_PC_Rsp_SOP0_cnt;
417*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_cmd_rsp.sop[1] = sge_dbg_reg->debug_PC_Rsp_SOP1_cnt;
418*7e6ad469SVishal Kulkarni 
419*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_cmd_rsp.eop[0] = sge_dbg_reg->debug_PC_Rsp_EOP0_cnt;
420*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_cmd_rsp.eop[1] = sge_dbg_reg->debug_PC_Rsp_EOP1_cnt;
421*7e6ad469SVishal Kulkarni 
422*7e6ad469SVishal Kulkarni 	/* Get commands sent from SGE to CIM/uP*/
423*7e6ad469SVishal Kulkarni 	wtp->sge_cim.sop[0] = sge_dbg_reg->debug_CIM_SOP0_cnt;
424*7e6ad469SVishal Kulkarni 	wtp->sge_cim.sop[1] = sge_dbg_reg->debug_CIM_SOP1_cnt;
425*7e6ad469SVishal Kulkarni 
426*7e6ad469SVishal Kulkarni 	wtp->sge_cim.eop[0] = sge_dbg_reg->debug_CIM_EOP0_cnt;
427*7e6ad469SVishal Kulkarni 	wtp->sge_cim.eop[1] = sge_dbg_reg->debug_CIM_EOP1_cnt;
428*7e6ad469SVishal Kulkarni 
429*7e6ad469SVishal Kulkarni 	/* Get Reqests of data from PCIE by SGE*/
430*7e6ad469SVishal Kulkarni 	wtp->utx_sge_dma_req.sop[0] = sge_dbg_reg->debug_UD_Rx_SOP0_cnt;
431*7e6ad469SVishal Kulkarni 	wtp->utx_sge_dma_req.sop[1] = sge_dbg_reg->debug_UD_Rx_SOP1_cnt;
432*7e6ad469SVishal Kulkarni 	wtp->utx_sge_dma_req.sop[2] = sge_dbg_reg->debug_UD_Rx_SOP2_cnt;
433*7e6ad469SVishal Kulkarni 	wtp->utx_sge_dma_req.sop[3] = sge_dbg_reg->debug_UD_Rx_SOP3_cnt;
434*7e6ad469SVishal Kulkarni 
435*7e6ad469SVishal Kulkarni 	wtp->utx_sge_dma_req.eop[0] = sge_dbg_reg->debug_UD_Rx_EOP0_cnt;
436*7e6ad469SVishal Kulkarni 	wtp->utx_sge_dma_req.eop[1] = sge_dbg_reg->debug_UD_Rx_EOP1_cnt;
437*7e6ad469SVishal Kulkarni 	wtp->utx_sge_dma_req.eop[2] = sge_dbg_reg->debug_UD_Rx_EOP2_cnt;
438*7e6ad469SVishal Kulkarni 	wtp->utx_sge_dma_req.eop[3] = sge_dbg_reg->debug_UD_Rx_EOP3_cnt;
439*7e6ad469SVishal Kulkarni 
440*7e6ad469SVishal Kulkarni 	/* Get Reqests of data from PCIE by SGE*/
441*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_dma_req.sop[0] = sge_dbg_reg->debug_PD_Req_Rd0_cnt;
442*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_dma_req.sop[1] = sge_dbg_reg->debug_PD_Req_Rd1_cnt;
443*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_dma_req.sop[2] = sge_dbg_reg->debug_PD_Req_Rd2_cnt;
444*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_dma_req.sop[3] = sge_dbg_reg->debug_PD_Req_Rd3_cnt;
445*7e6ad469SVishal Kulkarni 	/*no EOP's, so fake it.*/
446*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_dma_req.eop[0] = sge_dbg_reg->debug_PD_Req_Rd0_cnt;
447*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_dma_req.eop[1] = sge_dbg_reg->debug_PD_Req_Rd1_cnt;
448*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_dma_req.eop[2] = sge_dbg_reg->debug_PD_Req_Rd2_cnt;
449*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_dma_req.eop[3] = sge_dbg_reg->debug_PD_Req_Rd3_cnt;
450*7e6ad469SVishal Kulkarni 
451*7e6ad469SVishal Kulkarni 	/* Get Reqests of data from PCIE to core*/
452*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_PCIE_DMAR_REQ_CNT);
453*7e6ad469SVishal Kulkarni 
454*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dma_req.sop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
455*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dma_req.sop[1] = ((value >> 8) & 0xFF); /*bit 8:15*/
456*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dma_req.sop[2] = ((value >> 16) & 0xFF); /*bit 16:23*/
457*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dma_req.sop[3] = ((value >> 24) & 0xFF); /*bit 24:31*/
458*7e6ad469SVishal Kulkarni 	/* There is no eop so fake it.*/
459*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dma_req.eop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
460*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dma_req.eop[1] = ((value >> 8) & 0xFF); /*bit 8:15*/
461*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dma_req.eop[2] = ((value >> 16) & 0xFF); /*bit 16:23*/
462*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dma_req.eop[3] = ((value >> 24) & 0xFF); /*bit 24:31*/
463*7e6ad469SVishal Kulkarni 
464*7e6ad469SVishal Kulkarni 	/* Get data responses from core to PCIE*/
465*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_PCIE_DMAR_RSP_SOP_CNT);
466*7e6ad469SVishal Kulkarni 
467*7e6ad469SVishal Kulkarni 	wtp->core_pcie_dma_rsp.sop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
468*7e6ad469SVishal Kulkarni 	wtp->core_pcie_dma_rsp.sop[1] = ((value >> 8) & 0xFF); /*bit 8:15*/
469*7e6ad469SVishal Kulkarni 	wtp->core_pcie_dma_rsp.sop[2] = ((value >> 16) & 0xFF); /*bit 16:23*/
470*7e6ad469SVishal Kulkarni 	wtp->core_pcie_dma_rsp.sop[3] = ((value >> 24) & 0xFF); /*bit 24:31*/
471*7e6ad469SVishal Kulkarni 
472*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_PCIE_DMAR_RSP_EOP_CNT);
473*7e6ad469SVishal Kulkarni 
474*7e6ad469SVishal Kulkarni 	wtp->core_pcie_dma_rsp.eop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
475*7e6ad469SVishal Kulkarni 	wtp->core_pcie_dma_rsp.eop[1] = ((value >> 8) & 0xFF); /*bit 8:15*/
476*7e6ad469SVishal Kulkarni 	wtp->core_pcie_dma_rsp.eop[2] = ((value >> 16) & 0xFF); /*bit 16:23*/
477*7e6ad469SVishal Kulkarni 	wtp->core_pcie_dma_rsp.eop[3] = ((value >> 24) & 0xFF); /*bit 24:31*/
478*7e6ad469SVishal Kulkarni 
479*7e6ad469SVishal Kulkarni 	/* Get PCIE_DATA to SGE*/
480*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_dma_rsp.sop[0] = sge_dbg_reg->debug_PD_Rsp_SOP0_cnt;
481*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_dma_rsp.sop[1] = sge_dbg_reg->debug_PD_Rsp_SOP1_cnt;
482*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_dma_rsp.sop[2] = sge_dbg_reg->debug_PD_Rsp_SOP2_cnt;
483*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_dma_rsp.sop[3] = sge_dbg_reg->debug_PD_Rsp_SOP3_cnt;
484*7e6ad469SVishal Kulkarni 
485*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_dma_rsp.eop[0] = sge_dbg_reg->debug_PD_Rsp_EOP0_cnt;
486*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_dma_rsp.eop[1] = sge_dbg_reg->debug_PD_Rsp_EOP1_cnt;
487*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_dma_rsp.eop[2] = sge_dbg_reg->debug_PD_Rsp_EOP2_cnt;
488*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_dma_rsp.eop[3] = sge_dbg_reg->debug_PD_Rsp_EOP3_cnt;
489*7e6ad469SVishal Kulkarni 
490*7e6ad469SVishal Kulkarni 	/*Get SGE to ULP_TX*/
491*7e6ad469SVishal Kulkarni 	wtp->sge_utx.sop[0] = sge_dbg_reg->debug_U_Tx_SOP0_cnt;
492*7e6ad469SVishal Kulkarni 	wtp->sge_utx.sop[1] = sge_dbg_reg->debug_U_Tx_SOP1_cnt;
493*7e6ad469SVishal Kulkarni 	wtp->sge_utx.sop[2] = sge_dbg_reg->debug_U_Tx_SOP2_cnt;
494*7e6ad469SVishal Kulkarni 	wtp->sge_utx.sop[3] = sge_dbg_reg->debug_U_Tx_SOP3_cnt;
495*7e6ad469SVishal Kulkarni 
496*7e6ad469SVishal Kulkarni 	wtp->sge_utx.eop[0] = sge_dbg_reg->debug_U_Tx_EOP0_cnt;
497*7e6ad469SVishal Kulkarni 	wtp->sge_utx.eop[1] = sge_dbg_reg->debug_U_Tx_EOP1_cnt;
498*7e6ad469SVishal Kulkarni 	wtp->sge_utx.eop[2] = sge_dbg_reg->debug_U_Tx_EOP2_cnt;
499*7e6ad469SVishal Kulkarni 	wtp->sge_utx.eop[3] = sge_dbg_reg->debug_U_Tx_EOP3_cnt;
500*7e6ad469SVishal Kulkarni 
501*7e6ad469SVishal Kulkarni 	/* Get ULP_TX to TP*/
502*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
503*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_ULP_TX_SE_CNT_CH0 + (i*4)));
504*7e6ad469SVishal Kulkarni 
505*7e6ad469SVishal Kulkarni 		wtp->utx_tp.sop[i] = ((value >> 28) & 0xF); /*bits 28:31*/
506*7e6ad469SVishal Kulkarni 		wtp->utx_tp.eop[i] = ((value >> 24) & 0xF); /*bits 24:27*/
507*7e6ad469SVishal Kulkarni 	}
508*7e6ad469SVishal Kulkarni 
509*7e6ad469SVishal Kulkarni 	/* Get TP_DBG_CSIDE registers*/
510*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
511*7e6ad469SVishal Kulkarni 		t4_tp_pio_read(padap, &value, 1, (u32)(A_TP_DBG_CSIDE_RX0 + i),
512*7e6ad469SVishal Kulkarni 			       true);
513*7e6ad469SVishal Kulkarni 
514*7e6ad469SVishal Kulkarni 		wtp->utx_tpcside.sop[i]   = ((value >> 28) & 0xF);/*bits 28:31*/
515*7e6ad469SVishal Kulkarni 		wtp->utx_tpcside.eop[i]   = ((value >> 24) & 0xF);/*bits 24:27*/
516*7e6ad469SVishal Kulkarni 		wtp->tpcside_rxpld.sop[i] = ((value >> 20) & 0xF);/*bits 20:23*/
517*7e6ad469SVishal Kulkarni 		wtp->tpcside_rxpld.eop[i] = ((value >> 16) & 0xF);/*bits 16:19*/
518*7e6ad469SVishal Kulkarni 		wtp->tpcside_rxarb.sop[i] = ((value >> 12) & 0xF);/*bits 12:15*/
519*7e6ad469SVishal Kulkarni 		wtp->tpcside_rxarb.eop[i] = ((value >> 8) & 0xF); /*bits 8:11*/
520*7e6ad469SVishal Kulkarni 		wtp->tpcside_rxcpl.sop[i] = ((value >> 4) & 0xF); /*bits 4:7*/
521*7e6ad469SVishal Kulkarni 		wtp->tpcside_rxcpl.eop[i] = ((value >> 0) & 0xF); /*bits 0:3*/
522*7e6ad469SVishal Kulkarni 	}
523*7e6ad469SVishal Kulkarni 
524*7e6ad469SVishal Kulkarni 	/* TP_DBG_ESIDE*/
525*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
526*7e6ad469SVishal Kulkarni 		t4_tp_pio_read(padap, &value, 1, (u32)(A_TP_DBG_ESIDE_PKT0 + i),
527*7e6ad469SVishal Kulkarni 			       true);
528*7e6ad469SVishal Kulkarni 
529*7e6ad469SVishal Kulkarni 		wtp->tpeside_mps.sop[i] = ((value >> 28) & 0xF); /*bits 28:31*/
530*7e6ad469SVishal Kulkarni 		wtp->tpeside_mps.eop[i] = ((value >> 24) & 0xF); /*bits 24:27*/
531*7e6ad469SVishal Kulkarni 		wtp->tpeside_pm.sop[i]	= ((value >> 20) & 0xF); /*bits 20:23*/
532*7e6ad469SVishal Kulkarni 		wtp->tpeside_pm.eop[i]	= ((value >> 16) & 0xF); /*bits 16:19*/
533*7e6ad469SVishal Kulkarni 		wtp->mps_tpeside.sop[i] = ((value >> 12) & 0xF); /*bits 12:15*/
534*7e6ad469SVishal Kulkarni 		wtp->mps_tpeside.eop[i] = ((value >> 8) & 0xF); /*bits 8:11*/
535*7e6ad469SVishal Kulkarni 		wtp->tpeside_pld.sop[i] = ((value >> 4) & 0xF); /*bits 4:7*/
536*7e6ad469SVishal Kulkarni 		wtp->tpeside_pld.eop[i] = ((value >> 0) & 0xF); /*bits 0:3*/
537*7e6ad469SVishal Kulkarni 
538*7e6ad469SVishal Kulkarni 	}
539*7e6ad469SVishal Kulkarni 
540*7e6ad469SVishal Kulkarni 	/*PCIE CMD STAT2*/
541*7e6ad469SVishal Kulkarni 	for (i = 0; i < 3; i++) {
542*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, 0x5988 + (i * 0x10));
543*7e6ad469SVishal Kulkarni 		wtp->pcie_cmd_stat2.sop[i] = value & 0xFF;
544*7e6ad469SVishal Kulkarni 		wtp->pcie_cmd_stat2.eop[i] = value & 0xFF;
545*7e6ad469SVishal Kulkarni 	}
546*7e6ad469SVishal Kulkarni 
547*7e6ad469SVishal Kulkarni 	/*PCIE cmd stat3*/
548*7e6ad469SVishal Kulkarni 	for (i = 0; i < 3; i++) {
549*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, 0x598c + (i * 0x10));
550*7e6ad469SVishal Kulkarni 		wtp->pcie_cmd_stat3.sop[i] = value & 0xFF;
551*7e6ad469SVishal Kulkarni 		wtp->pcie_cmd_stat3.eop[i] = value & 0xFF;
552*7e6ad469SVishal Kulkarni 	}
553*7e6ad469SVishal Kulkarni 
554*7e6ad469SVishal Kulkarni 	/* ULP_RX input/output*/
555*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
556*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_ULP_RX_SE_CNT_CH0 + (i*4)));
557*7e6ad469SVishal Kulkarni 
558*7e6ad469SVishal Kulkarni 		wtp->pmrx_ulprx.sop[i]	  = ((value >> 4) & 0xF); /*bits 4:7*/
559*7e6ad469SVishal Kulkarni 		wtp->pmrx_ulprx.eop[i]	  = ((value >> 0) & 0xF); /*bits 0:3*/
560*7e6ad469SVishal Kulkarni 		wtp->ulprx_tpcside.sop[i] = ((value >> 28) & 0xF);/*bits 28:31*/
561*7e6ad469SVishal Kulkarni 		wtp->ulprx_tpcside.eop[i] = ((value >> 24) & 0xF);/*bits 24:27*/
562*7e6ad469SVishal Kulkarni 	}
563*7e6ad469SVishal Kulkarni 
564*7e6ad469SVishal Kulkarni 	/* Get the MPS input from TP*/
565*7e6ad469SVishal Kulkarni 	drop = 0;
566*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
567*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_MPS_TX_SE_CNT_TP01 + (i << 2)));
568*7e6ad469SVishal Kulkarni 		wtp->tp_mps.sop[(i*2)]	   = ((value >> 8) & 0xFF); /*bit 8:15*/
569*7e6ad469SVishal Kulkarni 		wtp->tp_mps.eop[(i*2)]	   = ((value >> 0) & 0xFF); /*bit 0:7*/
570*7e6ad469SVishal Kulkarni 		wtp->tp_mps.sop[(i*2) + 1] = ((value >> 24) & 0xFF);/*bit 24:31
571*7e6ad469SVishal Kulkarni 								    */
572*7e6ad469SVishal Kulkarni 		wtp->tp_mps.eop[(i*2) + 1] = ((value >> 16) & 0xFF);/*bit 16:23
573*7e6ad469SVishal Kulkarni 								    */
574*7e6ad469SVishal Kulkarni 	}
575*7e6ad469SVishal Kulkarni 	drop  = ptp_mib->TP_MIB_OFD_ARP_DROP.value;
576*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_DFR_DROP.value;
577*7e6ad469SVishal Kulkarni 
578*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_TNL_DROP_0.value;
579*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_TNL_DROP_1.value;
580*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_TNL_DROP_2.value;
581*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_TNL_DROP_3.value;
582*7e6ad469SVishal Kulkarni 
583*7e6ad469SVishal Kulkarni 	wtp->tp_mps.drops = drop;
584*7e6ad469SVishal Kulkarni 
585*7e6ad469SVishal Kulkarni 	/* Get the MPS output to the MAC's*/
586*7e6ad469SVishal Kulkarni 	drop = 0;
587*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
588*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_MPS_TX_SE_CNT_MAC01 + (i << 2)));
589*7e6ad469SVishal Kulkarni 		wtp->mps_xgm.sop[(i*2)]     = ((value >> 8) & 0xFF);/*bit 8:15*/
590*7e6ad469SVishal Kulkarni 		wtp->mps_xgm.eop[(i*2)]     = ((value >> 0) & 0xFF);/*bit 0:7*/
591*7e6ad469SVishal Kulkarni 		wtp->mps_xgm.sop[(i*2) + 1] = ((value >> 24) & 0xFF);/*bit 24:31
592*7e6ad469SVishal Kulkarni 								     */
593*7e6ad469SVishal Kulkarni 		wtp->mps_xgm.eop[(i*2) + 1] = ((value >> 16) & 0xFF);/*bit 16:23
594*7e6ad469SVishal Kulkarni 								     */
595*7e6ad469SVishal Kulkarni 	}
596*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
597*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
598*7e6ad469SVishal Kulkarni 				(T5_PORT0_REG(A_MPS_PORT_STAT_TX_PORT_DROP_L) +
599*7e6ad469SVishal Kulkarni 				(i * T5_PORT_STRIDE)));
600*7e6ad469SVishal Kulkarni 		drop += value;
601*7e6ad469SVishal Kulkarni 	}
602*7e6ad469SVishal Kulkarni 	wtp->mps_xgm.drops = (drop & 0xFF);
603*7e6ad469SVishal Kulkarni 
604*7e6ad469SVishal Kulkarni 	/* Get the SOP/EOP counters into and out of MAC. [JHANEL] I think this
605*7e6ad469SVishal Kulkarni 	 * is*/
606*7e6ad469SVishal Kulkarni 	/* clear on read, so you have to read both TX and RX path at same
607*7e6ad469SVishal Kulkarni 	 * time.*/
608*7e6ad469SVishal Kulkarni 	drop = 0;
609*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
610*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
611*7e6ad469SVishal Kulkarni 				(T5_PORT0_REG(A_MAC_PORT_PKT_COUNT) +
612*7e6ad469SVishal Kulkarni 				(i * T5_PORT_STRIDE)));
613*7e6ad469SVishal Kulkarni 
614*7e6ad469SVishal Kulkarni 		wtp->tx_xgm_xgm.sop[i] = ((value >> 24) & 0xFF); /*bit 24:31*/
615*7e6ad469SVishal Kulkarni 		wtp->tx_xgm_xgm.eop[i] = ((value >> 16) & 0xFF); /*bit 16:23*/
616*7e6ad469SVishal Kulkarni 		wtp->rx_xgm_xgm.sop[i] = ((value >> 8) & 0xFF); /*bit 8:15*/
617*7e6ad469SVishal Kulkarni 		wtp->rx_xgm_xgm.eop[i] = ((value >> 0) & 0xFF); /*bit 0:7*/
618*7e6ad469SVishal Kulkarni 	}
619*7e6ad469SVishal Kulkarni 
620*7e6ad469SVishal Kulkarni 	/* Get the MAC's output to the wire*/
621*7e6ad469SVishal Kulkarni 	drop = 0;
622*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
623*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
624*7e6ad469SVishal Kulkarni 				(T5_PORT0_REG(A_MAC_PORT_AFRAMESTRANSMITTEDOK) +
625*7e6ad469SVishal Kulkarni 				(i * T5_PORT_STRIDE)));
626*7e6ad469SVishal Kulkarni 		wtp->xgm_wire.sop[i] = (value);
627*7e6ad469SVishal Kulkarni 		wtp->xgm_wire.eop[i] = (value); /* No EOP for XGMAC, so fake
628*7e6ad469SVishal Kulkarni 						   it.*/
629*7e6ad469SVishal Kulkarni 	}
630*7e6ad469SVishal Kulkarni 
631*7e6ad469SVishal Kulkarni 	/*########################################################################*/
632*7e6ad469SVishal Kulkarni 	/*# RX PATH, starting from wire*/
633*7e6ad469SVishal Kulkarni 	/*########################################################################*/
634*7e6ad469SVishal Kulkarni 
635*7e6ad469SVishal Kulkarni 	/* Add up the wire input to the MAC*/
636*7e6ad469SVishal Kulkarni 	drop = 0;
637*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
638*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
639*7e6ad469SVishal Kulkarni 				(T5_PORT0_REG(A_MAC_PORT_AFRAMESRECEIVEDOK) +
640*7e6ad469SVishal Kulkarni 				(i * T5_PORT_STRIDE)));
641*7e6ad469SVishal Kulkarni 
642*7e6ad469SVishal Kulkarni 		wtp->wire_xgm.sop[i] = (value);
643*7e6ad469SVishal Kulkarni 		wtp->wire_xgm.eop[i] = (value); /* No EOP for XGMAC, so fake
644*7e6ad469SVishal Kulkarni 						   it.*/
645*7e6ad469SVishal Kulkarni 	}
646*7e6ad469SVishal Kulkarni 
647*7e6ad469SVishal Kulkarni 	/* Already read the rx_xgm_xgm when reading TX path.*/
648*7e6ad469SVishal Kulkarni 
649*7e6ad469SVishal Kulkarni 	/* Add up SOP/EOP's on all 8 MPS buffer channels*/
650*7e6ad469SVishal Kulkarni 	drop = 0;
651*7e6ad469SVishal Kulkarni 	for (i = 0; i < 8; i++) {
652*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_MPS_RX_SE_CNT_IN0 + (i << 2)));
653*7e6ad469SVishal Kulkarni 
654*7e6ad469SVishal Kulkarni 		wtp->xgm_mps.sop[i] = ((value >> 8) & 0xFF); /*bits 8:15*/
655*7e6ad469SVishal Kulkarni 		wtp->xgm_mps.eop[i] = ((value >> 0) & 0xFF); /*bits 0:7*/
656*7e6ad469SVishal Kulkarni 	}
657*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
658*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_MPS_RX_CLS_DROP_CNT0 + (i << 2)));
659*7e6ad469SVishal Kulkarni 		/* typo in JHANEL's code.*/
660*7e6ad469SVishal Kulkarni 		drop += (value & 0xFFFF) + ((value >> 16) & 0xFFFF);
661*7e6ad469SVishal Kulkarni 	}
662*7e6ad469SVishal Kulkarni 	wtp->xgm_mps.cls_drop = drop & 0xFF;
663*7e6ad469SVishal Kulkarni 
664*7e6ad469SVishal Kulkarni 	/* Add up the overflow drops on all 4 ports.*/
665*7e6ad469SVishal Kulkarni 	drop = 0;
666*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
667*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
668*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_DROP_FRAME_L +
669*7e6ad469SVishal Kulkarni 				     (i << 3)));
670*7e6ad469SVishal Kulkarni 		drop += value;
671*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
672*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_DROP_FRAME_L +
673*7e6ad469SVishal Kulkarni 				     (i << 2)));
674*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
675*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_LB_DROP_FRAME_L +
676*7e6ad469SVishal Kulkarni 				     (i << 3)));
677*7e6ad469SVishal Kulkarni 		drop += value;
678*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
679*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_DROP_FRAME_L +
680*7e6ad469SVishal Kulkarni 				     (i << 2)));
681*7e6ad469SVishal Kulkarni 
682*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
683*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_TRUNC_FRAME_L +
684*7e6ad469SVishal Kulkarni 				     (i << 3)));
685*7e6ad469SVishal Kulkarni 		drop += value;
686*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
687*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_TRUNC_FRAME_L +
688*7e6ad469SVishal Kulkarni 				     (i << 3)));
689*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
690*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_LB_TRUNC_FRAME_L +
691*7e6ad469SVishal Kulkarni 				     (i << 3)));
692*7e6ad469SVishal Kulkarni 		drop += value;
693*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
694*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_TRUNC_FRAME_L +
695*7e6ad469SVishal Kulkarni 				     (i << 3)));
696*7e6ad469SVishal Kulkarni 
697*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
698*7e6ad469SVishal Kulkarni 			T5_PORT0_REG(A_MPS_PORT_STAT_LB_PORT_DROP_FRAMES) +
699*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE));
700*7e6ad469SVishal Kulkarni 		drop += value;
701*7e6ad469SVishal Kulkarni 	}
702*7e6ad469SVishal Kulkarni 	wtp->xgm_mps.drop = (drop & 0xFF);
703*7e6ad469SVishal Kulkarni 
704*7e6ad469SVishal Kulkarni 	/* Add up the MPS errors that should result in dropped packets*/
705*7e6ad469SVishal Kulkarni 	err = 0;
706*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
707*7e6ad469SVishal Kulkarni 
708*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
709*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_MTU_ERROR_L) +
710*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
711*7e6ad469SVishal Kulkarni 		err += value;
712*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
713*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_MTU_ERROR_L) +
714*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
715*7e6ad469SVishal Kulkarni 
716*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
717*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_MTU_CRC_ERROR_L) +
718*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
719*7e6ad469SVishal Kulkarni 		err += value;
720*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
721*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_MTU_CRC_ERROR_L) +
722*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
723*7e6ad469SVishal Kulkarni 
724*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
725*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L) +
726*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
727*7e6ad469SVishal Kulkarni 		err += value;
728*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
729*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L) +
730*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
731*7e6ad469SVishal Kulkarni 
732*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
733*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_LEN_ERROR_L) +
734*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
735*7e6ad469SVishal Kulkarni 		err += value;
736*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
737*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_LEN_ERROR_L) +
738*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
739*7e6ad469SVishal Kulkarni 
740*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
741*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_SYM_ERROR_L) +
742*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
743*7e6ad469SVishal Kulkarni 		err += value;
744*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
745*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_SYM_ERROR_L) +
746*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
747*7e6ad469SVishal Kulkarni 
748*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
749*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_LESS_64B_L) +
750*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
751*7e6ad469SVishal Kulkarni 		err += value;
752*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
753*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG((A_MPS_PORT_STAT_RX_PORT_LESS_64B_L) +
754*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4)));
755*7e6ad469SVishal Kulkarni 	}
756*7e6ad469SVishal Kulkarni 	wtp->xgm_mps.err = (err & 0xFF);
757*7e6ad469SVishal Kulkarni 
758*7e6ad469SVishal Kulkarni 	drop = 0;
759*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
760*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_MPS_RX_SE_CNT_OUT01 + (i << 2)));
761*7e6ad469SVishal Kulkarni 
762*7e6ad469SVishal Kulkarni 		wtp->mps_tp.sop[(i*2)]	   = ((value >> 8) & 0xFF); /*bit 8:15*/
763*7e6ad469SVishal Kulkarni 		wtp->mps_tp.eop[(i*2)]	   = ((value >> 0) & 0xFF); /*bit 0:7*/
764*7e6ad469SVishal Kulkarni 		wtp->mps_tp.sop[(i*2) + 1] = ((value >> 24) & 0xFF);/*bit 24:31
765*7e6ad469SVishal Kulkarni 								    */
766*7e6ad469SVishal Kulkarni 		wtp->mps_tp.eop[(i*2) + 1] = ((value >> 16) & 0xFF);/*bit 16:23
767*7e6ad469SVishal Kulkarni 								    */
768*7e6ad469SVishal Kulkarni 	}
769*7e6ad469SVishal Kulkarni 	drop = ptp_mib->TP_MIB_TNL_CNG_DROP_0.value;
770*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_TNL_CNG_DROP_1.value;
771*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_TNL_CNG_DROP_2.value;
772*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_TNL_CNG_DROP_3.value;
773*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_CHN_DROP_0.value;
774*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_CHN_DROP_1.value;
775*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_CHN_DROP_2.value;
776*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_CHN_DROP_3.value;
777*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_FCOE_DROP_0.value;
778*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_FCOE_DROP_1.value;
779*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_FCOE_DROP_2.value;
780*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_FCOE_DROP_3.value;
781*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_VLN_DROP_0.value;
782*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_VLN_DROP_1.value;
783*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_VLN_DROP_2.value;
784*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_VLN_DROP_3.value;
785*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_USM_DROP.value;
786*7e6ad469SVishal Kulkarni 
787*7e6ad469SVishal Kulkarni 	wtp->mps_tp.drops = drop;
788*7e6ad469SVishal Kulkarni 
789*7e6ad469SVishal Kulkarni 	/* Get TP_DBG_CSIDE_TX registers*/
790*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
791*7e6ad469SVishal Kulkarni 		t4_tp_pio_read(padap, &value, 1, (u32)(A_TP_DBG_CSIDE_RX0 + i),
792*7e6ad469SVishal Kulkarni 			       true);
793*7e6ad469SVishal Kulkarni 
794*7e6ad469SVishal Kulkarni 		wtp->tpcside_csw.sop[i]   = ((value >> 28) & 0xF);/*bits 28:31*/
795*7e6ad469SVishal Kulkarni 		wtp->tpcside_csw.eop[i]   = ((value >> 24) & 0xF);/*bits 24:27*/
796*7e6ad469SVishal Kulkarni 		wtp->tpcside_pm.sop[i]	  = ((value >> 20) & 0xF);/*bits 20:23*/
797*7e6ad469SVishal Kulkarni 		wtp->tpcside_pm.eop[i]	  = ((value >> 16) & 0xF);/*bits 16:19*/
798*7e6ad469SVishal Kulkarni 		wtp->tpcside_uturn.sop[i] = ((value >> 12) & 0xF);/*bits 12:15*/
799*7e6ad469SVishal Kulkarni 		wtp->tpcside_uturn.eop[i] = ((value >> 8) & 0xF); /*bits 8:11*/
800*7e6ad469SVishal Kulkarni 		wtp->tpcside_txcpl.sop[i] = ((value >> 4) & 0xF); /*bits 4:7*/
801*7e6ad469SVishal Kulkarni 		wtp->tpcside_txcpl.eop[i] = ((value >> 0) & 0xF); /*bits 0:3*/
802*7e6ad469SVishal Kulkarni 	}
803*7e6ad469SVishal Kulkarni 
804*7e6ad469SVishal Kulkarni 	/* TP to CPL_SWITCH*/
805*7e6ad469SVishal Kulkarni 	wtp->tp_csw.sop[0] = sge_dbg_reg->debug_CPLSW_TP_Rx_SOP0_cnt;
806*7e6ad469SVishal Kulkarni 	wtp->tp_csw.sop[1] = sge_dbg_reg->debug_CPLSW_TP_Rx_SOP1_cnt;
807*7e6ad469SVishal Kulkarni 
808*7e6ad469SVishal Kulkarni 	wtp->tp_csw.eop[0] = sge_dbg_reg->debug_CPLSW_TP_Rx_EOP0_cnt;
809*7e6ad469SVishal Kulkarni 	wtp->tp_csw.eop[1] = sge_dbg_reg->debug_CPLSW_TP_Rx_EOP1_cnt;
810*7e6ad469SVishal Kulkarni 
811*7e6ad469SVishal Kulkarni 	/* TP/CPL_SWITCH to SGE*/
812*7e6ad469SVishal Kulkarni 	wtp->csw_sge.sop[0] = sge_dbg_reg->debug_T_Rx_SOP0_cnt;
813*7e6ad469SVishal Kulkarni 	wtp->csw_sge.sop[1] = sge_dbg_reg->debug_T_Rx_SOP1_cnt;
814*7e6ad469SVishal Kulkarni 
815*7e6ad469SVishal Kulkarni 	wtp->csw_sge.eop[0] = sge_dbg_reg->debug_T_Rx_EOP0_cnt;
816*7e6ad469SVishal Kulkarni 	wtp->csw_sge.eop[1] = sge_dbg_reg->debug_T_Rx_EOP1_cnt;
817*7e6ad469SVishal Kulkarni 
818*7e6ad469SVishal Kulkarni 	wtp->sge_pcie.sop[0] = sge_dbg_reg->debug_PD_Req_SOP0_cnt;
819*7e6ad469SVishal Kulkarni 	wtp->sge_pcie.sop[1] = sge_dbg_reg->debug_PD_Req_SOP1_cnt;
820*7e6ad469SVishal Kulkarni 	wtp->sge_pcie.sop[2] = sge_dbg_reg->debug_PD_Req_SOP2_cnt;
821*7e6ad469SVishal Kulkarni 	wtp->sge_pcie.sop[3] = sge_dbg_reg->debug_PD_Req_SOP3_cnt;
822*7e6ad469SVishal Kulkarni 
823*7e6ad469SVishal Kulkarni 	wtp->sge_pcie.eop[0] = sge_dbg_reg->debug_PD_Req_EOP0_cnt;
824*7e6ad469SVishal Kulkarni 	wtp->sge_pcie.eop[1] = sge_dbg_reg->debug_PD_Req_EOP1_cnt;
825*7e6ad469SVishal Kulkarni 	wtp->sge_pcie.eop[2] = sge_dbg_reg->debug_PD_Req_EOP2_cnt;
826*7e6ad469SVishal Kulkarni 	wtp->sge_pcie.eop[3] = sge_dbg_reg->debug_PD_Req_EOP3_cnt;
827*7e6ad469SVishal Kulkarni 
828*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.sop[0] = sge_dbg_reg->debug_PD_Req_Int0_cnt;
829*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.sop[1] = sge_dbg_reg->debug_PD_Req_Int1_cnt;
830*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.sop[2] = sge_dbg_reg->debug_PD_Req_Int2_cnt;
831*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.sop[3] = sge_dbg_reg->debug_PD_Req_Int3_cnt;
832*7e6ad469SVishal Kulkarni 	/* NO EOP, so fake it.*/
833*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.eop[0] = sge_dbg_reg->debug_PD_Req_Int0_cnt;
834*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.eop[1] = sge_dbg_reg->debug_PD_Req_Int1_cnt;
835*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.eop[2] = sge_dbg_reg->debug_PD_Req_Int2_cnt;
836*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.eop[3] = sge_dbg_reg->debug_PD_Req_Int3_cnt;
837*7e6ad469SVishal Kulkarni 
838*7e6ad469SVishal Kulkarni 	/*Get PCIE DMA1 STAT2*/
839*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
840*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, A_PCIE_T5_DMA_STAT2 + (i * 0x10));
841*7e6ad469SVishal Kulkarni 		wtp->pcie_dma1_stat2.sop[i] = ((value >> 8) & 0x0F);
842*7e6ad469SVishal Kulkarni 		wtp->pcie_dma1_stat2.eop[i] = ((value >> 8) & 0x0F);
843*7e6ad469SVishal Kulkarni 		wtp->pcie_dma1_stat2_core.sop[i] += value & 0x0F;
844*7e6ad469SVishal Kulkarni 		wtp->pcie_dma1_stat2_core.eop[i] += value & 0x0F;
845*7e6ad469SVishal Kulkarni 	}
846*7e6ad469SVishal Kulkarni 
847*7e6ad469SVishal Kulkarni 	/* Get mac porrx aFramesTransmittedok*/
848*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
849*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, 0x30a88 + ((i * 4) << 12));
850*7e6ad469SVishal Kulkarni 		wtp->mac_porrx_aframestra_ok.sop[i] = (value & 0xFF);
851*7e6ad469SVishal Kulkarni 		wtp->mac_porrx_aframestra_ok.eop[i] = (value & 0xFF);
852*7e6ad469SVishal Kulkarni 	}
853*7e6ad469SVishal Kulkarni 
854*7e6ad469SVishal Kulkarni 	/*Get SGE debug data high index 7*/
855*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_7);
856*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.sop[0] = ((value >> 4) & 0x0F);
857*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.eop[0] = ((value >> 0) & 0x0F);
858*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.sop[1] = ((value >> 12) & 0x0F);
859*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.eop[1] = ((value >> 8) & 0x0F);
860*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.sop[2] = ((value >> 20) & 0x0F);
861*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.eop[2] = ((value >> 16) & 0x0F);
862*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.sop[3] = ((value >> 28) & 0x0F);
863*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.eop[3] = ((value >> 24) & 0x0F);
864*7e6ad469SVishal Kulkarni 
865*7e6ad469SVishal Kulkarni 	/*Get SGE debug data high index 1*/
866*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_1);
867*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx1.sop[0] = ((value >> 20) & 0x0F);
868*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx1.eop[0] = ((value >> 16) & 0x0F);
869*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx1.sop[1] = ((value >> 28) & 0x0F);
870*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx1.eop[1] = ((value >> 24) & 0x0F);
871*7e6ad469SVishal Kulkarni 
872*7e6ad469SVishal Kulkarni 	/*Get TP debug CSIDE Tx registers*/
873*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
874*7e6ad469SVishal Kulkarni 		t4_tp_pio_read(padap, &value, 1, (u32)(A_TP_DBG_CSIDE_TX0 + i),
875*7e6ad469SVishal Kulkarni 			       true);
876*7e6ad469SVishal Kulkarni 
877*7e6ad469SVishal Kulkarni 		wtp->utx_tpcside_tx.sop[i] = ((value >> 28) & 0xF);/*bits 28:31
878*7e6ad469SVishal Kulkarni 								   */
879*7e6ad469SVishal Kulkarni 		wtp->utx_tpcside_tx.eop[i] = ((value >> 24) & 0xF);
880*7e6ad469SVishal Kulkarni 	}
881*7e6ad469SVishal Kulkarni 
882*7e6ad469SVishal Kulkarni 	/*Get SGE debug data high index 9*/
883*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_9);
884*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx9.sop[0] = ((value >> 20) & 0x0F);
885*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx9.sop[1] = ((value >> 28) & 0x0F);
886*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx9.eop[0] = ((value >> 16) & 0x0F);
887*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx9.eop[1] = ((value >> 24) & 0x0F);
888*7e6ad469SVishal Kulkarni 	wtp->sge_work_req_pkt.sop[0] = ((value >> 4) & 0x0F);
889*7e6ad469SVishal Kulkarni 	wtp->sge_work_req_pkt.sop[1] = ((value >> 12) & 0x0F);
890*7e6ad469SVishal Kulkarni 
891*7e6ad469SVishal Kulkarni 	/*Get LE DB response count*/
892*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_LE_DB_REQ_RSP_CNT);
893*7e6ad469SVishal Kulkarni 	wtp->le_db_rsp_cnt.sop = value & 0xF;
894*7e6ad469SVishal Kulkarni 	wtp->le_db_rsp_cnt.eop = (value >> 16) & 0xF;
895*7e6ad469SVishal Kulkarni 
896*7e6ad469SVishal Kulkarni 	/*Get TP debug Eside PKTx*/
897*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
898*7e6ad469SVishal Kulkarni 		t4_tp_pio_read(padap, &value, 1, (u32)(A_TP_DBG_ESIDE_PKT0 + i),
899*7e6ad469SVishal Kulkarni 			       true);
900*7e6ad469SVishal Kulkarni 
901*7e6ad469SVishal Kulkarni 		wtp->tp_dbg_eside_pktx.sop[i] = ((value >> 12) & 0xF);
902*7e6ad469SVishal Kulkarni 		wtp->tp_dbg_eside_pktx.eop[i] = ((value >> 8) & 0xF);
903*7e6ad469SVishal Kulkarni 	}
904*7e6ad469SVishal Kulkarni 
905*7e6ad469SVishal Kulkarni 	/* Get data responses from core to PCIE*/
906*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_PCIE_DMAW_SOP_CNT);
907*7e6ad469SVishal Kulkarni 
908*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmaw.sop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
909*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmaw.sop[1] = ((value >> 8) & 0xFF); /*bit 8:15*/
910*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmaw.sop[2] = ((value >> 16) & 0xFF); /*bit 16:23*/
911*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmaw.sop[3] = ((value >> 24) & 0xFF); /*bit 24:31*/
912*7e6ad469SVishal Kulkarni 
913*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_PCIE_DMAW_EOP_CNT);
914*7e6ad469SVishal Kulkarni 
915*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmaw.eop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
916*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmaw.eop[1] = ((value >> 8) & 0xFF); /*bit 8:15*/
917*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmaw.eop[2] = ((value >> 16) & 0xFF); /*bit 16:23*/
918*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmaw.eop[3] = ((value >> 24) & 0xFF); /*bit 24:31*/
919*7e6ad469SVishal Kulkarni 
920*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_PCIE_DMAI_CNT);
921*7e6ad469SVishal Kulkarni 
922*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmai.sop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
923*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmai.sop[1] = ((value >> 8) & 0xFF); /*bit 8:15*/
924*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmai.sop[2] = ((value >> 16) & 0xFF); /*bit 16:23*/
925*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmai.sop[3] = ((value >> 24) & 0xFF); /*bit 24:31*/
926*7e6ad469SVishal Kulkarni 	/* no eop for interrups, just fake it.*/
927*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmai.eop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
928*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmai.eop[1] = ((value >> 8) & 0xFF); /*bit 8:15*/
929*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmai.eop[2] = ((value >> 16) & 0xFF); /*bit 16:23*/
930*7e6ad469SVishal Kulkarni 	wtp->pcie_core_dmai.eop[3] = ((value >> 24) & 0xFF); /*bit 24:31*/
931*7e6ad469SVishal Kulkarni 
932*7e6ad469SVishal Kulkarni 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
933*7e6ad469SVishal Kulkarni 
934*7e6ad469SVishal Kulkarni 	if (rc)
935*7e6ad469SVishal Kulkarni 		goto err1;
936*7e6ad469SVishal Kulkarni 
937*7e6ad469SVishal Kulkarni 	rc = compress_buff(&scratch_buff, dbg_buff);
938*7e6ad469SVishal Kulkarni 
939*7e6ad469SVishal Kulkarni err1:
940*7e6ad469SVishal Kulkarni 	release_scratch_buff(&scratch_buff, dbg_buff);
941*7e6ad469SVishal Kulkarni err:
942*7e6ad469SVishal Kulkarni 	return rc;
943*7e6ad469SVishal Kulkarni }
944*7e6ad469SVishal Kulkarni 
945*7e6ad469SVishal Kulkarni static int
t6_wtp_data(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)946*7e6ad469SVishal Kulkarni t6_wtp_data(struct cudbg_init *pdbg_init,
947*7e6ad469SVishal Kulkarni 	    struct cudbg_buffer *dbg_buff,
948*7e6ad469SVishal Kulkarni 	    struct cudbg_error *cudbg_err)
949*7e6ad469SVishal Kulkarni {
950*7e6ad469SVishal Kulkarni 	struct adapter *padap = pdbg_init->adap;
951*7e6ad469SVishal Kulkarni 	struct sge_debug_reg_data *sge_dbg_reg = NULL;
952*7e6ad469SVishal Kulkarni 	struct cudbg_buffer scratch_buff;
953*7e6ad469SVishal Kulkarni 	struct tp_mib_data *ptp_mib = NULL;
954*7e6ad469SVishal Kulkarni 	struct wtp_data *wtp;
955*7e6ad469SVishal Kulkarni 	u32 Sge_Dbg[32] = {0};
956*7e6ad469SVishal Kulkarni 	u32 value = 0;
957*7e6ad469SVishal Kulkarni 	u32 i = 0;
958*7e6ad469SVishal Kulkarni 	u32 drop = 0;
959*7e6ad469SVishal Kulkarni 	u32 err = 0;
960*7e6ad469SVishal Kulkarni 	u32 offset;
961*7e6ad469SVishal Kulkarni 	int rc = 0;
962*7e6ad469SVishal Kulkarni 
963*7e6ad469SVishal Kulkarni 	rc = get_scratch_buff(dbg_buff, sizeof(struct wtp_data), &scratch_buff);
964*7e6ad469SVishal Kulkarni 
965*7e6ad469SVishal Kulkarni 	if (rc)
966*7e6ad469SVishal Kulkarni 		goto err;
967*7e6ad469SVishal Kulkarni 
968*7e6ad469SVishal Kulkarni 	offset = scratch_buff.offset;
969*7e6ad469SVishal Kulkarni 	wtp = (struct wtp_data *)((char *)scratch_buff.data + offset);
970*7e6ad469SVishal Kulkarni 
971*7e6ad469SVishal Kulkarni 	read_sge_debug_data(pdbg_init, Sge_Dbg);
972*7e6ad469SVishal Kulkarni 	read_tp_mib_data(pdbg_init, &ptp_mib);
973*7e6ad469SVishal Kulkarni 
974*7e6ad469SVishal Kulkarni 	sge_dbg_reg = (struct sge_debug_reg_data *) &Sge_Dbg[0];
975*7e6ad469SVishal Kulkarni 
976*7e6ad469SVishal Kulkarni 	/*# TX PATH*/
977*7e6ad469SVishal Kulkarni 
978*7e6ad469SVishal Kulkarni 	/*PCIE CMD STAT2*/
979*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_PCIE_T5_CMD_STAT2);
980*7e6ad469SVishal Kulkarni 	wtp->pcie_cmd_stat2.sop[0] = value & 0xFF;
981*7e6ad469SVishal Kulkarni 	wtp->pcie_cmd_stat2.eop[0] = value & 0xFF;
982*7e6ad469SVishal Kulkarni 
983*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_7);
984*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_cmd_req.sop[0] = ((value >> 20) & 0x0F);
985*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_cmd_req.eop[0] = ((value >> 16) & 0x0F);
986*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_cmd_req.sop[1] = ((value >> 28) & 0x0F);
987*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_cmd_req.eop[1] = ((value >> 24) & 0x0F);
988*7e6ad469SVishal Kulkarni 
989*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_PCIE_T5_CMD_STAT3);
990*7e6ad469SVishal Kulkarni 	wtp->pcie_cmd_stat3.sop[0] = value & 0xFF;
991*7e6ad469SVishal Kulkarni 	wtp->pcie_cmd_stat3.eop[0] = value & 0xFF;
992*7e6ad469SVishal Kulkarni 
993*7e6ad469SVishal Kulkarni 	/*Get command Resposes from PCIE to SGE*/
994*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_cmd_rsp.sop[0] = sge_dbg_reg->debug_PC_Rsp_SOP0_cnt;
995*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_cmd_rsp.eop[0] = sge_dbg_reg->debug_PC_Rsp_EOP0_cnt;
996*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_cmd_rsp.sop[1] = sge_dbg_reg->debug_PC_Rsp_SOP1_cnt;
997*7e6ad469SVishal Kulkarni 	wtp->pcie_sge_cmd_rsp.eop[1] = sge_dbg_reg->debug_PC_Rsp_EOP0_cnt;
998*7e6ad469SVishal Kulkarni 
999*7e6ad469SVishal Kulkarni 	/* Get commands sent from SGE to CIM/uP*/
1000*7e6ad469SVishal Kulkarni 	wtp->sge_cim.sop[0] = sge_dbg_reg->debug_CIM_SOP0_cnt;
1001*7e6ad469SVishal Kulkarni 	wtp->sge_cim.sop[1] = sge_dbg_reg->debug_CIM_SOP1_cnt;
1002*7e6ad469SVishal Kulkarni 
1003*7e6ad469SVishal Kulkarni 	wtp->sge_cim.eop[0] = sge_dbg_reg->debug_CIM_EOP0_cnt;
1004*7e6ad469SVishal Kulkarni 	wtp->sge_cim.eop[1] = sge_dbg_reg->debug_CIM_EOP1_cnt;
1005*7e6ad469SVishal Kulkarni 
1006*7e6ad469SVishal Kulkarni 	/*Get SGE debug data high index 9*/
1007*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_9);
1008*7e6ad469SVishal Kulkarni 	wtp->sge_work_req_pkt.sop[0] = ((value >> 4) & 0x0F);
1009*7e6ad469SVishal Kulkarni 	wtp->sge_work_req_pkt.eop[0] = ((value >> 0) & 0x0F);
1010*7e6ad469SVishal Kulkarni 
1011*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1012*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, A_PCIE_T5_DMA_STAT2 + (i * 0x10));
1013*7e6ad469SVishal Kulkarni 		wtp->pcie_dma1_stat2.sop[i] = ((value >> 8) & 0x0F);
1014*7e6ad469SVishal Kulkarni 		wtp->pcie_dma1_stat2.eop[i] = ((value >> 8) & 0x0F);
1015*7e6ad469SVishal Kulkarni 		wtp->pcie_dma1_stat2_core.sop[i] = value & 0x0F;
1016*7e6ad469SVishal Kulkarni 		wtp->pcie_dma1_stat2_core.eop[i] = value & 0x0F;
1017*7e6ad469SVishal Kulkarni 	}
1018*7e6ad469SVishal Kulkarni 
1019*7e6ad469SVishal Kulkarni 	/* Get DMA0 stats3*/
1020*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1021*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, A_PCIE_T5_DMA_STAT3 + (i * 0x10));
1022*7e6ad469SVishal Kulkarni 		wtp->pcie_t5_dma_stat3.sop[i] = value & 0xFF;
1023*7e6ad469SVishal Kulkarni 		wtp->pcie_t5_dma_stat3.eop[i] = ((value >> 16) & 0xFF);
1024*7e6ad469SVishal Kulkarni 	}
1025*7e6ad469SVishal Kulkarni 
1026*7e6ad469SVishal Kulkarni 	/* Get ULP SE CNT CHx*/
1027*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
1028*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, A_ULP_TX_SE_CNT_CH0 + (i * 4));
1029*7e6ad469SVishal Kulkarni 		wtp->ulp_se_cnt_chx.sop[i] = ((value >> 28) & 0x0F);
1030*7e6ad469SVishal Kulkarni 		wtp->ulp_se_cnt_chx.eop[i] = ((value >> 24) & 0x0F);
1031*7e6ad469SVishal Kulkarni 	}
1032*7e6ad469SVishal Kulkarni 
1033*7e6ad469SVishal Kulkarni 	/* Get TP_DBG_CSIDE registers*/
1034*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
1035*7e6ad469SVishal Kulkarni 		t4_tp_pio_read(padap, &value, 1, (u32)(A_TP_DBG_CSIDE_RX0 + i),
1036*7e6ad469SVishal Kulkarni 			       true);
1037*7e6ad469SVishal Kulkarni 
1038*7e6ad469SVishal Kulkarni 		wtp->utx_tpcside.sop[i]   = ((value >> 28) & 0xF);/*bits 28:31*/
1039*7e6ad469SVishal Kulkarni 		wtp->utx_tpcside.eop[i]   = ((value >> 24) & 0xF);/*bits 24:27*/
1040*7e6ad469SVishal Kulkarni 		wtp->tpcside_rxarb.sop[i] = ((value >> 12) & 0xF);/*bits 12:15*/
1041*7e6ad469SVishal Kulkarni 		wtp->tpcside_rxarb.eop[i] = ((value >> 8) & 0xF); /*bits 8:11*/
1042*7e6ad469SVishal Kulkarni 	}
1043*7e6ad469SVishal Kulkarni 
1044*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
1045*7e6ad469SVishal Kulkarni 		t4_tp_pio_read(padap, &value, 1, (u32)(A_TP_DBG_ESIDE_PKT0 + i),
1046*7e6ad469SVishal Kulkarni 			       true);
1047*7e6ad469SVishal Kulkarni 
1048*7e6ad469SVishal Kulkarni 
1049*7e6ad469SVishal Kulkarni 		wtp->tpeside_mps.sop[i] = ((value >> 28) & 0xF); /*bits 28:31*/
1050*7e6ad469SVishal Kulkarni 		wtp->tpeside_mps.eop[i] = ((value >> 24) & 0xF); /*bits 24:27*/
1051*7e6ad469SVishal Kulkarni 	}
1052*7e6ad469SVishal Kulkarni 
1053*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1054*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_MPS_TX_SE_CNT_TP01 + (i << 2)));
1055*7e6ad469SVishal Kulkarni 		wtp->tp_mps.sop[(i*2)]	   = ((value >> 8) & 0xFF); /*bit 8:15*/
1056*7e6ad469SVishal Kulkarni 		wtp->tp_mps.eop[(i*2)]	   = ((value >> 0) & 0xFF); /*bit 0:7*/
1057*7e6ad469SVishal Kulkarni 		wtp->tp_mps.sop[(i*2) + 1] = ((value >> 24) & 0xFF);/*bit 24:31
1058*7e6ad469SVishal Kulkarni 								    */
1059*7e6ad469SVishal Kulkarni 		wtp->tp_mps.eop[(i*2) + 1] = ((value >> 16) & 0xFF);/*bit 16:23
1060*7e6ad469SVishal Kulkarni 								    */
1061*7e6ad469SVishal Kulkarni 	}
1062*7e6ad469SVishal Kulkarni 
1063*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1064*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_MPS_TX_SE_CNT_MAC01 + (i << 2)));
1065*7e6ad469SVishal Kulkarni 		wtp->mps_xgm.sop[(i*2)]     = ((value >> 8) & 0xFF);/*bit 8:15*/
1066*7e6ad469SVishal Kulkarni 		wtp->mps_xgm.eop[(i*2)]     = ((value >> 0) & 0xFF); /*bit 0:7*/
1067*7e6ad469SVishal Kulkarni 		wtp->mps_xgm.sop[(i*2) + 1] = ((value >> 24) & 0xFF);/*bit 24:31
1068*7e6ad469SVishal Kulkarni 								     */
1069*7e6ad469SVishal Kulkarni 		wtp->mps_xgm.eop[(i*2) + 1] = ((value >> 16) & 0xFF);/*bit 16:23
1070*7e6ad469SVishal Kulkarni 								     */
1071*7e6ad469SVishal Kulkarni 	}
1072*7e6ad469SVishal Kulkarni 
1073*7e6ad469SVishal Kulkarni 	/* Get MAC PORTx PKT COUNT*/
1074*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1075*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, 0x3081c + ((i * 4) << 12));
1076*7e6ad469SVishal Kulkarni 		wtp->mac_portx_pkt_count.sop[i] = ((value >> 24) & 0xFF);
1077*7e6ad469SVishal Kulkarni 		wtp->mac_portx_pkt_count.eop[i] = ((value >> 16) & 0xFF);
1078*7e6ad469SVishal Kulkarni 		wtp->mac_porrx_pkt_count.sop[i] = ((value >> 8) & 0xFF);
1079*7e6ad469SVishal Kulkarni 		wtp->mac_porrx_pkt_count.eop[i] = ((value >> 0) & 0xFF);
1080*7e6ad469SVishal Kulkarni 	}
1081*7e6ad469SVishal Kulkarni 
1082*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1083*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, 0x30f20 + ((i * 4) << 12));
1084*7e6ad469SVishal Kulkarni 		wtp->mac_portx_aframestra_ok.sop[i] = value & 0xff;
1085*7e6ad469SVishal Kulkarni 		wtp->mac_portx_aframestra_ok.eop[i] = value & 0xff;
1086*7e6ad469SVishal Kulkarni 	}
1087*7e6ad469SVishal Kulkarni 
1088*7e6ad469SVishal Kulkarni 	/*MAC_PORT_MTIP_1G10G_TX_etherStatsPkts*/
1089*7e6ad469SVishal Kulkarni 
1090*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1091*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, 0x30f60 + ((i * 4) << 12));
1092*7e6ad469SVishal Kulkarni 		wtp->mac_portx_etherstatspkts.sop[i] = value & 0xff;
1093*7e6ad469SVishal Kulkarni 		wtp->mac_portx_etherstatspkts.eop[i] = value & 0xff;
1094*7e6ad469SVishal Kulkarni 	}
1095*7e6ad469SVishal Kulkarni 
1096*7e6ad469SVishal Kulkarni 	/*RX path*/
1097*7e6ad469SVishal Kulkarni 
1098*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_7);
1099*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.sop[0] = ((value >> 4) & 0x0F);
1100*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.eop[0] = ((value >> 0) & 0x0F);
1101*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.sop[1] = ((value >> 12) & 0x0F);
1102*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx7.eop[1] = ((value >> 8) & 0x0F);
1103*7e6ad469SVishal Kulkarni 
1104*7e6ad469SVishal Kulkarni 	/*Get SGE debug data high index 1*/
1105*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_1);
1106*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx1.sop[0] = ((value >> 20) & 0x0F);
1107*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx1.eop[0] = ((value >> 16) & 0x0F);
1108*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx1.sop[1] = ((value >> 28) & 0x0F);
1109*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx1.eop[1] = ((value >> 24) & 0x0F);
1110*7e6ad469SVishal Kulkarni 
1111*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_SGE_DEBUG_DATA_HIGH_INDEX_9);
1112*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx9.sop[0] = ((value >> 20) & 0x0F);
1113*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx9.sop[1] = ((value >> 28) & 0x0F);
1114*7e6ad469SVishal Kulkarni 
1115*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx9.eop[0] = ((value >> 16) & 0x0F);
1116*7e6ad469SVishal Kulkarni 	wtp->sge_debug_data_high_indx9.eop[1] = ((value >> 24) & 0x0F);
1117*7e6ad469SVishal Kulkarni 
1118*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1119*7e6ad469SVishal Kulkarni 		t4_tp_pio_read(padap, &value, 1, (u32)(A_TP_DBG_CSIDE_TX0 + i),
1120*7e6ad469SVishal Kulkarni 			       true);
1121*7e6ad469SVishal Kulkarni 
1122*7e6ad469SVishal Kulkarni 		wtp->utx_tpcside_tx.sop[i] = ((value >> 28) & 0xF);/*bits 28:31
1123*7e6ad469SVishal Kulkarni 								   */
1124*7e6ad469SVishal Kulkarni 		wtp->utx_tpcside_tx.eop[i]   = ((value >> 24) & 0xF);
1125*7e6ad469SVishal Kulkarni 	}
1126*7e6ad469SVishal Kulkarni 
1127*7e6ad469SVishal Kulkarni 	/*ULP_RX input/output*/
1128*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1129*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_ULP_RX_SE_CNT_CH0 + (i*4)));
1130*7e6ad469SVishal Kulkarni 
1131*7e6ad469SVishal Kulkarni 		wtp->pmrx_ulprx.sop[i]	  = ((value >> 4) & 0xF); /*bits 4:7*/
1132*7e6ad469SVishal Kulkarni 		wtp->pmrx_ulprx.eop[i]	  = ((value >> 0) & 0xF); /*bits 0:3*/
1133*7e6ad469SVishal Kulkarni 		wtp->ulprx_tpcside.sop[i] = ((value >> 28) & 0xF);/*bits 28:31*/
1134*7e6ad469SVishal Kulkarni 		wtp->ulprx_tpcside.eop[i] = ((value >> 24) & 0xF);/*bits 24:27*/
1135*7e6ad469SVishal Kulkarni 	}
1136*7e6ad469SVishal Kulkarni 
1137*7e6ad469SVishal Kulkarni 	/*Get LE DB response count*/
1138*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, A_LE_DB_REQ_RSP_CNT);
1139*7e6ad469SVishal Kulkarni 	wtp->le_db_rsp_cnt.sop = value & 0xF;
1140*7e6ad469SVishal Kulkarni 	wtp->le_db_rsp_cnt.eop = (value >> 16) & 0xF;
1141*7e6ad469SVishal Kulkarni 
1142*7e6ad469SVishal Kulkarni 	/*Get TP debug Eside PKTx*/
1143*7e6ad469SVishal Kulkarni 	for (i = 0; i < 4; i++) {
1144*7e6ad469SVishal Kulkarni 		t4_tp_pio_read(padap, &value, 1, (u32)(A_TP_DBG_ESIDE_PKT0 + i),
1145*7e6ad469SVishal Kulkarni 			       true);
1146*7e6ad469SVishal Kulkarni 
1147*7e6ad469SVishal Kulkarni 		wtp->tp_dbg_eside_pktx.sop[i] = ((value >> 12) & 0xF);
1148*7e6ad469SVishal Kulkarni 		wtp->tp_dbg_eside_pktx.eop[i] = ((value >> 8) & 0xF);
1149*7e6ad469SVishal Kulkarni 	}
1150*7e6ad469SVishal Kulkarni 
1151*7e6ad469SVishal Kulkarni 	drop = 0;
1152*7e6ad469SVishal Kulkarni 	/*MPS_RX_SE_CNT_OUT01*/
1153*7e6ad469SVishal Kulkarni 	value = t4_read_reg(padap, (A_MPS_RX_SE_CNT_OUT01 + (i << 2)));
1154*7e6ad469SVishal Kulkarni 	wtp->mps_tp.sop[0] = ((value >> 8) & 0xFF); /*bit 8:15*/
1155*7e6ad469SVishal Kulkarni 	wtp->mps_tp.eop[0] = ((value >> 0) & 0xFF); /*bit 0:7*/
1156*7e6ad469SVishal Kulkarni 	wtp->mps_tp.sop[1] = ((value >> 24) & 0xFF); /*bit 24:31*/
1157*7e6ad469SVishal Kulkarni 	wtp->mps_tp.eop[1] = ((value >> 16) & 0xFF); /*bit 16:23*/
1158*7e6ad469SVishal Kulkarni 
1159*7e6ad469SVishal Kulkarni 	drop = ptp_mib->TP_MIB_TNL_CNG_DROP_0.value;
1160*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_TNL_CNG_DROP_1.value;
1161*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_CHN_DROP_0.value;
1162*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_CHN_DROP_1.value;
1163*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_FCOE_DROP_0.value;
1164*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_FCOE_DROP_1.value;
1165*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_VLN_DROP_0.value;
1166*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_OFD_VLN_DROP_1.value;
1167*7e6ad469SVishal Kulkarni 	drop += ptp_mib->TP_MIB_USM_DROP.value;
1168*7e6ad469SVishal Kulkarni 
1169*7e6ad469SVishal Kulkarni 	wtp->mps_tp.drops = drop;
1170*7e6ad469SVishal Kulkarni 
1171*7e6ad469SVishal Kulkarni 	drop = 0;
1172*7e6ad469SVishal Kulkarni 	for (i = 0; i < 8; i++) {
1173*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_MPS_RX_SE_CNT_IN0 + (i << 2)));
1174*7e6ad469SVishal Kulkarni 
1175*7e6ad469SVishal Kulkarni 		wtp->xgm_mps.sop[i] = ((value >> 8) & 0xFF); /*bits 8:15*/
1176*7e6ad469SVishal Kulkarni 		wtp->xgm_mps.eop[i] = ((value >> 0) & 0xFF); /*bits 0:7*/
1177*7e6ad469SVishal Kulkarni 	}
1178*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1179*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, (A_MPS_RX_CLS_DROP_CNT0 + (i << 2)));
1180*7e6ad469SVishal Kulkarni 		drop += (value & 0xFFFF) + ((value >> 16) & 0xFFFF);
1181*7e6ad469SVishal Kulkarni 	}
1182*7e6ad469SVishal Kulkarni 	wtp->xgm_mps.cls_drop = drop & 0xFF;
1183*7e6ad469SVishal Kulkarni 
1184*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1185*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, 0x30e20 + ((i * 4) << 12));
1186*7e6ad469SVishal Kulkarni 		wtp->mac_porrx_aframestra_ok.sop[i] = value & 0xff;
1187*7e6ad469SVishal Kulkarni 		wtp->mac_porrx_aframestra_ok.eop[i] = value & 0xff;
1188*7e6ad469SVishal Kulkarni 	}
1189*7e6ad469SVishal Kulkarni 
1190*7e6ad469SVishal Kulkarni 	/*MAC_PORT_MTIP_1G10G_RX_etherStatsPkts*/
1191*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1192*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap, 0x30e60 + ((i * 4) << 12));
1193*7e6ad469SVishal Kulkarni 		wtp->mac_porrx_etherstatspkts.sop[i] = value & 0xff;
1194*7e6ad469SVishal Kulkarni 		wtp->mac_porrx_etherstatspkts.eop[i] = value & 0xff;
1195*7e6ad469SVishal Kulkarni 	}
1196*7e6ad469SVishal Kulkarni 
1197*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.sop[0] = sge_dbg_reg->debug_PD_Req_Int0_cnt;
1198*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.sop[1] = sge_dbg_reg->debug_PD_Req_Int1_cnt;
1199*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.sop[2] = sge_dbg_reg->debug_PD_Req_Int2_cnt;
1200*7e6ad469SVishal Kulkarni 	wtp->sge_pcie_ints.sop[3] = sge_dbg_reg->debug_PD_Req_Int3_cnt;
1201*7e6ad469SVishal Kulkarni 
1202*7e6ad469SVishal Kulkarni 	/* Add up the overflow drops on all 4 ports.*/
1203*7e6ad469SVishal Kulkarni 	drop = 0;
1204*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1205*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1206*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_DROP_FRAME_L +
1207*7e6ad469SVishal Kulkarni 				     (i << 3)));
1208*7e6ad469SVishal Kulkarni 		drop += value;
1209*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1210*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_DROP_FRAME_L +
1211*7e6ad469SVishal Kulkarni 				     (i << 2)));
1212*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1213*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_LB_DROP_FRAME_L +
1214*7e6ad469SVishal Kulkarni 				     (i << 3)));
1215*7e6ad469SVishal Kulkarni 		drop += value;
1216*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1217*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_DROP_FRAME_L +
1218*7e6ad469SVishal Kulkarni 				     (i << 2)));
1219*7e6ad469SVishal Kulkarni 
1220*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1221*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_TRUNC_FRAME_L +
1222*7e6ad469SVishal Kulkarni 				     (i << 3)));
1223*7e6ad469SVishal Kulkarni 		drop += value;
1224*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1225*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_TRUNC_FRAME_L +
1226*7e6ad469SVishal Kulkarni 				     (i << 3)));
1227*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1228*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_LB_TRUNC_FRAME_L +
1229*7e6ad469SVishal Kulkarni 				     (i << 3)));
1230*7e6ad469SVishal Kulkarni 		drop += value;
1231*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1232*7e6ad469SVishal Kulkarni 				    (A_MPS_STAT_RX_BG_0_MAC_TRUNC_FRAME_L +
1233*7e6ad469SVishal Kulkarni 				     (i << 3)));
1234*7e6ad469SVishal Kulkarni 
1235*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1236*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_LB_PORT_DROP_FRAMES) +
1237*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
1238*7e6ad469SVishal Kulkarni 		drop += value;
1239*7e6ad469SVishal Kulkarni 	}
1240*7e6ad469SVishal Kulkarni 	wtp->xgm_mps.drop = (drop & 0xFF);
1241*7e6ad469SVishal Kulkarni 
1242*7e6ad469SVishal Kulkarni 	/* Add up the MPS errors that should result in dropped packets*/
1243*7e6ad469SVishal Kulkarni 	err = 0;
1244*7e6ad469SVishal Kulkarni 	for (i = 0; i < 2; i++) {
1245*7e6ad469SVishal Kulkarni 
1246*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1247*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_MTU_ERROR_L) +
1248*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
1249*7e6ad469SVishal Kulkarni 		err += value;
1250*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1251*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_MTU_ERROR_L) +
1252*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
1253*7e6ad469SVishal Kulkarni 
1254*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1255*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_MTU_CRC_ERROR_L) +
1256*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
1257*7e6ad469SVishal Kulkarni 		err += value;
1258*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1259*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_MTU_CRC_ERROR_L) +
1260*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
1261*7e6ad469SVishal Kulkarni 
1262*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1263*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L) +
1264*7e6ad469SVishal Kulkarni 				     (i * T5_PORT_STRIDE)));
1265*7e6ad469SVishal Kulkarni 		err += value;
1266*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1267*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L) +
1268*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
1269*7e6ad469SVishal Kulkarni 
1270*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1271*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_LEN_ERROR_L) +
1272*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
1273*7e6ad469SVishal Kulkarni 		err += value;
1274*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1275*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_LEN_ERROR_L) +
1276*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
1277*7e6ad469SVishal Kulkarni 
1278*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1279*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_SYM_ERROR_L) +
1280*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
1281*7e6ad469SVishal Kulkarni 		err += value;
1282*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1283*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_SYM_ERROR_L) +
1284*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
1285*7e6ad469SVishal Kulkarni 
1286*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1287*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_LESS_64B_L) +
1288*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE)));
1289*7e6ad469SVishal Kulkarni 		err += value;
1290*7e6ad469SVishal Kulkarni 		value = t4_read_reg(padap,
1291*7e6ad469SVishal Kulkarni 			(T5_PORT0_REG(A_MPS_PORT_STAT_RX_PORT_LESS_64B_L) +
1292*7e6ad469SVishal Kulkarni 			(i * T5_PORT_STRIDE) + 4));
1293*7e6ad469SVishal Kulkarni 	}
1294*7e6ad469SVishal Kulkarni 	wtp->xgm_mps.err = (err & 0xFF);
1295*7e6ad469SVishal Kulkarni 
1296*7e6ad469SVishal Kulkarni 	rc = write_compression_hdr(&scratch_buff, dbg_buff);
1297*7e6ad469SVishal Kulkarni 
1298*7e6ad469SVishal Kulkarni 	if (rc)
1299*7e6ad469SVishal Kulkarni 		goto err1;
1300*7e6ad469SVishal Kulkarni 
1301*7e6ad469SVishal Kulkarni 	rc = compress_buff(&scratch_buff, dbg_buff);
1302*7e6ad469SVishal Kulkarni 
1303*7e6ad469SVishal Kulkarni err1:
1304*7e6ad469SVishal Kulkarni 	release_scratch_buff(&scratch_buff, dbg_buff);
1305*7e6ad469SVishal Kulkarni err:
1306*7e6ad469SVishal Kulkarni 	return rc;
1307*7e6ad469SVishal Kulkarni }
1308*7e6ad469SVishal Kulkarni 
1309*7e6ad469SVishal Kulkarni int
collect_wtp_data(struct cudbg_init * pdbg_init,struct cudbg_buffer * dbg_buff,struct cudbg_error * cudbg_err)1310*7e6ad469SVishal Kulkarni collect_wtp_data(struct cudbg_init *pdbg_init,
1311*7e6ad469SVishal Kulkarni 		 struct cudbg_buffer *dbg_buff,
1312*7e6ad469SVishal Kulkarni 		 struct cudbg_error *cudbg_err)
1313*7e6ad469SVishal Kulkarni {
1314*7e6ad469SVishal Kulkarni 	struct adapter *padap = pdbg_init->adap;
1315*7e6ad469SVishal Kulkarni 	int rc = -1;
1316*7e6ad469SVishal Kulkarni 
1317*7e6ad469SVishal Kulkarni 	if (is_t5(padap->params.chip))
1318*7e6ad469SVishal Kulkarni 		rc = t5_wtp_data(pdbg_init, dbg_buff, cudbg_err);
1319*7e6ad469SVishal Kulkarni 	else if (is_t6(padap->params.chip))
1320*7e6ad469SVishal Kulkarni 		rc = t6_wtp_data(pdbg_init, dbg_buff, cudbg_err);
1321*7e6ad469SVishal Kulkarni 
1322*7e6ad469SVishal Kulkarni 	return rc;
1323*7e6ad469SVishal Kulkarni }
1324