xref: /illumos-gate/usr/src/uts/common/io/bnxe/577xx/drivers/common/lm/device/lm_stats.c (revision d14abf155341d55053c76eeec58b787a456b753b)
1*d14abf15SRobert Mustacchi /*******************************************************************************
2*d14abf15SRobert Mustacchi  * CDDL HEADER START
3*d14abf15SRobert Mustacchi  *
4*d14abf15SRobert Mustacchi  * The contents of this file are subject to the terms of the
5*d14abf15SRobert Mustacchi  * Common Development and Distribution License (the "License").
6*d14abf15SRobert Mustacchi  * You may not use this file except in compliance with the License.
7*d14abf15SRobert Mustacchi  *
8*d14abf15SRobert Mustacchi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d14abf15SRobert Mustacchi  * or http://www.opensolaris.org/os/licensing.
10*d14abf15SRobert Mustacchi  * See the License for the specific language governing permissions
11*d14abf15SRobert Mustacchi  * and limitations under the License.
12*d14abf15SRobert Mustacchi  *
13*d14abf15SRobert Mustacchi  * When distributing Covered Code, include this CDDL HEADER in each
14*d14abf15SRobert Mustacchi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d14abf15SRobert Mustacchi  * If applicable, add the following below this CDDL HEADER, with the
16*d14abf15SRobert Mustacchi  * fields enclosed by brackets "[]" replaced with your own identifying
17*d14abf15SRobert Mustacchi  * information: Portions Copyright [yyyy] [name of copyright owner]
18*d14abf15SRobert Mustacchi  *
19*d14abf15SRobert Mustacchi  * CDDL HEADER END
20*d14abf15SRobert Mustacchi  *
21*d14abf15SRobert Mustacchi  * Copyright 2014 QLogic Corporation
22*d14abf15SRobert Mustacchi  * The contents of this file are subject to the terms of the
23*d14abf15SRobert Mustacchi  * QLogic End User License (the "License").
24*d14abf15SRobert Mustacchi  * You may not use this file except in compliance with the License.
25*d14abf15SRobert Mustacchi  *
26*d14abf15SRobert Mustacchi  * You can obtain a copy of the License at
27*d14abf15SRobert Mustacchi  * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
28*d14abf15SRobert Mustacchi  * QLogic_End_User_Software_License.txt
29*d14abf15SRobert Mustacchi  * See the License for the specific language governing permissions
30*d14abf15SRobert Mustacchi  * and limitations under the License.
31*d14abf15SRobert Mustacchi  *
32*d14abf15SRobert Mustacchi  *
33*d14abf15SRobert Mustacchi  * Module Description:
34*d14abf15SRobert Mustacchi  *
35*d14abf15SRobert Mustacchi  *
36*d14abf15SRobert Mustacchi  * History:
37*d14abf15SRobert Mustacchi  *    02/05/07 Alon Elhanani    Inception.
38*d14abf15SRobert Mustacchi  ******************************************************************************/
39*d14abf15SRobert Mustacchi 
40*d14abf15SRobert Mustacchi 
41*d14abf15SRobert Mustacchi #include "lm5710.h"
42*d14abf15SRobert Mustacchi #include "license.h"
43*d14abf15SRobert Mustacchi #include "mcp_shmem.h"
44*d14abf15SRobert Mustacchi #include "command.h"
45*d14abf15SRobert Mustacchi #include "debug.h"
46*d14abf15SRobert Mustacchi 
47*d14abf15SRobert Mustacchi // does HW statistics is active
48*d14abf15SRobert Mustacchi // only if we are PMF && collect_enabled is on!
49*d14abf15SRobert Mustacchi #define LM_STATS_IS_HW_ACTIVE(_pdev) ( _pdev->vars.stats.stats_collect.stats_hw.b_collect_enabled && \
50*d14abf15SRobert Mustacchi                                        IS_PMF(_pdev) )
51*d14abf15SRobert Mustacchi 
52*d14abf15SRobert Mustacchi // do _cmd statement only if in SF mode
53*d14abf15SRobert Mustacchi // we use this macro since in MF mode we don't maintain non-mandatory statistics so to prevent inconsistently - we don't use them at all
54*d14abf15SRobert Mustacchi #define LM_STATS_DO_IF_SF(_pdev,_cmd) if( !_pdev->hw_info.mf_info.multi_vnics_mode ){ _cmd; } ;
55*d14abf15SRobert Mustacchi 
56*d14abf15SRobert Mustacchi #define LM_STATS_64_TO_HI_LO( _x_64_, _hi_lo ) ( _hi_lo##_hi = (u32_t)U64_HI( _x_64_ ) ); ( _hi_lo##_lo = (u32_t)U64_LO( _x_64_ ) );
57*d14abf15SRobert Mustacchi #define LM_STATS_HI_LO_TO_64( _hi_lo, _x_64_ ) ( _x_64_ = (((u64_t)(_hi_lo##_hi) << 32) | (_hi_lo##_lo)) )
58*d14abf15SRobert Mustacchi 
59*d14abf15SRobert Mustacchi /**
60*d14abf15SRobert Mustacchi  * driver stats are stored as 64bits where the lower bits store
61*d14abf15SRobert Mustacchi  * the value and the upper bits store the wraparound count.
62*d14abf15SRobert Mustacchi  * different stat fields are stored with different data sizes
63*d14abf15SRobert Mustacchi  * and the following macros help in storing values in the
64*d14abf15SRobert Mustacchi  * "overflow count" part of a 64bit value and seperating it from
65*d14abf15SRobert Mustacchi  * the actual data.
66*d14abf15SRobert Mustacchi   */
67*d14abf15SRobert Mustacchi #define DATA_MASK(_bits) (((u64_t)-1)>>(64-_bits))
68*d14abf15SRobert Mustacchi #define STATS_DATA(_bits,_val) ( (_val) & DATA_MASK(_bits) )
69*d14abf15SRobert Mustacchi #define WRAPAROUND_COUNT_MASK(_bits) ( ~ DATA_MASK(_bits) )
70*d14abf15SRobert Mustacchi #define HAS_WRAPPED_AROUND(_bits,_old,_new) ((STATS_DATA(_bits,_old) ) > (STATS_DATA(_bits,_new) ))
71*d14abf15SRobert Mustacchi #define INC_WRAPAROUND_COUNT(_bits,_val) (_val + ( 1ull << _bits ) )
72*d14abf15SRobert Mustacchi 
73*d14abf15SRobert Mustacchi /**lm_update_wraparound_if_needed
74*d14abf15SRobert Mustacchi  * This function checks the old and new values, and returns a
75*d14abf15SRobert Mustacchi  * either the new data with the old wraparound count, or (if a
76*d14abf15SRobert Mustacchi  * wraparound has occured) the new data with an incremented
77*d14abf15SRobert Mustacchi  * wraparound count.
78*d14abf15SRobert Mustacchi  *
79*d14abf15SRobert Mustacchi  * val_current can be given in either little-endian or
80*d14abf15SRobert Mustacchi  * big-endian byte ordering. the values returned are always in
81*d14abf15SRobert Mustacchi  * host byte order.
82*d14abf15SRobert Mustacchi  *
83*d14abf15SRobert Mustacchi  * @param data_bits the number of data bits in the values
84*d14abf15SRobert Mustacchi  * @param val_current the newly collected value. the byte
85*d14abf15SRobert Mustacchi  *                    ordering is detemined by
86*d14abf15SRobert Mustacchi  *                    @param b_swap_bytes
87*d14abf15SRobert Mustacchi  * @param val_prev the the previously saved value in host byte
88*d14abf15SRobert Mustacchi  *                 order
89*d14abf15SRobert Mustacchi  * @param b_swap_bytes TRUE if val_current is byte-swapped (i.e
90*d14abf15SRobert Mustacchi  *                     given as little-endian on a big-endian
91*d14abf15SRobert Mustacchi  *                     machine), FALSE otherwise.
92*d14abf15SRobert Mustacchi  *
93*d14abf15SRobert Mustacchi  * @return u64_t the new data with an appropriate wraparound
94*d14abf15SRobert Mustacchi  *         count.
95*d14abf15SRobert Mustacchi  */
96*d14abf15SRobert Mustacchi 
lm_update_wraparound_if_needed(u8_t data_bits,u64_t val_current,u64_t val_prev,u8_t b_swap_bytes)97*d14abf15SRobert Mustacchi static u64_t lm_update_wraparound_if_needed(u8_t data_bits, u64_t val_current, u64_t val_prev, u8_t b_swap_bytes)
98*d14abf15SRobert Mustacchi {
99*d14abf15SRobert Mustacchi     if(b_swap_bytes)
100*d14abf15SRobert Mustacchi     {
101*d14abf15SRobert Mustacchi         /*We assume that only 32bit stats will ever need to be byte-swapped. this is because
102*d14abf15SRobert Mustacchi           all HW data is byte-swapped by DMAE as needed, and the 64bit FW stats are swapped
103*d14abf15SRobert Mustacchi           by the REGPAIR macros.*/
104*d14abf15SRobert Mustacchi         DbgBreakIf(data_bits != 32);
105*d14abf15SRobert Mustacchi         val_current=mm_le32_to_cpu(val_current);
106*d14abf15SRobert Mustacchi     }
107*d14abf15SRobert Mustacchi     if (HAS_WRAPPED_AROUND(data_bits,val_prev,val_current))
108*d14abf15SRobert Mustacchi     {
109*d14abf15SRobert Mustacchi         val_prev=INC_WRAPAROUND_COUNT(data_bits,val_prev);
110*d14abf15SRobert Mustacchi     }
111*d14abf15SRobert Mustacchi     return ((val_prev & WRAPAROUND_COUNT_MASK(data_bits)) |
112*d14abf15SRobert Mustacchi             (val_current & DATA_MASK(data_bits))); /*take the overflow count we calculated, and the data from the new value*/
113*d14abf15SRobert Mustacchi }
114*d14abf15SRobert Mustacchi 
115*d14abf15SRobert Mustacchi /**
116*d14abf15SRobert Mustacchi  * The following macros handle the wraparound-count for FW
117*d14abf15SRobert Mustacchi  * stats. Note that in the 32bit case (i.e any stats that are
118*d14abf15SRobert Mustacchi  * not REGPAIRs), the bytes have to swapped if the host byte
119*d14abf15SRobert Mustacchi  * order is not little-endian.
120*d14abf15SRobert Mustacchi  */
121*d14abf15SRobert Mustacchi #define LM_SIGN_EXTEND_VALUE_32( val_current_32, val_prev_64 ) \
122*d14abf15SRobert Mustacchi     val_prev_64 = lm_update_wraparound_if_needed( 32, val_current_32, val_prev_64, CHANGE_ENDIANITY )
123*d14abf15SRobert Mustacchi #define LM_SIGN_EXTEND_VALUE_36( val_current_36, val_prev_64 ) \
124*d14abf15SRobert Mustacchi     val_prev_64 = lm_update_wraparound_if_needed( 36, val_current_36, val_prev_64, FALSE)
125*d14abf15SRobert Mustacchi #define LM_SIGN_EXTEND_VALUE_42( val_current_42, val_prev_64 ) \
126*d14abf15SRobert Mustacchi     val_prev_64 = lm_update_wraparound_if_needed( 42, val_current_42, val_prev_64, FALSE )
127*d14abf15SRobert Mustacchi 
128*d14abf15SRobert Mustacchi 
129*d14abf15SRobert Mustacchi 
130*d14abf15SRobert Mustacchi /* function checks if there is a pending completion for statistics and a pending dpc to handle the completion:
131*d14abf15SRobert Mustacchi  * for cases where VBD gets a bit starved - we don't want to assert if chip isn't stuck and we have a pending completion
132*d14abf15SRobert Mustacchi  */
133*d14abf15SRobert Mustacchi u8_t is_pending_stats_completion(struct _lm_device_t * pdev);
134*d14abf15SRobert Mustacchi 
135*d14abf15SRobert Mustacchi lm_status_t lm_stats_hw_collect( struct _lm_device_t *pdev );
136*d14abf15SRobert Mustacchi 
137*d14abf15SRobert Mustacchi #ifdef _VBD_CMD_
138*d14abf15SRobert Mustacchi extern volatile u32_t* g_everest_sim_flags_ptr;
139*d14abf15SRobert Mustacchi #define EVEREST_SIM_STATS       0x02
140*d14abf15SRobert Mustacchi #endif
141*d14abf15SRobert Mustacchi 
142*d14abf15SRobert Mustacchi 
143*d14abf15SRobert Mustacchi /*******************************************************************************
144*d14abf15SRobert Mustacchi  * Description:
145*d14abf15SRobert Mustacchi  *
146*d14abf15SRobert Mustacchi  * Return:
147*d14abf15SRobert Mustacchi  ******************************************************************************/
148*d14abf15SRobert Mustacchi lm_status_t
lm_get_stats(lm_device_t * pdev,lm_stats_t stats_type,u64_t * stats_cnt,lm_vf_info_t * vf_info)149*d14abf15SRobert Mustacchi lm_get_stats( lm_device_t* pdev,
150*d14abf15SRobert Mustacchi               lm_stats_t   stats_type,
151*d14abf15SRobert Mustacchi               u64_t*       stats_cnt
152*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
153*d14abf15SRobert Mustacchi               ,lm_vf_info_t * vf_info
154*d14abf15SRobert Mustacchi #endif
155*d14abf15SRobert Mustacchi               )
156*d14abf15SRobert Mustacchi {
157*d14abf15SRobert Mustacchi     lm_status_t lm_status    = LM_STATUS_SUCCESS;
158*d14abf15SRobert Mustacchi     lm_u64_t*   stats        = (lm_u64_t *)stats_cnt;
159*d14abf15SRobert Mustacchi     const u32_t i            = LM_CLI_IDX_NDIS;
160*d14abf15SRobert Mustacchi    lm_stats_fw_t* stats_fw  = NULL;
161*d14abf15SRobert Mustacchi 
162*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
163*d14abf15SRobert Mustacchi    if (vf_info != NULL) {
164*d14abf15SRobert Mustacchi            stats_fw = (lm_stats_fw_t*)vf_info->vf_stats.mirror_stats_fw;
165*d14abf15SRobert Mustacchi            vf_info->vf_stats.vf_exracted_stats_cnt++;
166*d14abf15SRobert Mustacchi    } else
167*d14abf15SRobert Mustacchi #endif
168*d14abf15SRobert Mustacchi    {
169*d14abf15SRobert Mustacchi            stats_fw = &pdev->vars.stats.stats_mirror.stats_fw;
170*d14abf15SRobert Mustacchi    }
171*d14abf15SRobert Mustacchi 
172*d14abf15SRobert Mustacchi     switch(stats_type)
173*d14abf15SRobert Mustacchi     {
174*d14abf15SRobert Mustacchi         case LM_STATS_FRAMES_XMITTED_OK:
175*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_xstorm_common.client_statistics[i].total_sent_pkts ;
176*d14abf15SRobert Mustacchi             // ioc IfHCOutPkts
177*d14abf15SRobert Mustacchi             break;
178*d14abf15SRobert Mustacchi         case LM_STATS_FRAMES_RECEIVED_OK:
179*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_tstorm_common.client_statistics[i].rcv_broadcast_pkts +
180*d14abf15SRobert Mustacchi                             stats_fw->eth_tstorm_common.client_statistics[i].rcv_multicast_pkts +
181*d14abf15SRobert Mustacchi                             stats_fw->eth_tstorm_common.client_statistics[i].rcv_unicast_pkts ;
182*d14abf15SRobert Mustacchi             stats->as_u64-= stats_fw->eth_ustorm_common.client_statistics[i].ucast_no_buff_pkts ;
183*d14abf15SRobert Mustacchi             stats->as_u64-= stats_fw->eth_ustorm_common.client_statistics[i].mcast_no_buff_pkts ;
184*d14abf15SRobert Mustacchi             stats->as_u64-= stats_fw->eth_ustorm_common.client_statistics[i].bcast_no_buff_pkts ;
185*d14abf15SRobert Mustacchi             // ioc IfHCInPkts
186*d14abf15SRobert Mustacchi             break;
187*d14abf15SRobert Mustacchi         case LM_STATS_ERRORED_RECEIVE_CNT:
188*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
189*d14abf15SRobert Mustacchi                    DbgBreakIf(vf_info);
190*d14abf15SRobert Mustacchi #endif
191*d14abf15SRobert Mustacchi #define LM_STATS_ERROR_DISCARD_SUM( _pdev, _i )  _pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[_i].checksum_discard + \
192*d14abf15SRobert Mustacchi                                                  _pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[_i].packets_too_big_discard + \
193*d14abf15SRobert Mustacchi                                                  _pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.port_statistics.mac_discard + \
194*d14abf15SRobert Mustacchi                                                  LM_STATS_HW_GET_MACS_U64(_pdev, stats_rx.rx_stat_dot3statsframestoolong )
195*d14abf15SRobert Mustacchi             stats->as_u64 = LM_STATS_ERROR_DISCARD_SUM( pdev, i ) ;
196*d14abf15SRobert Mustacchi            break;
197*d14abf15SRobert Mustacchi         case LM_STATS_RCV_CRC_ERROR:
198*d14abf15SRobert Mustacchi             // Spec. 9
199*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
200*d14abf15SRobert Mustacchi                    DbgBreakIf(vf_info);
201*d14abf15SRobert Mustacchi #endif
202*d14abf15SRobert Mustacchi             stats->as_u64 = LM_STATS_HW_GET_MACS_U64(pdev, stats_rx.rx_stat_dot3statsfcserrors) ;
203*d14abf15SRobert Mustacchi             // ioc Dot3StatsFCSErrors
204*d14abf15SRobert Mustacchi             break;
205*d14abf15SRobert Mustacchi         case LM_STATS_ALIGNMENT_ERROR:
206*d14abf15SRobert Mustacchi             // Spec. 10
207*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
208*d14abf15SRobert Mustacchi                    DbgBreakIf(vf_info);
209*d14abf15SRobert Mustacchi #endif
210*d14abf15SRobert Mustacchi             if( !IS_PMF(pdev))
211*d14abf15SRobert Mustacchi             {
212*d14abf15SRobert Mustacchi                 stats->as_u64 = 0 ;
213*d14abf15SRobert Mustacchi             }
214*d14abf15SRobert Mustacchi             else
215*d14abf15SRobert Mustacchi             {
216*d14abf15SRobert Mustacchi                 stats->as_u64 =  LM_STATS_HW_GET_MACS_U64(pdev, stats_rx.rx_stat_dot3statsalignmenterrors) ;
217*d14abf15SRobert Mustacchi             }
218*d14abf15SRobert Mustacchi             // ioc Dot3StatsAlignmentErrors
219*d14abf15SRobert Mustacchi             break;
220*d14abf15SRobert Mustacchi         case LM_STATS_SINGLE_COLLISION_FRAMES:
221*d14abf15SRobert Mustacchi             // Spec. 18
222*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
223*d14abf15SRobert Mustacchi                    DbgBreakIf(vf_info);
224*d14abf15SRobert Mustacchi #endif
225*d14abf15SRobert Mustacchi             if( !IS_PMF(pdev) )
226*d14abf15SRobert Mustacchi             {
227*d14abf15SRobert Mustacchi                 stats->as_u64 = 0 ;
228*d14abf15SRobert Mustacchi             }
229*d14abf15SRobert Mustacchi             else
230*d14abf15SRobert Mustacchi             {
231*d14abf15SRobert Mustacchi                 stats->as_u64 =  LM_STATS_HW_GET_MACS_U64(pdev, stats_tx.tx_stat_dot3statssinglecollisionframes ) ;
232*d14abf15SRobert Mustacchi             }
233*d14abf15SRobert Mustacchi             // ioc Dot3StatsSingleCollisionFrames
234*d14abf15SRobert Mustacchi             break;
235*d14abf15SRobert Mustacchi         case LM_STATS_MULTIPLE_COLLISION_FRAMES:
236*d14abf15SRobert Mustacchi             // Spec. 19
237*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
238*d14abf15SRobert Mustacchi                    DbgBreakIf(vf_info);
239*d14abf15SRobert Mustacchi #endif
240*d14abf15SRobert Mustacchi             if( !IS_PMF(pdev) )
241*d14abf15SRobert Mustacchi             {
242*d14abf15SRobert Mustacchi                 stats->as_u64 = 0 ;
243*d14abf15SRobert Mustacchi             }
244*d14abf15SRobert Mustacchi             else
245*d14abf15SRobert Mustacchi             {
246*d14abf15SRobert Mustacchi                 stats->as_u64 =  LM_STATS_HW_GET_MACS_U64(pdev, stats_tx.tx_stat_dot3statsmultiplecollisionframes ) ;
247*d14abf15SRobert Mustacchi             }
248*d14abf15SRobert Mustacchi             // ioc Dot3StatsMultipleCollisionFrame
249*d14abf15SRobert Mustacchi             break;
250*d14abf15SRobert Mustacchi         case LM_STATS_FRAMES_DEFERRED:
251*d14abf15SRobert Mustacchi             // Spec. 40 (not in mini port)
252*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
253*d14abf15SRobert Mustacchi                    DbgBreakIf(vf_info);
254*d14abf15SRobert Mustacchi #endif
255*d14abf15SRobert Mustacchi             stats->as_u64 =  LM_STATS_HW_GET_MACS_U64(pdev, stats_tx.tx_stat_dot3statsdeferredtransmissions ) ;
256*d14abf15SRobert Mustacchi             // ioc Dot3StatsDeferredTransmissions
257*d14abf15SRobert Mustacchi             break;
258*d14abf15SRobert Mustacchi         case LM_STATS_MAX_COLLISIONS:
259*d14abf15SRobert Mustacchi             // Spec. 21
260*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
261*d14abf15SRobert Mustacchi                    DbgBreakIf(vf_info);
262*d14abf15SRobert Mustacchi #endif
263*d14abf15SRobert Mustacchi             stats->as_u64 = LM_STATS_HW_GET_MACS_U64(pdev, stats_tx.tx_stat_dot3statsexcessivecollisions ) ;
264*d14abf15SRobert Mustacchi             // ioc Dot3StatsExcessiveCollisions
265*d14abf15SRobert Mustacchi             break;
266*d14abf15SRobert Mustacchi         case LM_STATS_UNICAST_FRAMES_XMIT:
267*d14abf15SRobert Mustacchi             // Spec. 6
268*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_xstorm_common.client_statistics[i].unicast_pkts_sent ;
269*d14abf15SRobert Mustacchi             break;
270*d14abf15SRobert Mustacchi         case LM_STATS_MULTICAST_FRAMES_XMIT:
271*d14abf15SRobert Mustacchi             // Spec. 7
272*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_xstorm_common.client_statistics[i].multicast_pkts_sent ;
273*d14abf15SRobert Mustacchi             break;
274*d14abf15SRobert Mustacchi         case LM_STATS_BROADCAST_FRAMES_XMIT:
275*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_xstorm_common.client_statistics[i].broadcast_pkts_sent ;
276*d14abf15SRobert Mustacchi             break;
277*d14abf15SRobert Mustacchi         case LM_STATS_UNICAST_FRAMES_RCV:
278*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_tstorm_common.client_statistics[i].rcv_unicast_pkts ;
279*d14abf15SRobert Mustacchi             break;
280*d14abf15SRobert Mustacchi         case LM_STATS_MULTICAST_FRAMES_RCV:
281*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_tstorm_common.client_statistics[i].rcv_multicast_pkts ;
282*d14abf15SRobert Mustacchi             break;
283*d14abf15SRobert Mustacchi         case LM_STATS_BROADCAST_FRAMES_RCV:
284*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_tstorm_common.client_statistics[i].rcv_broadcast_pkts ;
285*d14abf15SRobert Mustacchi             break;
286*d14abf15SRobert Mustacchi         case LM_STATS_ERRORED_TRANSMIT_CNT:
287*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
288*d14abf15SRobert Mustacchi                    DbgBreakIf(vf_info);
289*d14abf15SRobert Mustacchi #endif
290*d14abf15SRobert Mustacchi             if( !IS_PMF(pdev) )
291*d14abf15SRobert Mustacchi             {
292*d14abf15SRobert Mustacchi                 stats->as_u64 = 0 ;
293*d14abf15SRobert Mustacchi             }
294*d14abf15SRobert Mustacchi             else
295*d14abf15SRobert Mustacchi             {
296*d14abf15SRobert Mustacchi                 stats->as_u64 =  LM_STATS_HW_GET_MACS_U64(pdev, stats_tx.tx_stat_dot3statsinternalmactransmiterrors ) ;
297*d14abf15SRobert Mustacchi             }
298*d14abf15SRobert Mustacchi             break;
299*d14abf15SRobert Mustacchi         case LM_STATS_RCV_OVERRUN:
300*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
301*d14abf15SRobert Mustacchi                    DbgBreakIf(vf_info);
302*d14abf15SRobert Mustacchi #endif
303*d14abf15SRobert Mustacchi             stats->as_u64 =  pdev->vars.stats.stats_mirror.stats_hw.nig.brb_discard ;
304*d14abf15SRobert Mustacchi             stats->as_u64+=  pdev->vars.stats.stats_mirror.stats_hw.nig.brb_truncate ;
305*d14abf15SRobert Mustacchi             stats->as_u64+=  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.port_statistics.xxoverflow_discard ;
306*d14abf15SRobert Mustacchi             break;
307*d14abf15SRobert Mustacchi         case LM_STATS_XMIT_UNDERRUN:
308*d14abf15SRobert Mustacchi             //These counters are always zero
309*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
310*d14abf15SRobert Mustacchi                    DbgBreakIf(vf_info);
311*d14abf15SRobert Mustacchi #endif
312*d14abf15SRobert Mustacchi             stats->as_u64 = 0;
313*d14abf15SRobert Mustacchi             break;
314*d14abf15SRobert Mustacchi         case LM_STATS_RCV_NO_BUFFER_DROP:
315*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_tstorm_common.client_statistics[i].no_buff_discard ;
316*d14abf15SRobert Mustacchi             stats->as_u64+= stats_fw->eth_ustorm_common.client_statistics[i].ucast_no_buff_pkts ;
317*d14abf15SRobert Mustacchi             stats->as_u64+= stats_fw->eth_ustorm_common.client_statistics[i].mcast_no_buff_pkts ;
318*d14abf15SRobert Mustacchi             stats->as_u64+= stats_fw->eth_ustorm_common.client_statistics[i].bcast_no_buff_pkts ;
319*d14abf15SRobert Mustacchi             // ioc IfInMBUFDiscards
320*d14abf15SRobert Mustacchi             break;
321*d14abf15SRobert Mustacchi         case LM_STATS_BYTES_RCV:
322*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_tstorm_common.client_statistics[i].rcv_broadcast_bytes +
323*d14abf15SRobert Mustacchi                             stats_fw->eth_tstorm_common.client_statistics[i].rcv_multicast_bytes +
324*d14abf15SRobert Mustacchi                             stats_fw->eth_tstorm_common.client_statistics[i].rcv_unicast_bytes ;
325*d14abf15SRobert Mustacchi             //  ioc IfHCInOctets
326*d14abf15SRobert Mustacchi             break;
327*d14abf15SRobert Mustacchi         case LM_STATS_BYTES_XMIT:
328*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_xstorm_common.client_statistics[i].total_sent_bytes ;
329*d14abf15SRobert Mustacchi             // ioc IfHCOutOctets
330*d14abf15SRobert Mustacchi             break;
331*d14abf15SRobert Mustacchi         case LM_STATS_IF_IN_DISCARDS:
332*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
333*d14abf15SRobert Mustacchi                if (vf_info != NULL)
334*d14abf15SRobert Mustacchi                {
335*d14abf15SRobert Mustacchi                        stats->as_u64 = 0;
336*d14abf15SRobert Mustacchi                }
337*d14abf15SRobert Mustacchi                else
338*d14abf15SRobert Mustacchi #endif
339*d14abf15SRobert Mustacchi                {
340*d14abf15SRobert Mustacchi                    stats->as_u64 = LM_STATS_ERROR_DISCARD_SUM( pdev, i ) ;                            // LM_STATS_ERRORED_RECEIVE_CNT
341*d14abf15SRobert Mustacchi                }
342*d14abf15SRobert Mustacchi                 stats->as_u64+= stats_fw->eth_tstorm_common.client_statistics[i].no_buff_discard ;    // LM_STATS_RCV_NO_BUFFER_DROP
343*d14abf15SRobert Mustacchi                 stats->as_u64+= stats_fw->eth_ustorm_common.client_statistics[i].ucast_no_buff_pkts ; // LM_STATS_RCV_NO_BUFFER_DROP
344*d14abf15SRobert Mustacchi                 stats->as_u64+= stats_fw->eth_ustorm_common.client_statistics[i].mcast_no_buff_pkts ; // LM_STATS_RCV_NO_BUFFER_DROP
345*d14abf15SRobert Mustacchi                 stats->as_u64+= stats_fw->eth_ustorm_common.client_statistics[i].bcast_no_buff_pkts ; // LM_STATS_RCV_NO_BUFFER_DROP
346*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
347*d14abf15SRobert Mustacchi                 if (vf_info == NULL)
348*d14abf15SRobert Mustacchi #endif
349*d14abf15SRobert Mustacchi                 {
350*d14abf15SRobert Mustacchi                     stats->as_u64+= pdev->vars.stats.stats_mirror.stats_hw.nig.brb_discard ;   // LM_STATS_RCV_OVERRUN
351*d14abf15SRobert Mustacchi                     stats->as_u64+= pdev->vars.stats.stats_mirror.stats_hw.nig.brb_truncate ;  // LM_STATS_RCV_OVERRUN
352*d14abf15SRobert Mustacchi                 }
353*d14abf15SRobert Mustacchi                 stats->as_u64+= stats_fw->eth_tstorm_common.port_statistics.xxoverflow_discard ; // LM_STATS_RCV_OVERRUN
354*d14abf15SRobert Mustacchi             break;
355*d14abf15SRobert Mustacchi         case LM_STATS_MULTICAST_BYTES_RCV:
356*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_tstorm_common.client_statistics[i].rcv_multicast_bytes ;
357*d14abf15SRobert Mustacchi             break;
358*d14abf15SRobert Mustacchi         case LM_STATS_DIRECTED_BYTES_RCV:
359*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_tstorm_common.client_statistics[i].rcv_unicast_bytes ;
360*d14abf15SRobert Mustacchi             break;
361*d14abf15SRobert Mustacchi         case LM_STATS_BROADCAST_BYTES_RCV:
362*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_tstorm_common.client_statistics[i].rcv_broadcast_bytes ;
363*d14abf15SRobert Mustacchi             break;
364*d14abf15SRobert Mustacchi         case LM_STATS_DIRECTED_BYTES_XMIT:
365*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_xstorm_common.client_statistics[i].unicast_bytes_sent ;
366*d14abf15SRobert Mustacchi             break;
367*d14abf15SRobert Mustacchi         case LM_STATS_MULTICAST_BYTES_XMIT:
368*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_xstorm_common.client_statistics[i].multicast_bytes_sent ;
369*d14abf15SRobert Mustacchi             break;
370*d14abf15SRobert Mustacchi         case LM_STATS_BROADCAST_BYTES_XMIT:
371*d14abf15SRobert Mustacchi             stats->as_u64 = stats_fw->eth_xstorm_common.client_statistics[i].broadcast_bytes_sent ;
372*d14abf15SRobert Mustacchi             break;
373*d14abf15SRobert Mustacchi /*
374*d14abf15SRobert Mustacchi         case LM_STATS_IF_IN_ERRORS:
375*d14abf15SRobert Mustacchi         case LM_STATS_IF_OUT_ERRORS:
376*d14abf15SRobert Mustacchi             stats->as_u32.low = 0;
377*d14abf15SRobert Mustacchi             stats->as_u32.high = 0;
378*d14abf15SRobert Mustacchi             break;
379*d14abf15SRobert Mustacchi */
380*d14abf15SRobert Mustacchi         default:
381*d14abf15SRobert Mustacchi            stats->as_u64 = 0 ;
382*d14abf15SRobert Mustacchi             lm_status = LM_STATUS_INVALID_PARAMETER;
383*d14abf15SRobert Mustacchi             break;
384*d14abf15SRobert Mustacchi     }
385*d14abf15SRobert Mustacchi     //DbgMessage(pdev, WARN, "lm_get_stats: stats_type=0x%X val=%d\n", stats_type, stats->as_u64);
386*d14abf15SRobert Mustacchi     return lm_status;
387*d14abf15SRobert Mustacchi } /* lm_get_stats */
388*d14abf15SRobert Mustacchi /*******************************************************************************
389*d14abf15SRobert Mustacchi  * Description:
390*d14abf15SRobert Mustacchi  *  Zero the mirror statistics (probably after miniport was down in windows, 'driver unload' on ediag)
391*d14abf15SRobert Mustacchi  *
392*d14abf15SRobert Mustacchi  * Return:
393*d14abf15SRobert Mustacchi  ******************************************************************************/
lm_stats_reset(struct _lm_device_t * pdev)394*d14abf15SRobert Mustacchi void lm_stats_reset( struct _lm_device_t* pdev)
395*d14abf15SRobert Mustacchi {
396*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "Zero 'mirror' statistics...\n");
397*d14abf15SRobert Mustacchi     mm_mem_zero( &pdev->vars.stats.stats_mirror, sizeof(pdev->vars.stats.stats_mirror) ) ;
398*d14abf15SRobert Mustacchi }
399*d14abf15SRobert Mustacchi 
400*d14abf15SRobert Mustacchi /*
401*d14abf15SRobert Mustacchi  * lm_edebug_if_is_stats_disabled returns TRUE if statistics gathering is
402*d14abf15SRobert Mustacchi  * disabled according to edebug-driver interface implemented through SHMEM2
403*d14abf15SRobert Mustacchi  * field named edebug_driver_if. Otherwise, return FALSE.
404*d14abf15SRobert Mustacchi */
405*d14abf15SRobert Mustacchi static u32_t
lm_edebug_if_is_stats_disabled(struct _lm_device_t * pdev)406*d14abf15SRobert Mustacchi lm_edebug_if_is_stats_disabled(struct _lm_device_t * pdev)
407*d14abf15SRobert Mustacchi {
408*d14abf15SRobert Mustacchi     u32_t shmem2_size;
409*d14abf15SRobert Mustacchi     u32_t offset = OFFSETOF(shmem2_region_t, edebug_driver_if[1]);
410*d14abf15SRobert Mustacchi     u32_t val;
411*d14abf15SRobert Mustacchi 
412*d14abf15SRobert Mustacchi     if (pdev->hw_info.shmem_base2 != 0)
413*d14abf15SRobert Mustacchi     {
414*d14abf15SRobert Mustacchi         LM_SHMEM2_READ(pdev, OFFSETOF(shmem2_region_t, size), &shmem2_size);
415*d14abf15SRobert Mustacchi 
416*d14abf15SRobert Mustacchi         if (shmem2_size > offset)
417*d14abf15SRobert Mustacchi         {
418*d14abf15SRobert Mustacchi             LM_SHMEM2_READ(pdev, offset, &val);
419*d14abf15SRobert Mustacchi 
420*d14abf15SRobert Mustacchi 
421*d14abf15SRobert Mustacchi             if (val == EDEBUG_DRIVER_IF_OP_CODE_DISABLE_STAT)
422*d14abf15SRobert Mustacchi             {
423*d14abf15SRobert Mustacchi                 return TRUE;
424*d14abf15SRobert Mustacchi             }
425*d14abf15SRobert Mustacchi         }
426*d14abf15SRobert Mustacchi     }
427*d14abf15SRobert Mustacchi 
428*d14abf15SRobert Mustacchi     return FALSE;
429*d14abf15SRobert Mustacchi }
430*d14abf15SRobert Mustacchi 
431*d14abf15SRobert Mustacchi 
lm_stats_fw_post_request(lm_device_t * pdev)432*d14abf15SRobert Mustacchi static lm_status_t lm_stats_fw_post_request(lm_device_t *pdev)
433*d14abf15SRobert Mustacchi {
434*d14abf15SRobert Mustacchi     lm_status_t             lm_status = LM_STATUS_SUCCESS;
435*d14abf15SRobert Mustacchi     lm_stats_fw_collect_t * stats_fw  = &pdev->vars.stats.stats_collect.stats_fw;
436*d14abf15SRobert Mustacchi 
437*d14abf15SRobert Mustacchi     stats_fw->fw_stats_req->hdr.drv_stats_counter = mm_cpu_to_le16(stats_fw->drv_counter);
438*d14abf15SRobert Mustacchi 
439*d14abf15SRobert Mustacchi     // zero no completion counter
440*d14abf15SRobert Mustacchi     stats_fw->timer_wakeup_no_completion_current = 0 ;
441*d14abf15SRobert Mustacchi 
442*d14abf15SRobert Mustacchi     stats_fw->b_completion_done = FALSE ;
443*d14abf15SRobert Mustacchi     if (IS_VFDEV(pdev))
444*d14abf15SRobert Mustacchi     {
445*d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
446*d14abf15SRobert Mustacchi     }
447*d14abf15SRobert Mustacchi     stats_fw->b_ramrod_completed = FALSE ;
448*d14abf15SRobert Mustacchi 
449*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
450*d14abf15SRobert Mustacchi #ifndef __LINUX
451*d14abf15SRobert Mustacchi     if (IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev))
452*d14abf15SRobert Mustacchi     {
453*d14abf15SRobert Mustacchi         lm_stats_prep_vf_fw_stats_req(pdev);
454*d14abf15SRobert Mustacchi     }
455*d14abf15SRobert Mustacchi #endif
456*d14abf15SRobert Mustacchi #endif
457*d14abf15SRobert Mustacchi 
458*d14abf15SRobert Mustacchi     /* send FW stats ramrod */
459*d14abf15SRobert Mustacchi     lm_status = lm_sq_post_entry(pdev,&(stats_fw->stats_sp_list_command),CMD_PRIORITY_HIGH);
460*d14abf15SRobert Mustacchi 
461*d14abf15SRobert Mustacchi     DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
462*d14abf15SRobert Mustacchi 
463*d14abf15SRobert Mustacchi     if (lm_status == LM_STATUS_SUCCESS)
464*d14abf15SRobert Mustacchi     {
465*d14abf15SRobert Mustacchi         // increamant ramrod counter (for debugging)
466*d14abf15SRobert Mustacchi         ++stats_fw->stats_ramrod_cnt ;
467*d14abf15SRobert Mustacchi     }
468*d14abf15SRobert Mustacchi 
469*d14abf15SRobert Mustacchi     return lm_status;
470*d14abf15SRobert Mustacchi 
471*d14abf15SRobert Mustacchi }
472*d14abf15SRobert Mustacchi // main stats function called from timer
lm_stats_on_timer(struct _lm_device_t * pdev)473*d14abf15SRobert Mustacchi void lm_stats_on_timer( struct _lm_device_t * pdev )
474*d14abf15SRobert Mustacchi {
475*d14abf15SRobert Mustacchi     lm_status_t                         lm_status   = LM_STATUS_SUCCESS ;
476*d14abf15SRobert Mustacchi     u32_t                               val         = 0 ;
477*d14abf15SRobert Mustacchi 
478*d14abf15SRobert Mustacchi     if CHK_NULL( pdev )
479*d14abf15SRobert Mustacchi     {
480*d14abf15SRobert Mustacchi         DbgBreakIf(!pdev) ;
481*d14abf15SRobert Mustacchi         return;
482*d14abf15SRobert Mustacchi     }
483*d14abf15SRobert Mustacchi 
484*d14abf15SRobert Mustacchi     ++pdev->vars.stats.stats_collect.timer_wakeup ;
485*d14abf15SRobert Mustacchi 
486*d14abf15SRobert Mustacchi #ifdef _VBD_CMD_
487*d14abf15SRobert Mustacchi     val = GET_FLAGS(*g_everest_sim_flags_ptr, EVEREST_SIM_STATS);
488*d14abf15SRobert Mustacchi     pdev->vars.stats.stats_collect.stats_fw.b_collect_enabled = val && pdev->vars.stats.stats_collect.stats_fw.b_collect_enabled;
489*d14abf15SRobert Mustacchi #endif
490*d14abf15SRobert Mustacchi     /* disable statistics if FW SP trace is involved */
491*d14abf15SRobert Mustacchi     if (pdev->params.record_sp)
492*d14abf15SRobert Mustacchi     {
493*d14abf15SRobert Mustacchi         ++pdev->vars.stats.stats_collect.sp_record_disabled;
494*d14abf15SRobert Mustacchi         return;
495*d14abf15SRobert Mustacchi     }
496*d14abf15SRobert Mustacchi     /* if stats gathering is disabled according to edebug-driver i/f - return */
497*d14abf15SRobert Mustacchi     if(lm_edebug_if_is_stats_disabled(pdev))
498*d14abf15SRobert Mustacchi     {
499*d14abf15SRobert Mustacchi         ++pdev->vars.stats.stats_collect.shmem_disabled;
500*d14abf15SRobert Mustacchi         return;
501*d14abf15SRobert Mustacchi     }
502*d14abf15SRobert Mustacchi 
503*d14abf15SRobert Mustacchi     if( pdev->vars.stats.stats_collect.stats_fw.b_collect_enabled )
504*d14abf15SRobert Mustacchi     {
505*d14abf15SRobert Mustacchi         // verify that previous ramrod cb is finished
506*d14abf15SRobert Mustacchi         if( lm_stats_fw_complete( pdev ) == LM_STATUS_BUSY)
507*d14abf15SRobert Mustacchi         {
508*d14abf15SRobert Mustacchi             // using a variable to have event log since the message is too long
509*d14abf15SRobert Mustacchi             val = ++pdev->vars.stats.stats_collect.stats_fw.timer_wakeup_no_completion_current ;
510*d14abf15SRobert Mustacchi 
511*d14abf15SRobert Mustacchi             // update timer_wakeup_no_completion_max
512*d14abf15SRobert Mustacchi             if( pdev->vars.stats.stats_collect.stats_fw.timer_wakeup_no_completion_max < val )
513*d14abf15SRobert Mustacchi             {
514*d14abf15SRobert Mustacchi                 pdev->vars.stats.stats_collect.stats_fw.timer_wakeup_no_completion_max = val ;
515*d14abf15SRobert Mustacchi             }
516*d14abf15SRobert Mustacchi             /* We give up in two case:
517*d14abf15SRobert Mustacchi              * 1. We got here #NO_COMPLETION times without having a stats-completion pending to be handled
518*d14abf15SRobert Mustacchi              * 2. There is a completion pending to be handled - but it still hasn't been handled in #COMP_NOT_HANDLED times
519*d14abf15SRobert Mustacchi              *    we got here. #COMP_NOT_HANDLED > #NO_COMPLETION*/
520*d14abf15SRobert Mustacchi             if ((!is_pending_stats_completion(pdev) && (val >= MAX_STATS_TIMER_WAKEUP_NO_COMPLETION)) ||
521*d14abf15SRobert Mustacchi                 (val >= MAX_STATS_TIMER_WAKEUP_COMP_NOT_HANDLED))
522*d14abf15SRobert Mustacchi             {
523*d14abf15SRobert Mustacchi                 if(GET_FLAGS(pdev->params.debug_cap_flags,DEBUG_CAP_FLAGS_STATS_FW))
524*d14abf15SRobert Mustacchi                 {
525*d14abf15SRobert Mustacchi                     LM_TRIGGER_PCIE(pdev);
526*d14abf15SRobert Mustacchi                 }
527*d14abf15SRobert Mustacchi                 /* shutdown bug - BSOD only if shutdown is not in progress */
528*d14abf15SRobert Mustacchi                 if (!lm_reset_is_inprogress(pdev))
529*d14abf15SRobert Mustacchi                 {
530*d14abf15SRobert Mustacchi                     /* BSOD */
531*d14abf15SRobert Mustacchi                     if(GET_FLAGS(pdev->params.debug_cap_flags,DEBUG_CAP_FLAGS_STATS_FW))
532*d14abf15SRobert Mustacchi                     {
533*d14abf15SRobert Mustacchi                         DbgBreakIfAll( val >= MAX_STATS_TIMER_WAKEUP_NO_COMPLETION ) ;
534*d14abf15SRobert Mustacchi                     }
535*d14abf15SRobert Mustacchi                 }
536*d14abf15SRobert Mustacchi             }
537*d14abf15SRobert Mustacchi 
538*d14abf15SRobert Mustacchi             /* check interrupt mode on 57710A0 boards */
539*d14abf15SRobert Mustacchi             lm_57710A0_dbg_intr(pdev);
540*d14abf15SRobert Mustacchi 
541*d14abf15SRobert Mustacchi             // this is total wake up no completion - for debuging
542*d14abf15SRobert Mustacchi             ++pdev->vars.stats.stats_collect.stats_fw.timer_wakeup_no_completion_total ;
543*d14abf15SRobert Mustacchi         }
544*d14abf15SRobert Mustacchi         else
545*d14abf15SRobert Mustacchi         {
546*d14abf15SRobert Mustacchi             lm_status = lm_stats_fw_post_request(pdev);
547*d14abf15SRobert Mustacchi             DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
548*d14abf15SRobert Mustacchi         }
549*d14abf15SRobert Mustacchi     } // fw collect enabled
550*d14abf15SRobert Mustacchi 
551*d14abf15SRobert Mustacchi     if( LM_STATS_IS_HW_ACTIVE(pdev) )
552*d14abf15SRobert Mustacchi     {
553*d14abf15SRobert Mustacchi         // if link is not up - we can simply pass this call (optimization)
554*d14abf15SRobert Mustacchi         if( pdev->vars.stats.stats_collect.stats_hw.b_is_link_up )
555*d14abf15SRobert Mustacchi         {
556*d14abf15SRobert Mustacchi             MM_ACQUIRE_PHY_LOCK_DPC(pdev);
557*d14abf15SRobert Mustacchi 
558*d14abf15SRobert Mustacchi             // we can call dmae only if link is up, and we must check it with lock
559*d14abf15SRobert Mustacchi             if( pdev->vars.stats.stats_collect.stats_hw.b_is_link_up )
560*d14abf15SRobert Mustacchi             {
561*d14abf15SRobert Mustacchi                 lm_status = lm_stats_hw_collect( pdev );
562*d14abf15SRobert Mustacchi 
563*d14abf15SRobert Mustacchi                 DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
564*d14abf15SRobert Mustacchi 
565*d14abf15SRobert Mustacchi                 // assign values for relevant mac type which is up - inside the lock due to consistecy reasons
566*d14abf15SRobert Mustacchi                 lm_stats_hw_assign( pdev ) ;
567*d14abf15SRobert Mustacchi             }
568*d14abf15SRobert Mustacchi 
569*d14abf15SRobert Mustacchi             // assign to statistics to MCP
570*d14abf15SRobert Mustacchi             lm_stats_mgmt_assign( pdev ) ;
571*d14abf15SRobert Mustacchi 
572*d14abf15SRobert Mustacchi             MM_RELEASE_PHY_LOCK_DPC(pdev);
573*d14abf15SRobert Mustacchi         } // link is up
574*d14abf15SRobert Mustacchi     } // LM_STATS_IS_HW_ACTIVE
575*d14abf15SRobert Mustacchi     else if( pdev->vars.stats.stats_collect.stats_hw.b_collect_enabled &&
576*d14abf15SRobert Mustacchi              pdev->vars.stats.stats_collect.stats_hw.b_is_link_up ) // when there is no link - no use writing to mgmt
577*d14abf15SRobert Mustacchi     {
578*d14abf15SRobert Mustacchi         MM_ACQUIRE_PHY_LOCK_DPC(pdev);
579*d14abf15SRobert Mustacchi         lm_stats_mgmt_assign( pdev ) ;
580*d14abf15SRobert Mustacchi         MM_RELEASE_PHY_LOCK_DPC(pdev);
581*d14abf15SRobert Mustacchi     }
582*d14abf15SRobert Mustacchi }
583*d14abf15SRobert Mustacchi 
is_pending_stats_completion(struct _lm_device_t * pdev)584*d14abf15SRobert Mustacchi u8_t is_pending_stats_completion(struct _lm_device_t * pdev)
585*d14abf15SRobert Mustacchi {
586*d14abf15SRobert Mustacchi     volatile struct hc_sp_status_block * sp_sb=NULL;
587*d14abf15SRobert Mustacchi     u32_t val=0;
588*d14abf15SRobert Mustacchi 
589*d14abf15SRobert Mustacchi     /* read interrupt mask from IGU - check that default-status-block bit is off... */
590*d14abf15SRobert Mustacchi     if (INTR_BLK_TYPE(pdev)==INTR_BLK_HC){
591*d14abf15SRobert Mustacchi         val = REG_RD(pdev,  HC_REG_INT_MASK + 4*PORT_ID(pdev) );
592*d14abf15SRobert Mustacchi     } // TODO add IGU complement
593*d14abf15SRobert Mustacchi 
594*d14abf15SRobert Mustacchi 
595*d14abf15SRobert Mustacchi     sp_sb = lm_get_default_status_block(pdev);
596*d14abf15SRobert Mustacchi 
597*d14abf15SRobert Mustacchi     /* check bit 0 is masked (value 0) and that cstorm in default-status-block has increased. */
598*d14abf15SRobert Mustacchi     if(!GET_FLAGS(val, 1) && lm_is_eq_completion(pdev))
599*d14abf15SRobert Mustacchi     {
600*d14abf15SRobert Mustacchi         return TRUE;
601*d14abf15SRobert Mustacchi     }
602*d14abf15SRobert Mustacchi     return FALSE; /* no pending completion */
603*d14abf15SRobert Mustacchi }
604*d14abf15SRobert Mustacchi 
605*d14abf15SRobert Mustacchi /**lm_stats_get_dmae_operation
606*d14abf15SRobert Mustacchi  * The statistics module uses two pre-allocated DMAE operations
607*d14abf15SRobert Mustacchi  * instead of allocating and releasing a DMAE operation on every
608*d14abf15SRobert Mustacchi  * statistics collection. There is an operation for EMAC
609*d14abf15SRobert Mustacchi  * statistics, and an operation for BMAC or MSTAT statistics
610*d14abf15SRobert Mustacchi  * (since EMAC requires 3 SGEs and BMAC/MSTAT require 2).
611*d14abf15SRobert Mustacchi  * This function returns the appropriate DMAE operation based on
612*d14abf15SRobert Mustacchi  * current MAC setting.
613*d14abf15SRobert Mustacchi  *
614*d14abf15SRobert Mustacchi  *
615*d14abf15SRobert Mustacchi  * @param pdev the device to use.
616*d14abf15SRobert Mustacchi  *
617*d14abf15SRobert Mustacchi  * @return lm_dmae_operation_t* the DMAE operation to use for
618*d14abf15SRobert Mustacchi  *         collection HW statistics from the current MAC.
619*d14abf15SRobert Mustacchi  */
620*d14abf15SRobert Mustacchi static lm_dmae_operation_t*
lm_stats_get_dmae_operation(lm_device_t * pdev)621*d14abf15SRobert Mustacchi lm_stats_get_dmae_operation(lm_device_t* pdev)
622*d14abf15SRobert Mustacchi {
623*d14abf15SRobert Mustacchi     if (HAS_MSTAT(pdev) || (pdev->vars.mac_type == MAC_TYPE_BMAC))
624*d14abf15SRobert Mustacchi     {
625*d14abf15SRobert Mustacchi         return (lm_dmae_operation_t*)pdev->vars.stats.stats_collect.stats_hw.non_emac_dmae_operation;
626*d14abf15SRobert Mustacchi     }
627*d14abf15SRobert Mustacchi     else if(pdev->vars.mac_type == MAC_TYPE_EMAC)
628*d14abf15SRobert Mustacchi     {
629*d14abf15SRobert Mustacchi         return (lm_dmae_operation_t*)pdev->vars.stats.stats_collect.stats_hw.emac_dmae_operation;
630*d14abf15SRobert Mustacchi     }
631*d14abf15SRobert Mustacchi     else
632*d14abf15SRobert Mustacchi     {
633*d14abf15SRobert Mustacchi         DbgBreakIf((pdev->vars.mac_type != MAC_TYPE_EMAC) && (pdev->vars.mac_type != MAC_TYPE_BMAC));
634*d14abf15SRobert Mustacchi         return NULL;
635*d14abf15SRobert Mustacchi     }
636*d14abf15SRobert Mustacchi 
637*d14abf15SRobert Mustacchi }
638*d14abf15SRobert Mustacchi 
639*d14abf15SRobert Mustacchi /*
640*d14abf15SRobert Mustacchi  *Function Name:lm_stats_dmae
641*d14abf15SRobert Mustacchi  *
642*d14abf15SRobert Mustacchi  *Parameters:
643*d14abf15SRobert Mustacchi  *
644*d14abf15SRobert Mustacchi  *Description:
645*d14abf15SRobert Mustacchi  *  collect stats from hw using dmae
646*d14abf15SRobert Mustacchi  *Returns:
647*d14abf15SRobert Mustacchi  *
648*d14abf15SRobert Mustacchi  */
lm_stats_dmae(lm_device_t * pdev)649*d14abf15SRobert Mustacchi lm_status_t lm_stats_dmae( lm_device_t *pdev )
650*d14abf15SRobert Mustacchi {
651*d14abf15SRobert Mustacchi     lm_status_t             lm_status   = LM_STATUS_SUCCESS ;
652*d14abf15SRobert Mustacchi     lm_dmae_context_t*      context     = lm_dmae_get(pdev, LM_DMAE_STATS)->context;
653*d14abf15SRobert Mustacchi     lm_dmae_operation_t*    operation   = lm_stats_get_dmae_operation(pdev);
654*d14abf15SRobert Mustacchi 
655*d14abf15SRobert Mustacchi     DbgBreakIf( FALSE == LM_STATS_IS_HW_ACTIVE( pdev ) ) ;
656*d14abf15SRobert Mustacchi 
657*d14abf15SRobert Mustacchi     if (NULL == operation)
658*d14abf15SRobert Mustacchi     {
659*d14abf15SRobert Mustacchi         DbgBreakIf( NULL == operation );
660*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
661*d14abf15SRobert Mustacchi     }
662*d14abf15SRobert Mustacchi 
663*d14abf15SRobert Mustacchi     lm_status = lm_dmae_context_execute(pdev,context,operation);
664*d14abf15SRobert Mustacchi 
665*d14abf15SRobert Mustacchi     if (LM_STATUS_ABORTED == lm_status)
666*d14abf15SRobert Mustacchi     {
667*d14abf15SRobert Mustacchi         //if the DMAE operation was interrupted by lm_reset_is_inprogress, it's OK and we can treat it as success.
668*d14abf15SRobert Mustacchi         lm_status = LM_STATUS_SUCCESS;
669*d14abf15SRobert Mustacchi     }
670*d14abf15SRobert Mustacchi 
671*d14abf15SRobert Mustacchi     return lm_status ;
672*d14abf15SRobert Mustacchi }
673*d14abf15SRobert Mustacchi 
674*d14abf15SRobert Mustacchi /*
675*d14abf15SRobert Mustacchi  *Function Name:lm_stats_clear_emac_stats
676*d14abf15SRobert Mustacchi  *
677*d14abf15SRobert Mustacchi  *Parameters:
678*d14abf15SRobert Mustacchi  *
679*d14abf15SRobert Mustacchi  *Description:
680*d14abf15SRobert Mustacchi  *  resets all emac statistics counter registers
681*d14abf15SRobert Mustacchi  *Returns:
682*d14abf15SRobert Mustacchi  *
683*d14abf15SRobert Mustacchi  */
lm_stats_clear_emac_stats(lm_device_t * pdev)684*d14abf15SRobert Mustacchi lm_status_t lm_stats_clear_emac_stats( lm_device_t *pdev )
685*d14abf15SRobert Mustacchi {
686*d14abf15SRobert Mustacchi     u32_t i              = 0 ;
687*d14abf15SRobert Mustacchi     u32_t j              = 0 ;
688*d14abf15SRobert Mustacchi     u32_t count_limit[3] = { EMAC_REG_EMAC_RX_STAT_AC_COUNT,
689*d14abf15SRobert Mustacchi                              1,
690*d14abf15SRobert Mustacchi                              EMAC_REG_EMAC_TX_STAT_AC_COUNT } ;
691*d14abf15SRobert Mustacchi     u32_t reg_start  [3] = { EMAC_REG_EMAC_RX_STAT_AC,
692*d14abf15SRobert Mustacchi                              EMAC_REG_EMAC_RX_STAT_AC_28,
693*d14abf15SRobert Mustacchi                              EMAC_REG_EMAC_TX_STAT_AC } ;
694*d14abf15SRobert Mustacchi     u32_t emac_base      = 0 ;
695*d14abf15SRobert Mustacchi     u32_t dummy          = 0 ;
696*d14abf15SRobert Mustacchi 
697*d14abf15SRobert Mustacchi     ASSERT_STATIC( ARRSIZE(reg_start) == ARRSIZE(count_limit) );
698*d14abf15SRobert Mustacchi 
699*d14abf15SRobert Mustacchi     if CHK_NULL( pdev )
700*d14abf15SRobert Mustacchi     {
701*d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER ;
702*d14abf15SRobert Mustacchi     }
703*d14abf15SRobert Mustacchi 
704*d14abf15SRobert Mustacchi     emac_base = ( 0 == PORT_ID(pdev) ) ? GRCBASE_EMAC0 : GRCBASE_EMAC1 ;
705*d14abf15SRobert Mustacchi 
706*d14abf15SRobert Mustacchi     for( i = 0; i< ARRSIZE(reg_start) ; i++ )
707*d14abf15SRobert Mustacchi     {
708*d14abf15SRobert Mustacchi         for( j = 0 ; j < count_limit[i]; j++ )
709*d14abf15SRobert Mustacchi         {
710*d14abf15SRobert Mustacchi             dummy = REG_RD( pdev, emac_base + reg_start[i]+(j*sizeof(u32_t))) ; /*Clear stats registers by reading from from ReadClear RX/RXerr/TX STAT banks*/
711*d14abf15SRobert Mustacchi         }
712*d14abf15SRobert Mustacchi     }
713*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS ;
714*d14abf15SRobert Mustacchi }
715*d14abf15SRobert Mustacchi 
716*d14abf15SRobert Mustacchi /*
717*d14abf15SRobert Mustacchi  *Function Name:lm_stats_on_update_state
718*d14abf15SRobert Mustacchi  *
719*d14abf15SRobert Mustacchi  *Parameters:
720*d14abf15SRobert Mustacchi  *
721*d14abf15SRobert Mustacchi  *Description:
722*d14abf15SRobert Mustacchi  *  This function should be called on one of two occasions:
723*d14abf15SRobert Mustacchi  *  - When link is down
724*d14abf15SRobert Mustacchi  *  - When PMF is going down (meaning - changed to another PMF)
725*d14abf15SRobert Mustacchi  *  Function must be called under PHY LOCK
726*d14abf15SRobert Mustacchi  *  1. in case no link - do nothing
727*d14abf15SRobert Mustacchi  *  2. make last query to hw stats for current link
728*d14abf15SRobert Mustacchi  *  3. assign to mirror host structures
729*d14abf15SRobert Mustacchi  *  4. assign to MCP (managment)
730*d14abf15SRobert Mustacchi  *  5. saves the copy in mirror
731*d14abf15SRobert Mustacchi  *Returns:
732*d14abf15SRobert Mustacchi  *
733*d14abf15SRobert Mustacchi  */
lm_stats_on_update_state(lm_device_t * pdev)734*d14abf15SRobert Mustacchi lm_status_t lm_stats_on_update_state(lm_device_t * pdev )
735*d14abf15SRobert Mustacchi {
736*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS ;
737*d14abf15SRobert Mustacchi 
738*d14abf15SRobert Mustacchi     if CHK_NULL( pdev )
739*d14abf15SRobert Mustacchi     {
740*d14abf15SRobert Mustacchi         DbgBreakIf( !pdev ) ;
741*d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER ;
742*d14abf15SRobert Mustacchi     }
743*d14abf15SRobert Mustacchi 
744*d14abf15SRobert Mustacchi     if( MAC_TYPE_NONE == pdev->vars.mac_type )
745*d14abf15SRobert Mustacchi     {
746*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNstat, "lm_stats_on_link_update: linking down when already linked down\n" );
747*d14abf15SRobert Mustacchi         return LM_STATUS_LINK_DOWN ;
748*d14abf15SRobert Mustacchi     }
749*d14abf15SRobert Mustacchi 
750*d14abf15SRobert Mustacchi     if ( LM_STATS_IS_HW_ACTIVE(pdev) )
751*d14abf15SRobert Mustacchi     {
752*d14abf15SRobert Mustacchi         // call statistics for the last time before link down
753*d14abf15SRobert Mustacchi         lm_status = lm_stats_dmae( pdev ) ;
754*d14abf15SRobert Mustacchi 
755*d14abf15SRobert Mustacchi         if( LM_STATUS_SUCCESS != lm_status )
756*d14abf15SRobert Mustacchi         {
757*d14abf15SRobert Mustacchi             DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
758*d14abf15SRobert Mustacchi         }
759*d14abf15SRobert Mustacchi 
760*d14abf15SRobert Mustacchi         // assign last values before link down
761*d14abf15SRobert Mustacchi         lm_stats_hw_assign( pdev ) ;
762*d14abf15SRobert Mustacchi     }
763*d14abf15SRobert Mustacchi 
764*d14abf15SRobert Mustacchi     // assign to statistics to mgmt
765*d14abf15SRobert Mustacchi     lm_stats_mgmt_assign( pdev ) ;
766*d14abf15SRobert Mustacchi 
767*d14abf15SRobert Mustacchi     return lm_status;
768*d14abf15SRobert Mustacchi }
769*d14abf15SRobert Mustacchi // NOTE: this function must be called under PHY LOCK!
770*d14abf15SRobert Mustacchi // - 1. Lock with stats timer/dmae, whcih means - no timer request on air when function running
771*d14abf15SRobert Mustacchi // - 2. Last update of stats from emac/bmac (TBD - do it with reset addresses)
772*d14abf15SRobert Mustacchi // - 3. keep latest stats in a copy
773*d14abf15SRobert Mustacchi // - 4. if emac - reset all stats registers!
774*d14abf15SRobert Mustacchi // - 5. if up - change b_link_down_is_on flag to FALSE
lm_stats_on_link_update(lm_device_t * pdev,const u8_t b_is_link_up)775*d14abf15SRobert Mustacchi lm_status_t lm_stats_on_link_update( lm_device_t *pdev, const u8_t b_is_link_up )
776*d14abf15SRobert Mustacchi {
777*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS ;
778*d14abf15SRobert Mustacchi 
779*d14abf15SRobert Mustacchi     if CHK_NULL( pdev )
780*d14abf15SRobert Mustacchi     {
781*d14abf15SRobert Mustacchi         DbgBreakIf( !pdev ) ;
782*d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER ;
783*d14abf15SRobert Mustacchi     }
784*d14abf15SRobert Mustacchi 
785*d14abf15SRobert Mustacchi     if( FALSE == b_is_link_up ) // link down
786*d14abf15SRobert Mustacchi     {
787*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_collect.stats_hw.b_is_link_up = FALSE ;
788*d14abf15SRobert Mustacchi 
789*d14abf15SRobert Mustacchi         if ( FALSE == LM_STATS_IS_HW_ACTIVE(pdev) )
790*d14abf15SRobert Mustacchi         {
791*d14abf15SRobert Mustacchi             return LM_STATUS_SUCCESS;
792*d14abf15SRobert Mustacchi         }
793*d14abf15SRobert Mustacchi 
794*d14abf15SRobert Mustacchi         // get stats for the last time, assign to managment and save copy to mirror
795*d14abf15SRobert Mustacchi         lm_status = lm_stats_on_update_state(pdev);
796*d14abf15SRobert Mustacchi 
797*d14abf15SRobert Mustacchi         if( LM_STATUS_SUCCESS != lm_status )
798*d14abf15SRobert Mustacchi         {
799*d14abf15SRobert Mustacchi             return lm_status ;
800*d14abf15SRobert Mustacchi         }
801*d14abf15SRobert Mustacchi 
802*d14abf15SRobert Mustacchi         switch( pdev->vars.mac_type )
803*d14abf15SRobert Mustacchi         {
804*d14abf15SRobert Mustacchi         case MAC_TYPE_EMAC:
805*d14abf15SRobert Mustacchi             lm_stats_clear_emac_stats( pdev ) ; // resest emac stats fields
806*d14abf15SRobert Mustacchi             break;
807*d14abf15SRobert Mustacchi 
808*d14abf15SRobert Mustacchi         case MAC_TYPE_BMAC: // nothing to do - bigmac resets itself anyway
809*d14abf15SRobert Mustacchi             break;
810*d14abf15SRobert Mustacchi 
811*d14abf15SRobert Mustacchi         case MAC_TYPE_UMAC: // nothing to do - mstat resets anyway
812*d14abf15SRobert Mustacchi         case MAC_TYPE_XMAC:
813*d14abf15SRobert Mustacchi             DbgBreakIf(!CHIP_IS_E3(pdev));
814*d14abf15SRobert Mustacchi             break;
815*d14abf15SRobert Mustacchi 
816*d14abf15SRobert Mustacchi         default:
817*d14abf15SRobert Mustacchi         case MAC_TYPE_NONE:
818*d14abf15SRobert Mustacchi             DbgBreakMsg( "mac_type not acceptable\n" ) ;
819*d14abf15SRobert Mustacchi             return LM_STATUS_INVALID_PARAMETER ;
820*d14abf15SRobert Mustacchi         }
821*d14abf15SRobert Mustacchi 
822*d14abf15SRobert Mustacchi         // Set current to 0
823*d14abf15SRobert Mustacchi         mm_mem_zero( &pdev->vars.stats.stats_mirror.stats_hw.macs[STATS_MACS_IDX_CURRENT],
824*d14abf15SRobert Mustacchi                      sizeof(pdev->vars.stats.stats_mirror.stats_hw.macs[STATS_MACS_IDX_CURRENT]) ) ;
825*d14abf15SRobert Mustacchi     }
826*d14abf15SRobert Mustacchi     else
827*d14abf15SRobert Mustacchi     {
828*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_collect.stats_hw.b_is_link_up = TRUE ;
829*d14abf15SRobert Mustacchi     }
830*d14abf15SRobert Mustacchi 
831*d14abf15SRobert Mustacchi     return lm_status ;
832*d14abf15SRobert Mustacchi }
833*d14abf15SRobert Mustacchi 
834*d14abf15SRobert Mustacchi /**lm_stats_alloc_hw_query
835*d14abf15SRobert Mustacchi  * Allocate buffers for the MAC and NIG stats. If the chip has
836*d14abf15SRobert Mustacchi  * an EMAC block, memory will be allocated for it's stats.
837*d14abf15SRobert Mustacchi  * otherwise only the non-EMAC and NIG buffers will be
838*d14abf15SRobert Mustacchi  * allocated. The non-EMAC buffer will be of the proper size for
839*d14abf15SRobert Mustacchi  * BMAC1/BMAC2/MSTAT, as needed.
840*d14abf15SRobert Mustacchi  *
841*d14abf15SRobert Mustacchi  * @param pdev the pdev to initialize
842*d14abf15SRobert Mustacchi  *
843*d14abf15SRobert Mustacchi  * @return lm_status_t LM_STATUS_SUCCESS on success,
844*d14abf15SRobert Mustacchi  *         LM_STATUS_FAILURE on failure.
845*d14abf15SRobert Mustacchi  */
lm_stats_alloc_hw_query(lm_device_t * pdev)846*d14abf15SRobert Mustacchi static lm_status_t lm_stats_alloc_hw_query(lm_device_t *pdev)
847*d14abf15SRobert Mustacchi {
848*d14abf15SRobert Mustacchi     lm_stats_hw_collect_t*  stats_hw                = &(pdev->vars.stats.stats_collect.stats_hw);
849*d14abf15SRobert Mustacchi     u32_t                   alloc_size              = 0 ;
850*d14abf15SRobert Mustacchi     u32_t                   mac_stats_alloc_size    = 0;
851*d14abf15SRobert Mustacchi     lm_address_t            phys_addr               = {{0}};
852*d14abf15SRobert Mustacchi 
853*d14abf15SRobert Mustacchi     if(!HAS_MSTAT(pdev)) //MSTAT replaces EMAC/BMAC1/BMAC2 stats.
854*d14abf15SRobert Mustacchi     {
855*d14abf15SRobert Mustacchi         DbgMessage(NULL, INFORM, "lm_stats_alloc_hw_query: device has no MSTAT block.\n");
856*d14abf15SRobert Mustacchi         // Allocate continuous memory for statistics buffers to be read from hardware. This can probably be changed to
857*d14abf15SRobert Mustacchi         // allocate max(emac, bmac) instead of emac+bmac, but need to make sure there are no races in the transition from
858*d14abf15SRobert Mustacchi         // 1G link to 10G link or vice-versa
859*d14abf15SRobert Mustacchi         mac_stats_alloc_size = sizeof(struct _stats_emac_query_t) + sizeof( union _stats_bmac_query_t);
860*d14abf15SRobert Mustacchi         alloc_size =  mac_stats_alloc_size + sizeof( struct _stats_nig_query_t ) ;
861*d14abf15SRobert Mustacchi         stats_hw->u.s.addr_emac_stats_query = mm_alloc_phys_mem(pdev, alloc_size, &phys_addr ,PHYS_MEM_TYPE_NONCACHED, LM_RESOURCE_COMMON );
862*d14abf15SRobert Mustacchi 
863*d14abf15SRobert Mustacchi         stats_hw->mac_stats_phys_addr = phys_addr;
864*d14abf15SRobert Mustacchi         LM_INC64(&phys_addr, sizeof(struct _stats_emac_query_t));
865*d14abf15SRobert Mustacchi         stats_hw->bmac_stats_phys_addr = phys_addr;
866*d14abf15SRobert Mustacchi         LM_INC64(&phys_addr, sizeof( union _stats_bmac_query_t));
867*d14abf15SRobert Mustacchi         stats_hw->nig_stats_phys_addr= phys_addr;
868*d14abf15SRobert Mustacchi 
869*d14abf15SRobert Mustacchi         DbgMessage(NULL, INFORM, "lm_stats_alloc_hw_query: allocated a block of size %d at %x\n", alloc_size, stats_hw->u.s.addr_emac_stats_query);
870*d14abf15SRobert Mustacchi         if CHK_NULL( stats_hw->u.s.addr_emac_stats_query )
871*d14abf15SRobert Mustacchi         {
872*d14abf15SRobert Mustacchi             DbgBreakIf(!stats_hw->u.s.addr_emac_stats_query );
873*d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE ;
874*d14abf15SRobert Mustacchi         }
875*d14abf15SRobert Mustacchi 
876*d14abf15SRobert Mustacchi         stats_hw->u.s.addr_bmac1_stats_query = (struct _stats_bmac1_query_t*)((u8_t*)stats_hw->u.s.addr_emac_stats_query + sizeof(struct _stats_emac_query_t)) ;
877*d14abf15SRobert Mustacchi         stats_hw->u.s.addr_bmac2_stats_query = (struct _stats_bmac2_query_t*)((u8_t*)stats_hw->u.s.addr_emac_stats_query + sizeof(struct _stats_emac_query_t)) ;
878*d14abf15SRobert Mustacchi         stats_hw->addr_nig_stats_query   = (struct _stats_nig_query_t*)((u8_t*)stats_hw->u.s.addr_bmac1_stats_query + sizeof(union _stats_bmac_query_t)) ;
879*d14abf15SRobert Mustacchi         DbgMessage(NULL, INFORM, "lm_stats_alloc_hw_query: addr_bmac1_stats_query = %x, addr_bmac2_stats_query=%x, addr_nig_stats_query=%x\n", stats_hw->u.s.addr_bmac1_stats_query, stats_hw->u.s.addr_bmac2_stats_query, stats_hw->addr_nig_stats_query);
880*d14abf15SRobert Mustacchi     }
881*d14abf15SRobert Mustacchi     else
882*d14abf15SRobert Mustacchi     {
883*d14abf15SRobert Mustacchi         DbgMessage(NULL, INFORM, "lm_stats_alloc_hw_query: device has an MSTAT block.\n");
884*d14abf15SRobert Mustacchi 
885*d14abf15SRobert Mustacchi         mac_stats_alloc_size = sizeof(struct _stats_mstat_query_t);
886*d14abf15SRobert Mustacchi         alloc_size = mac_stats_alloc_size + sizeof( struct _stats_nig_query_t );
887*d14abf15SRobert Mustacchi 
888*d14abf15SRobert Mustacchi         stats_hw->u.addr_mstat_stats_query = mm_alloc_phys_mem(pdev, alloc_size, &phys_addr ,PHYS_MEM_TYPE_NONCACHED, LM_RESOURCE_COMMON );
889*d14abf15SRobert Mustacchi 
890*d14abf15SRobert Mustacchi         stats_hw->mac_stats_phys_addr = phys_addr;
891*d14abf15SRobert Mustacchi         LM_INC64(&phys_addr, mac_stats_alloc_size);
892*d14abf15SRobert Mustacchi         stats_hw->nig_stats_phys_addr = phys_addr;
893*d14abf15SRobert Mustacchi 
894*d14abf15SRobert Mustacchi         DbgMessage(NULL, INFORM, "lm_stats_alloc_hw_query: allocated a block of size %d at %x\n", alloc_size, stats_hw->u.addr_mstat_stats_query);
895*d14abf15SRobert Mustacchi         if CHK_NULL( stats_hw->u.addr_mstat_stats_query )
896*d14abf15SRobert Mustacchi         {
897*d14abf15SRobert Mustacchi             DbgBreakIf(!stats_hw->u.addr_mstat_stats_query );
898*d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE ;
899*d14abf15SRobert Mustacchi         }
900*d14abf15SRobert Mustacchi 
901*d14abf15SRobert Mustacchi         stats_hw->addr_nig_stats_query   = (struct _stats_nig_query_t*)((u8_t*)stats_hw->u.addr_mstat_stats_query + sizeof(struct _stats_mstat_query_t)) ;
902*d14abf15SRobert Mustacchi         DbgMessage(NULL, INFORM, "lm_stats_alloc_hw_query: stats_hw->addr_nig_stats_query=%x\n", stats_hw->addr_nig_stats_query);
903*d14abf15SRobert Mustacchi     }
904*d14abf15SRobert Mustacchi 
905*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
906*d14abf15SRobert Mustacchi }
907*d14abf15SRobert Mustacchi 
lm_stats_alloc_fw_resc(struct _lm_device_t * pdev)908*d14abf15SRobert Mustacchi lm_status_t lm_stats_alloc_fw_resc (struct _lm_device_t *pdev)
909*d14abf15SRobert Mustacchi {
910*d14abf15SRobert Mustacchi     lm_stats_fw_collect_t * stats_fw        = &pdev->vars.stats.stats_collect.stats_fw;
911*d14abf15SRobert Mustacchi     u32_t                   num_groups      = 0;
912*d14abf15SRobert Mustacchi     u32_t                   alloc_size      = 0;
913*d14abf15SRobert Mustacchi     u8_t                    num_queue_stats = 1;
914*d14abf15SRobert Mustacchi 
915*d14abf15SRobert Mustacchi     /* Total number of FW statistics requests =
916*d14abf15SRobert Mustacchi      * 1 for port stats + 1 for PF stats + 1 for queue stats + 1 for FCoE stats + 1 for toe stats */
917*d14abf15SRobert Mustacchi     #define NUM_FW_STATS_REQS 5
918*d14abf15SRobert Mustacchi     stats_fw->fw_static_stats_num = stats_fw->fw_stats_num = NUM_FW_STATS_REQS;
919*d14abf15SRobert Mustacchi 
920*d14abf15SRobert Mustacchi #ifndef __LINUX
921*d14abf15SRobert Mustacchi     if (IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev)) {
922*d14abf15SRobert Mustacchi         stats_fw->fw_stats_num += pdev->hw_info.sriov_info.total_vfs * 2;
923*d14abf15SRobert Mustacchi     }
924*d14abf15SRobert Mustacchi #endif
925*d14abf15SRobert Mustacchi 
926*d14abf15SRobert Mustacchi     /* Request is built from stats_query_header and an array of
927*d14abf15SRobert Mustacchi      * stats_query_cmd_group each of which contains
928*d14abf15SRobert Mustacchi      * STATS_QUERY_CMD_COUNT rules. The real number or requests is
929*d14abf15SRobert Mustacchi      * configured in the stats_query_header.
930*d14abf15SRobert Mustacchi      */
931*d14abf15SRobert Mustacchi     num_groups = (stats_fw->fw_stats_num) / STATS_QUERY_CMD_COUNT +
932*d14abf15SRobert Mustacchi         (((stats_fw->fw_stats_num) % STATS_QUERY_CMD_COUNT) ? 1 : 0);
933*d14abf15SRobert Mustacchi 
934*d14abf15SRobert Mustacchi #ifndef __LINUX
935*d14abf15SRobert Mustacchi     if (IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev)) {
936*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARN, "%d stats groups to support %d VFs\n",num_groups, pdev->hw_info.sriov_info.total_vfs);
937*d14abf15SRobert Mustacchi     }
938*d14abf15SRobert Mustacchi #endif
939*d14abf15SRobert Mustacchi     stats_fw->fw_stats_req_sz = sizeof(struct stats_query_header) +
940*d14abf15SRobert Mustacchi             num_groups * sizeof(struct stats_query_cmd_group);
941*d14abf15SRobert Mustacchi 
942*d14abf15SRobert Mustacchi     /* Data for statistics requests + stats_conter
943*d14abf15SRobert Mustacchi      *
944*d14abf15SRobert Mustacchi      * stats_counter holds per-STORM counters that are incremented
945*d14abf15SRobert Mustacchi      * when STORM has finished with the current request.
946*d14abf15SRobert Mustacchi      */
947*d14abf15SRobert Mustacchi     stats_fw->fw_stats_data_sz = sizeof(struct per_port_stats) +
948*d14abf15SRobert Mustacchi                              sizeof(struct per_pf_stats) +
949*d14abf15SRobert Mustacchi                              sizeof(struct per_queue_stats) * num_queue_stats +
950*d14abf15SRobert Mustacchi                              sizeof(struct toe_stats_query) +
951*d14abf15SRobert Mustacchi                              sizeof(struct fcoe_statistics_params) +
952*d14abf15SRobert Mustacchi                              sizeof(struct stats_counter);
953*d14abf15SRobert Mustacchi 
954*d14abf15SRobert Mustacchi     alloc_size = stats_fw->fw_stats_data_sz + stats_fw->fw_stats_req_sz;
955*d14abf15SRobert Mustacchi     stats_fw->fw_stats = mm_alloc_phys_mem(pdev, alloc_size, &stats_fw->fw_stats_mapping ,PHYS_MEM_TYPE_NONCACHED, LM_RESOURCE_COMMON );
956*d14abf15SRobert Mustacchi     if (!stats_fw->fw_stats)
957*d14abf15SRobert Mustacchi     {
958*d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
959*d14abf15SRobert Mustacchi     }
960*d14abf15SRobert Mustacchi     /* Set shortcuts */
961*d14abf15SRobert Mustacchi     stats_fw->fw_stats_req = (lm_stats_fw_stats_req_t *)stats_fw->fw_stats;
962*d14abf15SRobert Mustacchi     stats_fw->fw_stats_req_mapping = stats_fw->fw_stats_mapping;
963*d14abf15SRobert Mustacchi 
964*d14abf15SRobert Mustacchi     stats_fw->fw_stats_data = (lm_stats_fw_stats_data_t *)
965*d14abf15SRobert Mustacchi         ((u8*)stats_fw->fw_stats + stats_fw->fw_stats_req_sz);
966*d14abf15SRobert Mustacchi 
967*d14abf15SRobert Mustacchi     stats_fw->fw_stats_data_mapping = stats_fw->fw_stats_mapping;
968*d14abf15SRobert Mustacchi     LM_INC64(&stats_fw->fw_stats_data_mapping, stats_fw->fw_stats_req_sz);
969*d14abf15SRobert Mustacchi 
970*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
971*d14abf15SRobert Mustacchi }
972*d14abf15SRobert Mustacchi 
973*d14abf15SRobert Mustacchi /*
974*d14abf15SRobert Mustacchi  *Function Name: lm_stats_alloc_drv_info_to_mfw_resc
975*d14abf15SRobert Mustacchi  *
976*d14abf15SRobert Mustacchi  *Parameters:
977*d14abf15SRobert Mustacchi  *
978*d14abf15SRobert Mustacchi  *Description:
979*d14abf15SRobert Mustacchi  *  Allocates physical memory to be used for OCBB statisics query by MFW needed for E3+ only
980*d14abf15SRobert Mustacchi  *Returns:
981*d14abf15SRobert Mustacchi  *
982*d14abf15SRobert Mustacchi  */
lm_stats_alloc_drv_info_to_mfw_resc(lm_device_t * pdev)983*d14abf15SRobert Mustacchi static lm_status_t lm_stats_alloc_drv_info_to_mfw_resc(lm_device_t *pdev)
984*d14abf15SRobert Mustacchi {
985*d14abf15SRobert Mustacchi     lm_stats_drv_info_to_mfw_t*        drv_info_to_mfw = &(pdev->vars.stats.stats_collect.drv_info_to_mfw );
986*d14abf15SRobert Mustacchi     u32_t                              alloc_size      = 0 ;
987*d14abf15SRobert Mustacchi     lm_address_t                       phys_addr       = {{0}};
988*d14abf15SRobert Mustacchi     lm_status_t                        lm_status       = LM_STATUS_SUCCESS;
989*d14abf15SRobert Mustacchi 
990*d14abf15SRobert Mustacchi     if( CHIP_IS_E3(pdev) )
991*d14abf15SRobert Mustacchi     {
992*d14abf15SRobert Mustacchi         alloc_size                                 = max( ( sizeof( *drv_info_to_mfw->addr.eth_stats   ) ),
993*d14abf15SRobert Mustacchi                                                           ( sizeof( *drv_info_to_mfw->addr.iscsi_stats ) ) ) ;
994*d14abf15SRobert Mustacchi         alloc_size                                 = max( ( sizeof( *drv_info_to_mfw->addr.fcoe_stats  ) ), alloc_size ) ;
995*d14abf15SRobert Mustacchi 
996*d14abf15SRobert Mustacchi         // since it is a union it doesn't matter
997*d14abf15SRobert Mustacchi         drv_info_to_mfw->addr.eth_stats            = mm_alloc_phys_mem(pdev, alloc_size, &phys_addr ,PHYS_MEM_TYPE_NONCACHED, LM_RESOURCE_COMMON );
998*d14abf15SRobert Mustacchi 
999*d14abf15SRobert Mustacchi         if( !drv_info_to_mfw->addr.eth_stats )
1000*d14abf15SRobert Mustacchi         {
1001*d14abf15SRobert Mustacchi             lm_status = LM_STATUS_RESOURCE;
1002*d14abf15SRobert Mustacchi         }
1003*d14abf15SRobert Mustacchi 
1004*d14abf15SRobert Mustacchi         drv_info_to_mfw->drv_info_to_mfw_phys_addr = phys_addr;
1005*d14abf15SRobert Mustacchi     }
1006*d14abf15SRobert Mustacchi 
1007*d14abf15SRobert Mustacchi     return lm_status;
1008*d14abf15SRobert Mustacchi }
1009*d14abf15SRobert Mustacchi 
1010*d14abf15SRobert Mustacchi // allocate memory both for hw and fw statistics
lm_stats_alloc_resc(struct _lm_device_t * pdev)1011*d14abf15SRobert Mustacchi lm_status_t lm_stats_alloc_resc( struct _lm_device_t* pdev )
1012*d14abf15SRobert Mustacchi {
1013*d14abf15SRobert Mustacchi     u8_t                    loader_channel_idx      = (u8_t)(-1) ;
1014*d14abf15SRobert Mustacchi     u8_t                    executer_channel_idx    = (u8_t)(-1) ;
1015*d14abf15SRobert Mustacchi     lm_status_t             lm_status               = LM_STATUS_SUCCESS;
1016*d14abf15SRobert Mustacchi     lm_dmae_context_info_t *stats_dmae_context_info = lm_dmae_get(pdev, LM_DMAE_STATS);
1017*d14abf15SRobert Mustacchi 
1018*d14abf15SRobert Mustacchi     if CHK_NULL(pdev )
1019*d14abf15SRobert Mustacchi     {
1020*d14abf15SRobert Mustacchi         DbgBreakIf(!pdev) ;
1021*d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER ;
1022*d14abf15SRobert Mustacchi     }
1023*d14abf15SRobert Mustacchi 
1024*d14abf15SRobert Mustacchi     lm_status = lm_stats_alloc_fw_resc(pdev);
1025*d14abf15SRobert Mustacchi 
1026*d14abf15SRobert Mustacchi     if( lm_status != LM_STATUS_SUCCESS )
1027*d14abf15SRobert Mustacchi     {
1028*d14abf15SRobert Mustacchi         // stats is not such a big deal if not working but since we
1029*d14abf15SRobert Mustacchi         // only allocate here buffer, it doesn't matter since next alloc will also fail...
1030*d14abf15SRobert Mustacchi         return lm_status;
1031*d14abf15SRobert Mustacchi     }
1032*d14abf15SRobert Mustacchi 
1033*d14abf15SRobert Mustacchi 
1034*d14abf15SRobert Mustacchi     lm_status = lm_stats_alloc_drv_info_to_mfw_resc(pdev);
1035*d14abf15SRobert Mustacchi 
1036*d14abf15SRobert Mustacchi     if( lm_status != LM_STATUS_SUCCESS )
1037*d14abf15SRobert Mustacchi     {
1038*d14abf15SRobert Mustacchi         // OCBB is not such a big deal if not working but since we
1039*d14abf15SRobert Mustacchi         // only allocate here buffer, it doesn't matter since next alloc will also fail...
1040*d14abf15SRobert Mustacchi         return lm_status;
1041*d14abf15SRobert Mustacchi     }
1042*d14abf15SRobert Mustacchi 
1043*d14abf15SRobert Mustacchi     lm_status = lm_stats_alloc_hw_query(pdev);
1044*d14abf15SRobert Mustacchi     if(lm_status != LM_STATUS_SUCCESS)
1045*d14abf15SRobert Mustacchi     {
1046*d14abf15SRobert Mustacchi         return lm_status;
1047*d14abf15SRobert Mustacchi     }
1048*d14abf15SRobert Mustacchi 
1049*d14abf15SRobert Mustacchi 
1050*d14abf15SRobert Mustacchi     switch (PORT_ID(pdev))
1051*d14abf15SRobert Mustacchi     {
1052*d14abf15SRobert Mustacchi     case 0:
1053*d14abf15SRobert Mustacchi         {
1054*d14abf15SRobert Mustacchi             loader_channel_idx = DMAE_STATS_PORT_0_CMD_IDX_0;
1055*d14abf15SRobert Mustacchi             executer_channel_idx = DMAE_STATS_PORT_0_CMD_IDX_1;
1056*d14abf15SRobert Mustacchi         }
1057*d14abf15SRobert Mustacchi         break;
1058*d14abf15SRobert Mustacchi     case 1:
1059*d14abf15SRobert Mustacchi         {
1060*d14abf15SRobert Mustacchi             loader_channel_idx = DMAE_STATS_PORT_1_CMD_IDX_0;
1061*d14abf15SRobert Mustacchi             executer_channel_idx = DMAE_STATS_PORT_1_CMD_IDX_1;
1062*d14abf15SRobert Mustacchi         }
1063*d14abf15SRobert Mustacchi         break;
1064*d14abf15SRobert Mustacchi     default:
1065*d14abf15SRobert Mustacchi         {
1066*d14abf15SRobert Mustacchi             DbgMessage(NULL, FATAL, "Invalid Port ID %d\n", PORT_ID(pdev));
1067*d14abf15SRobert Mustacchi             DbgBreak();
1068*d14abf15SRobert Mustacchi             return LM_STATUS_INVALID_PARAMETER;
1069*d14abf15SRobert Mustacchi         }
1070*d14abf15SRobert Mustacchi         break;
1071*d14abf15SRobert Mustacchi     }
1072*d14abf15SRobert Mustacchi 
1073*d14abf15SRobert Mustacchi     //create the locking policy for the stats DMAE context
1074*d14abf15SRobert Mustacchi     lm_status = lm_dmae_locking_policy_create(pdev, LM_PROTECTED_RESOURCE_DMAE_STATS, LM_DMAE_LOCKING_POLICY_TYPE_PER_PF, &stats_dmae_context_info->locking_policy);
1075*d14abf15SRobert Mustacchi     if(lm_status != LM_STATUS_SUCCESS)
1076*d14abf15SRobert Mustacchi     {
1077*d14abf15SRobert Mustacchi         return lm_status;
1078*d14abf15SRobert Mustacchi     }
1079*d14abf15SRobert Mustacchi 
1080*d14abf15SRobert Mustacchi     //create the stats DMAE context
1081*d14abf15SRobert Mustacchi     stats_dmae_context_info->context = lm_dmae_context_create_sgl( pdev,
1082*d14abf15SRobert Mustacchi                                                                    loader_channel_idx,
1083*d14abf15SRobert Mustacchi                                                                    executer_channel_idx,
1084*d14abf15SRobert Mustacchi                                                                    &stats_dmae_context_info->locking_policy,
1085*d14abf15SRobert Mustacchi                                                                    CHANGE_ENDIANITY);
1086*d14abf15SRobert Mustacchi     if (CHK_NULL(stats_dmae_context_info->context))
1087*d14abf15SRobert Mustacchi     {
1088*d14abf15SRobert Mustacchi         DbgBreak();
1089*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
1090*d14abf15SRobert Mustacchi     }
1091*d14abf15SRobert Mustacchi 
1092*d14abf15SRobert Mustacchi     //create the non-EMAC DMAE operation
1093*d14abf15SRobert Mustacchi     pdev->vars.stats.stats_collect.stats_hw.non_emac_dmae_operation = lm_dmae_operation_create_sgl(pdev, TRUE, stats_dmae_context_info->context);
1094*d14abf15SRobert Mustacchi 
1095*d14abf15SRobert Mustacchi     //create the EMAC DMAE operation if needed
1096*d14abf15SRobert Mustacchi     if (!HAS_MSTAT(pdev))
1097*d14abf15SRobert Mustacchi     {
1098*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_collect.stats_hw.emac_dmae_operation = lm_dmae_operation_create_sgl(pdev, TRUE, stats_dmae_context_info->context);
1099*d14abf15SRobert Mustacchi     }
1100*d14abf15SRobert Mustacchi     else
1101*d14abf15SRobert Mustacchi     {
1102*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_collect.stats_hw.emac_dmae_operation = NULL;
1103*d14abf15SRobert Mustacchi     }
1104*d14abf15SRobert Mustacchi 
1105*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS ;
1106*d14abf15SRobert Mustacchi }
1107*d14abf15SRobert Mustacchi 
1108*d14abf15SRobert Mustacchi /**lm_stats_hw_setup_nig
1109*d14abf15SRobert Mustacchi  * Add the DMAE command for reading NIG stats to the non-EMAC
1110*d14abf15SRobert Mustacchi  * DMAE context.
1111*d14abf15SRobert Mustacchi  *
1112*d14abf15SRobert Mustacchi  * @param pdev the device to initialize
1113*d14abf15SRobert Mustacchi  * @param dmae_operation the operation to setup for reading NIG
1114*d14abf15SRobert Mustacchi  *                       statistics
1115*d14abf15SRobert Mustacchi  *
1116*d14abf15SRobert Mustacchi  * @return lm_status_t LM_STATUS_SUCCESS on success, some other
1117*d14abf15SRobert Mustacchi  *         failure value on failure.
1118*d14abf15SRobert Mustacchi  */
lm_stats_hw_setup_nig(lm_device_t * pdev,lm_dmae_operation_t * dmae_operation)1119*d14abf15SRobert Mustacchi static lm_status_t lm_stats_hw_setup_nig(lm_device_t* pdev, lm_dmae_operation_t* dmae_operation)
1120*d14abf15SRobert Mustacchi {
1121*d14abf15SRobert Mustacchi     lm_status_t     lm_status    = LM_STATUS_FAILURE;
1122*d14abf15SRobert Mustacchi 
1123*d14abf15SRobert Mustacchi     lm_dmae_address_t source = lm_dmae_address((0==PORT_ID(pdev))?NIG_REG_STAT0_BRB_DISCARD : NIG_REG_STAT1_BRB_DISCARD,
1124*d14abf15SRobert Mustacchi                                                LM_DMAE_ADDRESS_GRC);
1125*d14abf15SRobert Mustacchi     lm_dmae_address_t dest = lm_dmae_address(pdev->vars.stats.stats_collect.stats_hw.nig_stats_phys_addr.as_u64,
1126*d14abf15SRobert Mustacchi                                              LM_DMAE_ADDRESS_HOST_PHYS);
1127*d14abf15SRobert Mustacchi 
1128*d14abf15SRobert Mustacchi     lm_status = lm_dmae_operation_add_sge(pdev, dmae_operation, source, dest, sizeof(struct _stats_nig_query_t ) / sizeof(u32_t));
1129*d14abf15SRobert Mustacchi 
1130*d14abf15SRobert Mustacchi     return lm_status;
1131*d14abf15SRobert Mustacchi }
1132*d14abf15SRobert Mustacchi 
1133*d14abf15SRobert Mustacchi /**
1134*d14abf15SRobert Mustacchi  * This struct is used to describe a DMAE SGE. It is used by the
1135*d14abf15SRobert Mustacchi  * lm_status_setup_xxx and lm_stats_set_dmae_operation_sges
1136*d14abf15SRobert Mustacchi  * functions.
1137*d14abf15SRobert Mustacchi  *
1138*d14abf15SRobert Mustacchi  */
1139*d14abf15SRobert Mustacchi struct lm_stats_sge_descr_t{
1140*d14abf15SRobert Mustacchi     u32_t source_offset;
1141*d14abf15SRobert Mustacchi     u64_t dest_paddr;
1142*d14abf15SRobert Mustacchi     u16_t length; // in DWORDS
1143*d14abf15SRobert Mustacchi };
1144*d14abf15SRobert Mustacchi 
1145*d14abf15SRobert Mustacchi 
1146*d14abf15SRobert Mustacchi /**lm_stats_set_dmae_operation_sges
1147*d14abf15SRobert Mustacchi  * Set the SGEs of a DMAE operation according to the supplied
1148*d14abf15SRobert Mustacchi  * SGE descriptor array. If the DMAE operation had any SGEs
1149*d14abf15SRobert Mustacchi  * defined before, this function removes them.
1150*d14abf15SRobert Mustacchi  *
1151*d14abf15SRobert Mustacchi  * @param pdev the device to use
1152*d14abf15SRobert Mustacchi  * @param operation the operation to modify
1153*d14abf15SRobert Mustacchi  * @param sge_descr the array of SGE descriptors
1154*d14abf15SRobert Mustacchi  * @param num_sges the number of SGE descriptors
1155*d14abf15SRobert Mustacchi  *
1156*d14abf15SRobert Mustacchi  * @return lm_status_t LM_STATUS_SUCCESS on success, some other
1157*d14abf15SRobert Mustacchi  *         failure value on failure.
1158*d14abf15SRobert Mustacchi  */
lm_stats_set_dmae_operation_sges(lm_device_t * pdev,lm_dmae_operation_t * operation,struct lm_stats_sge_descr_t * sge_descr,u8_t num_sges)1159*d14abf15SRobert Mustacchi static lm_status_t lm_stats_set_dmae_operation_sges(lm_device_t* pdev, lm_dmae_operation_t* operation, struct lm_stats_sge_descr_t* sge_descr, u8_t num_sges)
1160*d14abf15SRobert Mustacchi {
1161*d14abf15SRobert Mustacchi     u8_t sge_idx = 0;
1162*d14abf15SRobert Mustacchi     lm_dmae_address_t sge_source = {{0}};
1163*d14abf15SRobert Mustacchi     lm_dmae_address_t sge_dest = {{0}};
1164*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
1165*d14abf15SRobert Mustacchi 
1166*d14abf15SRobert Mustacchi     //after returning from D3 there may be some SGEs set up here.
1167*d14abf15SRobert Mustacchi     lm_dmae_operation_clear_all_sges(operation);
1168*d14abf15SRobert Mustacchi 
1169*d14abf15SRobert Mustacchi     for (sge_idx = 0; sge_idx < num_sges; ++sge_idx)
1170*d14abf15SRobert Mustacchi     {
1171*d14abf15SRobert Mustacchi         sge_source = lm_dmae_address(sge_descr[sge_idx].source_offset, LM_DMAE_ADDRESS_GRC);
1172*d14abf15SRobert Mustacchi         sge_dest = lm_dmae_address(sge_descr[sge_idx].dest_paddr, LM_DMAE_ADDRESS_HOST_PHYS);
1173*d14abf15SRobert Mustacchi 
1174*d14abf15SRobert Mustacchi         lm_status = lm_dmae_operation_add_sge(pdev, operation, sge_source, sge_dest, sge_descr[sge_idx].length);
1175*d14abf15SRobert Mustacchi         if (LM_STATUS_SUCCESS != lm_status)
1176*d14abf15SRobert Mustacchi         {
1177*d14abf15SRobert Mustacchi             DbgBreak();
1178*d14abf15SRobert Mustacchi             return lm_status;
1179*d14abf15SRobert Mustacchi         }
1180*d14abf15SRobert Mustacchi     }
1181*d14abf15SRobert Mustacchi 
1182*d14abf15SRobert Mustacchi     return lm_status;
1183*d14abf15SRobert Mustacchi }
1184*d14abf15SRobert Mustacchi 
1185*d14abf15SRobert Mustacchi /**lm_stats_hw_setup_emac
1186*d14abf15SRobert Mustacchi  * setup the DMAE SGL for the EMAC stats DMAE context
1187*d14abf15SRobert Mustacchi  *
1188*d14abf15SRobert Mustacchi  * @param pdev the device to initialize
1189*d14abf15SRobert Mustacchi  *
1190*d14abf15SRobert Mustacchi  * @return lm_status_t LM_STATUS_SUCCESS on success, some other
1191*d14abf15SRobert Mustacchi  *         value on failure.
1192*d14abf15SRobert Mustacchi  */
lm_stats_hw_setup_emac(lm_device_t * pdev)1193*d14abf15SRobert Mustacchi static lm_status_t lm_stats_hw_setup_emac(  lm_device_t* pdev)
1194*d14abf15SRobert Mustacchi {
1195*d14abf15SRobert Mustacchi     const u64_t base_paddr = pdev->vars.stats.stats_collect.stats_hw.mac_stats_phys_addr.as_u64;
1196*d14abf15SRobert Mustacchi 
1197*d14abf15SRobert Mustacchi     const u16_t sge1_len = sizeof(pdev->vars.stats.stats_collect.stats_hw.u.s.addr_emac_stats_query->stats_rx );
1198*d14abf15SRobert Mustacchi     const u16_t sge2_len = sizeof(pdev->vars.stats.stats_collect.stats_hw.u.s.addr_emac_stats_query->stats_rx_err );
1199*d14abf15SRobert Mustacchi     const u32_t emac_base = (PORT_ID(pdev)==0) ? GRCBASE_EMAC0 : GRCBASE_EMAC1;
1200*d14abf15SRobert Mustacchi 
1201*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_FAILURE;
1202*d14abf15SRobert Mustacchi 
1203*d14abf15SRobert Mustacchi     lm_dmae_operation_t* operation = pdev->vars.stats.stats_collect.stats_hw.emac_dmae_operation;
1204*d14abf15SRobert Mustacchi 
1205*d14abf15SRobert Mustacchi     struct lm_stats_sge_descr_t sges[3] = {{0}}; //we can't use an initializer because DOS compiler requires that all initializers be constant.
1206*d14abf15SRobert Mustacchi 
1207*d14abf15SRobert Mustacchi     sges[0].source_offset = emac_base + EMAC_REG_EMAC_RX_STAT_IFHCINOCTETS;
1208*d14abf15SRobert Mustacchi     sges[0].dest_paddr = base_paddr;
1209*d14abf15SRobert Mustacchi     sges[0].length = EMAC_REG_EMAC_RX_STAT_AC_COUNT;
1210*d14abf15SRobert Mustacchi 
1211*d14abf15SRobert Mustacchi     sges[1].source_offset = emac_base + EMAC_REG_EMAC_RX_STAT_FALSECARRIERERRORS;
1212*d14abf15SRobert Mustacchi     sges[1].dest_paddr = base_paddr + sge1_len;
1213*d14abf15SRobert Mustacchi     sges[1].length = 1;
1214*d14abf15SRobert Mustacchi 
1215*d14abf15SRobert Mustacchi     sges[2].source_offset = emac_base + EMAC_REG_EMAC_TX_STAT_IFHCOUTOCTETS;
1216*d14abf15SRobert Mustacchi     sges[2].dest_paddr = base_paddr + sge1_len + sge2_len;
1217*d14abf15SRobert Mustacchi     sges[2].length = EMAC_REG_EMAC_TX_STAT_AC_COUNT;
1218*d14abf15SRobert Mustacchi 
1219*d14abf15SRobert Mustacchi     lm_status = lm_stats_set_dmae_operation_sges(pdev, operation, sges, ARRSIZE(sges));
1220*d14abf15SRobert Mustacchi     if (LM_STATUS_SUCCESS != lm_status)
1221*d14abf15SRobert Mustacchi     {
1222*d14abf15SRobert Mustacchi         DbgBreakMsg("Failed to initialize EMAC stats DMAE operation.\n");
1223*d14abf15SRobert Mustacchi         return lm_status;
1224*d14abf15SRobert Mustacchi     }
1225*d14abf15SRobert Mustacchi 
1226*d14abf15SRobert Mustacchi     lm_status = lm_stats_hw_setup_nig(pdev, operation);
1227*d14abf15SRobert Mustacchi     if (LM_STATUS_SUCCESS != lm_status)
1228*d14abf15SRobert Mustacchi     {
1229*d14abf15SRobert Mustacchi         DbgBreakMsg("Failed to initialize NIG stats DMAE operation.\n");
1230*d14abf15SRobert Mustacchi         return lm_status;
1231*d14abf15SRobert Mustacchi     }
1232*d14abf15SRobert Mustacchi 
1233*d14abf15SRobert Mustacchi     return lm_status;
1234*d14abf15SRobert Mustacchi }
1235*d14abf15SRobert Mustacchi 
1236*d14abf15SRobert Mustacchi /**lm_stats_hw_setup_non_emac
1237*d14abf15SRobert Mustacchi  * Setup the DMAE SGL for the non-EMAC stats DMAE context. This
1238*d14abf15SRobert Mustacchi  * function assumes that the MAC statistics themselves can be
1239*d14abf15SRobert Mustacchi  * read with 2 DMAE transactions.
1240*d14abf15SRobert Mustacchi  *
1241*d14abf15SRobert Mustacchi  *
1242*d14abf15SRobert Mustacchi  * @param pdev the device to initialize
1243*d14abf15SRobert Mustacchi  * @param paddr_base the base physical address where the
1244*d14abf15SRobert Mustacchi  *                   statistics data will be copied.
1245*d14abf15SRobert Mustacchi  * @param grc_base the base GRC address of the required stats
1246*d14abf15SRobert Mustacchi  *                 block (e.g NIG_REG_INGRESS_BMAC0_MEM or
1247*d14abf15SRobert Mustacchi  *                 GRCBASE_MSTAT0)
1248*d14abf15SRobert Mustacchi  * @param block1_start offset of the first register in the first
1249*d14abf15SRobert Mustacchi  *                     transaction.
1250*d14abf15SRobert Mustacchi  * @param block1_size size (in bytes) of the first DMAE
1251*d14abf15SRobert Mustacchi  *                    transaction.
1252*d14abf15SRobert Mustacchi  * @param block2_start offset of the first register in the
1253*d14abf15SRobert Mustacchi  *                     second transaction.
1254*d14abf15SRobert Mustacchi  * @param block2_size size (in bytes) of the second DMAE
1255*d14abf15SRobert Mustacchi  *                    transaction.
1256*d14abf15SRobert Mustacchi  *
1257*d14abf15SRobert Mustacchi  * @return lm_status_t LM_STATUS_SUCCESS on success, some other
1258*d14abf15SRobert Mustacchi  *         value on failure.
1259*d14abf15SRobert Mustacchi  */
lm_stats_hw_setup_non_emac(lm_device_t * pdev,u64_t paddr_base,u32_t grc_base,u32_t block1_start,u16_t block1_size,u32_t block2_start,u16_t block2_size)1260*d14abf15SRobert Mustacchi static lm_status_t lm_stats_hw_setup_non_emac(  lm_device_t* pdev,
1261*d14abf15SRobert Mustacchi                                                 u64_t paddr_base,
1262*d14abf15SRobert Mustacchi                                                 u32_t grc_base,
1263*d14abf15SRobert Mustacchi                                                 u32_t block1_start, u16_t block1_size,
1264*d14abf15SRobert Mustacchi                                                 u32_t block2_start, u16_t block2_size)
1265*d14abf15SRobert Mustacchi {
1266*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_FAILURE;
1267*d14abf15SRobert Mustacchi 
1268*d14abf15SRobert Mustacchi     lm_dmae_operation_t* operation = (lm_dmae_operation_t*)pdev->vars.stats.stats_collect.stats_hw.non_emac_dmae_operation;
1269*d14abf15SRobert Mustacchi 
1270*d14abf15SRobert Mustacchi     struct lm_stats_sge_descr_t sges[2] = {{0}};
1271*d14abf15SRobert Mustacchi 
1272*d14abf15SRobert Mustacchi     sges[0].source_offset = grc_base+block1_start;
1273*d14abf15SRobert Mustacchi     sges[0].dest_paddr = paddr_base;
1274*d14abf15SRobert Mustacchi     sges[0].length = block1_size / sizeof(u32_t);
1275*d14abf15SRobert Mustacchi 
1276*d14abf15SRobert Mustacchi     sges[1].source_offset = grc_base+block2_start;
1277*d14abf15SRobert Mustacchi     sges[1].dest_paddr = paddr_base + block1_size;
1278*d14abf15SRobert Mustacchi     sges[1].length = block2_size / sizeof(u32_t);
1279*d14abf15SRobert Mustacchi 
1280*d14abf15SRobert Mustacchi     lm_status = lm_stats_set_dmae_operation_sges(pdev, operation, sges, ARRSIZE(sges));
1281*d14abf15SRobert Mustacchi     if (LM_STATUS_SUCCESS != lm_status)
1282*d14abf15SRobert Mustacchi     {
1283*d14abf15SRobert Mustacchi         DbgBreakMsg("Failed to initialize non-EMAC stats DMAE operation.\n");
1284*d14abf15SRobert Mustacchi         return lm_status;
1285*d14abf15SRobert Mustacchi     }
1286*d14abf15SRobert Mustacchi 
1287*d14abf15SRobert Mustacchi     lm_status = lm_stats_hw_setup_nig(pdev, operation);
1288*d14abf15SRobert Mustacchi     if (LM_STATUS_SUCCESS != lm_status)
1289*d14abf15SRobert Mustacchi     {
1290*d14abf15SRobert Mustacchi         DbgBreakMsg("Failed to initialize NIG stats DMAE operation.\n");
1291*d14abf15SRobert Mustacchi         return lm_status;
1292*d14abf15SRobert Mustacchi     }
1293*d14abf15SRobert Mustacchi 
1294*d14abf15SRobert Mustacchi     return lm_status;
1295*d14abf15SRobert Mustacchi }
1296*d14abf15SRobert Mustacchi 
1297*d14abf15SRobert Mustacchi /**lm_stats_hw_setup_bmac
1298*d14abf15SRobert Mustacchi  * Setup the BMAC1/BMAC2 stats DMAE transactions.
1299*d14abf15SRobert Mustacchi  * @see lm_stats_hw_setup_non_emac for more details.
1300*d14abf15SRobert Mustacchi  *
1301*d14abf15SRobert Mustacchi  * @param pdev the device to initialize.
1302*d14abf15SRobert Mustacchi  *
1303*d14abf15SRobert Mustacchi  * @return lm_status_t LM_STATUS_SUCCESS on success, some other
1304*d14abf15SRobert Mustacchi  *         value on failure.
1305*d14abf15SRobert Mustacchi  */
lm_stats_hw_setup_bmac(lm_device_t * pdev)1306*d14abf15SRobert Mustacchi static lm_status_t lm_stats_hw_setup_bmac(lm_device_t* pdev)
1307*d14abf15SRobert Mustacchi {
1308*d14abf15SRobert Mustacchi     const u32_t     port         = PORT_ID(pdev) ;
1309*d14abf15SRobert Mustacchi     u32_t           bmac_base    = 0 ; // bmac: GRCBASE_NIG, bmac_base + reg name
1310*d14abf15SRobert Mustacchi                                        // nig :GRCBASE_NIG, reg name (NIG_XXX)
1311*d14abf15SRobert Mustacchi     u32_t           bmac_tx_start_reg, bmac_rx_start_reg;
1312*d14abf15SRobert Mustacchi     u16_t           bmac_tx_stat_size, bmac_rx_stat_size;
1313*d14abf15SRobert Mustacchi     lm_status_t     lm_status = LM_STATUS_FAILURE;
1314*d14abf15SRobert Mustacchi 
1315*d14abf15SRobert Mustacchi     DbgBreakIf(HAS_MSTAT(pdev));
1316*d14abf15SRobert Mustacchi 
1317*d14abf15SRobert Mustacchi     switch( port )
1318*d14abf15SRobert Mustacchi     {
1319*d14abf15SRobert Mustacchi     case 0:
1320*d14abf15SRobert Mustacchi         bmac_base = NIG_REG_INGRESS_BMAC0_MEM ;
1321*d14abf15SRobert Mustacchi         break;
1322*d14abf15SRobert Mustacchi 
1323*d14abf15SRobert Mustacchi     case 1:
1324*d14abf15SRobert Mustacchi         bmac_base = NIG_REG_INGRESS_BMAC1_MEM;
1325*d14abf15SRobert Mustacchi 
1326*d14abf15SRobert Mustacchi         if (!CHIP_IS_E1x(pdev))
1327*d14abf15SRobert Mustacchi         {
1328*d14abf15SRobert Mustacchi             DbgMessage(pdev, INFORMi, "BMAC stats should never be collected on port 1 of E2!\n");
1329*d14abf15SRobert Mustacchi             bmac_base = NIG_REG_INGRESS_BMAC0_MEM;
1330*d14abf15SRobert Mustacchi         }
1331*d14abf15SRobert Mustacchi         break;
1332*d14abf15SRobert Mustacchi 
1333*d14abf15SRobert Mustacchi     default:
1334*d14abf15SRobert Mustacchi         DbgBreakIf( port > 1 ) ;
1335*d14abf15SRobert Mustacchi         break;
1336*d14abf15SRobert Mustacchi 
1337*d14abf15SRobert Mustacchi     }
1338*d14abf15SRobert Mustacchi 
1339*d14abf15SRobert Mustacchi     if (CHIP_IS_E1x(pdev))
1340*d14abf15SRobert Mustacchi     {
1341*d14abf15SRobert Mustacchi         bmac_tx_start_reg = BIGMAC_REGISTER_TX_STAT_GTPKT;
1342*d14abf15SRobert Mustacchi         bmac_rx_start_reg = BIGMAC_REGISTER_RX_STAT_GR64;
1343*d14abf15SRobert Mustacchi         bmac_tx_stat_size = sizeof(pdev->vars.stats.stats_collect.stats_hw.u.s.addr_bmac1_stats_query->stats_tx);
1344*d14abf15SRobert Mustacchi         bmac_rx_stat_size = sizeof(pdev->vars.stats.stats_collect.stats_hw.u.s.addr_bmac1_stats_query->stats_rx);
1345*d14abf15SRobert Mustacchi     }
1346*d14abf15SRobert Mustacchi     else
1347*d14abf15SRobert Mustacchi     {
1348*d14abf15SRobert Mustacchi         bmac_tx_start_reg = BIGMAC2_REGISTER_TX_STAT_GTPOK;
1349*d14abf15SRobert Mustacchi         bmac_rx_start_reg = BIGMAC2_REGISTER_RX_STAT_GR64;
1350*d14abf15SRobert Mustacchi         bmac_tx_stat_size = sizeof(pdev->vars.stats.stats_collect.stats_hw.u.s.addr_bmac2_stats_query->stats_tx);
1351*d14abf15SRobert Mustacchi         bmac_rx_stat_size = sizeof(pdev->vars.stats.stats_collect.stats_hw.u.s.addr_bmac2_stats_query->stats_rx);
1352*d14abf15SRobert Mustacchi     }
1353*d14abf15SRobert Mustacchi 
1354*d14abf15SRobert Mustacchi     lm_status = lm_stats_hw_setup_non_emac(pdev,
1355*d14abf15SRobert Mustacchi                                            pdev->vars.stats.stats_collect.stats_hw.bmac_stats_phys_addr.as_u64,
1356*d14abf15SRobert Mustacchi                                            bmac_base,
1357*d14abf15SRobert Mustacchi                                            bmac_tx_start_reg,
1358*d14abf15SRobert Mustacchi                                            bmac_tx_stat_size,
1359*d14abf15SRobert Mustacchi                                            bmac_rx_start_reg,
1360*d14abf15SRobert Mustacchi                                            bmac_rx_stat_size);
1361*d14abf15SRobert Mustacchi 
1362*d14abf15SRobert Mustacchi     return lm_status;
1363*d14abf15SRobert Mustacchi }
1364*d14abf15SRobert Mustacchi 
1365*d14abf15SRobert Mustacchi /**lm_stats_hw_setup_mstat
1366*d14abf15SRobert Mustacchi  * Setup the MSTAT stats DMAE transactions.
1367*d14abf15SRobert Mustacchi  * @see lm_stats_hw_setup_non_emac for more details.
1368*d14abf15SRobert Mustacchi  *
1369*d14abf15SRobert Mustacchi  * @param pdev the device to initialize.
1370*d14abf15SRobert Mustacchi  *
1371*d14abf15SRobert Mustacchi  * @return lm_status_t LM_STATUS_SUCCESS on success, some other
1372*d14abf15SRobert Mustacchi  *         value on failure.
1373*d14abf15SRobert Mustacchi  */
lm_stats_hw_setup_mstat(lm_device_t * pdev)1374*d14abf15SRobert Mustacchi static lm_status_t lm_stats_hw_setup_mstat(lm_device_t* pdev)
1375*d14abf15SRobert Mustacchi {
1376*d14abf15SRobert Mustacchi     const u32_t     port         = PORT_ID(pdev) ;
1377*d14abf15SRobert Mustacchi     u32_t           mstat_base   = 0;
1378*d14abf15SRobert Mustacchi     u32_t           mstat_tx_start, mstat_rx_start;
1379*d14abf15SRobert Mustacchi     u16_t           mstat_tx_size, mstat_rx_size;
1380*d14abf15SRobert Mustacchi     lm_status_t     lm_status    = LM_STATUS_FAILURE;
1381*d14abf15SRobert Mustacchi     lm_stats_hw_collect_t* stats_hw = &pdev->vars.stats.stats_collect.stats_hw;
1382*d14abf15SRobert Mustacchi 
1383*d14abf15SRobert Mustacchi     DbgBreakIf(!HAS_MSTAT(pdev));
1384*d14abf15SRobert Mustacchi 
1385*d14abf15SRobert Mustacchi     mstat_tx_start = MSTAT_REG_TX_STAT_GTXPOK_LO;
1386*d14abf15SRobert Mustacchi     mstat_tx_size = sizeof(stats_hw->u.addr_mstat_stats_query->stats_tx);
1387*d14abf15SRobert Mustacchi 
1388*d14abf15SRobert Mustacchi     mstat_rx_start = MSTAT_REG_RX_STAT_GR64_LO;
1389*d14abf15SRobert Mustacchi     mstat_rx_size = sizeof(stats_hw->u.addr_mstat_stats_query->stats_rx);
1390*d14abf15SRobert Mustacchi 
1391*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_stats_hw_setup_mstat: mstat_tx_start=%x, mstat_tx_size=%x, mstat_rx_start=%x, mstat_rx_size=%x\n",mstat_tx_start,mstat_tx_size,mstat_rx_start, mstat_rx_size);
1392*d14abf15SRobert Mustacchi 
1393*d14abf15SRobert Mustacchi     switch(port)
1394*d14abf15SRobert Mustacchi     {
1395*d14abf15SRobert Mustacchi     case 0:
1396*d14abf15SRobert Mustacchi         mstat_base = GRCBASE_MSTAT0;
1397*d14abf15SRobert Mustacchi         break;
1398*d14abf15SRobert Mustacchi     case 1:
1399*d14abf15SRobert Mustacchi         mstat_base = GRCBASE_MSTAT1;
1400*d14abf15SRobert Mustacchi         break;
1401*d14abf15SRobert Mustacchi     default:
1402*d14abf15SRobert Mustacchi         DbgBreakIf( port > 1 ) ;
1403*d14abf15SRobert Mustacchi         break;
1404*d14abf15SRobert Mustacchi     }
1405*d14abf15SRobert Mustacchi 
1406*d14abf15SRobert Mustacchi     lm_status = lm_stats_hw_setup_non_emac(pdev,
1407*d14abf15SRobert Mustacchi                                            pdev->vars.stats.stats_collect.stats_hw.mac_stats_phys_addr.as_u64,
1408*d14abf15SRobert Mustacchi                                            mstat_base,
1409*d14abf15SRobert Mustacchi                                            mstat_tx_start,
1410*d14abf15SRobert Mustacchi                                            mstat_tx_size,
1411*d14abf15SRobert Mustacchi                                            mstat_rx_start,
1412*d14abf15SRobert Mustacchi                                            mstat_rx_size);
1413*d14abf15SRobert Mustacchi 
1414*d14abf15SRobert Mustacchi     return lm_status;
1415*d14abf15SRobert Mustacchi }
1416*d14abf15SRobert Mustacchi 
1417*d14abf15SRobert Mustacchi /* Description:
1418*d14abf15SRobert Mustacchi *    setups resources regarding hw stats (init fields)
1419*d14abf15SRobert Mustacchi *    set offsets serials of hw reads, either from EMAC & BIGMAC or from MSTAT block
1420*d14abf15SRobert Mustacchi */
lm_stats_hw_setup(struct _lm_device_t * pdev)1421*d14abf15SRobert Mustacchi lm_status_t lm_stats_hw_setup(struct _lm_device_t *pdev)
1422*d14abf15SRobert Mustacchi {
1423*d14abf15SRobert Mustacchi     lm_status_t lm_status           = LM_STATUS_SUCCESS ;
1424*d14abf15SRobert Mustacchi     /* enable hw collect with mstat only if it's not fpga and not a 4-domain emulation compile... */
1425*d14abf15SRobert Mustacchi     u8_t        b_enable_collect    = HAS_MSTAT(pdev)? ((CHIP_REV_IS_EMUL(pdev) && (CHIP_BONDING(pdev) == 0)) || CHIP_REV_IS_ASIC(pdev)) : TRUE;
1426*d14abf15SRobert Mustacchi 
1427*d14abf15SRobert Mustacchi     if(HAS_MSTAT(pdev))
1428*d14abf15SRobert Mustacchi     {
1429*d14abf15SRobert Mustacchi         lm_status = lm_stats_hw_setup_mstat(pdev);
1430*d14abf15SRobert Mustacchi         if(lm_status != LM_STATUS_SUCCESS)
1431*d14abf15SRobert Mustacchi         {
1432*d14abf15SRobert Mustacchi             DbgMessage(NULL, FATAL, "Failed to initialize MSTAT statistics\n");
1433*d14abf15SRobert Mustacchi             return lm_status;
1434*d14abf15SRobert Mustacchi         }
1435*d14abf15SRobert Mustacchi     }
1436*d14abf15SRobert Mustacchi     else
1437*d14abf15SRobert Mustacchi     {
1438*d14abf15SRobert Mustacchi         lm_status = lm_stats_hw_setup_emac(pdev);
1439*d14abf15SRobert Mustacchi         if(lm_status != LM_STATUS_SUCCESS)
1440*d14abf15SRobert Mustacchi         {
1441*d14abf15SRobert Mustacchi             DbgMessage(NULL, FATAL, "Failed to initialize EMAC statistics\n");
1442*d14abf15SRobert Mustacchi             return lm_status;
1443*d14abf15SRobert Mustacchi         }
1444*d14abf15SRobert Mustacchi         lm_status = lm_stats_hw_setup_bmac(pdev);
1445*d14abf15SRobert Mustacchi         if(lm_status != LM_STATUS_SUCCESS)
1446*d14abf15SRobert Mustacchi         {
1447*d14abf15SRobert Mustacchi             DbgMessage(NULL, FATAL, "Failed to initialize BMAC statistics\n");
1448*d14abf15SRobert Mustacchi             return lm_status;
1449*d14abf15SRobert Mustacchi         }
1450*d14abf15SRobert Mustacchi     }
1451*d14abf15SRobert Mustacchi 
1452*d14abf15SRobert Mustacchi     pdev->vars.stats.stats_collect.stats_hw.b_is_link_up = FALSE;
1453*d14abf15SRobert Mustacchi 
1454*d14abf15SRobert Mustacchi     pdev->vars.stats.stats_collect.stats_hw.b_collect_enabled = b_enable_collect ; // HW stats are not supported on E3 FPGA.
1455*d14abf15SRobert Mustacchi 
1456*d14abf15SRobert Mustacchi     return lm_status ;
1457*d14abf15SRobert Mustacchi } /* lm_stats_hw_setup */
1458*d14abf15SRobert Mustacchi 
1459*d14abf15SRobert Mustacchi /**
1460*d14abf15SRobert Mustacchi  * This function will prepare the statistics ramrod data the way
1461*d14abf15SRobert Mustacchi  * we will only have to increment the statistics counter and
1462*d14abf15SRobert Mustacchi  * send the ramrod each time we have to.
1463*d14abf15SRobert Mustacchi  *
1464*d14abf15SRobert Mustacchi  * @param pdev
1465*d14abf15SRobert Mustacchi  */
lm_stats_prep_fw_stats_req(lm_device_t * pdev)1466*d14abf15SRobert Mustacchi static void lm_stats_prep_fw_stats_req(lm_device_t *pdev)
1467*d14abf15SRobert Mustacchi {
1468*d14abf15SRobert Mustacchi     lm_stats_fw_collect_t     *stats_fw        = &pdev->vars.stats.stats_collect.stats_fw;
1469*d14abf15SRobert Mustacchi     struct stats_query_header *stats_hdr       = &stats_fw->fw_stats_req->hdr;
1470*d14abf15SRobert Mustacchi     lm_address_t              cur_data_offset  = {{0}};
1471*d14abf15SRobert Mustacchi     struct stats_query_entry  *cur_query_entry = NULL;
1472*d14abf15SRobert Mustacchi 
1473*d14abf15SRobert Mustacchi     stats_hdr->cmd_num           = stats_fw->fw_stats_num;
1474*d14abf15SRobert Mustacchi     stats_hdr->drv_stats_counter = 0;
1475*d14abf15SRobert Mustacchi 
1476*d14abf15SRobert Mustacchi     /* storm_counters struct contains the counters of completed
1477*d14abf15SRobert Mustacchi      * statistics requests per storm which are incremented by FW
1478*d14abf15SRobert Mustacchi      * each time it completes hadning a statistics ramrod. We will
1479*d14abf15SRobert Mustacchi      * check these counters in the timer handler and discard a
1480*d14abf15SRobert Mustacchi      * (statistics) ramrod completion.
1481*d14abf15SRobert Mustacchi      */
1482*d14abf15SRobert Mustacchi     cur_data_offset = stats_fw->fw_stats_data_mapping;
1483*d14abf15SRobert Mustacchi     LM_INC64(&cur_data_offset, OFFSETOF(lm_stats_fw_stats_data_t, storm_counters));
1484*d14abf15SRobert Mustacchi 
1485*d14abf15SRobert Mustacchi     stats_hdr->stats_counters_addrs.hi = mm_cpu_to_le32(cur_data_offset.as_u32.high);
1486*d14abf15SRobert Mustacchi     stats_hdr->stats_counters_addrs.lo = mm_cpu_to_le32(cur_data_offset.as_u32.low);
1487*d14abf15SRobert Mustacchi 
1488*d14abf15SRobert Mustacchi     /* prepare to the first stats ramrod (will be completed with
1489*d14abf15SRobert Mustacchi      * the counters equal to zero) - init counters to somethig different.
1490*d14abf15SRobert Mustacchi      */
1491*d14abf15SRobert Mustacchi     mm_memset(&stats_fw->fw_stats_data->storm_counters, 0xff, sizeof(stats_fw->fw_stats_data->storm_counters) );
1492*d14abf15SRobert Mustacchi 
1493*d14abf15SRobert Mustacchi     /**** Port FW statistics data ****/
1494*d14abf15SRobert Mustacchi     cur_data_offset = stats_fw->fw_stats_data_mapping;
1495*d14abf15SRobert Mustacchi     LM_INC64(&cur_data_offset, OFFSETOF(lm_stats_fw_stats_data_t, port));
1496*d14abf15SRobert Mustacchi 
1497*d14abf15SRobert Mustacchi     cur_query_entry = &stats_fw->fw_stats_req->query[LM_STATS_PORT_QUERY_IDX];
1498*d14abf15SRobert Mustacchi 
1499*d14abf15SRobert Mustacchi     cur_query_entry->kind       = STATS_TYPE_PORT;
1500*d14abf15SRobert Mustacchi     /* For port query index is a DONT CARE */
1501*d14abf15SRobert Mustacchi     cur_query_entry->index      = PORT_ID(pdev);
1502*d14abf15SRobert Mustacchi     cur_query_entry->funcID     = mm_cpu_to_le16(FUNC_ID(pdev));;
1503*d14abf15SRobert Mustacchi     cur_query_entry->address.hi = mm_cpu_to_le32(cur_data_offset.as_u32.high);
1504*d14abf15SRobert Mustacchi     cur_query_entry->address.lo = mm_cpu_to_le32(cur_data_offset.as_u32.low);
1505*d14abf15SRobert Mustacchi 
1506*d14abf15SRobert Mustacchi     /**** PF FW statistics data ****/
1507*d14abf15SRobert Mustacchi     cur_data_offset = stats_fw->fw_stats_data_mapping;
1508*d14abf15SRobert Mustacchi     LM_INC64(&cur_data_offset, OFFSETOF(lm_stats_fw_stats_data_t, pf));
1509*d14abf15SRobert Mustacchi 
1510*d14abf15SRobert Mustacchi     cur_query_entry = &stats_fw->fw_stats_req->query[LM_STATS_PF_QUERY_IDX];
1511*d14abf15SRobert Mustacchi 
1512*d14abf15SRobert Mustacchi     cur_query_entry->kind       = STATS_TYPE_PF;
1513*d14abf15SRobert Mustacchi     /* For PF query index is a DONT CARE */
1514*d14abf15SRobert Mustacchi     cur_query_entry->index      = PORT_ID(pdev);
1515*d14abf15SRobert Mustacchi     cur_query_entry->funcID     = mm_cpu_to_le16(FUNC_ID(pdev));
1516*d14abf15SRobert Mustacchi     cur_query_entry->address.hi = mm_cpu_to_le32(cur_data_offset.as_u32.high);
1517*d14abf15SRobert Mustacchi     cur_query_entry->address.lo = mm_cpu_to_le32(cur_data_offset.as_u32.low);
1518*d14abf15SRobert Mustacchi 
1519*d14abf15SRobert Mustacchi     /**** Toe query  ****/
1520*d14abf15SRobert Mustacchi     cur_data_offset = stats_fw->fw_stats_data_mapping;
1521*d14abf15SRobert Mustacchi     LM_INC64(&cur_data_offset, OFFSETOF(lm_stats_fw_stats_data_t, toe));
1522*d14abf15SRobert Mustacchi 
1523*d14abf15SRobert Mustacchi     ASSERT_STATIC(LM_STATS_TOE_IDX<ARRSIZE(stats_fw->fw_stats_req->query));
1524*d14abf15SRobert Mustacchi     cur_query_entry = &stats_fw->fw_stats_req->query[LM_STATS_TOE_IDX];
1525*d14abf15SRobert Mustacchi 
1526*d14abf15SRobert Mustacchi     cur_query_entry->kind       = STATS_TYPE_TOE;
1527*d14abf15SRobert Mustacchi     cur_query_entry->index      = LM_STATS_CNT_ID(pdev);
1528*d14abf15SRobert Mustacchi     cur_query_entry->funcID     = mm_cpu_to_le16(FUNC_ID(pdev));
1529*d14abf15SRobert Mustacchi     cur_query_entry->address.hi = mm_cpu_to_le32(cur_data_offset.as_u32.high);
1530*d14abf15SRobert Mustacchi     cur_query_entry->address.lo = mm_cpu_to_le32(cur_data_offset.as_u32.low);
1531*d14abf15SRobert Mustacchi 
1532*d14abf15SRobert Mustacchi     if ( !CHIP_IS_E1x(pdev) )
1533*d14abf15SRobert Mustacchi     {
1534*d14abf15SRobert Mustacchi         // FW will assert if we send this kind for chip < E2
1535*d14abf15SRobert Mustacchi         /**** FCoE query  ****/
1536*d14abf15SRobert Mustacchi         cur_data_offset = stats_fw->fw_stats_data_mapping;
1537*d14abf15SRobert Mustacchi         LM_INC64(&cur_data_offset, OFFSETOF(lm_stats_fw_stats_data_t, fcoe));
1538*d14abf15SRobert Mustacchi 
1539*d14abf15SRobert Mustacchi         ASSERT_STATIC(LM_STATS_FCOE_IDX<ARRSIZE(stats_fw->fw_stats_req->query));
1540*d14abf15SRobert Mustacchi         cur_query_entry = &stats_fw->fw_stats_req->query[LM_STATS_FCOE_IDX];
1541*d14abf15SRobert Mustacchi         cur_query_entry->kind       = STATS_TYPE_FCOE;
1542*d14abf15SRobert Mustacchi         cur_query_entry->index      = LM_STATS_CNT_ID(pdev);
1543*d14abf15SRobert Mustacchi         cur_query_entry->funcID     = mm_cpu_to_le16(FUNC_ID(pdev));
1544*d14abf15SRobert Mustacchi         cur_query_entry->address.hi = mm_cpu_to_le32(cur_data_offset.as_u32.high);
1545*d14abf15SRobert Mustacchi         cur_query_entry->address.lo = mm_cpu_to_le32(cur_data_offset.as_u32.low);
1546*d14abf15SRobert Mustacchi     }
1547*d14abf15SRobert Mustacchi     else
1548*d14abf15SRobert Mustacchi     {
1549*d14abf15SRobert Mustacchi         // if no FCoE, we need to decrease command count by one
1550*d14abf15SRobert Mustacchi         --stats_hdr->cmd_num;
1551*d14abf15SRobert Mustacchi     }
1552*d14abf15SRobert Mustacchi 
1553*d14abf15SRobert Mustacchi     /**** Clients' queries ****/
1554*d14abf15SRobert Mustacchi     cur_data_offset = stats_fw->fw_stats_data_mapping;
1555*d14abf15SRobert Mustacchi     LM_INC64(&cur_data_offset, OFFSETOF(lm_stats_fw_stats_data_t, queue_stats));
1556*d14abf15SRobert Mustacchi 
1557*d14abf15SRobert Mustacchi     ASSERT_STATIC(LM_STATS_FIRST_QUEUE_QUERY_IDX < ARRSIZE(stats_fw->fw_stats_req->query));
1558*d14abf15SRobert Mustacchi     cur_query_entry = &stats_fw->fw_stats_req->query[LM_STATS_FIRST_QUEUE_QUERY_IDX];
1559*d14abf15SRobert Mustacchi 
1560*d14abf15SRobert Mustacchi     cur_query_entry->kind       = STATS_TYPE_QUEUE;
1561*d14abf15SRobert Mustacchi     cur_query_entry->index      = LM_STATS_CNT_ID(pdev);
1562*d14abf15SRobert Mustacchi     cur_query_entry->funcID     = mm_cpu_to_le16(FUNC_ID(pdev));
1563*d14abf15SRobert Mustacchi     cur_query_entry->address.hi = mm_cpu_to_le32(cur_data_offset.as_u32.high);
1564*d14abf15SRobert Mustacchi     cur_query_entry->address.lo = mm_cpu_to_le32(cur_data_offset.as_u32.low);
1565*d14abf15SRobert Mustacchi     /* TODO : VF! more stats? */
1566*d14abf15SRobert Mustacchi }
1567*d14abf15SRobert Mustacchi 
1568*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
lm_stats_prep_vf_fw_stats_req(lm_device_t * pdev)1569*d14abf15SRobert Mustacchi void lm_stats_prep_vf_fw_stats_req(lm_device_t *pdev)
1570*d14abf15SRobert Mustacchi {
1571*d14abf15SRobert Mustacchi     lm_stats_fw_collect_t      *stats_fw = &pdev->vars.stats.stats_collect.stats_fw;
1572*d14abf15SRobert Mustacchi     struct stats_query_header  *stats_hdr = &stats_fw->fw_stats_req->hdr;
1573*d14abf15SRobert Mustacchi     struct stats_query_entry   *cur_query_entry;
1574*d14abf15SRobert Mustacchi     u8_t                        vf_idx = 0;
1575*d14abf15SRobert Mustacchi     u8_t                        cmd_cnt = 0;
1576*d14abf15SRobert Mustacchi     lm_vf_info_t               *vf_info;
1577*d14abf15SRobert Mustacchi 
1578*d14abf15SRobert Mustacchi     cur_query_entry = &stats_fw->fw_stats_req->query[LM_STATS_FIRST_VF_QUEUE_QUERY_IDX];
1579*d14abf15SRobert Mustacchi 
1580*d14abf15SRobert Mustacchi     MM_ACQUIRE_VFS_STATS_LOCK_DPC(pdev);
1581*d14abf15SRobert Mustacchi     for (vf_idx = 0; vf_idx < pdev->vfs_set.number_of_enabled_vfs; vf_idx++) {
1582*d14abf15SRobert Mustacchi         vf_info = &pdev->vfs_set.vfs_array[vf_idx];
1583*d14abf15SRobert Mustacchi         if (vf_info->vf_stats.vf_stats_state == VF_STATS_REQ_SUBMITTED) {
1584*d14abf15SRobert Mustacchi             u8_t process_it = FALSE;
1585*d14abf15SRobert Mustacchi             if (vf_info->vf_stats.vf_stats_flag & VF_STATS_COLLECT_FW_STATS_FOR_PF) {
1586*d14abf15SRobert Mustacchi                 cur_query_entry->kind = STATS_TYPE_QUEUE;
1587*d14abf15SRobert Mustacchi                 cur_query_entry->index = LM_FW_VF_STATS_CNT_ID(vf_info);
1588*d14abf15SRobert Mustacchi                 cur_query_entry->funcID = mm_cpu_to_le16(FUNC_ID(pdev));
1589*d14abf15SRobert Mustacchi                 cur_query_entry->address.hi = mm_cpu_to_le32(vf_info->vf_stats.pf_fw_stats_phys_data.as_u32.high);
1590*d14abf15SRobert Mustacchi                 cur_query_entry->address.lo = mm_cpu_to_le32(vf_info->vf_stats.pf_fw_stats_phys_data.as_u32.low);
1591*d14abf15SRobert Mustacchi                 process_it = TRUE;
1592*d14abf15SRobert Mustacchi                 cur_query_entry++;
1593*d14abf15SRobert Mustacchi                 cmd_cnt++;
1594*d14abf15SRobert Mustacchi             }
1595*d14abf15SRobert Mustacchi             if (vf_info->vf_stats.vf_stats_flag & VF_STATS_COLLECT_FW_STATS_FOR_VF) {
1596*d14abf15SRobert Mustacchi                 cur_query_entry->kind = STATS_TYPE_QUEUE;
1597*d14abf15SRobert Mustacchi                 cur_query_entry->index = LM_FW_VF_STATS_CNT_ID(vf_info);
1598*d14abf15SRobert Mustacchi                 cur_query_entry->funcID = mm_cpu_to_le16(8 + vf_info->abs_vf_id);
1599*d14abf15SRobert Mustacchi                 cur_query_entry->address.hi = mm_cpu_to_le32(vf_info->vf_stats.vf_fw_stats_phys_data.as_u32.high);
1600*d14abf15SRobert Mustacchi                 cur_query_entry->address.lo = mm_cpu_to_le32(vf_info->vf_stats.vf_fw_stats_phys_data.as_u32.low);
1601*d14abf15SRobert Mustacchi                 process_it = TRUE;
1602*d14abf15SRobert Mustacchi                 cur_query_entry++;
1603*d14abf15SRobert Mustacchi                 cmd_cnt++;
1604*d14abf15SRobert Mustacchi             }
1605*d14abf15SRobert Mustacchi             if (process_it) {
1606*d14abf15SRobert Mustacchi                 vf_info->vf_stats.vf_stats_state = VF_STATS_REQ_IN_PROCESSING;
1607*d14abf15SRobert Mustacchi                 vf_info->vf_stats.vf_stats_cnt++;
1608*d14abf15SRobert Mustacchi             }
1609*d14abf15SRobert Mustacchi         }
1610*d14abf15SRobert Mustacchi     }
1611*d14abf15SRobert Mustacchi     stats_hdr->cmd_num = stats_fw->fw_static_stats_num + cmd_cnt;
1612*d14abf15SRobert Mustacchi     MM_RELEASE_VFS_STATS_LOCK_DPC(pdev);
1613*d14abf15SRobert Mustacchi 
1614*d14abf15SRobert Mustacchi }
1615*d14abf15SRobert Mustacchi #endif
1616*d14abf15SRobert Mustacchi 
1617*d14abf15SRobert Mustacchi /* Description:
1618*d14abf15SRobert Mustacchi *    setups fw statistics parameters
1619*d14abf15SRobert Mustacchi */
lm_stats_fw_setup(struct _lm_device_t * pdev)1620*d14abf15SRobert Mustacchi void lm_stats_fw_setup(struct _lm_device_t *pdev)
1621*d14abf15SRobert Mustacchi {
1622*d14abf15SRobert Mustacchi     lm_stats_fw_collect_t * stats_fw = &pdev->vars.stats.stats_collect.stats_fw;
1623*d14abf15SRobert Mustacchi     stats_fw->b_completion_done      = TRUE ; // reset flag to initial value
1624*d14abf15SRobert Mustacchi     stats_fw->b_ramrod_completed     = TRUE ;
1625*d14abf15SRobert Mustacchi     stats_fw->drv_counter            = 0 ;
1626*d14abf15SRobert Mustacchi     stats_fw->b_collect_enabled      = pdev->params.fw_stats_init_value ; // change to TRUE in order to enable fw stats
1627*d14abf15SRobert Mustacchi 
1628*d14abf15SRobert Mustacchi     pdev->vars.stats.stats_collect.b_last_called  = TRUE ;
1629*d14abf15SRobert Mustacchi 
1630*d14abf15SRobert Mustacchi     /* Prepare the constatnt slow-path command (For stats we don't allocate a new one each time) */
1631*d14abf15SRobert Mustacchi     lm_sq_post_fill_entry(pdev,
1632*d14abf15SRobert Mustacchi                           &(stats_fw->stats_sp_list_command),
1633*d14abf15SRobert Mustacchi                           0 /* cid: Don't care */,
1634*d14abf15SRobert Mustacchi                           RAMROD_CMD_ID_COMMON_STAT_QUERY,
1635*d14abf15SRobert Mustacchi                           NONE_CONNECTION_TYPE,
1636*d14abf15SRobert Mustacchi                           stats_fw->fw_stats_req_mapping.as_u64,
1637*d14abf15SRobert Mustacchi                           FALSE /* don't release sp mem*/);
1638*d14abf15SRobert Mustacchi 
1639*d14abf15SRobert Mustacchi     /* Prepare the FW stats ramrod request structure (can do this just once) */
1640*d14abf15SRobert Mustacchi     lm_stats_prep_fw_stats_req(pdev);
1641*d14abf15SRobert Mustacchi }
1642*d14abf15SRobert Mustacchi /*
1643*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
1644*d14abf15SRobert Mustacchi  * lm_stats_fw_check_update_done -
1645*d14abf15SRobert Mustacchi  *
1646*d14abf15SRobert Mustacchi  * check done flags and update flags
1647*d14abf15SRobert Mustacchi  *
1648*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
1649*d14abf15SRobert Mustacchi  */
lm_stats_fw_check_update_done(struct _lm_device_t * pdev,OUT u32_t * ptr_stats_flags_done)1650*d14abf15SRobert Mustacchi void lm_stats_fw_check_update_done( struct _lm_device_t *pdev, OUT u32_t* ptr_stats_flags_done )
1651*d14abf15SRobert Mustacchi {
1652*d14abf15SRobert Mustacchi     if CHK_NULL( ptr_stats_flags_done )
1653*d14abf15SRobert Mustacchi     {
1654*d14abf15SRobert Mustacchi         DbgBreakIf(!ptr_stats_flags_done) ;
1655*d14abf15SRobert Mustacchi         return;
1656*d14abf15SRobert Mustacchi     }
1657*d14abf15SRobert Mustacchi 
1658*d14abf15SRobert Mustacchi     if (IS_VFDEV(pdev)) {
1659*d14abf15SRobert Mustacchi         SET_FLAGS(*ptr_stats_flags_done,LM_STATS_FLAGS_ALL);
1660*d14abf15SRobert Mustacchi         return;
1661*d14abf15SRobert Mustacchi     }
1662*d14abf15SRobert Mustacchi     // For each storm still wasn't done, we check and if done - set, so next time
1663*d14abf15SRobert Mustacchi     // we won't need to check again
1664*d14abf15SRobert Mustacchi 
1665*d14abf15SRobert Mustacchi     // eth xstorm
1666*d14abf15SRobert Mustacchi     if( 0 == GET_FLAGS(*ptr_stats_flags_done, LM_STATS_FLAG_XSTORM ) )
1667*d14abf15SRobert Mustacchi     {
1668*d14abf15SRobert Mustacchi         if( LM_STATS_VERIFY_COUNTER( pdev, fw_stats_data->storm_counters.xstats_counter ) )
1669*d14abf15SRobert Mustacchi         {
1670*d14abf15SRobert Mustacchi             SET_FLAGS(*ptr_stats_flags_done,LM_STATS_FLAG_XSTORM ) ;
1671*d14abf15SRobert Mustacchi         }
1672*d14abf15SRobert Mustacchi     }
1673*d14abf15SRobert Mustacchi 
1674*d14abf15SRobert Mustacchi     // eth tstorm
1675*d14abf15SRobert Mustacchi     if( 0 == GET_FLAGS(*ptr_stats_flags_done, LM_STATS_FLAG_TSTORM ) )
1676*d14abf15SRobert Mustacchi     {
1677*d14abf15SRobert Mustacchi         if( LM_STATS_VERIFY_COUNTER( pdev, fw_stats_data->storm_counters.tstats_counter ) )
1678*d14abf15SRobert Mustacchi         {
1679*d14abf15SRobert Mustacchi             SET_FLAGS(*ptr_stats_flags_done,LM_STATS_FLAG_TSTORM ) ;
1680*d14abf15SRobert Mustacchi         }
1681*d14abf15SRobert Mustacchi     }
1682*d14abf15SRobert Mustacchi 
1683*d14abf15SRobert Mustacchi     // eth ustorm
1684*d14abf15SRobert Mustacchi     if( 0 == GET_FLAGS(*ptr_stats_flags_done, LM_STATS_FLAG_USTORM ) )
1685*d14abf15SRobert Mustacchi     {
1686*d14abf15SRobert Mustacchi         if( LM_STATS_VERIFY_COUNTER( pdev, fw_stats_data->storm_counters.ustats_counter ) )
1687*d14abf15SRobert Mustacchi         {
1688*d14abf15SRobert Mustacchi             SET_FLAGS(*ptr_stats_flags_done,LM_STATS_FLAG_USTORM ) ;
1689*d14abf15SRobert Mustacchi         }
1690*d14abf15SRobert Mustacchi     }
1691*d14abf15SRobert Mustacchi 
1692*d14abf15SRobert Mustacchi     // eth cstorm
1693*d14abf15SRobert Mustacchi     if( 0 == GET_FLAGS(*ptr_stats_flags_done, LM_STATS_FLAG_CSTORM ) )
1694*d14abf15SRobert Mustacchi     {
1695*d14abf15SRobert Mustacchi         if( LM_STATS_VERIFY_COUNTER( pdev, fw_stats_data->storm_counters.cstats_counter ) )
1696*d14abf15SRobert Mustacchi         {
1697*d14abf15SRobert Mustacchi             SET_FLAGS(*ptr_stats_flags_done,LM_STATS_FLAG_CSTORM ) ;
1698*d14abf15SRobert Mustacchi         }
1699*d14abf15SRobert Mustacchi     }
1700*d14abf15SRobert Mustacchi 
1701*d14abf15SRobert Mustacchi }
1702*d14abf15SRobert Mustacchi 
1703*d14abf15SRobert Mustacchi /**
1704*d14abf15SRobert Mustacchi  * @Desription: Checks if FW completed last statistic update, if
1705*d14abf15SRobert Mustacchi  *            it did it assigns the statistics
1706*d14abf15SRobert Mustacchi  *
1707*d14abf15SRobert Mustacchi  * @param pdev
1708*d14abf15SRobert Mustacchi  *
1709*d14abf15SRobert Mustacchi  * @return lm_status_t LM_STATUS_SUCCESS if FW has completed
1710*d14abf15SRobert Mustacchi  *         LM_STATUS_BUSY if it hasn't yet completed
1711*d14abf15SRobert Mustacchi  */
lm_stats_fw_complete(struct _lm_device_t * pdev)1712*d14abf15SRobert Mustacchi lm_status_t lm_stats_fw_complete( struct _lm_device_t *pdev  )
1713*d14abf15SRobert Mustacchi {
1714*d14abf15SRobert Mustacchi     u32_t stats_flags_done      = 0 ; // bit wise for storms done flags are on
1715*d14abf15SRobert Mustacchi     u32_t stats_flags_assigned  = 0 ; // bit wise for already assigned values from storms
1716*d14abf15SRobert Mustacchi     lm_status_t lm_status             = LM_STATUS_SUCCESS;
1717*d14abf15SRobert Mustacchi 
1718*d14abf15SRobert Mustacchi     if CHK_NULL( pdev )
1719*d14abf15SRobert Mustacchi     {
1720*d14abf15SRobert Mustacchi         DbgBreakIf( !pdev ) ;
1721*d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
1722*d14abf15SRobert Mustacchi     }
1723*d14abf15SRobert Mustacchi 
1724*d14abf15SRobert Mustacchi     /* First check if the ramrod has completed, if it hasn't don't bother checking
1725*d14abf15SRobert Mustacchi      * dma completion  yet, we need both of them to complete before sending another
1726*d14abf15SRobert Mustacchi      * ramrod. */
1727*d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev) && (FALSE == pdev->vars.stats.stats_collect.stats_fw.b_ramrod_completed))
1728*d14abf15SRobert Mustacchi     {
1729*d14abf15SRobert Mustacchi         lm_status = LM_STATUS_BUSY;
1730*d14abf15SRobert Mustacchi     }
1731*d14abf15SRobert Mustacchi     else if (FALSE == pdev->vars.stats.stats_collect.stats_fw.b_completion_done)
1732*d14abf15SRobert Mustacchi     {
1733*d14abf15SRobert Mustacchi 
1734*d14abf15SRobert Mustacchi         // check done flags and update the falg if there was a change
1735*d14abf15SRobert Mustacchi         lm_stats_fw_check_update_done( pdev, &stats_flags_done ) ;
1736*d14abf15SRobert Mustacchi 
1737*d14abf15SRobert Mustacchi         // Check if we can assign any of the storms
1738*d14abf15SRobert Mustacchi         if ( LM_STATS_DO_ASSIGN_ANY( stats_flags_done, stats_flags_assigned) )
1739*d14abf15SRobert Mustacchi         {
1740*d14abf15SRobert Mustacchi             // assign stats that are ready
1741*d14abf15SRobert Mustacchi             lm_stats_fw_assign( pdev, stats_flags_done, &stats_flags_assigned ) ;
1742*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
1743*d14abf15SRobert Mustacchi #ifndef __LINUX
1744*d14abf15SRobert Mustacchi             if (IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev)) {
1745*d14abf15SRobert Mustacchi                 u32_t vf_stats_flags_assigned  = 0;
1746*d14abf15SRobert Mustacchi                 MM_ACQUIRE_VFS_STATS_LOCK_DPC(pdev);
1747*d14abf15SRobert Mustacchi                 lm_pf_stats_vf_fw_assign( pdev, stats_flags_done, &vf_stats_flags_assigned);
1748*d14abf15SRobert Mustacchi                 MM_RELEASE_VFS_STATS_LOCK_DPC(pdev);
1749*d14abf15SRobert Mustacchi             }
1750*d14abf15SRobert Mustacchi #endif
1751*d14abf15SRobert Mustacchi #endif
1752*d14abf15SRobert Mustacchi         }
1753*d14abf15SRobert Mustacchi 
1754*d14abf15SRobert Mustacchi         // did all storms were assigned
1755*d14abf15SRobert Mustacchi         if ERR_IF( LM_STATS_FLAGS_ALL != stats_flags_assigned  )
1756*d14abf15SRobert Mustacchi         {
1757*d14abf15SRobert Mustacchi             lm_status = LM_STATUS_BUSY;
1758*d14abf15SRobert Mustacchi         }
1759*d14abf15SRobert Mustacchi         else
1760*d14abf15SRobert Mustacchi         {
1761*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
1762*d14abf15SRobert Mustacchi #ifndef __LINUX
1763*d14abf15SRobert Mustacchi             if (IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev)) {
1764*d14abf15SRobert Mustacchi                 u8_t            vf_idx;
1765*d14abf15SRobert Mustacchi                 lm_vf_info_t   *vf_info;
1766*d14abf15SRobert Mustacchi                 MM_ACQUIRE_VFS_STATS_LOCK_DPC(pdev);
1767*d14abf15SRobert Mustacchi                 for (vf_idx = 0; vf_idx < pdev->vfs_set.number_of_enabled_vfs; vf_idx++) {
1768*d14abf15SRobert Mustacchi                     vf_info = &pdev->vfs_set.vfs_array[vf_idx];
1769*d14abf15SRobert Mustacchi                     if (vf_info->vf_stats.vf_stats_state == VF_STATS_REQ_IN_PROCESSING) {
1770*d14abf15SRobert Mustacchi                         if (vf_info->vf_stats.stop_collect_stats || vf_info->was_flred) {
1771*d14abf15SRobert Mustacchi                             vf_info->vf_stats.vf_stats_state = VF_STATS_REQ_READY;
1772*d14abf15SRobert Mustacchi                         } else {
1773*d14abf15SRobert Mustacchi                             vf_info->vf_stats.vf_stats_state = VF_STATS_REQ_SUBMITTED;
1774*d14abf15SRobert Mustacchi                         }
1775*d14abf15SRobert Mustacchi                     }
1776*d14abf15SRobert Mustacchi                 }
1777*d14abf15SRobert Mustacchi                 MM_RELEASE_VFS_STATS_LOCK_DPC(pdev);
1778*d14abf15SRobert Mustacchi             }
1779*d14abf15SRobert Mustacchi #endif
1780*d14abf15SRobert Mustacchi #endif
1781*d14abf15SRobert Mustacchi             ++pdev->vars.stats.stats_collect.stats_fw.drv_counter ;
1782*d14abf15SRobert Mustacchi 
1783*d14abf15SRobert Mustacchi             // barrier (for IA64) is to assure that the counter will be incremented BEFORE
1784*d14abf15SRobert Mustacchi             // the complation_done flag is set to TRUE.
1785*d14abf15SRobert Mustacchi             // in order to assure correct drv_counter sent to fw in lm_stats_on_timer (CQ48772)
1786*d14abf15SRobert Mustacchi 
1787*d14abf15SRobert Mustacchi             if (IS_PFDEV(pdev))
1788*d14abf15SRobert Mustacchi             {
1789*d14abf15SRobert Mustacchi                 mm_write_barrier();
1790*d14abf15SRobert Mustacchi             }
1791*d14abf15SRobert Mustacchi             // now we can notify timer that cb is done!
1792*d14abf15SRobert Mustacchi             pdev->vars.stats.stats_collect.stats_fw.b_completion_done = TRUE ;
1793*d14abf15SRobert Mustacchi             lm_status = LM_STATUS_SUCCESS;
1794*d14abf15SRobert Mustacchi         }
1795*d14abf15SRobert Mustacchi     }
1796*d14abf15SRobert Mustacchi     return lm_status;
1797*d14abf15SRobert Mustacchi }
1798*d14abf15SRobert Mustacchi 
1799*d14abf15SRobert Mustacchi void
lm_stats_fw_assign_fcoe_xstorm(IN const struct fcoe_statistics_params * collect,OUT lm_fcoe_stats_t * mirror)1800*d14abf15SRobert Mustacchi lm_stats_fw_assign_fcoe_xstorm(IN const struct fcoe_statistics_params* collect,
1801*d14abf15SRobert Mustacchi                                OUT lm_fcoe_stats_t* mirror)
1802*d14abf15SRobert Mustacchi {
1803*d14abf15SRobert Mustacchi     //Tx
1804*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->tx_stat.fcoe_tx_byte_cnt, mirror->fcoe_tx_byte_cnt);
1805*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->tx_stat.fcoe_tx_pkt_cnt, mirror->fcoe_tx_pkt_cnt);
1806*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->tx_stat.fcp_tx_pkt_cnt, mirror->fcp_tx_pkt_cnt);
1807*d14abf15SRobert Mustacchi }
1808*d14abf15SRobert Mustacchi 
1809*d14abf15SRobert Mustacchi 
1810*d14abf15SRobert Mustacchi void
lm_stats_fw_assign_fcoe_tstorm(IN const struct fcoe_statistics_params * collect,OUT lm_fcoe_stats_t * mirror)1811*d14abf15SRobert Mustacchi lm_stats_fw_assign_fcoe_tstorm(IN const struct fcoe_statistics_params* collect,
1812*d14abf15SRobert Mustacchi                                OUT lm_fcoe_stats_t* mirror)
1813*d14abf15SRobert Mustacchi {
1814*d14abf15SRobert Mustacchi     //Section 0
1815*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat0.fcoe_rx_byte_cnt, mirror->fcoe_rx_byte_cnt);
1816*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat0.fcoe_rx_pkt_cnt, mirror->fcoe_rx_pkt_cnt);
1817*d14abf15SRobert Mustacchi 
1818*d14abf15SRobert Mustacchi     //Section 1
1819*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat1.fcoe_rx_drop_pkt_cnt, mirror->fcoe_rx_drop_pkt_cnt_tstorm);
1820*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat1.fcoe_ver_cnt, mirror->fcoe_ver_cnt);
1821*d14abf15SRobert Mustacchi }
1822*d14abf15SRobert Mustacchi 
1823*d14abf15SRobert Mustacchi void
lm_stats_fw_assign_fcoe_ustorm(IN const struct fcoe_statistics_params * collect,OUT lm_fcoe_stats_t * mirror)1824*d14abf15SRobert Mustacchi lm_stats_fw_assign_fcoe_ustorm(IN const struct fcoe_statistics_params* collect,
1825*d14abf15SRobert Mustacchi                                OUT lm_fcoe_stats_t* mirror)
1826*d14abf15SRobert Mustacchi {
1827*d14abf15SRobert Mustacchi     //Section 2
1828*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat2.drop_seq_cnt, mirror->drop_seq_cnt);
1829*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat2.eofa_del_cnt, mirror->eofa_del_cnt);
1830*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat2.fc_crc_cnt, mirror->fc_crc_cnt);
1831*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat2.fcoe_rx_drop_pkt_cnt, mirror->fcoe_rx_drop_pkt_cnt_ustorm);
1832*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat2.fcp_rx_pkt_cnt, mirror->fcp_rx_pkt_cnt);
1833*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat2.miss_frame_cnt, mirror->miss_frame_cnt);
1834*d14abf15SRobert Mustacchi     LM_SIGN_EXTEND_VALUE_32(collect->rx_stat2.seq_timeout_cnt, mirror->seq_timeout_cnt);
1835*d14abf15SRobert Mustacchi }
1836*d14abf15SRobert Mustacchi 
1837*d14abf15SRobert Mustacchi /*
1838*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
1839*d14abf15SRobert Mustacchi  * lm_stats_fw_assign -
1840*d14abf15SRobert Mustacchi  *
1841*d14abf15SRobert Mustacchi  * assign values from fw shared memory to the lm structs
1842*d14abf15SRobert Mustacchi  *
1843*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
1844*d14abf15SRobert Mustacchi  */
lm_stats_fw_assign(struct _lm_device_t * pdev,u32_t stats_flags_done,u32_t * ptr_stats_flags_assigned)1845*d14abf15SRobert Mustacchi void lm_stats_fw_assign( struct _lm_device_t *pdev, u32_t stats_flags_done, u32_t* ptr_stats_flags_assigned )
1846*d14abf15SRobert Mustacchi {
1847*d14abf15SRobert Mustacchi     const u8_t cli_id       = LM_CLI_IDX_NDIS ;
1848*d14abf15SRobert Mustacchi     int        arr_cnt      = 0 ;
1849*d14abf15SRobert Mustacchi     u8_t       i            = 0 ;
1850*d14abf15SRobert Mustacchi 
1851*d14abf15SRobert Mustacchi     if CHK_NULL( ptr_stats_flags_assigned )
1852*d14abf15SRobert Mustacchi     {
1853*d14abf15SRobert Mustacchi         DbgBreakIf(!ptr_stats_flags_assigned) ;
1854*d14abf15SRobert Mustacchi         return;
1855*d14abf15SRobert Mustacchi     }
1856*d14abf15SRobert Mustacchi 
1857*d14abf15SRobert Mustacchi // assign reg_pair fw collected into fw mirror
1858*d14abf15SRobert Mustacchi #define LM_STATS_FW_ASSIGN_TOE_REGPAIR(field_name) \
1859*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.toe_##field_name, \
1860*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->toe.field_name ) ;
1861*d14abf15SRobert Mustacchi 
1862*d14abf15SRobert Mustacchi // assign u32 fw collected into fw mirror + do sign extension
1863*d14abf15SRobert Mustacchi #define LM_STATS_FW_ASSIGN_TOE_U32(field_name) \
1864*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->toe.field_name, \
1865*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_mirror.stats_fw.toe_##field_name ) ;
1866*d14abf15SRobert Mustacchi 
1867*d14abf15SRobert Mustacchi 
1868*d14abf15SRobert Mustacchi     // eth xstorm
1869*d14abf15SRobert Mustacchi     if( LM_STATS_DO_ASSIGN( stats_flags_done, *ptr_stats_flags_assigned, LM_STATS_FLAG_XSTORM ) )
1870*d14abf15SRobert Mustacchi     {
1871*d14abf15SRobert Mustacchi         // regpairs
1872*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].unicast_bytes_sent,
1873*d14abf15SRobert Mustacchi                        pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.xstorm_queue_statistics.ucast_bytes_sent);
1874*d14abf15SRobert Mustacchi         // regpairs
1875*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].multicast_bytes_sent,
1876*d14abf15SRobert Mustacchi                        pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.xstorm_queue_statistics.mcast_bytes_sent);
1877*d14abf15SRobert Mustacchi 
1878*d14abf15SRobert Mustacchi         // regpairs
1879*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].broadcast_bytes_sent,
1880*d14abf15SRobert Mustacchi                        pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.xstorm_queue_statistics.bcast_bytes_sent);
1881*d14abf15SRobert Mustacchi 
1882*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].total_sent_bytes =
1883*d14abf15SRobert Mustacchi             pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].unicast_bytes_sent +
1884*d14abf15SRobert Mustacchi             pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].multicast_bytes_sent +
1885*d14abf15SRobert Mustacchi             pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].broadcast_bytes_sent;
1886*d14abf15SRobert Mustacchi 
1887*d14abf15SRobert Mustacchi         // non regpairs
1888*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.xstorm_queue_statistics.ucast_pkts_sent,
1889*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].unicast_pkts_sent );
1890*d14abf15SRobert Mustacchi 
1891*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.xstorm_queue_statistics.mcast_pkts_sent,
1892*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].multicast_pkts_sent );
1893*d14abf15SRobert Mustacchi 
1894*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.xstorm_queue_statistics.bcast_pkts_sent,
1895*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].broadcast_pkts_sent );
1896*d14abf15SRobert Mustacchi 
1897*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.xstorm_queue_statistics.error_drop_pkts,
1898*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].error_drop_pkts );
1899*d14abf15SRobert Mustacchi 
1900*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].total_sent_pkts =
1901*d14abf15SRobert Mustacchi             pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].unicast_pkts_sent+
1902*d14abf15SRobert Mustacchi             pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].multicast_pkts_sent +
1903*d14abf15SRobert Mustacchi             pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[cli_id].broadcast_pkts_sent;
1904*d14abf15SRobert Mustacchi 
1905*d14abf15SRobert Mustacchi 
1906*d14abf15SRobert Mustacchi 
1907*d14abf15SRobert Mustacchi         /* TOE Stats for Xstorm */
1908*d14abf15SRobert Mustacchi         arr_cnt = ARRSIZE(pdev->vars.stats.stats_mirror.stats_fw.toe_xstorm_toe.statistics) ;
1909*d14abf15SRobert Mustacchi         for ( i = 0; i < arr_cnt; i++)
1910*d14abf15SRobert Mustacchi         {
1911*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_U32(xstorm_toe.statistics[i].tcp_out_segments) ;
1912*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_U32(xstorm_toe.statistics[i].tcp_retransmitted_segments) ;
1913*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_REGPAIR(xstorm_toe.statistics[i].ip_out_octets ) ;
1914*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_U32(xstorm_toe.statistics[i].ip_out_requests) ;
1915*d14abf15SRobert Mustacchi         }
1916*d14abf15SRobert Mustacchi 
1917*d14abf15SRobert Mustacchi         if( !CHIP_IS_E1x(pdev) )
1918*d14abf15SRobert Mustacchi         {
1919*d14abf15SRobert Mustacchi             lm_stats_fw_assign_fcoe_xstorm(&pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->fcoe,
1920*d14abf15SRobert Mustacchi                                            &pdev->vars.stats.stats_mirror.stats_fw.fcoe);
1921*d14abf15SRobert Mustacchi         }
1922*d14abf15SRobert Mustacchi 
1923*d14abf15SRobert Mustacchi         SET_FLAGS( *ptr_stats_flags_assigned, LM_STATS_FLAG_XSTORM ) ;
1924*d14abf15SRobert Mustacchi     }
1925*d14abf15SRobert Mustacchi 
1926*d14abf15SRobert Mustacchi     // eth tstorm
1927*d14abf15SRobert Mustacchi     if( LM_STATS_DO_ASSIGN( stats_flags_done, *ptr_stats_flags_assigned, LM_STATS_FLAG_TSTORM ) )
1928*d14abf15SRobert Mustacchi     {
1929*d14abf15SRobert Mustacchi         // regpairs
1930*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].rcv_unicast_bytes,
1931*d14abf15SRobert Mustacchi                        pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.tstorm_queue_statistics.rcv_ucast_bytes );
1932*d14abf15SRobert Mustacchi 
1933*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].rcv_broadcast_bytes,
1934*d14abf15SRobert Mustacchi                        pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.tstorm_queue_statistics.rcv_bcast_bytes );
1935*d14abf15SRobert Mustacchi 
1936*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].rcv_multicast_bytes,
1937*d14abf15SRobert Mustacchi                        pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.tstorm_queue_statistics.rcv_mcast_bytes );
1938*d14abf15SRobert Mustacchi 
1939*d14abf15SRobert Mustacchi         // FIXME REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].rcv_error_bytes,
1940*d14abf15SRobert Mustacchi         //               pdev->vars.stats.stats_collect.stats_fw.addr_eth_stats_query->tstorm_common.client_statistics[cnt_id].rcv_error_bytes );
1941*d14abf15SRobert Mustacchi 
1942*d14abf15SRobert Mustacchi         // eth tstorm - non regpairs
1943*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.tstorm_queue_statistics.checksum_discard,
1944*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].checksum_discard );
1945*d14abf15SRobert Mustacchi 
1946*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.tstorm_queue_statistics.pkts_too_big_discard,
1947*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].packets_too_big_discard );
1948*d14abf15SRobert Mustacchi 
1949*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.tstorm_queue_statistics.rcv_ucast_pkts,
1950*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].rcv_unicast_pkts );
1951*d14abf15SRobert Mustacchi 
1952*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.tstorm_queue_statistics.rcv_bcast_pkts,
1953*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].rcv_broadcast_pkts );
1954*d14abf15SRobert Mustacchi 
1955*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.tstorm_queue_statistics.rcv_mcast_pkts,
1956*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].rcv_multicast_pkts );
1957*d14abf15SRobert Mustacchi 
1958*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.tstorm_queue_statistics.no_buff_discard,
1959*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].no_buff_discard );
1960*d14abf15SRobert Mustacchi 
1961*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.tstorm_queue_statistics.ttl0_discard,
1962*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].ttl0_discard );
1963*d14abf15SRobert Mustacchi 
1964*d14abf15SRobert Mustacchi 
1965*d14abf15SRobert Mustacchi 
1966*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->port.tstorm_port_statistics.mf_tag_discard,
1967*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].ttl0_discard );
1968*d14abf15SRobert Mustacchi 
1969*d14abf15SRobert Mustacchi 
1970*d14abf15SRobert Mustacchi         /* Port Statistics */
1971*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->port.tstorm_port_statistics.mac_filter_discard, \
1972*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.port_statistics.mac_filter_discard ) ;
1973*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->port.tstorm_port_statistics.brb_truncate_discard, \
1974*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.port_statistics.brb_truncate_discard ) ;
1975*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->port.tstorm_port_statistics.mac_discard, \
1976*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.port_statistics.mac_discard ) ;
1977*d14abf15SRobert Mustacchi 
1978*d14abf15SRobert Mustacchi         // toe tstorm
1979*d14abf15SRobert Mustacchi         arr_cnt = ARRSIZE(pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics) ;
1980*d14abf15SRobert Mustacchi         for ( i = 0; i < arr_cnt; i++)
1981*d14abf15SRobert Mustacchi         {
1982*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_U32(tstorm_toe.statistics[i].ip_in_receives) ;
1983*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_U32(tstorm_toe.statistics[i].ip_in_delivers) ;
1984*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_REGPAIR(tstorm_toe.statistics[i].ip_in_octets) ;
1985*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_U32(tstorm_toe.statistics[i].tcp_in_errors) ;
1986*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_U32(tstorm_toe.statistics[i].ip_in_header_errors) ;
1987*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_U32(tstorm_toe.statistics[i].ip_in_discards) ;
1988*d14abf15SRobert Mustacchi             LM_STATS_FW_ASSIGN_TOE_U32(tstorm_toe.statistics[i].ip_in_truncated_packets) ;
1989*d14abf15SRobert Mustacchi         }
1990*d14abf15SRobert Mustacchi 
1991*d14abf15SRobert Mustacchi         if( !CHIP_IS_E1x(pdev) )
1992*d14abf15SRobert Mustacchi         {
1993*d14abf15SRobert Mustacchi             lm_stats_fw_assign_fcoe_tstorm(&pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->fcoe,
1994*d14abf15SRobert Mustacchi                                            &pdev->vars.stats.stats_mirror.stats_fw.fcoe);
1995*d14abf15SRobert Mustacchi         }
1996*d14abf15SRobert Mustacchi 
1997*d14abf15SRobert Mustacchi         SET_FLAGS( *ptr_stats_flags_assigned, LM_STATS_FLAG_TSTORM ) ;
1998*d14abf15SRobert Mustacchi     }
1999*d14abf15SRobert Mustacchi 
2000*d14abf15SRobert Mustacchi     // eth ustorm
2001*d14abf15SRobert Mustacchi     if( LM_STATS_DO_ASSIGN( stats_flags_done, *ptr_stats_flags_assigned, LM_STATS_FLAG_USTORM ) )
2002*d14abf15SRobert Mustacchi     {
2003*d14abf15SRobert Mustacchi         // regpairs
2004*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].ucast_no_buff_bytes,
2005*d14abf15SRobert Mustacchi                        pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.ucast_no_buff_bytes );
2006*d14abf15SRobert Mustacchi 
2007*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].mcast_no_buff_bytes,
2008*d14abf15SRobert Mustacchi                        pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.mcast_no_buff_bytes );
2009*d14abf15SRobert Mustacchi 
2010*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].bcast_no_buff_bytes,
2011*d14abf15SRobert Mustacchi                        pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.bcast_no_buff_bytes );
2012*d14abf15SRobert Mustacchi 
2013*d14abf15SRobert Mustacchi         REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].coalesced_bytes,
2014*d14abf15SRobert Mustacchi                        pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.coalesced_bytes );
2015*d14abf15SRobert Mustacchi 
2016*d14abf15SRobert Mustacchi         // non regpairs
2017*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.ucast_no_buff_pkts,
2018*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].ucast_no_buff_pkts );
2019*d14abf15SRobert Mustacchi 
2020*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.mcast_no_buff_pkts,
2021*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].mcast_no_buff_pkts );
2022*d14abf15SRobert Mustacchi 
2023*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.bcast_no_buff_pkts,
2024*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].bcast_no_buff_pkts );
2025*d14abf15SRobert Mustacchi 
2026*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.coalesced_pkts,
2027*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].coalesced_pkts );
2028*d14abf15SRobert Mustacchi 
2029*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.coalesced_events,
2030*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].coalesced_events );
2031*d14abf15SRobert Mustacchi 
2032*d14abf15SRobert Mustacchi         LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.coalesced_aborts,
2033*d14abf15SRobert Mustacchi                                  pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].coalesced_aborts );
2034*d14abf15SRobert Mustacchi 
2035*d14abf15SRobert Mustacchi         if( !CHIP_IS_E1x(pdev) )
2036*d14abf15SRobert Mustacchi         {
2037*d14abf15SRobert Mustacchi             lm_stats_fw_assign_fcoe_ustorm(&pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->fcoe,
2038*d14abf15SRobert Mustacchi                                            &pdev->vars.stats.stats_mirror.stats_fw.fcoe);
2039*d14abf15SRobert Mustacchi         }
2040*d14abf15SRobert Mustacchi 
2041*d14abf15SRobert Mustacchi         SET_FLAGS( *ptr_stats_flags_assigned, LM_STATS_FLAG_USTORM ) ;
2042*d14abf15SRobert Mustacchi     }
2043*d14abf15SRobert Mustacchi 
2044*d14abf15SRobert Mustacchi     if( LM_STATS_DO_ASSIGN( stats_flags_done, *ptr_stats_flags_assigned, LM_STATS_FLAG_CSTORM ) )
2045*d14abf15SRobert Mustacchi     {
2046*d14abf15SRobert Mustacchi         // toe cstorm
2047*d14abf15SRobert Mustacchi 
2048*d14abf15SRobert Mustacchi         LM_STATS_FW_ASSIGN_TOE_U32(cstorm_toe.no_tx_cqes) ;
2049*d14abf15SRobert Mustacchi         SET_FLAGS( *ptr_stats_flags_assigned, LM_STATS_FLAG_CSTORM ) ;
2050*d14abf15SRobert Mustacchi 
2051*d14abf15SRobert Mustacchi     }
2052*d14abf15SRobert Mustacchi }
2053*d14abf15SRobert Mustacchi 
2054*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
lm_pf_stats_vf_fw_assign(struct _lm_device_t * pdev,u32_t stats_flags_done,u32_t * ptr_stats_flags_assigned)2055*d14abf15SRobert Mustacchi void lm_pf_stats_vf_fw_assign(struct _lm_device_t *pdev, u32_t stats_flags_done, u32_t* ptr_stats_flags_assigned)
2056*d14abf15SRobert Mustacchi {
2057*d14abf15SRobert Mustacchi     lm_stats_fw_t          *mirror_stats_fw;
2058*d14abf15SRobert Mustacchi     struct per_queue_stats *queue_stats;
2059*d14abf15SRobert Mustacchi     const u8_t              cli_id = LM_CLI_IDX_NDIS ;
2060*d14abf15SRobert Mustacchi     u8_t                    vf_idx;
2061*d14abf15SRobert Mustacchi 
2062*d14abf15SRobert Mustacchi     if CHK_NULL( ptr_stats_flags_assigned )
2063*d14abf15SRobert Mustacchi     {
2064*d14abf15SRobert Mustacchi         DbgBreakIf(!ptr_stats_flags_assigned) ;
2065*d14abf15SRobert Mustacchi         return;
2066*d14abf15SRobert Mustacchi     }
2067*d14abf15SRobert Mustacchi 
2068*d14abf15SRobert Mustacchi     // eth xstorm
2069*d14abf15SRobert Mustacchi     if( LM_STATS_DO_ASSIGN( stats_flags_done, *ptr_stats_flags_assigned, LM_STATS_FLAG_XSTORM ) )
2070*d14abf15SRobert Mustacchi     {
2071*d14abf15SRobert Mustacchi         for (vf_idx = 0; vf_idx < pdev->vfs_set.number_of_enabled_vfs; vf_idx++) {
2072*d14abf15SRobert Mustacchi             mirror_stats_fw = pdev->vfs_set.vfs_array[vf_idx].vf_stats.mirror_stats_fw;
2073*d14abf15SRobert Mustacchi             queue_stats = pdev->vfs_set.vfs_array[vf_idx].vf_stats.pf_fw_stats_virt_data;
2074*d14abf15SRobert Mustacchi             // regpairs
2075*d14abf15SRobert Mustacchi             REGPAIR_TO_U64(mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].unicast_bytes_sent,
2076*d14abf15SRobert Mustacchi                            queue_stats->xstorm_queue_statistics.ucast_bytes_sent);
2077*d14abf15SRobert Mustacchi             // regpairs
2078*d14abf15SRobert Mustacchi             REGPAIR_TO_U64(mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].multicast_bytes_sent,
2079*d14abf15SRobert Mustacchi                            queue_stats->xstorm_queue_statistics.mcast_bytes_sent);
2080*d14abf15SRobert Mustacchi 
2081*d14abf15SRobert Mustacchi             // regpairs
2082*d14abf15SRobert Mustacchi             REGPAIR_TO_U64(mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].broadcast_bytes_sent,
2083*d14abf15SRobert Mustacchi                            queue_stats->xstorm_queue_statistics.bcast_bytes_sent);
2084*d14abf15SRobert Mustacchi 
2085*d14abf15SRobert Mustacchi             mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].total_sent_bytes =
2086*d14abf15SRobert Mustacchi                 mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].unicast_bytes_sent +
2087*d14abf15SRobert Mustacchi                 mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].multicast_bytes_sent +
2088*d14abf15SRobert Mustacchi                 mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].broadcast_bytes_sent;
2089*d14abf15SRobert Mustacchi 
2090*d14abf15SRobert Mustacchi             // non regpairs
2091*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->xstorm_queue_statistics.ucast_pkts_sent,
2092*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].unicast_pkts_sent );
2093*d14abf15SRobert Mustacchi 
2094*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->xstorm_queue_statistics.mcast_pkts_sent,
2095*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].multicast_pkts_sent );
2096*d14abf15SRobert Mustacchi 
2097*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->xstorm_queue_statistics.bcast_pkts_sent,
2098*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].broadcast_pkts_sent );
2099*d14abf15SRobert Mustacchi 
2100*d14abf15SRobert Mustacchi             mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].total_sent_pkts =
2101*d14abf15SRobert Mustacchi                 mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].unicast_pkts_sent+
2102*d14abf15SRobert Mustacchi                 mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].multicast_pkts_sent +
2103*d14abf15SRobert Mustacchi                 mirror_stats_fw->eth_xstorm_common.client_statistics[cli_id].broadcast_pkts_sent;
2104*d14abf15SRobert Mustacchi 
2105*d14abf15SRobert Mustacchi 
2106*d14abf15SRobert Mustacchi         }
2107*d14abf15SRobert Mustacchi         SET_FLAGS( *ptr_stats_flags_assigned, LM_STATS_FLAG_XSTORM ) ;
2108*d14abf15SRobert Mustacchi     }
2109*d14abf15SRobert Mustacchi 
2110*d14abf15SRobert Mustacchi     // eth tstorm
2111*d14abf15SRobert Mustacchi     if( LM_STATS_DO_ASSIGN( stats_flags_done, *ptr_stats_flags_assigned, LM_STATS_FLAG_TSTORM ) )
2112*d14abf15SRobert Mustacchi     {
2113*d14abf15SRobert Mustacchi         for (vf_idx = 0; vf_idx < pdev->vfs_set.number_of_enabled_vfs; vf_idx++) {
2114*d14abf15SRobert Mustacchi             mirror_stats_fw = pdev->vfs_set.vfs_array[vf_idx].vf_stats.mirror_stats_fw;
2115*d14abf15SRobert Mustacchi             queue_stats = pdev->vfs_set.vfs_array[vf_idx].vf_stats.pf_fw_stats_virt_data;
2116*d14abf15SRobert Mustacchi             // regpairs
2117*d14abf15SRobert Mustacchi             REGPAIR_TO_U64(mirror_stats_fw->eth_tstorm_common.client_statistics[cli_id].rcv_unicast_bytes,
2118*d14abf15SRobert Mustacchi                            queue_stats->tstorm_queue_statistics.rcv_ucast_bytes );
2119*d14abf15SRobert Mustacchi 
2120*d14abf15SRobert Mustacchi             REGPAIR_TO_U64(mirror_stats_fw->eth_tstorm_common.client_statistics[cli_id].rcv_broadcast_bytes,
2121*d14abf15SRobert Mustacchi                            queue_stats->tstorm_queue_statistics.rcv_bcast_bytes );
2122*d14abf15SRobert Mustacchi 
2123*d14abf15SRobert Mustacchi             REGPAIR_TO_U64(mirror_stats_fw->eth_tstorm_common.client_statistics[cli_id].rcv_multicast_bytes,
2124*d14abf15SRobert Mustacchi                            queue_stats->tstorm_queue_statistics.rcv_mcast_bytes );
2125*d14abf15SRobert Mustacchi 
2126*d14abf15SRobert Mustacchi             // FIXME REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[cli_id].rcv_error_bytes,
2127*d14abf15SRobert Mustacchi             //               pdev->vars.stats.stats_collect.stats_fw.addr_eth_stats_query->tstorm_common.client_statistics[cnt_id].rcv_error_bytes );
2128*d14abf15SRobert Mustacchi 
2129*d14abf15SRobert Mustacchi             // eth tstorm - non regpairs
2130*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->tstorm_queue_statistics.checksum_discard,
2131*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_tstorm_common.client_statistics[cli_id].checksum_discard );
2132*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->tstorm_queue_statistics.pkts_too_big_discard,
2133*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_tstorm_common.client_statistics[cli_id].packets_too_big_discard );
2134*d14abf15SRobert Mustacchi 
2135*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->tstorm_queue_statistics.rcv_ucast_pkts,
2136*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_tstorm_common.client_statistics[cli_id].rcv_unicast_pkts );
2137*d14abf15SRobert Mustacchi 
2138*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->tstorm_queue_statistics.rcv_bcast_pkts,
2139*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_tstorm_common.client_statistics[cli_id].rcv_broadcast_pkts );
2140*d14abf15SRobert Mustacchi 
2141*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->tstorm_queue_statistics.rcv_mcast_pkts,
2142*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_tstorm_common.client_statistics[cli_id].rcv_multicast_pkts );
2143*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->tstorm_queue_statistics.no_buff_discard,
2144*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_tstorm_common.client_statistics[cli_id].no_buff_discard );
2145*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->tstorm_queue_statistics.ttl0_discard,
2146*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_tstorm_common.client_statistics[cli_id].ttl0_discard );
2147*d14abf15SRobert Mustacchi 
2148*d14abf15SRobert Mustacchi         }
2149*d14abf15SRobert Mustacchi         SET_FLAGS( *ptr_stats_flags_assigned, LM_STATS_FLAG_TSTORM ) ;
2150*d14abf15SRobert Mustacchi     }
2151*d14abf15SRobert Mustacchi 
2152*d14abf15SRobert Mustacchi     // eth ustorm
2153*d14abf15SRobert Mustacchi     if( LM_STATS_DO_ASSIGN( stats_flags_done, *ptr_stats_flags_assigned, LM_STATS_FLAG_USTORM ) )
2154*d14abf15SRobert Mustacchi     {
2155*d14abf15SRobert Mustacchi         for (vf_idx = 0; vf_idx < pdev->vfs_set.number_of_enabled_vfs; vf_idx++) {
2156*d14abf15SRobert Mustacchi             mirror_stats_fw = pdev->vfs_set.vfs_array[vf_idx].vf_stats.mirror_stats_fw;
2157*d14abf15SRobert Mustacchi             queue_stats = pdev->vfs_set.vfs_array[vf_idx].vf_stats.pf_fw_stats_virt_data;
2158*d14abf15SRobert Mustacchi             // regpairs
2159*d14abf15SRobert Mustacchi             REGPAIR_TO_U64(mirror_stats_fw->eth_ustorm_common.client_statistics[cli_id].ucast_no_buff_bytes,
2160*d14abf15SRobert Mustacchi                            queue_stats->ustorm_queue_statistics.ucast_no_buff_bytes );
2161*d14abf15SRobert Mustacchi 
2162*d14abf15SRobert Mustacchi             REGPAIR_TO_U64(mirror_stats_fw->eth_ustorm_common.client_statistics[cli_id].mcast_no_buff_bytes,
2163*d14abf15SRobert Mustacchi                            queue_stats->ustorm_queue_statistics.mcast_no_buff_bytes );
2164*d14abf15SRobert Mustacchi 
2165*d14abf15SRobert Mustacchi             REGPAIR_TO_U64(mirror_stats_fw->eth_ustorm_common.client_statistics[cli_id].bcast_no_buff_bytes,
2166*d14abf15SRobert Mustacchi                            queue_stats->ustorm_queue_statistics.bcast_no_buff_bytes );
2167*d14abf15SRobert Mustacchi 
2168*d14abf15SRobert Mustacchi             REGPAIR_TO_U64(pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].coalesced_bytes,
2169*d14abf15SRobert Mustacchi                            pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.coalesced_bytes );
2170*d14abf15SRobert Mustacchi 
2171*d14abf15SRobert Mustacchi             // non regpairs
2172*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->ustorm_queue_statistics.ucast_no_buff_pkts,
2173*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_ustorm_common.client_statistics[cli_id].ucast_no_buff_pkts );
2174*d14abf15SRobert Mustacchi 
2175*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->ustorm_queue_statistics.mcast_no_buff_pkts,
2176*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_ustorm_common.client_statistics[cli_id].mcast_no_buff_pkts );
2177*d14abf15SRobert Mustacchi 
2178*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( queue_stats->ustorm_queue_statistics.bcast_no_buff_pkts,
2179*d14abf15SRobert Mustacchi                                      mirror_stats_fw->eth_ustorm_common.client_statistics[cli_id].bcast_no_buff_pkts );
2180*d14abf15SRobert Mustacchi 
2181*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.coalesced_pkts,
2182*d14abf15SRobert Mustacchi                                      pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].coalesced_pkts );
2183*d14abf15SRobert Mustacchi 
2184*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.coalesced_events,
2185*d14abf15SRobert Mustacchi                                      pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].coalesced_events );
2186*d14abf15SRobert Mustacchi 
2187*d14abf15SRobert Mustacchi             LM_SIGN_EXTEND_VALUE_32( pdev->vars.stats.stats_collect.stats_fw.fw_stats_data->queue_stats.ustorm_queue_statistics.coalesced_aborts,
2188*d14abf15SRobert Mustacchi                                      pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[cli_id].coalesced_aborts );
2189*d14abf15SRobert Mustacchi         }
2190*d14abf15SRobert Mustacchi         SET_FLAGS( *ptr_stats_flags_assigned, LM_STATS_FLAG_USTORM ) ;
2191*d14abf15SRobert Mustacchi     }
2192*d14abf15SRobert Mustacchi 
2193*d14abf15SRobert Mustacchi     if( LM_STATS_DO_ASSIGN( stats_flags_done, *ptr_stats_flags_assigned, LM_STATS_FLAG_CSTORM ) )
2194*d14abf15SRobert Mustacchi     {
2195*d14abf15SRobert Mustacchi         SET_FLAGS( *ptr_stats_flags_assigned, LM_STATS_FLAG_CSTORM ) ;
2196*d14abf15SRobert Mustacchi     }
2197*d14abf15SRobert Mustacchi 
2198*d14abf15SRobert Mustacchi }
2199*d14abf15SRobert Mustacchi #endif
2200*d14abf15SRobert Mustacchi 
2201*d14abf15SRobert Mustacchi /**lm_stats_hw_macs_assign
2202*d14abf15SRobert Mustacchi  *
2203*d14abf15SRobert Mustacchi  * THIS FUNCTION MUST BE CALLED INSIDE PHY LOCK
2204*d14abf15SRobert Mustacchi  *
2205*d14abf15SRobert Mustacchi  * The mirrored statistics store 2 copies of the MAC stats:
2206*d14abf15SRobert Mustacchi  * CURRENT and TOTAL. the reason for this is that each PF has
2207*d14abf15SRobert Mustacchi  * it's own MAC and when a PMF change occures,  the new PMF
2208*d14abf15SRobert Mustacchi  * would start with all MAC stats equal to 0. in this case
2209*d14abf15SRobert Mustacchi  * CURRENT would be zeroed on the next collection, but TOTAL
2210*d14abf15SRobert Mustacchi  * would still have the old stats.
2211*d14abf15SRobert Mustacchi  * because of this, TOTAL is updated according to the difference
2212*d14abf15SRobert Mustacchi  * between the old value and the new value.
2213*d14abf15SRobert Mustacchi  *
2214*d14abf15SRobert Mustacchi  * the following function updates a field in the CURRENT block
2215*d14abf15SRobert Mustacchi  * and returns the value to be added to the TOTAL block
2216*d14abf15SRobert Mustacchi  *
2217*d14abf15SRobert Mustacchi  * @param bits the number of data bits in the field
2218*d14abf15SRobert Mustacchi  * @param field_collect_val the value collected from the HW
2219*d14abf15SRobert Mustacchi  * @param field_mirror_val a pointer to the relevant field in
2220*d14abf15SRobert Mustacchi  *                         the CURRENT block
2221*d14abf15SRobert Mustacchi  *
2222*d14abf15SRobert Mustacchi  * @return the difference between the new value and the old
2223*d14abf15SRobert Mustacchi  *         value - this should be added to the relevant field in
2224*d14abf15SRobert Mustacchi  *         the TOTAL block.
2225*d14abf15SRobert Mustacchi  *
2226*d14abf15SRobert Mustacchi  * @see stats_macs_idx_t , lm_stats_hw_t
2227*d14abf15SRobert Mustacchi  */
lm_stats_hw_macs_assign(IN lm_device_t * pdev,IN u8_t bits,IN u64_t field_collect_val,IN OUT u64_t * field_mirror_val)2228*d14abf15SRobert Mustacchi static u64_t lm_stats_hw_macs_assign(IN lm_device_t* pdev,
2229*d14abf15SRobert Mustacchi                                      IN u8_t bits,
2230*d14abf15SRobert Mustacchi                                      IN u64_t field_collect_val,
2231*d14abf15SRobert Mustacchi                                      IN OUT u64_t *field_mirror_val)
2232*d14abf15SRobert Mustacchi {
2233*d14abf15SRobert Mustacchi     /*MSTAT has no wraparound logic, and it's stat values are zeroed on each read.
2234*d14abf15SRobert Mustacchi       This means that what we read is the difference in the stats since the last read,
2235*d14abf15SRobert Mustacchi       so we should just update the counters and exit.
2236*d14abf15SRobert Mustacchi       EMAC and BMAC stats have wraparound logic and are not zeroed on read, so we handle
2237*d14abf15SRobert Mustacchi       the wraparound if needed and return the difference between the old value and the
2238*d14abf15SRobert Mustacchi       new value.*/
2239*d14abf15SRobert Mustacchi     if(HAS_MSTAT(pdev))
2240*d14abf15SRobert Mustacchi     {
2241*d14abf15SRobert Mustacchi         *field_mirror_val += field_collect_val;
2242*d14abf15SRobert Mustacchi         return field_collect_val;
2243*d14abf15SRobert Mustacchi     }
2244*d14abf15SRobert Mustacchi     else
2245*d14abf15SRobert Mustacchi     {
2246*d14abf15SRobert Mustacchi         u64_t prev = *field_mirror_val;
2247*d14abf15SRobert Mustacchi         *field_mirror_val = lm_update_wraparound_if_needed(bits, field_collect_val, *field_mirror_val,FALSE/*no need to swap bytes on HW stats*/) ;
2248*d14abf15SRobert Mustacchi         return *field_mirror_val - prev;
2249*d14abf15SRobert Mustacchi     }
2250*d14abf15SRobert Mustacchi }
2251*d14abf15SRobert Mustacchi 
2252*d14abf15SRobert Mustacchi #define LM_STATS_HW_MAC_ASSIGN(field_collect, field_mirror, field_width)\
2253*d14abf15SRobert Mustacchi     if (mac_query->field_collect != 0) { DbgMessage(pdev, INFORM, "assigning %s[=%x] to %s, width %d.\n", #field_collect, mac_query->field_collect, #field_mirror, field_width ); } \
2254*d14abf15SRobert Mustacchi     macs[STATS_MACS_IDX_TOTAL].field_mirror += lm_stats_hw_macs_assign( pdev, \
2255*d14abf15SRobert Mustacchi                                                                         field_width, \
2256*d14abf15SRobert Mustacchi                                                  mac_query->field_collect, \
2257*d14abf15SRobert Mustacchi                                                  &(macs[STATS_MACS_IDX_CURRENT].field_mirror) ) ;
2258*d14abf15SRobert Mustacchi 
2259*d14abf15SRobert Mustacchi #define LM_STATS_HW_MAC_ASSIGN_U32( field_collect, field_mirror ) LM_STATS_HW_MAC_ASSIGN(field_collect, field_mirror, 32)
2260*d14abf15SRobert Mustacchi 
2261*d14abf15SRobert Mustacchi #define LM_STATS_HW_MAC_ASSIGN_U36( field_collect, field_mirror ) LM_STATS_HW_MAC_ASSIGN(field_collect, field_mirror, 36)
2262*d14abf15SRobert Mustacchi 
2263*d14abf15SRobert Mustacchi #define LM_STATS_HW_MAC_ASSIGN_U42( field_collect, field_mirror ) LM_STATS_HW_MAC_ASSIGN(field_collect, field_mirror, 42)
2264*d14abf15SRobert Mustacchi 
2265*d14abf15SRobert Mustacchi 
2266*d14abf15SRobert Mustacchi // assign a block (emac/bmac) uXX hw collected into hw mirror + do sign extension (width is XX)
2267*d14abf15SRobert Mustacchi #define LM_STATS_HW_NIG_ASSIGN_UXX(bits, block_name,field_collect,field_mirror) \
2268*d14abf15SRobert Mustacchi                                    LM_SIGN_EXTEND_VALUE_##bits( pdev->vars.stats.stats_collect.stats_hw.addr_##block_name##_stats_query->field_collect, \
2269*d14abf15SRobert Mustacchi                                    pdev->vars.stats.stats_mirror.stats_hw.nig.field_mirror ) ;
2270*d14abf15SRobert Mustacchi 
2271*d14abf15SRobert Mustacchi #define LM_STATS_HW_NIG_ASSIGN_U32(block_name,field_collect,field_mirror) LM_STATS_HW_NIG_ASSIGN_UXX(32, block_name,field_collect,field_mirror)
2272*d14abf15SRobert Mustacchi 
2273*d14abf15SRobert Mustacchi 
2274*d14abf15SRobert Mustacchi /* The code below is duplicated for bmac1, bmac2 and mstat, the structure mac_query differs between them and therefore
2275*d14abf15SRobert Mustacchi  * needs to be done this way (to avoid duplicating the code) */
2276*d14abf15SRobert Mustacchi #define LM_STATS_NON_EMAC_ASSIGN_CODE(_field_width) \
2277*d14abf15SRobert Mustacchi {\
2278*d14abf15SRobert Mustacchi     /* Maps bmac_query into macs sturct */ \
2279*d14abf15SRobert Mustacchi     /* Spec .1-5 (N/A) */ \
2280*d14abf15SRobert Mustacchi     /* Spec .6 */ \
2281*d14abf15SRobert Mustacchi     if (!IS_MULTI_VNIC(pdev)) { \
2282*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gtgca, stats_tx.tx_stat_ifhcoutucastpkts_bmac_bca, _field_width); \
2283*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gtgca, stats_tx.tx_stat_ifhcoutbroadcastpkts, _field_width); \
2284*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gtpkt, stats_tx.tx_stat_ifhcoutucastpkts_bmac_pkt , _field_width); \
2285*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gtmca, stats_tx.tx_stat_ifhcoutucastpkts_bmac_mca , _field_width); \
2286*d14abf15SRobert Mustacchi         /* Spec .7 */ \
2287*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gtmca, stats_tx.tx_stat_ifhcoutmulticastpkts , _field_width); \
2288*d14abf15SRobert Mustacchi         /* Spec .8  */ \
2289*d14abf15SRobert Mustacchi     } \
2290*d14abf15SRobert Mustacchi     /* Spec .9 */ \
2291*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_rx.rx_grfcs, stats_rx.rx_stat_dot3statsfcserrors, _field_width); \
2292*d14abf15SRobert Mustacchi     /* Spec .10-11 (N/A) */ \
2293*d14abf15SRobert Mustacchi     /* Spec .12 */ \
2294*d14abf15SRobert Mustacchi     /* Spec .13 */ \
2295*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_rx.rx_grovr, stats_rx.rx_stat_dot3statsframestoolong, _field_width); \
2296*d14abf15SRobert Mustacchi     /* Spec .14 (N/A) */ \
2297*d14abf15SRobert Mustacchi     /* Spec .15 */ \
2298*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_rx.rx_grxpf, stats_rx.rx_stat_xoffpauseframesreceived, _field_width); \
2299*d14abf15SRobert Mustacchi     /* Spec .17 */ \
2300*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gtxpf, stats_tx.tx_stat_outxoffsent, _field_width); \
2301*d14abf15SRobert Mustacchi     /* Spec .18-21 (N/A) */ \
2302*d14abf15SRobert Mustacchi     /* Spec .22 */ \
2303*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_rx.rx_grxpf, stats_rx.rx_stat_maccontrolframesreceived_bmac_xpf, _field_width); \
2304*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_rx.rx_grxcf, stats_rx.rx_stat_maccontrolframesreceived_bmac_xcf, _field_width); \
2305*d14abf15SRobert Mustacchi     /* Spec .23-29 (N/A) */ \
2306*d14abf15SRobert Mustacchi     /* Spec. 30 */ \
2307*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gt64, stats_tx.tx_stat_etherstatspkts64octets, _field_width); \
2308*d14abf15SRobert Mustacchi     /* Spec. 31 */ \
2309*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gt127, stats_tx.tx_stat_etherstatspkts65octetsto127octets, _field_width); \
2310*d14abf15SRobert Mustacchi     /* Spec. 32 */ \
2311*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gt255, stats_tx.tx_stat_etherstatspkts128octetsto255octets, _field_width); \
2312*d14abf15SRobert Mustacchi     /* Spec. 33 */ \
2313*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gt511, stats_tx.tx_stat_etherstatspkts256octetsto511octets, _field_width); \
2314*d14abf15SRobert Mustacchi     /* Spec. 34 */ \
2315*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gt1023, stats_tx.tx_stat_etherstatspkts512octetsto1023octets, _field_width); \
2316*d14abf15SRobert Mustacchi     /* Spec. 35                                                   */ \
2317*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gt1518, stats_tx.tx_stat_etherstatspkts1024octetsto1522octet, _field_width); \
2318*d14abf15SRobert Mustacchi     /* Spec. 36 */ \
2319*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gt2047,  stats_tx.tx_stat_etherstatspktsover1522octets_bmac_2047, _field_width); \
2320*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gt4095,  stats_tx.tx_stat_etherstatspktsover1522octets_bmac_4095, _field_width); \
2321*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gt9216,  stats_tx.tx_stat_etherstatspktsover1522octets_bmac_9216, _field_width); \
2322*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gt16383, stats_tx.tx_stat_etherstatspktsover1522octets_bmac_16383, _field_width);\
2323*d14abf15SRobert Mustacchi     /* Spec. 38 */ \
2324*d14abf15SRobert Mustacchi     /* Spec. 39 */ \
2325*d14abf15SRobert Mustacchi     /* Spec. 40 (N/A) */ \
2326*d14abf15SRobert Mustacchi     /* Spec. 41 */ \
2327*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gterr, stats_tx.tx_stat_dot3statsinternalmactransmiterrors, _field_width); \
2328*d14abf15SRobert Mustacchi     /* Spec. 42 (N/A) */ \
2329*d14abf15SRobert Mustacchi     /* Spec. 43 */ \
2330*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gtxpf, stats_tx.tx_stat_flowcontroldone, _field_width); \
2331*d14abf15SRobert Mustacchi     /* Spec. 44 */ \
2332*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_rx.rx_grxpf, stats_rx.rx_stat_xoffstateentered, _field_width); \
2333*d14abf15SRobert Mustacchi     /* Spec. 45 */ \
2334*d14abf15SRobert Mustacchi     /* Spec. 46 (N/A) */ \
2335*d14abf15SRobert Mustacchi     /* Spec. 47 */ \
2336*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gtufl, stats_tx.tx_stat_ifhcoutdiscards, _field_width); \
2337*d14abf15SRobert Mustacchi }
2338*d14abf15SRobert Mustacchi 
2339*d14abf15SRobert Mustacchi //Assign the registers that do not exist in MSTAT or have a different size and therefore can't
2340*d14abf15SRobert Mustacchi //be a part of LM_STATS_NON_EMAC_ASSIGN_CODE
2341*d14abf15SRobert Mustacchi #define LM_STATS_BMAC_ASSIGN_CODE \
2342*d14abf15SRobert Mustacchi { \
2343*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U42( stats_rx.rx_grund, stats_rx.rx_stat_etherstatsundersizepkts ) ; \
2344*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U36( stats_rx.rx_grjbr, stats_rx.rx_stat_etherstatsjabbers ) ; \
2345*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U42( stats_rx.rx_grfrg, stats_rx.rx_stat_etherstatsfragments ) ; \
2346*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U42( stats_rx.rx_grerb, stats_rx.rx_stat_ifhcinbadoctets ); \
2347*d14abf15SRobert Mustacchi }
2348*d14abf15SRobert Mustacchi 
2349*d14abf15SRobert Mustacchi /* The code below is duplicated for bmac2 and mstat, the structure mac_query differs between them and therefore
2350*d14abf15SRobert Mustacchi  * needs to be done this way (to avoid duplicating the code) */
2351*d14abf15SRobert Mustacchi #define LM_STATS_BMAC2_MSTAT_ASSIGN_CODE(_field_width) \
2352*d14abf15SRobert Mustacchi {\
2353*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_tx.tx_gtxpp, stats_tx.tx_stat_pfcPacketCounter, _field_width); \
2354*d14abf15SRobert Mustacchi     /* Rx PFC Packet Counter*/ \
2355*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_rx.rx_grxpp, stats_rx.rx_stat_pfcPacketCounter, _field_width); \
2356*d14abf15SRobert Mustacchi }
2357*d14abf15SRobert Mustacchi //Assign the registers that do not exist in BMAC1/BMAC2 or have a different size and therefore
2358*d14abf15SRobert Mustacchi //can't be a part of LM_STATS_NON_EMAC_ASSIGN_CODE.
2359*d14abf15SRobert Mustacchi //Also, some fields are read from EMAC stats on devices that have an EMAC block but must be read
2360*d14abf15SRobert Mustacchi //from MSTAT on devices that don't have one.
2361*d14abf15SRobert Mustacchi #define LM_STATS_MSTAT_ASSIGN_CODE \
2362*d14abf15SRobert Mustacchi { \
2363*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_rx.rx_grund, stats_rx.rx_stat_etherstatsundersizepkts, 39) ; \
2364*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_rx.rx_grfrg, stats_rx.rx_stat_etherstatsfragments, 39) ; \
2365*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN( stats_rx.rx_grerb, stats_rx.rx_stat_ifhcinbadoctets, 45); \
2366*d14abf15SRobert Mustacchi     if (!IS_MULTI_VNIC(pdev)) {\
2367*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_grbyt, stats_rx.rx_stat_ifhcinoctets, 45);\
2368*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_gruca, stats_rx.rx_stat_ifhcinucastpkts, 39)\
2369*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_grmca, stats_rx.rx_stat_ifhcinmulticastpkts, 39);\
2370*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_grbca, stats_rx.rx_stat_ifhcinbroadcastpkts, 39);\
2371*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_gr64, stats_rx.rx_stat_etherstatspkts64octets, 39);\
2372*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_gr127, stats_rx.rx_stat_etherstatspkts65octetsto127octets, 39);\
2373*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_gr255, stats_rx.rx_stat_etherstatspkts128octetsto255octets, 39);\
2374*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_gr511, stats_rx.rx_stat_etherstatspkts256octetsto511octets, 39);\
2375*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_gr1023, stats_rx.rx_stat_etherstatspkts512octetsto1023octets, 39);\
2376*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_gr1518, stats_rx.rx_stat_etherstatspkts1024octetsto1522octets, 39);\
2377*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN(stats_rx.rx_gr2047, stats_rx.rx_stat_etherstatspktsover1522octets, 39);\
2378*d14abf15SRobert Mustacchi     }\
2379*d14abf15SRobert Mustacchi }
2380*d14abf15SRobert Mustacchi 
2381*d14abf15SRobert Mustacchi /**lm_stats_hw_emac_assign
2382*d14abf15SRobert Mustacchi  * Copy the stats data from the BMAC1 stats values to the
2383*d14abf15SRobert Mustacchi  * generic struct used by the driver. This function must be
2384*d14abf15SRobert Mustacchi  * called after lm_stats_hw_collect that copies the data from
2385*d14abf15SRobert Mustacchi  * the hardware registers to the host's memory.
2386*d14abf15SRobert Mustacchi  *
2387*d14abf15SRobert Mustacchi  *
2388*d14abf15SRobert Mustacchi  * @param pdev the device to use.
2389*d14abf15SRobert Mustacchi  */
lm_stats_hw_bmac1_assign(struct _lm_device_t * pdev)2390*d14abf15SRobert Mustacchi void lm_stats_hw_bmac1_assign( struct _lm_device_t *pdev)
2391*d14abf15SRobert Mustacchi {
2392*d14abf15SRobert Mustacchi     /* Macros required for macros used in this code */
2393*d14abf15SRobert Mustacchi     stats_macs_t *macs = &pdev->vars.stats.stats_mirror.stats_hw.macs[STATS_MACS_IDX_CURRENT];
2394*d14abf15SRobert Mustacchi     volatile struct _stats_bmac1_query_t *mac_query = pdev->vars.stats.stats_collect.stats_hw.u.s.addr_bmac1_stats_query;
2395*d14abf15SRobert Mustacchi 
2396*d14abf15SRobert Mustacchi     LM_STATS_NON_EMAC_ASSIGN_CODE(36)
2397*d14abf15SRobert Mustacchi     LM_STATS_BMAC_ASSIGN_CODE
2398*d14abf15SRobert Mustacchi }
2399*d14abf15SRobert Mustacchi 
2400*d14abf15SRobert Mustacchi /**lm_stats_hw_emac_assign
2401*d14abf15SRobert Mustacchi  * Copy the stats data from the BMAC2 stats values to the
2402*d14abf15SRobert Mustacchi  * generic struct used by the driver. This function must be
2403*d14abf15SRobert Mustacchi  * called after lm_stats_hw_collect that copies the data from
2404*d14abf15SRobert Mustacchi  * the hardware registers to the host's memory.
2405*d14abf15SRobert Mustacchi  *
2406*d14abf15SRobert Mustacchi  *
2407*d14abf15SRobert Mustacchi  * @param pdev the device to use.
2408*d14abf15SRobert Mustacchi  */
lm_stats_hw_bmac2_assign(struct _lm_device_t * pdev)2409*d14abf15SRobert Mustacchi void lm_stats_hw_bmac2_assign( struct _lm_device_t *pdev)
2410*d14abf15SRobert Mustacchi {
2411*d14abf15SRobert Mustacchi     stats_macs_t *macs = &pdev->vars.stats.stats_mirror.stats_hw.macs[STATS_MACS_IDX_CURRENT];
2412*d14abf15SRobert Mustacchi     volatile struct _stats_bmac2_query_t *mac_query = pdev->vars.stats.stats_collect.stats_hw.u.s.addr_bmac2_stats_query;
2413*d14abf15SRobert Mustacchi     const u8_t bmac2_field_width = 36;
2414*d14abf15SRobert Mustacchi 
2415*d14abf15SRobert Mustacchi     DbgBreakIf(mac_query == NULL);
2416*d14abf15SRobert Mustacchi 
2417*d14abf15SRobert Mustacchi     LM_STATS_NON_EMAC_ASSIGN_CODE(bmac2_field_width)
2418*d14abf15SRobert Mustacchi     LM_STATS_BMAC2_MSTAT_ASSIGN_CODE(bmac2_field_width)
2419*d14abf15SRobert Mustacchi     LM_STATS_BMAC_ASSIGN_CODE
2420*d14abf15SRobert Mustacchi }
2421*d14abf15SRobert Mustacchi 
2422*d14abf15SRobert Mustacchi /**lm_stats_hw_emac_assign
2423*d14abf15SRobert Mustacchi  * Copy the stats data from the MSTAT stats values to the
2424*d14abf15SRobert Mustacchi  * generic struct used by the driver. This function must be
2425*d14abf15SRobert Mustacchi  * called after lm_stats_hw_collect that copies the data from
2426*d14abf15SRobert Mustacchi  * the hardware registers to the host's memory.
2427*d14abf15SRobert Mustacchi  *
2428*d14abf15SRobert Mustacchi  *
2429*d14abf15SRobert Mustacchi  * @param pdev the device to use.
2430*d14abf15SRobert Mustacchi  */
lm_stats_hw_mstat_assign(lm_device_t * pdev)2431*d14abf15SRobert Mustacchi void lm_stats_hw_mstat_assign( lm_device_t* pdev)
2432*d14abf15SRobert Mustacchi {
2433*d14abf15SRobert Mustacchi     stats_macs_t *macs = &pdev->vars.stats.stats_mirror.stats_hw.macs[STATS_MACS_IDX_CURRENT];
2434*d14abf15SRobert Mustacchi     volatile struct _stats_mstat_query_t *mac_query = pdev->vars.stats.stats_collect.stats_hw.u.addr_mstat_stats_query;
2435*d14abf15SRobert Mustacchi     const u8_t mstat_field_width = 39;
2436*d14abf15SRobert Mustacchi     DbgBreakIf(mac_query == NULL);
2437*d14abf15SRobert Mustacchi 
2438*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_stats_hw_mstat_assign: mac_query=%x\n", mac_query);
2439*d14abf15SRobert Mustacchi 
2440*d14abf15SRobert Mustacchi     LM_STATS_NON_EMAC_ASSIGN_CODE(mstat_field_width)
2441*d14abf15SRobert Mustacchi     LM_STATS_BMAC2_MSTAT_ASSIGN_CODE(mstat_field_width)
2442*d14abf15SRobert Mustacchi     LM_STATS_MSTAT_ASSIGN_CODE
2443*d14abf15SRobert Mustacchi }
2444*d14abf15SRobert Mustacchi 
2445*d14abf15SRobert Mustacchi /**lm_stats_hw_emac_assign
2446*d14abf15SRobert Mustacchi  * Copy the stats data from the EMAC stats values to the generic
2447*d14abf15SRobert Mustacchi  * struct used by the driver. This function must be called after
2448*d14abf15SRobert Mustacchi  * lm_stats_hw_collect that copies the data from the hardware
2449*d14abf15SRobert Mustacchi  * registers to the host's memory.
2450*d14abf15SRobert Mustacchi  *
2451*d14abf15SRobert Mustacchi  *
2452*d14abf15SRobert Mustacchi  * @param pdev the device to use.
2453*d14abf15SRobert Mustacchi  */
lm_stats_hw_emac_assign(struct _lm_device_t * pdev)2454*d14abf15SRobert Mustacchi void lm_stats_hw_emac_assign( struct _lm_device_t *pdev)
2455*d14abf15SRobert Mustacchi {
2456*d14abf15SRobert Mustacchi     stats_macs_t *macs = &pdev->vars.stats.stats_mirror.stats_hw.macs[STATS_MACS_IDX_CURRENT];
2457*d14abf15SRobert Mustacchi     volatile struct _stats_emac_query_t *mac_query = pdev->vars.stats.stats_collect.stats_hw.u.s.addr_emac_stats_query;
2458*d14abf15SRobert Mustacchi 
2459*d14abf15SRobert Mustacchi     DbgBreakIf(mac_query == NULL);
2460*d14abf15SRobert Mustacchi 
2461*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_ifhcinbadoctets, stats_rx.rx_stat_ifhcinbadoctets ) ;
2462*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_etherstatsfragments, stats_rx.rx_stat_etherstatsfragments ) ;
2463*d14abf15SRobert Mustacchi 
2464*d14abf15SRobert Mustacchi     if (!IS_MULTI_VNIC(pdev)) {
2465*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_ifhcinoctets, stats_rx.rx_stat_ifhcinoctets );
2466*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_ifhcinucastpkts, stats_rx.rx_stat_ifhcinucastpkts )
2467*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_ifhcinmulticastpkts, stats_rx.rx_stat_ifhcinmulticastpkts );
2468*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_ifhcinbroadcastpkts, stats_rx.rx_stat_ifhcinbroadcastpkts );
2469*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_etherstatspkts64octets, stats_rx.rx_stat_etherstatspkts64octets );
2470*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_etherstatspkts65octetsto127octets, stats_rx.rx_stat_etherstatspkts65octetsto127octets );
2471*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_etherstatspkts128octetsto255octets, stats_rx.rx_stat_etherstatspkts128octetsto255octets );
2472*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_etherstatspkts256octetsto511octets, stats_rx.rx_stat_etherstatspkts256octetsto511octets );
2473*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_etherstatspkts512octetsto1023octets, stats_rx.rx_stat_etherstatspkts512octetsto1023octets);
2474*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_etherstatspkts1024octetsto1522octets, stats_rx.rx_stat_etherstatspkts1024octetsto1522octets);
2475*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_etherstatspktsover1522octets, stats_rx.rx_stat_etherstatspktsover1522octets);
2476*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_ifhcoutoctets, stats_tx.tx_stat_ifhcoutoctets);
2477*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_ifhcoutucastpkts, stats_tx.tx_stat_ifhcoutucastpkts);
2478*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_ifhcoutmulticastpkts, stats_tx.tx_stat_ifhcoutmulticastpkts);
2479*d14abf15SRobert Mustacchi         LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_ifhcoutbroadcastpkts, stats_tx.tx_stat_ifhcoutbroadcastpkts);
2480*d14abf15SRobert Mustacchi     }
2481*d14abf15SRobert Mustacchi 
2482*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_dot3statsfcserrors, stats_rx.rx_stat_dot3statsfcserrors ) ;
2483*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_dot3statsalignmenterrors, stats_rx.rx_stat_dot3statsalignmenterrors ) ;
2484*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_dot3statscarriersenseerrors, stats_rx.rx_stat_dot3statscarriersenseerrors ) ;
2485*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_xonpauseframesreceived, stats_rx.rx_stat_xonpauseframesreceived ) ;
2486*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_xoffpauseframesreceived, stats_rx.rx_stat_xoffpauseframesreceived ) ;
2487*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_maccontrolframesreceived, stats_rx.rx_stat_maccontrolframesreceived ) ;
2488*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_xoffstateentered, stats_rx.rx_stat_xoffstateentered ) ;
2489*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_dot3statsframestoolong, stats_rx.rx_stat_dot3statsframestoolong ) ;
2490*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_etherstatsjabbers, stats_rx.rx_stat_etherstatsjabbers ) ;
2491*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx.rx_stat_etherstatsundersizepkts, stats_rx.rx_stat_etherstatsundersizepkts ) ;
2492*d14abf15SRobert Mustacchi 
2493*d14abf15SRobert Mustacchi 
2494*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_rx_err.rx_stat_falsecarriererrors, stats_rx_err.rx_stat_falsecarriererrors ) ;
2495*d14abf15SRobert Mustacchi 
2496*d14abf15SRobert Mustacchi 
2497*d14abf15SRobert Mustacchi 
2498*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_ifhcoutbadoctets, stats_tx.tx_stat_ifhcoutbadoctets ) ;
2499*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_etherstatscollisions, stats_tx.tx_stat_etherstatscollisions ) ;
2500*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_outxonsent, stats_tx.tx_stat_outxonsent ) ;
2501*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_outxoffsent, stats_tx.tx_stat_outxoffsent ) ;
2502*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_flowcontroldone, stats_tx.tx_stat_flowcontroldone ) ;
2503*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_dot3statssinglecollisionframes, stats_tx.tx_stat_dot3statssinglecollisionframes ) ;
2504*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_dot3statsmultiplecollisionframes, stats_tx.tx_stat_dot3statsmultiplecollisionframes ) ;
2505*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_dot3statsdeferredtransmissions, stats_tx.tx_stat_dot3statsdeferredtransmissions ) ;
2506*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_dot3statsexcessivecollisions, stats_tx.tx_stat_dot3statsexcessivecollisions ) ;
2507*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_dot3statslatecollisions, stats_tx.tx_stat_dot3statslatecollisions ) ;
2508*d14abf15SRobert Mustacchi 
2509*d14abf15SRobert Mustacchi 
2510*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_etherstatspkts64octets, stats_tx.tx_stat_etherstatspkts64octets ) ;
2511*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_etherstatspkts65octetsto127octets, stats_tx.tx_stat_etherstatspkts65octetsto127octets ) ;
2512*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_etherstatspkts128octetsto255octets, stats_tx.tx_stat_etherstatspkts128octetsto255octets ) ;
2513*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_etherstatspkts256octetsto511octets, stats_tx.tx_stat_etherstatspkts256octetsto511octets ) ;
2514*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_etherstatspkts512octetsto1023octets, stats_tx.tx_stat_etherstatspkts512octetsto1023octets ) ;
2515*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_etherstatspkts1024octetsto1522octet, stats_tx.tx_stat_etherstatspkts1024octetsto1522octet ) ;
2516*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_etherstatspktsover1522octets, stats_tx.tx_stat_etherstatspktsover1522octets ) ;
2517*d14abf15SRobert Mustacchi     LM_STATS_HW_MAC_ASSIGN_U32(stats_tx.tx_stat_dot3statsinternalmactransmiterrors, stats_tx.tx_stat_dot3statsinternalmactransmiterrors ) ;
2518*d14abf15SRobert Mustacchi }
2519*d14abf15SRobert Mustacchi 
lm_stats_hw_assign(struct _lm_device_t * pdev)2520*d14abf15SRobert Mustacchi void lm_stats_hw_assign( struct _lm_device_t *pdev )
2521*d14abf15SRobert Mustacchi {
2522*d14abf15SRobert Mustacchi     if(HAS_MSTAT(pdev))
2523*d14abf15SRobert Mustacchi     {
2524*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "lm_stats_hw_assign: device has MSTAT block.\n");
2525*d14abf15SRobert Mustacchi         lm_stats_hw_mstat_assign(pdev);
2526*d14abf15SRobert Mustacchi     }
2527*d14abf15SRobert Mustacchi     else if (CHIP_IS_E2(pdev) && (pdev->vars.mac_type == MAC_TYPE_BMAC))
2528*d14abf15SRobert Mustacchi     {
2529*d14abf15SRobert Mustacchi         lm_stats_hw_bmac2_assign(pdev);
2530*d14abf15SRobert Mustacchi     }
2531*d14abf15SRobert Mustacchi     else if (pdev->vars.mac_type == MAC_TYPE_BMAC)
2532*d14abf15SRobert Mustacchi     {
2533*d14abf15SRobert Mustacchi         lm_stats_hw_bmac1_assign(pdev);
2534*d14abf15SRobert Mustacchi     }
2535*d14abf15SRobert Mustacchi     else if(pdev->vars.mac_type == MAC_TYPE_EMAC)
2536*d14abf15SRobert Mustacchi     {
2537*d14abf15SRobert Mustacchi         lm_stats_hw_emac_assign(pdev);
2538*d14abf15SRobert Mustacchi     }
2539*d14abf15SRobert Mustacchi     else
2540*d14abf15SRobert Mustacchi     {
2541*d14abf15SRobert Mustacchi         DbgBreakIf((pdev->vars.mac_type != MAC_TYPE_EMAC) && (pdev->vars.mac_type == MAC_TYPE_BMAC) && !HAS_MSTAT(pdev) );
2542*d14abf15SRobert Mustacchi     }
2543*d14abf15SRobert Mustacchi 
2544*d14abf15SRobert Mustacchi     //nig
2545*d14abf15SRobert Mustacchi     {
2546*d14abf15SRobert Mustacchi        LM_STATS_HW_NIG_ASSIGN_U32(nig, brb_discard,       brb_discard       ) ;
2547*d14abf15SRobert Mustacchi        if (!IS_MULTI_VNIC(pdev))
2548*d14abf15SRobert Mustacchi        {
2549*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, brb_packet,        brb_packet        );
2550*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, brb_truncate,      brb_truncate      );
2551*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, flow_ctrl_discard, flow_ctrl_discard );
2552*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, flow_ctrl_octets,  flow_ctrl_octets  );
2553*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, flow_ctrl_packet,  flow_ctrl_packet  );
2554*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, mng_discard,       mng_discard       );
2555*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, mng_octet_inp,     mng_octet_inp     );
2556*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, mng_octet_out,     mng_octet_out     );
2557*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, mng_packet_inp,    mng_packet_inp    );
2558*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, mng_packet_out,    mng_packet_out    );
2559*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, pbf_octets,        pbf_octets        );
2560*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, pbf_packet,        pbf_packet        );
2561*d14abf15SRobert Mustacchi            LM_STATS_HW_NIG_ASSIGN_U32(nig, safc_inp,          safc_inp          );
2562*d14abf15SRobert Mustacchi        }
2563*d14abf15SRobert Mustacchi        if(HAS_MSTAT(pdev))//E3 has no NIG-ex registers, so we use values from MSTAT instead.
2564*d14abf15SRobert Mustacchi        {
2565*d14abf15SRobert Mustacchi            //Note: this must occur after the other HW stats have been assigned.
2566*d14abf15SRobert Mustacchi            stats_macs_t* assigned_hw_stats = &pdev->vars.stats.stats_mirror.stats_hw.macs[STATS_MACS_IDX_TOTAL];
2567*d14abf15SRobert Mustacchi            struct _stats_nig_ex_t* nig_ex_stats = &pdev->vars.stats.stats_collect.stats_hw.nig_ex_stats_query;
2568*d14abf15SRobert Mustacchi            /*NIG pkt0 counts packets with sizes 1024-1522 bytes. MSTAT has an equivalent register.*/
2569*d14abf15SRobert Mustacchi            nig_ex_stats->egress_mac_pkt0 = assigned_hw_stats->stats_tx.tx_stat_etherstatspkts1024octetsto1522octet;
2570*d14abf15SRobert Mustacchi            /*NIG pkt1 counts packets of size 1523 and up. We sum the required MSTAT values to get the right result.
2571*d14abf15SRobert Mustacchi              Note that the field names are somewhat misleading, since they don't count sizes 1522-XXXX but [1522-2047],[2048-4095],[4096-9216],[9217-14383]
2572*d14abf15SRobert Mustacchi              (see MSTAT low level design document).
2573*d14abf15SRobert Mustacchi              */
2574*d14abf15SRobert Mustacchi            nig_ex_stats->egress_mac_pkt1 =  assigned_hw_stats->stats_tx.tx_stat_etherstatspktsover1522octets_bmac_2047+
2575*d14abf15SRobert Mustacchi                                             assigned_hw_stats->stats_tx.tx_stat_etherstatspktsover1522octets_bmac_4095+
2576*d14abf15SRobert Mustacchi                                             assigned_hw_stats->stats_tx.tx_stat_etherstatspktsover1522octets_bmac_9216+
2577*d14abf15SRobert Mustacchi                                             assigned_hw_stats->stats_tx.tx_stat_etherstatspktsover1522octets_bmac_16383;
2578*d14abf15SRobert Mustacchi        }
2579*d14abf15SRobert Mustacchi        else
2580*d14abf15SRobert Mustacchi        {
2581*d14abf15SRobert Mustacchi            LM_SIGN_EXTEND_VALUE_36( pdev->vars.stats.stats_collect.stats_hw.nig_ex_stats_query.egress_mac_pkt0, pdev->vars.stats.stats_mirror.stats_hw.nig_ex.egress_mac_pkt0 ) ;
2582*d14abf15SRobert Mustacchi            LM_SIGN_EXTEND_VALUE_36( pdev->vars.stats.stats_collect.stats_hw.nig_ex_stats_query.egress_mac_pkt1, pdev->vars.stats.stats_mirror.stats_hw.nig_ex.egress_mac_pkt1 ) ;
2583*d14abf15SRobert Mustacchi        }
2584*d14abf15SRobert Mustacchi     }
2585*d14abf15SRobert Mustacchi }
2586*d14abf15SRobert Mustacchi 
2587*d14abf15SRobert Mustacchi /*
2588*d14abf15SRobert Mustacchi  *Function Name: lm_drv_info_to_mfw_assign_eth
2589*d14abf15SRobert Mustacchi  *
2590*d14abf15SRobert Mustacchi  *Parameters:
2591*d14abf15SRobert Mustacchi  *
2592*d14abf15SRobert Mustacchi  *Description:
2593*d14abf15SRobert Mustacchi  *  assign drv_info eth stats from different places in the pdev to "mirror" (vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.eth_stats)
2594*d14abf15SRobert Mustacchi  *Returns:
2595*d14abf15SRobert Mustacchi  *
2596*d14abf15SRobert Mustacchi  */
lm_drv_info_to_mfw_assign_eth(struct _lm_device_t * pdev)2597*d14abf15SRobert Mustacchi static void lm_drv_info_to_mfw_assign_eth( struct _lm_device_t *pdev )
2598*d14abf15SRobert Mustacchi {
2599*d14abf15SRobert Mustacchi     const u8_t              client_id  = LM_CLI_CID(pdev, LM_CLI_IDX_NDIS );
2600*d14abf15SRobert Mustacchi     eth_stats_info_t*       stats_eth  = &pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.eth_stats;
2601*d14abf15SRobert Mustacchi     lm_client_con_params_t* cli_params = NULL;
2602*d14abf15SRobert Mustacchi 
2603*d14abf15SRobert Mustacchi     if( client_id >= ARRSIZE(pdev->params.l2_cli_con_params) )
2604*d14abf15SRobert Mustacchi     {
2605*d14abf15SRobert Mustacchi         DbgBreakIf( client_id >= ARRSIZE(pdev->params.l2_cli_con_params) );
2606*d14abf15SRobert Mustacchi         return;
2607*d14abf15SRobert Mustacchi     }
2608*d14abf15SRobert Mustacchi 
2609*d14abf15SRobert Mustacchi #define DRV_INFO_TO_MFW_NOT_SUPPORTED 0
2610*d14abf15SRobert Mustacchi 
2611*d14abf15SRobert Mustacchi     cli_params = &pdev->params.l2_cli_con_params[client_id];
2612*d14abf15SRobert Mustacchi 
2613*d14abf15SRobert Mustacchi     ASSERT_STATIC( sizeof(stats_eth->version) <= sizeof(pdev->ver_str) );
2614*d14abf15SRobert Mustacchi 
2615*d14abf15SRobert Mustacchi     ASSERT_STATIC( sizeof(stats_eth->mac_local) <= sizeof( pdev->params.mac_addr ) );
2616*d14abf15SRobert Mustacchi 
2617*d14abf15SRobert Mustacchi     mm_memcpy( stats_eth->version, pdev->ver_str, sizeof(stats_eth->version) );
2618*d14abf15SRobert Mustacchi 
2619*d14abf15SRobert Mustacchi     /* Locally Admin Addr.   BigEndian EIU48. Actual size is 6 bytes */
2620*d14abf15SRobert Mustacchi     /* Additional Programmed MAC Addr 1. 2*/
2621*d14abf15SRobert Mustacchi 
2622*d14abf15SRobert Mustacchi     // stats_eth->mac_local, mac_add1, mac_add2 - NO NEED to update here since they are already updated in lm_eq_handle_classification_eqe
2623*d14abf15SRobert Mustacchi 
2624*d14abf15SRobert Mustacchi     /* MTU Size. Note   : Negotiated MTU */
2625*d14abf15SRobert Mustacchi     stats_eth->mtu_size             = cli_params->mtu;
2626*d14abf15SRobert Mustacchi 
2627*d14abf15SRobert Mustacchi     /* LSO MaxOffloadSize. */
2628*d14abf15SRobert Mustacchi     stats_eth->lso_max_size         = DRV_INFO_TO_MFW_NOT_SUPPORTED; // we should acquire this from NDIS?
2629*d14abf15SRobert Mustacchi 
2630*d14abf15SRobert Mustacchi     /* LSO MinSegmentCount. */
2631*d14abf15SRobert Mustacchi     stats_eth->lso_min_seg_cnt      = DRV_INFO_TO_MFW_NOT_SUPPORTED; // we should acquire this from NDIS?
2632*d14abf15SRobert Mustacchi 
2633*d14abf15SRobert Mustacchi     /* Num Offloaded Connections TCP_IPv4. */
2634*d14abf15SRobert Mustacchi     stats_eth->ipv4_ofld_cnt        = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[STATS_IP_4_IDX].currently_established;
2635*d14abf15SRobert Mustacchi 
2636*d14abf15SRobert Mustacchi     /* Num Offloaded Connections TCP_IPv6. */
2637*d14abf15SRobert Mustacchi     stats_eth->ipv6_ofld_cnt        = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[STATS_IP_6_IDX].currently_established;
2638*d14abf15SRobert Mustacchi 
2639*d14abf15SRobert Mustacchi     /* Promiscuous Mode. non-zero true */
2640*d14abf15SRobert Mustacchi     stats_eth->promiscuous_mode = ( 0 != GET_FLAGS( pdev->client_info[client_id].last_set_rx_mask, LM_RX_MASK_PROMISCUOUS_MODE ) );
2641*d14abf15SRobert Mustacchi 
2642*d14abf15SRobert Mustacchi      /* TX Descriptors Queue Size */
2643*d14abf15SRobert Mustacchi     stats_eth->txq_size             = cli_params->num_tx_desc;
2644*d14abf15SRobert Mustacchi 
2645*d14abf15SRobert Mustacchi     /* RX Descriptors Queue Size */
2646*d14abf15SRobert Mustacchi     stats_eth->rxq_size             = cli_params->num_rx_desc;//= pdev->params.l2_rx_desc_cnt[LM_CLI_IDX_NDIS];
2647*d14abf15SRobert Mustacchi 
2648*d14abf15SRobert Mustacchi     /* TX Descriptor Queue Avg Depth. % Avg Queue Depth since last poll */
2649*d14abf15SRobert Mustacchi     stats_eth->txq_avg_depth        = DRV_INFO_TO_MFW_NOT_SUPPORTED;
2650*d14abf15SRobert Mustacchi 
2651*d14abf15SRobert Mustacchi     /* RX Descriptors Queue Avg Depth. % Avg Queue Depth since last poll */
2652*d14abf15SRobert Mustacchi     stats_eth->rxq_avg_depth        = DRV_INFO_TO_MFW_NOT_SUPPORTED;
2653*d14abf15SRobert Mustacchi 
2654*d14abf15SRobert Mustacchi     /* IOV_Offload. 0=none; 1=MultiQueue, 2=VEB 3= VEPA*/
2655*d14abf15SRobert Mustacchi     stats_eth->iov_offload          = DRV_INFO_TO_MFW_NOT_SUPPORTED;
2656*d14abf15SRobert Mustacchi 
2657*d14abf15SRobert Mustacchi     /* Num VF assigned to this PF. */
2658*d14abf15SRobert Mustacchi     stats_eth->vf_cnt               = 0; // Once Win8 (T7.4) should be changed!
2659*d14abf15SRobert Mustacchi 
2660*d14abf15SRobert Mustacchi     /* Number of NetQueue/VMQ Config'd. */
2661*d14abf15SRobert Mustacchi     stats_eth->netq_cnt             = mm_get_vmq_cnt(pdev);
2662*d14abf15SRobert Mustacchi 
2663*d14abf15SRobert Mustacchi     /* Feature_Flags. */
2664*d14abf15SRobert Mustacchi     stats_eth->feature_flags        = mm_get_feature_flags(pdev);
2665*d14abf15SRobert Mustacchi } /* lm_drv_info_to_mfw_assign_eth */
2666*d14abf15SRobert Mustacchi 
2667*d14abf15SRobert Mustacchi 
2668*d14abf15SRobert Mustacchi /*
2669*d14abf15SRobert Mustacchi  *Function Name: lm_stats_drv_info_to_mfw_assign
2670*d14abf15SRobert Mustacchi  *
2671*d14abf15SRobert Mustacchi  *Parameters:
2672*d14abf15SRobert Mustacchi  *
2673*d14abf15SRobert Mustacchi  *Description:
2674*d14abf15SRobert Mustacchi  *  Upon the opcode assign relevant stats from "mirror" to physical memory in "collect"
2675*d14abf15SRobert Mustacchi  *  then, MFW will read this data.
2676*d14abf15SRobert Mustacchi  *Returns:
2677*d14abf15SRobert Mustacchi  *
2678*d14abf15SRobert Mustacchi  */
lm_stats_drv_info_to_mfw_assign(struct _lm_device_t * pdev,const enum drv_info_opcode drv_info_op)2679*d14abf15SRobert Mustacchi lm_status_t lm_stats_drv_info_to_mfw_assign( struct _lm_device_t *pdev, const enum drv_info_opcode drv_info_op )
2680*d14abf15SRobert Mustacchi {
2681*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
2682*d14abf15SRobert Mustacchi     void*        dest     = (void*)pdev->vars.stats.stats_collect.drv_info_to_mfw.addr.eth_stats; // this is a union so doesn't matter if etc/iscsi/fcoe
2683*d14abf15SRobert Mustacchi     void*        src      = NULL;
2684*d14abf15SRobert Mustacchi     u32_t        size     = 0;
2685*d14abf15SRobert Mustacchi 
2686*d14abf15SRobert Mustacchi     if CHK_NULL(dest)
2687*d14abf15SRobert Mustacchi     {
2688*d14abf15SRobert Mustacchi         // dest might be NULL if we got here in chip id < E3
2689*d14abf15SRobert Mustacchi         DbgBreakIf(!dest);
2690*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
2691*d14abf15SRobert Mustacchi     }
2692*d14abf15SRobert Mustacchi 
2693*d14abf15SRobert Mustacchi     switch(drv_info_op)
2694*d14abf15SRobert Mustacchi     {
2695*d14abf15SRobert Mustacchi     case ETH_STATS_OPCODE:
2696*d14abf15SRobert Mustacchi         // We gather eth stats from already known data
2697*d14abf15SRobert Mustacchi         lm_drv_info_to_mfw_assign_eth(pdev);
2698*d14abf15SRobert Mustacchi 
2699*d14abf15SRobert Mustacchi         src  = &pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.eth_stats;
2700*d14abf15SRobert Mustacchi         size = sizeof(pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.eth_stats);
2701*d14abf15SRobert Mustacchi         break;
2702*d14abf15SRobert Mustacchi 
2703*d14abf15SRobert Mustacchi     case ISCSI_STATS_OPCODE:
2704*d14abf15SRobert Mustacchi         // storage data is set by miniport
2705*d14abf15SRobert Mustacchi         src  = &pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.iscsi_stats;
2706*d14abf15SRobert Mustacchi         size = sizeof(pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.iscsi_stats);
2707*d14abf15SRobert Mustacchi         break;
2708*d14abf15SRobert Mustacchi 
2709*d14abf15SRobert Mustacchi     case FCOE_STATS_OPCODE:
2710*d14abf15SRobert Mustacchi         // storage data is set by miniport
2711*d14abf15SRobert Mustacchi         src  = &pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.fcoe_stats;
2712*d14abf15SRobert Mustacchi         size = sizeof(pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.fcoe_stats);
2713*d14abf15SRobert Mustacchi         break;
2714*d14abf15SRobert Mustacchi 
2715*d14abf15SRobert Mustacchi     default:
2716*d14abf15SRobert Mustacchi         lm_status = LM_STATUS_INVALID_PARAMETER;
2717*d14abf15SRobert Mustacchi         break;
2718*d14abf15SRobert Mustacchi     }
2719*d14abf15SRobert Mustacchi 
2720*d14abf15SRobert Mustacchi     if( LM_STATUS_SUCCESS == lm_status)
2721*d14abf15SRobert Mustacchi     {
2722*d14abf15SRobert Mustacchi         // Zero buffer
2723*d14abf15SRobert Mustacchi         mm_mem_zero( dest, size );
2724*d14abf15SRobert Mustacchi 
2725*d14abf15SRobert Mustacchi         // Copy relevant field
2726*d14abf15SRobert Mustacchi         mm_memcpy( dest, src, size );
2727*d14abf15SRobert Mustacchi     }
2728*d14abf15SRobert Mustacchi 
2729*d14abf15SRobert Mustacchi     return lm_status;
2730*d14abf15SRobert Mustacchi } /* lm_stats_drv_info_to_mfw_assign */
2731*d14abf15SRobert Mustacchi 
2732*d14abf15SRobert Mustacchi // resets mirror fw statistics
lm_stats_fw_reset(struct _lm_device_t * pdev)2733*d14abf15SRobert Mustacchi void lm_stats_fw_reset( struct _lm_device_t* pdev)
2734*d14abf15SRobert Mustacchi {
2735*d14abf15SRobert Mustacchi      if CHK_NULL( pdev )
2736*d14abf15SRobert Mustacchi      {
2737*d14abf15SRobert Mustacchi          DbgBreakIf(!pdev) ;
2738*d14abf15SRobert Mustacchi      }
2739*d14abf15SRobert Mustacchi      mm_memset( &pdev->vars.stats.stats_mirror.stats_fw, 0, sizeof(pdev->vars.stats.stats_mirror.stats_fw) ) ;
2740*d14abf15SRobert Mustacchi }
2741*d14abf15SRobert Mustacchi 
lm_stats_get_dcb_stats(lm_device_t * pdev,lm_dcbx_stat * stats)2742*d14abf15SRobert Mustacchi void lm_stats_get_dcb_stats( lm_device_t* pdev, lm_dcbx_stat *stats )
2743*d14abf15SRobert Mustacchi {
2744*d14abf15SRobert Mustacchi     stats->pfc_frames_sent      = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_pfcPacketCounter ) );
2745*d14abf15SRobert Mustacchi     stats->pfc_frames_received  = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_pfcPacketCounter ) );
2746*d14abf15SRobert Mustacchi }
lm_stats_get_driver_stats(struct _lm_device_t * pdev,b10_driver_statistics_t * stats)2747*d14abf15SRobert Mustacchi void lm_stats_get_driver_stats( struct _lm_device_t* pdev, b10_driver_statistics_t *stats )
2748*d14abf15SRobert Mustacchi {
2749*d14abf15SRobert Mustacchi     stats->ver_num            = DRIVER_STATISTISTCS_VER_NUM;
2750*d14abf15SRobert Mustacchi     stats->tx_lso_frames      = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.tx_lso_frames ;
2751*d14abf15SRobert Mustacchi     stats->tx_aborted         = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.tx_aborted ;
2752*d14abf15SRobert Mustacchi     stats->tx_no_bd           = 0 ;
2753*d14abf15SRobert Mustacchi     stats->tx_no_desc         = 0 ;
2754*d14abf15SRobert Mustacchi     stats->tx_no_coalesce_buf = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.tx_no_coalesce_buf ;
2755*d14abf15SRobert Mustacchi     stats->tx_no_map_reg      = 0 ;
2756*d14abf15SRobert Mustacchi     stats->rx_aborted         = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.rx_aborted ;
2757*d14abf15SRobert Mustacchi     stats->rx_err             = 0 ;
2758*d14abf15SRobert Mustacchi     stats->rx_crc             = 0 ;
2759*d14abf15SRobert Mustacchi     stats->rx_phy_err         = 0 ;
2760*d14abf15SRobert Mustacchi     stats->rx_alignment       = 0;
2761*d14abf15SRobert Mustacchi     stats->rx_short_packet    = 0 ;
2762*d14abf15SRobert Mustacchi     stats->rx_giant_packet    = 0 ;
2763*d14abf15SRobert Mustacchi }
2764*d14abf15SRobert Mustacchi 
lm_stats_get_l2_driver_stats(struct _lm_device_t * pdev,b10_l2_driver_statistics_t * stats)2765*d14abf15SRobert Mustacchi void lm_stats_get_l2_driver_stats( struct _lm_device_t* pdev, b10_l2_driver_statistics_t *stats )
2766*d14abf15SRobert Mustacchi {
2767*d14abf15SRobert Mustacchi     stats->ver_num            = L2_DRIVER_STATISTISTCS_VER_NUM;
2768*d14abf15SRobert Mustacchi     stats->RxIPv4FragCount    = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.rx_ipv4_frag_count ;
2769*d14abf15SRobert Mustacchi     stats->RxIpCsErrorCount   = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.rx_ip_cs_error_count ;
2770*d14abf15SRobert Mustacchi     stats->RxTcpCsErrorCount  = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.rx_tcp_cs_error_count ;
2771*d14abf15SRobert Mustacchi     stats->RxLlcSnapCount     = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.rx_llc_snap_count ;
2772*d14abf15SRobert Mustacchi     stats->RxPhyErrorCount    = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.rx_phy_error_count ;
2773*d14abf15SRobert Mustacchi     stats->RxIpv6ExtCount     = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.rx_ipv6_ext_count ;
2774*d14abf15SRobert Mustacchi     stats->TxNoL2Bd           = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.tx_no_l2_bd ;
2775*d14abf15SRobert Mustacchi     stats->TxNoSqWqe          = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.tx_no_sq_wqe ;
2776*d14abf15SRobert Mustacchi     stats->TxL2AssemblyBufUse = pdev->vars.stats.stats_mirror.stats_drv.drv_eth.tx_l2_assembly_buf_use ;
2777*d14abf15SRobert Mustacchi }
lm_stats_get_l4_driver_stats(struct _lm_device_t * pdev,b10_l4_driver_statistics_t * stats)2778*d14abf15SRobert Mustacchi void lm_stats_get_l4_driver_stats( struct _lm_device_t* pdev, b10_l4_driver_statistics_t *stats )
2779*d14abf15SRobert Mustacchi {
2780*d14abf15SRobert Mustacchi     u8_t idx = 0 ;
2781*d14abf15SRobert Mustacchi 
2782*d14abf15SRobert Mustacchi     stats->ver_num                    = L4_DRIVER_STATISTISTCS_VER_NUM;
2783*d14abf15SRobert Mustacchi 
2784*d14abf15SRobert Mustacchi     idx = STATS_IP_4_IDX ;
2785*d14abf15SRobert Mustacchi     stats->CurrentlyIpv4Established   = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[idx].currently_established ;
2786*d14abf15SRobert Mustacchi     stats->OutIpv4Resets              = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[idx].out_resets ;
2787*d14abf15SRobert Mustacchi     stats->OutIpv4Fin                 = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[idx].out_fin ;
2788*d14abf15SRobert Mustacchi     stats->InIpv4Reset                = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[idx].in_reset ;
2789*d14abf15SRobert Mustacchi     stats->InIpv4Fin                  = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[idx].in_fin ;
2790*d14abf15SRobert Mustacchi 
2791*d14abf15SRobert Mustacchi     idx = STATS_IP_6_IDX ;
2792*d14abf15SRobert Mustacchi     stats->CurrentlyIpv6Established   = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[idx].currently_established ;
2793*d14abf15SRobert Mustacchi     stats->OutIpv6Resets              = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[idx].out_resets ;
2794*d14abf15SRobert Mustacchi     stats->OutIpv6Fin                 = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[idx].out_fin ;
2795*d14abf15SRobert Mustacchi     stats->InIpv6Reset                = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[idx].in_reset ;
2796*d14abf15SRobert Mustacchi     stats->InIpv6Fin                  = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[idx].in_fin ;
2797*d14abf15SRobert Mustacchi 
2798*d14abf15SRobert Mustacchi     stats->RxIndicateReturnPendingCnt = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.rx_indicate_return_pending_cnt ;
2799*d14abf15SRobert Mustacchi     stats->RxIndicateReturnDoneCnt    = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.rx_indicate_return_done_cnt ;
2800*d14abf15SRobert Mustacchi     stats->RxActiveGenBufCnt          = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.rx_active_gen_buf_cnt ;
2801*d14abf15SRobert Mustacchi     stats->TxNoL4Bd                   = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.tx_no_l4_bd ;
2802*d14abf15SRobert Mustacchi     stats->TxL4AssemblyBufUse         = pdev->vars.stats.stats_mirror.stats_drv.drv_toe.tx_l4_assembly_buf_use ;
2803*d14abf15SRobert Mustacchi }
2804*d14abf15SRobert Mustacchi 
lm_stats_get_l2_chip_stats(struct _lm_device_t * pdev,void * buf,u8_t version)2805*d14abf15SRobert Mustacchi void lm_stats_get_l2_chip_stats( struct _lm_device_t* pdev, void *buf, u8_t version)
2806*d14abf15SRobert Mustacchi {
2807*d14abf15SRobert Mustacchi     u32_t idx = LM_CLI_IDX_NDIS ;
2808*d14abf15SRobert Mustacchi     b10_l2_chip_statistics_t *stats = buf;
2809*d14abf15SRobert Mustacchi 
2810*d14abf15SRobert Mustacchi     stats->ver_num                                = version ;
2811*d14abf15SRobert Mustacchi 
2812*d14abf15SRobert Mustacchi     // TODO - change IOCTL structure to be per client
2813*d14abf15SRobert Mustacchi 
2814*d14abf15SRobert Mustacchi     stats->IfHCInOctets                           = pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_broadcast_bytes +
2815*d14abf15SRobert Mustacchi                                                     pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_multicast_bytes +
2816*d14abf15SRobert Mustacchi                                                     pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_unicast_bytes ;
2817*d14abf15SRobert Mustacchi     stats->IfHCInBadOctets                        = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_ifhcinbadoctets ) );
2818*d14abf15SRobert Mustacchi     stats->IfHCOutOctets                          = pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[idx].total_sent_bytes ;
2819*d14abf15SRobert Mustacchi     stats->IfHCOutBadOctets                       = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_ifhcoutbadoctets ) );
2820*d14abf15SRobert Mustacchi     stats->IfHCInUcastPkts                        = (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_unicast_pkts ) ;
2821*d14abf15SRobert Mustacchi     stats->IfHCInMulticastPkts                    = (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_multicast_pkts ) ;
2822*d14abf15SRobert Mustacchi     stats->IfHCInBroadcastPkts                    = (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_broadcast_pkts ) ;
2823*d14abf15SRobert Mustacchi     stats->IfHCInUcastOctets                      = (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_unicast_bytes ) ;
2824*d14abf15SRobert Mustacchi     stats->IfHCInMulticastOctets                  = (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_multicast_bytes ) ;
2825*d14abf15SRobert Mustacchi     stats->IfHCInBroadcastOctets                  = (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_broadcast_bytes ) ;
2826*d14abf15SRobert Mustacchi 
2827*d14abf15SRobert Mustacchi     stats->IfHCOutUcastOctets                     = (pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[idx].unicast_bytes_sent ) ;
2828*d14abf15SRobert Mustacchi     stats->IfHCOutMulticastOctets                 = (pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[idx].multicast_bytes_sent ) ;
2829*d14abf15SRobert Mustacchi     stats->IfHCOutBroadcastOctets                 = (pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[idx].broadcast_bytes_sent ) ;
2830*d14abf15SRobert Mustacchi     stats->IfHCOutPkts                            = (pdev->vars.stats.stats_mirror.stats_fw.eth_xstorm_common.client_statistics[idx].total_sent_pkts ) ;
2831*d14abf15SRobert Mustacchi 
2832*d14abf15SRobert Mustacchi 
2833*d14abf15SRobert Mustacchi     lm_get_stats( pdev,  LM_STATS_UNICAST_FRAMES_XMIT, &stats->IfHCOutUcastPkts
2834*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
2835*d14abf15SRobert Mustacchi                   ,NULL
2836*d14abf15SRobert Mustacchi #endif
2837*d14abf15SRobert Mustacchi     ) ;
2838*d14abf15SRobert Mustacchi     lm_get_stats( pdev,  LM_STATS_MULTICAST_FRAMES_XMIT, &stats->IfHCOutMulticastPkts
2839*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
2840*d14abf15SRobert Mustacchi                   ,NULL
2841*d14abf15SRobert Mustacchi #endif
2842*d14abf15SRobert Mustacchi     ) ;
2843*d14abf15SRobert Mustacchi     lm_get_stats( pdev,  LM_STATS_BROADCAST_FRAMES_XMIT, &stats->IfHCOutBroadcastPkts
2844*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
2845*d14abf15SRobert Mustacchi                   ,NULL
2846*d14abf15SRobert Mustacchi #endif
2847*d14abf15SRobert Mustacchi      ) ;
2848*d14abf15SRobert Mustacchi 
2849*d14abf15SRobert Mustacchi     stats->IfHCInPkts                             = pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_broadcast_pkts +
2850*d14abf15SRobert Mustacchi                                                     pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_multicast_pkts +
2851*d14abf15SRobert Mustacchi                                                     pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].rcv_unicast_pkts ;
2852*d14abf15SRobert Mustacchi 
2853*d14abf15SRobert Mustacchi     stats->IfHCOutDiscards                        = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_ifhcoutdiscards ) );
2854*d14abf15SRobert Mustacchi     stats->IfHCInFalseCarrierErrors               = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx_err.rx_stat_falsecarriererrors ) );
2855*d14abf15SRobert Mustacchi 
2856*d14abf15SRobert Mustacchi     stats->Dot3StatsInternalMacTransmitErrors     = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_dot3statsinternalmactransmiterrors )) ;
2857*d14abf15SRobert Mustacchi     stats->Dot3StatsCarrierSenseErrors            = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_dot3statscarriersenseerrors )) ;
2858*d14abf15SRobert Mustacchi     stats->Dot3StatsFCSErrors                     = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_dot3statsfcserrors )) ;
2859*d14abf15SRobert Mustacchi     stats->Dot3StatsAlignmentErrors               = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_dot3statsalignmenterrors )) ;
2860*d14abf15SRobert Mustacchi     stats->Dot3StatsSingleCollisionFrames         = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_dot3statssinglecollisionframes )) ;
2861*d14abf15SRobert Mustacchi     stats->Dot3StatsMultipleCollisionFrames       = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_dot3statsmultiplecollisionframes )) ;
2862*d14abf15SRobert Mustacchi     stats->Dot3StatsDeferredTransmissions         = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_dot3statsdeferredtransmissions )) ;
2863*d14abf15SRobert Mustacchi     stats->Dot3StatsExcessiveCollisions           = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_dot3statsexcessivecollisions )) ;
2864*d14abf15SRobert Mustacchi     stats->Dot3StatsLateCollisions                = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_dot3statslatecollisions )) ;
2865*d14abf15SRobert Mustacchi     stats->EtherStatsCollisions                   = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_etherstatscollisions )) ;
2866*d14abf15SRobert Mustacchi     stats->EtherStatsFragments                    = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_etherstatsfragments )) ;
2867*d14abf15SRobert Mustacchi     stats->EtherStatsJabbers                      = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_etherstatsjabbers )) ;
2868*d14abf15SRobert Mustacchi 
2869*d14abf15SRobert Mustacchi 
2870*d14abf15SRobert Mustacchi     stats->EtherStatsUndersizePkts                = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_etherstatsundersizepkts )) ;
2871*d14abf15SRobert Mustacchi     stats->EtherStatsOverrsizePkts                = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_dot3statsframestoolong )) ;
2872*d14abf15SRobert Mustacchi 
2873*d14abf15SRobert Mustacchi     stats->EtherStatsPktsTx64Octets               = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_etherstatspkts64octets )) ;
2874*d14abf15SRobert Mustacchi     stats->EtherStatsPktsTx65Octetsto127Octets    = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_etherstatspkts65octetsto127octets )) ;
2875*d14abf15SRobert Mustacchi     stats->EtherStatsPktsTx128Octetsto255Octets   = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_etherstatspkts128octetsto255octets )) ;
2876*d14abf15SRobert Mustacchi     stats->EtherStatsPktsTx256Octetsto511Octets   = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_etherstatspkts256octetsto511octets )) ;
2877*d14abf15SRobert Mustacchi     stats->EtherStatsPktsTx512Octetsto1023Octets  = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_etherstatspkts512octetsto1023octets)) ;
2878*d14abf15SRobert Mustacchi     stats->EtherStatsPktsTx1024Octetsto1522Octets = (pdev->vars.stats.stats_mirror.stats_hw.nig_ex.egress_mac_pkt0) ;
2879*d14abf15SRobert Mustacchi     stats->EtherStatsPktsTxOver1522Octets         = (pdev->vars.stats.stats_mirror.stats_hw.nig_ex.egress_mac_pkt1) ;
2880*d14abf15SRobert Mustacchi 
2881*d14abf15SRobert Mustacchi     stats->XonPauseFramesReceived                 = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_xonpauseframesreceived )) ;
2882*d14abf15SRobert Mustacchi     stats->XoffPauseFramesReceived                = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_xoffpauseframesreceived )) ;
2883*d14abf15SRobert Mustacchi     stats->OutXonSent                             = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_outxonsent )) ;
2884*d14abf15SRobert Mustacchi 
2885*d14abf15SRobert Mustacchi     stats->OutXoffSent                            = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_outxoffsent )) ;
2886*d14abf15SRobert Mustacchi 
2887*d14abf15SRobert Mustacchi     stats->FlowControlDone                        = (LM_STATS_HW_GET_MACS_U64( pdev, stats_tx.tx_stat_flowcontroldone )) ;
2888*d14abf15SRobert Mustacchi 
2889*d14abf15SRobert Mustacchi     stats->MacControlFramesReceived               = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_maccontrolframesreceived )) ;
2890*d14abf15SRobert Mustacchi     stats->MacControlFramesReceived              += (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_maccontrolframesreceived_bmac_xcf )) ;
2891*d14abf15SRobert Mustacchi 
2892*d14abf15SRobert Mustacchi     stats->XoffStateEntered                       = (LM_STATS_HW_GET_MACS_U64( pdev, stats_rx.rx_stat_xoffstateentered )) ;
2893*d14abf15SRobert Mustacchi     lm_get_stats( pdev, LM_STATS_ERRORED_RECEIVE_CNT, &stats->IfInErrors
2894*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
2895*d14abf15SRobert Mustacchi                   ,NULL
2896*d14abf15SRobert Mustacchi #endif
2897*d14abf15SRobert Mustacchi     ) ;
2898*d14abf15SRobert Mustacchi     // TBD - IfInErrorsOctets - naming and support
2899*d14abf15SRobert Mustacchi     stats->IfInErrorsOctets                       = 0;
2900*d14abf15SRobert Mustacchi 
2901*d14abf15SRobert Mustacchi     stats->IfInNoBrbBuffer                        = (pdev->vars.stats.stats_mirror.stats_hw.nig.brb_discard) ;
2902*d14abf15SRobert Mustacchi     stats->IfInFramesL2FilterDiscards             = (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.port_statistics.mac_filter_discard) ;
2903*d14abf15SRobert Mustacchi     stats->IfInTTL0Discards                       = (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].ttl0_discard) ;
2904*d14abf15SRobert Mustacchi     stats->IfInxxOverflowDiscards                 = (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.port_statistics.xxoverflow_discard) ;
2905*d14abf15SRobert Mustacchi 
2906*d14abf15SRobert Mustacchi     stats->IfInMBUFDiscards                       = (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[idx].no_buff_discard );
2907*d14abf15SRobert Mustacchi     stats->IfInMBUFDiscards                      += (pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[idx].ucast_no_buff_pkts );
2908*d14abf15SRobert Mustacchi     stats->IfInMBUFDiscards                      += (pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[idx].mcast_no_buff_pkts );
2909*d14abf15SRobert Mustacchi     stats->IfInMBUFDiscards                      += (pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[idx].bcast_no_buff_pkts );
2910*d14abf15SRobert Mustacchi 
2911*d14abf15SRobert Mustacchi     stats->Nig_brb_packet                         = (pdev->vars.stats.stats_mirror.stats_hw.nig.brb_packet) ;
2912*d14abf15SRobert Mustacchi     stats->Nig_brb_truncate                       = (pdev->vars.stats.stats_mirror.stats_hw.nig.brb_truncate) ;
2913*d14abf15SRobert Mustacchi     stats->Nig_flow_ctrl_discard                  = (pdev->vars.stats.stats_mirror.stats_hw.nig.flow_ctrl_discard) ;
2914*d14abf15SRobert Mustacchi     stats->Nig_flow_ctrl_octets                   = (pdev->vars.stats.stats_mirror.stats_hw.nig.flow_ctrl_octets) ;
2915*d14abf15SRobert Mustacchi     stats->Nig_flow_ctrl_packet                   = (pdev->vars.stats.stats_mirror.stats_hw.nig.flow_ctrl_packet) ;
2916*d14abf15SRobert Mustacchi     stats->Nig_mng_discard                        = (pdev->vars.stats.stats_mirror.stats_hw.nig.mng_discard) ;
2917*d14abf15SRobert Mustacchi     stats->Nig_mng_octet_inp                      = (pdev->vars.stats.stats_mirror.stats_hw.nig.mng_octet_inp) ;
2918*d14abf15SRobert Mustacchi     stats->Nig_mng_octet_out                      = (pdev->vars.stats.stats_mirror.stats_hw.nig.mng_octet_out) ;
2919*d14abf15SRobert Mustacchi     stats->Nig_mng_packet_inp                     = (pdev->vars.stats.stats_mirror.stats_hw.nig.mng_packet_inp) ;
2920*d14abf15SRobert Mustacchi     stats->Nig_mng_packet_out                     = (pdev->vars.stats.stats_mirror.stats_hw.nig.mng_packet_out) ;
2921*d14abf15SRobert Mustacchi     stats->Nig_pbf_octets                         = (pdev->vars.stats.stats_mirror.stats_hw.nig.pbf_octets) ;
2922*d14abf15SRobert Mustacchi     stats->Nig_pbf_packet                         = (pdev->vars.stats.stats_mirror.stats_hw.nig.pbf_packet) ;
2923*d14abf15SRobert Mustacchi     stats->Nig_safc_inp                           = (pdev->vars.stats.stats_mirror.stats_hw.nig.safc_inp) ;
2924*d14abf15SRobert Mustacchi 
2925*d14abf15SRobert Mustacchi     if (version > L2_CHIP_STATISTICS_VER_NUM_1)
2926*d14abf15SRobert Mustacchi     {
2927*d14abf15SRobert Mustacchi         /* v2 statistics */
2928*d14abf15SRobert Mustacchi 
2929*d14abf15SRobert Mustacchi         b10_l2_chip_statistics_v2_t *stats_v2 = buf;
2930*d14abf15SRobert Mustacchi 
2931*d14abf15SRobert Mustacchi         stats_v2->v2.Tx_lpi_count                 = pdev->vars.stats.stats_mirror.stats_hw.misc.tx_lpi_count;
2932*d14abf15SRobert Mustacchi     }
2933*d14abf15SRobert Mustacchi 
2934*d14abf15SRobert Mustacchi     if (version > L2_CHIP_STATISTICS_VER_NUM_2)
2935*d14abf15SRobert Mustacchi     {
2936*d14abf15SRobert Mustacchi         b10_l2_chip_statistics_v3_t *stats_v3 = buf;
2937*d14abf15SRobert Mustacchi         stats_v3->v3.coalesced_pkts = pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[idx].coalesced_pkts;
2938*d14abf15SRobert Mustacchi         stats_v3->v3.coalesced_bytes = pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[idx].coalesced_bytes;
2939*d14abf15SRobert Mustacchi         stats_v3->v3.coalesced_events = pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[idx].coalesced_events;
2940*d14abf15SRobert Mustacchi         stats_v3->v3.coalesced_aborts = pdev->vars.stats.stats_mirror.stats_fw.eth_ustorm_common.client_statistics[idx].coalesced_aborts;
2941*d14abf15SRobert Mustacchi     }
2942*d14abf15SRobert Mustacchi }
2943*d14abf15SRobert Mustacchi 
lm_stats_get_l4_chip_stats(struct _lm_device_t * pdev,b10_l4_chip_statistics_t * stats)2944*d14abf15SRobert Mustacchi void lm_stats_get_l4_chip_stats( struct _lm_device_t* pdev, b10_l4_chip_statistics_t *stats )
2945*d14abf15SRobert Mustacchi {
2946*d14abf15SRobert Mustacchi     u8_t idx = 0 ;
2947*d14abf15SRobert Mustacchi 
2948*d14abf15SRobert Mustacchi     stats->ver_num                     = L4_CHIP_STATISTISTCS_VER_NUM ;
2949*d14abf15SRobert Mustacchi 
2950*d14abf15SRobert Mustacchi     stats->NoTxCqes                    = pdev->vars.stats.stats_mirror.stats_fw.toe_cstorm_toe.no_tx_cqes ;
2951*d14abf15SRobert Mustacchi 
2952*d14abf15SRobert Mustacchi     // IP4
2953*d14abf15SRobert Mustacchi     idx = STATS_IP_4_IDX ;
2954*d14abf15SRobert Mustacchi 
2955*d14abf15SRobert Mustacchi     stats->InTCP4Segments              = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_receives ;
2956*d14abf15SRobert Mustacchi     stats->OutTCP4Segments             = pdev->vars.stats.stats_mirror.stats_fw.toe_xstorm_toe.statistics[idx].tcp_out_segments ;
2957*d14abf15SRobert Mustacchi     stats->RetransmittedTCP4Segments   = pdev->vars.stats.stats_mirror.stats_fw.toe_xstorm_toe.statistics[idx].tcp_retransmitted_segments ;
2958*d14abf15SRobert Mustacchi     stats->InTCP4Errors                = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].tcp_in_errors ;
2959*d14abf15SRobert Mustacchi     stats->InIP4Receives               = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_receives ;
2960*d14abf15SRobert Mustacchi     stats->InIP4HeaderErrors           = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_header_errors ;
2961*d14abf15SRobert Mustacchi     stats->InIP4Discards               = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_discards ;
2962*d14abf15SRobert Mustacchi     stats->InIP4Delivers               = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_delivers ;
2963*d14abf15SRobert Mustacchi     stats->InIP4Octets                 = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_octets ;
2964*d14abf15SRobert Mustacchi     stats->OutIP4Octets                = pdev->vars.stats.stats_mirror.stats_fw.toe_xstorm_toe.statistics[idx].ip_out_octets ;
2965*d14abf15SRobert Mustacchi     stats->InIP4TruncatedPackets       = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_truncated_packets ;
2966*d14abf15SRobert Mustacchi 
2967*d14abf15SRobert Mustacchi     // IP6
2968*d14abf15SRobert Mustacchi     idx = STATS_IP_6_IDX ;
2969*d14abf15SRobert Mustacchi 
2970*d14abf15SRobert Mustacchi     stats->InTCP6Segments              = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_receives ;
2971*d14abf15SRobert Mustacchi     stats->OutTCP6Segments             = pdev->vars.stats.stats_mirror.stats_fw.toe_xstorm_toe.statistics[idx].tcp_out_segments ;
2972*d14abf15SRobert Mustacchi     stats->RetransmittedTCP6Segments   = pdev->vars.stats.stats_mirror.stats_fw.toe_xstorm_toe.statistics[idx].tcp_retransmitted_segments ;
2973*d14abf15SRobert Mustacchi     stats->InTCP6Errors                = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].tcp_in_errors ;
2974*d14abf15SRobert Mustacchi     stats->InIP6Receives               = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_receives ;
2975*d14abf15SRobert Mustacchi     stats->InIP6HeaderErrors           = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_header_errors ;
2976*d14abf15SRobert Mustacchi     stats->InIP6Discards               = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_discards ;
2977*d14abf15SRobert Mustacchi     stats->InIP6Delivers               = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_delivers ;
2978*d14abf15SRobert Mustacchi     stats->InIP6Octets                 = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_octets ;
2979*d14abf15SRobert Mustacchi     stats->OutIP6Octets                = pdev->vars.stats.stats_mirror.stats_fw.toe_xstorm_toe.statistics[idx].ip_out_octets ;
2980*d14abf15SRobert Mustacchi     stats->InIP6TruncatedPackets       = pdev->vars.stats.stats_mirror.stats_fw.toe_tstorm_toe.statistics[idx].ip_in_truncated_packets ;
2981*d14abf15SRobert Mustacchi }
2982*d14abf15SRobert Mustacchi 
lm_stats_hw_config_stats(struct _lm_device_t * pdev,u8_t b_enabled)2983*d14abf15SRobert Mustacchi void lm_stats_hw_config_stats( struct _lm_device_t* pdev, u8_t b_enabled )
2984*d14abf15SRobert Mustacchi {
2985*d14abf15SRobert Mustacchi     DbgMessage(pdev, WARNstat, "lm_stats_hw_config_stats: b_collect_enabled %s-->%s\n",
2986*d14abf15SRobert Mustacchi                 pdev->vars.stats.stats_collect.stats_hw.b_collect_enabled ? "TRUE":"FALSE",
2987*d14abf15SRobert Mustacchi                 b_enabled ? "TRUE":"FALSE" );
2988*d14abf15SRobert Mustacchi 
2989*d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev)) {
2990*d14abf15SRobert Mustacchi     pdev->vars.stats.stats_collect.stats_hw.b_collect_enabled = b_enabled ;
2991*d14abf15SRobert Mustacchi     }
2992*d14abf15SRobert Mustacchi }
2993*d14abf15SRobert Mustacchi 
lm_stats_fw_config_stats(struct _lm_device_t * pdev,u8_t b_enabled)2994*d14abf15SRobert Mustacchi void lm_stats_fw_config_stats( struct _lm_device_t* pdev, u8_t b_enabled )
2995*d14abf15SRobert Mustacchi {
2996*d14abf15SRobert Mustacchi     DbgMessage(pdev, VERBOSEstat, "lm_stats_fw_config_stats: b_collect_enabled %s-->%s\n",
2997*d14abf15SRobert Mustacchi             pdev->vars.stats.stats_collect.stats_fw.b_collect_enabled ? "TRUE":"FALSE",
2998*d14abf15SRobert Mustacchi             b_enabled ? "TRUE":"FALSE" );
2999*d14abf15SRobert Mustacchi     if (IS_PFDEV(pdev) || IS_CHANNEL_VFDEV(pdev)) {
3000*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_collect.stats_fw.b_collect_enabled = b_enabled ;
3001*d14abf15SRobert Mustacchi     }
3002*d14abf15SRobert Mustacchi }
3003*d14abf15SRobert Mustacchi 
3004*d14abf15SRobert Mustacchi /*
3005*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
3006*d14abf15SRobert Mustacchi  * lm_stats_mgmt_assign_func
3007*d14abf15SRobert Mustacchi  *
3008*d14abf15SRobert Mustacchi  * assign values from different 'mirror' structures into host_func_stats_t structure
3009*d14abf15SRobert Mustacchi  * that will be sent later to mgmt
3010*d14abf15SRobert Mustacchi  * NOTE: function must be called under PHY_LOCK (since it uses REG_WR_DMAE interface)
3011*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
3012*d14abf15SRobert Mustacchi  */
lm_stats_mgmt_assign_func(IN struct _lm_device_t * pdev)3013*d14abf15SRobert Mustacchi STATIC void lm_stats_mgmt_assign_func( IN struct _lm_device_t* pdev )
3014*d14abf15SRobert Mustacchi {
3015*d14abf15SRobert Mustacchi     u64_t              val           = 0 ;
3016*d14abf15SRobert Mustacchi     u64_t              val_base      = 0 ;
3017*d14abf15SRobert Mustacchi     lm_status_t        lm_status     = LM_STATUS_SUCCESS ;
3018*d14abf15SRobert Mustacchi     lm_stats_t         stats_type    = 0 ;
3019*d14abf15SRobert Mustacchi     host_func_stats_t* mcp_func      = NULL ;
3020*d14abf15SRobert Mustacchi     host_func_stats_t* mcp_func_base = NULL ;
3021*d14abf15SRobert Mustacchi 
3022*d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
3023*d14abf15SRobert Mustacchi     {
3024*d14abf15SRobert Mustacchi         return;
3025*d14abf15SRobert Mustacchi     }
3026*d14abf15SRobert Mustacchi 
3027*d14abf15SRobert Mustacchi     if ( GET_FLAGS(pdev->params.test_mode, TEST_MODE_NO_MCP ) )
3028*d14abf15SRobert Mustacchi     {
3029*d14abf15SRobert Mustacchi         return;
3030*d14abf15SRobert Mustacchi     }
3031*d14abf15SRobert Mustacchi 
3032*d14abf15SRobert Mustacchi     mcp_func      = &pdev->vars.stats.stats_mirror.stats_mcp_func ;
3033*d14abf15SRobert Mustacchi     mcp_func_base = &pdev->vars.stats.stats_mirror.stats_mcp_func_base ;
3034*d14abf15SRobert Mustacchi 
3035*d14abf15SRobert Mustacchi     stats_type = LM_STATS_BYTES_RCV ;
3036*d14abf15SRobert Mustacchi     lm_status = lm_get_stats( pdev, stats_type, &val
3037*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3038*d14abf15SRobert Mustacchi                   ,NULL
3039*d14abf15SRobert Mustacchi #endif
3040*d14abf15SRobert Mustacchi     ) ;
3041*d14abf15SRobert Mustacchi     if ERR_IF( LM_STATUS_SUCCESS != lm_status )
3042*d14abf15SRobert Mustacchi     {
3043*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNstat, "lm_stats_mcp_assign: lm_get_stats type=0x%X failed. lm_status=0x%X", stats_type, lm_status ) ;
3044*d14abf15SRobert Mustacchi     }
3045*d14abf15SRobert Mustacchi     else
3046*d14abf15SRobert Mustacchi     {
3047*d14abf15SRobert Mustacchi         // calculate 'total' rcv (total+discards)
3048*d14abf15SRobert Mustacchi         val += (pdev->vars.stats.stats_mirror.stats_fw.eth_tstorm_common.client_statistics[LM_CLI_IDX_NDIS].rcv_error_bytes) ;
3049*d14abf15SRobert Mustacchi 
3050*d14abf15SRobert Mustacchi         val+= LM_STATS_HI_LO_TO_64(mcp_func_base->total_bytes_received, val_base);
3051*d14abf15SRobert Mustacchi         mcp_func->total_bytes_received_hi                = (u32_t)U64_HI( val ) ;
3052*d14abf15SRobert Mustacchi         mcp_func->total_bytes_received_lo                = (u32_t)U64_LO( val ) ;
3053*d14abf15SRobert Mustacchi     }
3054*d14abf15SRobert Mustacchi 
3055*d14abf15SRobert Mustacchi     stats_type = LM_STATS_BYTES_XMIT ;
3056*d14abf15SRobert Mustacchi     lm_status  = lm_get_stats( pdev, stats_type, &val
3057*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3058*d14abf15SRobert Mustacchi                   ,NULL
3059*d14abf15SRobert Mustacchi #endif
3060*d14abf15SRobert Mustacchi     ) ;
3061*d14abf15SRobert Mustacchi     if ERR_IF( LM_STATUS_SUCCESS != lm_status )
3062*d14abf15SRobert Mustacchi     {
3063*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNstat, "lm_stats_mcp_assign: lm_get_stats type=0x%X failed. lm_status=0x%X", stats_type, lm_status ) ;
3064*d14abf15SRobert Mustacchi     }
3065*d14abf15SRobert Mustacchi     else
3066*d14abf15SRobert Mustacchi     {
3067*d14abf15SRobert Mustacchi         val+= LM_STATS_HI_LO_TO_64(mcp_func_base->total_bytes_transmitted, val_base);
3068*d14abf15SRobert Mustacchi         mcp_func->total_bytes_transmitted_hi             = (u32_t)U64_HI( val ) ;
3069*d14abf15SRobert Mustacchi         mcp_func->total_bytes_transmitted_lo             = (u32_t)U64_LO( val ) ;
3070*d14abf15SRobert Mustacchi     }
3071*d14abf15SRobert Mustacchi 
3072*d14abf15SRobert Mustacchi     stats_type = LM_STATS_UNICAST_FRAMES_RCV ;
3073*d14abf15SRobert Mustacchi     lm_status  = lm_get_stats( pdev, stats_type, &val
3074*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3075*d14abf15SRobert Mustacchi                   ,NULL
3076*d14abf15SRobert Mustacchi #endif
3077*d14abf15SRobert Mustacchi     ) ;
3078*d14abf15SRobert Mustacchi     if ERR_IF( LM_STATUS_SUCCESS != lm_status )
3079*d14abf15SRobert Mustacchi     {
3080*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNstat, "lm_stats_mcp_assign: lm_get_stats type=0x%X failed. lm_status=0x%X", stats_type, lm_status ) ;
3081*d14abf15SRobert Mustacchi     }
3082*d14abf15SRobert Mustacchi     else
3083*d14abf15SRobert Mustacchi     {
3084*d14abf15SRobert Mustacchi         val+= LM_STATS_HI_LO_TO_64(mcp_func_base->total_unicast_packets_received, val_base);
3085*d14abf15SRobert Mustacchi         mcp_func->total_unicast_packets_received_hi      = (u32_t)U64_HI( val ) ;
3086*d14abf15SRobert Mustacchi         mcp_func->total_unicast_packets_received_lo      = (u32_t)U64_LO( val ) ;
3087*d14abf15SRobert Mustacchi     }
3088*d14abf15SRobert Mustacchi 
3089*d14abf15SRobert Mustacchi     stats_type = LM_STATS_MULTICAST_FRAMES_RCV ;
3090*d14abf15SRobert Mustacchi     lm_status  = lm_get_stats( pdev, stats_type, &val
3091*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3092*d14abf15SRobert Mustacchi                   ,NULL
3093*d14abf15SRobert Mustacchi #endif
3094*d14abf15SRobert Mustacchi     ) ;
3095*d14abf15SRobert Mustacchi     if ERR_IF( LM_STATUS_SUCCESS != lm_status )
3096*d14abf15SRobert Mustacchi     {
3097*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNstat, "lm_stats_mcp_assign: lm_get_stats type=0x%X failed. lm_status=0x%X", stats_type, lm_status ) ;
3098*d14abf15SRobert Mustacchi     }
3099*d14abf15SRobert Mustacchi     else
3100*d14abf15SRobert Mustacchi     {
3101*d14abf15SRobert Mustacchi         val+= LM_STATS_HI_LO_TO_64(mcp_func_base->total_multicast_packets_received, val_base);
3102*d14abf15SRobert Mustacchi         mcp_func->total_multicast_packets_received_hi    = (u32_t)U64_HI( val ) ;
3103*d14abf15SRobert Mustacchi         mcp_func->total_multicast_packets_received_lo    = (u32_t)U64_LO( val ) ;
3104*d14abf15SRobert Mustacchi     }
3105*d14abf15SRobert Mustacchi 
3106*d14abf15SRobert Mustacchi     stats_type = LM_STATS_BROADCAST_FRAMES_RCV ;
3107*d14abf15SRobert Mustacchi     lm_status = lm_get_stats( pdev, stats_type, &val
3108*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3109*d14abf15SRobert Mustacchi                   ,NULL
3110*d14abf15SRobert Mustacchi #endif
3111*d14abf15SRobert Mustacchi     ) ;
3112*d14abf15SRobert Mustacchi     if ERR_IF( LM_STATUS_SUCCESS != lm_status )
3113*d14abf15SRobert Mustacchi     {
3114*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNstat, "lm_stats_mcp_assign: lm_get_stats type=0x%X failed. lm_status=0x%X", stats_type, lm_status ) ;
3115*d14abf15SRobert Mustacchi     }
3116*d14abf15SRobert Mustacchi     else
3117*d14abf15SRobert Mustacchi     {
3118*d14abf15SRobert Mustacchi         val+= LM_STATS_HI_LO_TO_64(mcp_func_base->total_broadcast_packets_received, val_base);
3119*d14abf15SRobert Mustacchi         mcp_func->total_broadcast_packets_received_hi    = (u32_t)U64_HI( val ) ;
3120*d14abf15SRobert Mustacchi         mcp_func->total_broadcast_packets_received_lo    = (u32_t)U64_LO( val ) ;
3121*d14abf15SRobert Mustacchi     }
3122*d14abf15SRobert Mustacchi 
3123*d14abf15SRobert Mustacchi     stats_type = LM_STATS_UNICAST_FRAMES_XMIT ;
3124*d14abf15SRobert Mustacchi     lm_status  = lm_get_stats( pdev, stats_type, &val
3125*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3126*d14abf15SRobert Mustacchi                   ,NULL
3127*d14abf15SRobert Mustacchi #endif
3128*d14abf15SRobert Mustacchi     ) ;
3129*d14abf15SRobert Mustacchi     if ERR_IF( LM_STATUS_SUCCESS != lm_status )
3130*d14abf15SRobert Mustacchi     {
3131*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNstat, "lm_stats_mcp_assign: lm_get_stats type=0x%X failed. lm_status=0x%X", stats_type, lm_status ) ;
3132*d14abf15SRobert Mustacchi     }
3133*d14abf15SRobert Mustacchi     else
3134*d14abf15SRobert Mustacchi     {
3135*d14abf15SRobert Mustacchi         val+= LM_STATS_HI_LO_TO_64(mcp_func_base->total_unicast_packets_transmitted, val_base);
3136*d14abf15SRobert Mustacchi         mcp_func->total_unicast_packets_transmitted_hi   = (u32_t)U64_HI( val ) ;
3137*d14abf15SRobert Mustacchi         mcp_func->total_unicast_packets_transmitted_lo   = (u32_t)U64_LO( val ) ;
3138*d14abf15SRobert Mustacchi     }
3139*d14abf15SRobert Mustacchi 
3140*d14abf15SRobert Mustacchi     stats_type = LM_STATS_MULTICAST_FRAMES_XMIT ;
3141*d14abf15SRobert Mustacchi     lm_status  = lm_get_stats( pdev, stats_type, &val
3142*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3143*d14abf15SRobert Mustacchi                   ,NULL
3144*d14abf15SRobert Mustacchi #endif
3145*d14abf15SRobert Mustacchi     ) ;
3146*d14abf15SRobert Mustacchi     if ERR_IF( LM_STATUS_SUCCESS != lm_status )
3147*d14abf15SRobert Mustacchi     {
3148*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNstat, "lm_stats_mcp_assign: lm_get_stats type=0x%X failed. lm_status=0x%X", stats_type, lm_status ) ;
3149*d14abf15SRobert Mustacchi     }
3150*d14abf15SRobert Mustacchi     else
3151*d14abf15SRobert Mustacchi     {
3152*d14abf15SRobert Mustacchi         val+= LM_STATS_HI_LO_TO_64(mcp_func_base->total_multicast_packets_transmitted, val_base);
3153*d14abf15SRobert Mustacchi         mcp_func->total_multicast_packets_transmitted_hi = (u32_t)U64_HI( val ) ;
3154*d14abf15SRobert Mustacchi         mcp_func->total_multicast_packets_transmitted_lo = (u32_t)U64_LO( val ) ;
3155*d14abf15SRobert Mustacchi     }
3156*d14abf15SRobert Mustacchi 
3157*d14abf15SRobert Mustacchi     stats_type = LM_STATS_BROADCAST_FRAMES_XMIT ;
3158*d14abf15SRobert Mustacchi     lm_status  = lm_get_stats( pdev, stats_type, &val
3159*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
3160*d14abf15SRobert Mustacchi                   ,NULL
3161*d14abf15SRobert Mustacchi #endif
3162*d14abf15SRobert Mustacchi     ) ;
3163*d14abf15SRobert Mustacchi     if ERR_IF( LM_STATUS_SUCCESS != lm_status )
3164*d14abf15SRobert Mustacchi     {
3165*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNstat, "lm_stats_mcp_assign: lm_get_stats type=0x%X failed. lm_status=0x%X", stats_type, lm_status ) ;
3166*d14abf15SRobert Mustacchi     }
3167*d14abf15SRobert Mustacchi     else
3168*d14abf15SRobert Mustacchi     {
3169*d14abf15SRobert Mustacchi         val+= LM_STATS_HI_LO_TO_64(mcp_func_base->total_broadcast_packets_transmitted, val_base);
3170*d14abf15SRobert Mustacchi         mcp_func->total_broadcast_packets_transmitted_hi = (u32_t)U64_HI( val ) ;
3171*d14abf15SRobert Mustacchi         mcp_func->total_broadcast_packets_transmitted_lo = (u32_t)U64_LO( val ) ;
3172*d14abf15SRobert Mustacchi     }
3173*d14abf15SRobert Mustacchi 
3174*d14abf15SRobert Mustacchi     // Calculate the size to be written through DMAE
3175*d14abf15SRobert Mustacchi     val = sizeof(pdev->vars.stats.stats_mirror.stats_mcp_func) ;
3176*d14abf15SRobert Mustacchi     val = val/sizeof(u32_t) ;
3177*d14abf15SRobert Mustacchi     mcp_func->host_func_stats_end = ++mcp_func->host_func_stats_start ;
3178*d14abf15SRobert Mustacchi 
3179*d14abf15SRobert Mustacchi     // This code section must be under phy lock!
3180*d14abf15SRobert Mustacchi     REG_WR_DMAE_LEN(pdev,
3181*d14abf15SRobert Mustacchi                     pdev->vars.fw_func_stats_ptr,
3182*d14abf15SRobert Mustacchi                     mcp_func,
3183*d14abf15SRobert Mustacchi                     (u16_t)val ) ;
3184*d14abf15SRobert Mustacchi 
3185*d14abf15SRobert Mustacchi } // lm_stats_mgmt_assign
3186*d14abf15SRobert Mustacchi 
3187*d14abf15SRobert Mustacchi /*
3188*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
3189*d14abf15SRobert Mustacchi  * lm_stats_mgmt_read_base -
3190*d14abf15SRobert Mustacchi  *
3191*d14abf15SRobert Mustacchi  * read values from mgmt structures into host_func_stats_t base structure
3192*d14abf15SRobert Mustacchi  * this is as a basic value that will be added when function report statistics
3193*d14abf15SRobert Mustacchi  * NOTE: function must be called under PHY_LOCK (since it uses REG_RD_DMAE interface)
3194*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
3195*d14abf15SRobert Mustacchi  */
lm_stats_mgmt_read_func_base(IN struct _lm_device_t * pdev)3196*d14abf15SRobert Mustacchi static void lm_stats_mgmt_read_func_base( IN struct _lm_device_t* pdev )
3197*d14abf15SRobert Mustacchi {
3198*d14abf15SRobert Mustacchi     u64_t              val           = 0 ;
3199*d14abf15SRobert Mustacchi     host_func_stats_t* mcp_func_base = NULL ;
3200*d14abf15SRobert Mustacchi 
3201*d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
3202*d14abf15SRobert Mustacchi     {
3203*d14abf15SRobert Mustacchi         return;
3204*d14abf15SRobert Mustacchi     }
3205*d14abf15SRobert Mustacchi 
3206*d14abf15SRobert Mustacchi     if( 0 == pdev->vars.fw_func_stats_ptr )
3207*d14abf15SRobert Mustacchi     {
3208*d14abf15SRobert Mustacchi         return;
3209*d14abf15SRobert Mustacchi     }
3210*d14abf15SRobert Mustacchi 
3211*d14abf15SRobert Mustacchi     if (GET_FLAGS(pdev->params.test_mode, TEST_MODE_NO_MCP ))
3212*d14abf15SRobert Mustacchi     {
3213*d14abf15SRobert Mustacchi         return;
3214*d14abf15SRobert Mustacchi     }
3215*d14abf15SRobert Mustacchi 
3216*d14abf15SRobert Mustacchi     mcp_func_base = &pdev->vars.stats.stats_mirror.stats_mcp_func_base ;
3217*d14abf15SRobert Mustacchi 
3218*d14abf15SRobert Mustacchi     val = sizeof(pdev->vars.stats.stats_mirror.stats_mcp_func_base) ;
3219*d14abf15SRobert Mustacchi     val = val/sizeof(u32_t) ;
3220*d14abf15SRobert Mustacchi 
3221*d14abf15SRobert Mustacchi     // This code section must be under phy lock!
3222*d14abf15SRobert Mustacchi     REG_RD_DMAE_LEN(pdev,
3223*d14abf15SRobert Mustacchi                     pdev->vars.fw_func_stats_ptr,
3224*d14abf15SRobert Mustacchi                     mcp_func_base,
3225*d14abf15SRobert Mustacchi                     (u16_t)val ) ;
3226*d14abf15SRobert Mustacchi 
3227*d14abf15SRobert Mustacchi } // lm_stats_mgmt_read_base
3228*d14abf15SRobert Mustacchi 
3229*d14abf15SRobert Mustacchi 
3230*d14abf15SRobert Mustacchi /*
3231*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
3232*d14abf15SRobert Mustacchi  * lm_stats_mgmt_clear_all_func -
3233*d14abf15SRobert Mustacchi  *
3234*d14abf15SRobert Mustacchi  * clear mgmt statistics for all function
3235*d14abf15SRobert Mustacchi  * should be called on init port part. first function should clear all other functions mail box
3236*d14abf15SRobert Mustacchi  * NOTE: function must be called under PHY_LOCK (since it uses REG_WR_DMAE interface)
3237*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
3238*d14abf15SRobert Mustacchi  */
lm_stats_mgmt_clear_all_func(IN struct _lm_device_t * pdev)3239*d14abf15SRobert Mustacchi static void lm_stats_mgmt_clear_all_func( IN struct _lm_device_t* pdev )
3240*d14abf15SRobert Mustacchi {
3241*d14abf15SRobert Mustacchi     u64_t              val               = 0 ;
3242*d14abf15SRobert Mustacchi     u8_t               func              = 0;
3243*d14abf15SRobert Mustacchi     u32_t              fw_func_stats_ptr = 0;
3244*d14abf15SRobert Mustacchi 
3245*d14abf15SRobert Mustacchi     // use current pdev stats_mcp_func for all function - (zeroed buffer)
3246*d14abf15SRobert Mustacchi     val = sizeof(pdev->vars.stats.stats_mirror.stats_mcp_func);
3247*d14abf15SRobert Mustacchi     mm_mem_zero(&pdev->vars.stats.stats_mirror.stats_mcp_func, (u32_t)val );
3248*d14abf15SRobert Mustacchi 
3249*d14abf15SRobert Mustacchi     val = val/sizeof(u32_t) ;
3250*d14abf15SRobert Mustacchi 
3251*d14abf15SRobert Mustacchi     LM_FOREACH_FUNC_MAILBOX_IN_PORT(pdev,func)
3252*d14abf15SRobert Mustacchi     {
3253*d14abf15SRobert Mustacchi         lm_setup_read_mgmt_stats_ptr(pdev, func, NULL, &fw_func_stats_ptr );
3254*d14abf15SRobert Mustacchi 
3255*d14abf15SRobert Mustacchi         if( 0 != fw_func_stats_ptr )
3256*d14abf15SRobert Mustacchi         {
3257*d14abf15SRobert Mustacchi 
3258*d14abf15SRobert Mustacchi             // This code section must be under phy lock!
3259*d14abf15SRobert Mustacchi             // writes zero
3260*d14abf15SRobert Mustacchi             REG_WR_DMAE_LEN(pdev,
3261*d14abf15SRobert Mustacchi                             fw_func_stats_ptr,
3262*d14abf15SRobert Mustacchi                             &pdev->vars.stats.stats_mirror.stats_mcp_func,
3263*d14abf15SRobert Mustacchi                             (u16_t)val ) ;
3264*d14abf15SRobert Mustacchi         }
3265*d14abf15SRobert Mustacchi         if(CHIP_IS_E1(pdev) || (!CHIP_IS_E1x(pdev) && (CHIP_PORT_MODE(pdev) == LM_CHIP_PORT_MODE_4)))
3266*d14abf15SRobert Mustacchi         {
3267*d14abf15SRobert Mustacchi             // only one iteration functionand one  for E1 !
3268*d14abf15SRobert Mustacchi             break;
3269*d14abf15SRobert Mustacchi         }
3270*d14abf15SRobert Mustacchi     }
3271*d14abf15SRobert Mustacchi } // lm_stats_mgmt_clear_all_func
3272*d14abf15SRobert Mustacchi 
3273*d14abf15SRobert Mustacchi /*
3274*d14abf15SRobert Mustacchi  *Function Name:lm_stats_port_to_from
3275*d14abf15SRobert Mustacchi  *
3276*d14abf15SRobert Mustacchi  *Parameters:
3277*d14abf15SRobert Mustacchi  *  b_is_to - determine is it operation to/from MCP
3278*d14abf15SRobert Mustacchi  *  b_is_to TRUE  - to MCP
3279*d14abf15SRobert Mustacchi  *  b_is_to FLASE - from MCP
3280*d14abf15SRobert Mustacchi  *Description:
3281*d14abf15SRobert Mustacchi  *  Helper function in order to set stats to/from mcp to driver host when swithcing PMF's
3282*d14abf15SRobert Mustacchi  *
3283*d14abf15SRobert Mustacchi  *Returns:
3284*d14abf15SRobert Mustacchi  *
3285*d14abf15SRobert Mustacchi  */
lm_stats_port_to_from(IN OUT struct _lm_device_t * pdev,u8_t b_is_to)3286*d14abf15SRobert Mustacchi void lm_stats_port_to_from( IN OUT struct _lm_device_t* pdev, u8_t b_is_to )
3287*d14abf15SRobert Mustacchi {
3288*d14abf15SRobert Mustacchi     host_port_stats_t* mcp_port        = NULL ;
3289*d14abf15SRobert Mustacchi     lm_stats_hw_t*    stats_hw         = NULL ;
3290*d14abf15SRobert Mustacchi     stats_macs_idx_t  stats_macs_idx   = STATS_MACS_IDX_MAX ;
3291*d14abf15SRobert Mustacchi     u8_t              i                = 0 ;
3292*d14abf15SRobert Mustacchi 
3293*d14abf15SRobert Mustacchi     mcp_port = &pdev->vars.stats.stats_mirror.stats_mcp_port ;
3294*d14abf15SRobert Mustacchi     stats_hw = &pdev->vars.stats.stats_mirror.stats_hw ;
3295*d14abf15SRobert Mustacchi 
3296*d14abf15SRobert Mustacchi     ASSERT_STATIC( STATS_MACS_IDX_MAX == MAC_STX_IDX_MAX );
3297*d14abf15SRobert Mustacchi     ASSERT_STATIC( STATS_MACS_IDX_CURRENT < STATS_MACS_IDX_TOTAL );
3298*d14abf15SRobert Mustacchi 
3299*d14abf15SRobert Mustacchi 
3300*d14abf15SRobert Mustacchi     // B/EMAC is up:
3301*d14abf15SRobert Mustacchi     //   OLD PMF:
3302*d14abf15SRobert Mustacchi     //   copy all EMAC 'reset' to 'total'
3303*d14abf15SRobert Mustacchi     //
3304*d14abf15SRobert Mustacchi     //   NEW PMF:
3305*d14abf15SRobert Mustacchi     //   copy all EMAC 'total' to 'reset'
3306*d14abf15SRobert Mustacchi     //
3307*d14abf15SRobert Mustacchi     // NONE is up:
3308*d14abf15SRobert Mustacchi     //   copy only 'reset' to 'total'
3309*d14abf15SRobert Mustacchi 
3310*d14abf15SRobert Mustacchi     switch( pdev->vars.mac_type )
3311*d14abf15SRobert Mustacchi     {
3312*d14abf15SRobert Mustacchi     case MAC_TYPE_EMAC:
3313*d14abf15SRobert Mustacchi     case MAC_TYPE_BMAC:
3314*d14abf15SRobert Mustacchi     case MAC_TYPE_UMAC:
3315*d14abf15SRobert Mustacchi     case MAC_TYPE_XMAC:
3316*d14abf15SRobert Mustacchi         stats_macs_idx  = STATS_MACS_IDX_CURRENT ;
3317*d14abf15SRobert Mustacchi         break;
3318*d14abf15SRobert Mustacchi 
3319*d14abf15SRobert Mustacchi     case MAC_TYPE_NONE:
3320*d14abf15SRobert Mustacchi         stats_macs_idx  = STATS_MACS_IDX_TOTAL ;
3321*d14abf15SRobert Mustacchi         break;
3322*d14abf15SRobert Mustacchi 
3323*d14abf15SRobert Mustacchi     default:
3324*d14abf15SRobert Mustacchi         DbgBreakMsg( "mac_type not acceptable" ) ;
3325*d14abf15SRobert Mustacchi         return;
3326*d14abf15SRobert Mustacchi     }
3327*d14abf15SRobert Mustacchi 
3328*d14abf15SRobert Mustacchi #define LM_STATS_PMF_TO_FROM( _mcp_field, _hw_field, _b_is_to ) \
3329*d14abf15SRobert Mustacchi                              if( _b_is_to )\
3330*d14abf15SRobert Mustacchi                              {             \
3331*d14abf15SRobert Mustacchi                                 LM_STATS_64_TO_HI_LO( stats_hw->macs[i]._hw_field, mcp_port->mac_stx[i]._mcp_field );\
3332*d14abf15SRobert Mustacchi                              }             \
3333*d14abf15SRobert Mustacchi                              else          \
3334*d14abf15SRobert Mustacchi                              {             \
3335*d14abf15SRobert Mustacchi                                  LM_STATS_HI_LO_TO_64( mcp_port->mac_stx[i]._mcp_field, stats_hw->macs[i]._hw_field ) ;\
3336*d14abf15SRobert Mustacchi                              }
3337*d14abf15SRobert Mustacchi 
3338*d14abf15SRobert Mustacchi 
3339*d14abf15SRobert Mustacchi     for( i = stats_macs_idx; i < STATS_MACS_IDX_MAX; i++ )
3340*d14abf15SRobert Mustacchi     {
3341*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_dot3statsfcserrors,                   stats_rx.rx_stat_dot3statsfcserrors,                   b_is_to ) ;
3342*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_dot3statsalignmenterrors,             stats_rx.rx_stat_dot3statsalignmenterrors,             b_is_to ) ; // BMAC 0
3343*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_dot3statscarriersenseerrors,          stats_rx.rx_stat_dot3statscarriersenseerrors,          b_is_to ) ; // BMAC 0
3344*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_etherstatsundersizepkts,              stats_rx.rx_stat_etherstatsundersizepkts,              b_is_to ) ;
3345*d14abf15SRobert Mustacchi 
3346*d14abf15SRobert Mustacchi        // Exception - don't migrate this parameter (mandatory NDIS parameter)
3347*d14abf15SRobert Mustacchi        //LM_STATS_PMF_TO_FROM( rx_stat_dot3statsframestoolong,               stats_rx.rx_stat_dot3statsframestoolong,             b_is_to ) ;
3348*d14abf15SRobert Mustacchi 
3349*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_xonpauseframesreceived,               stats_rx.rx_stat_xonpauseframesreceived,               b_is_to ) ; // BMAC 0
3350*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_xoffpauseframesreceived,              stats_rx.rx_stat_xoffpauseframesreceived,              b_is_to ) ;
3351*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_outxonsent,                           stats_tx.tx_stat_outxonsent,                           b_is_to ) ; // BMAC 0
3352*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_outxoffsent,                          stats_tx.tx_stat_outxoffsent,                          b_is_to ) ;
3353*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_dot3statssinglecollisionframes,       stats_tx.tx_stat_dot3statssinglecollisionframes,       b_is_to ) ; // BMAC 0
3354*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_dot3statsmultiplecollisionframes,     stats_tx.tx_stat_dot3statsmultiplecollisionframes,     b_is_to ) ; // BMAC 0
3355*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_dot3statslatecollisions,              stats_tx.tx_stat_dot3statslatecollisions,              b_is_to ) ; // BMAC 0
3356*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_dot3statsexcessivecollisions,         stats_tx.tx_stat_dot3statsexcessivecollisions,         b_is_to ) ; // BMAC 0
3357*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_maccontrolframesreceived,             stats_rx.rx_stat_maccontrolframesreceived,             b_is_to ) ;
3358*d14abf15SRobert Mustacchi 
3359*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_mac_xpf,                             stats_rx.rx_stat_maccontrolframesreceived_bmac_xpf,    b_is_to ) ; // EMAC 0 BMAC only
3360*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_mac_xcf,                             stats_rx.rx_stat_maccontrolframesreceived_bmac_xcf,    b_is_to ) ; // EMAC 0 BMAC only
3361*d14abf15SRobert Mustacchi 
3362*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_etherstatspkts64octets,               stats_tx.tx_stat_etherstatspkts64octets,               b_is_to ) ;
3363*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_etherstatspkts65octetsto127octets,    stats_tx.tx_stat_etherstatspkts65octetsto127octets,    b_is_to ) ;
3364*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_etherstatspkts128octetsto255octets,   stats_tx.tx_stat_etherstatspkts128octetsto255octets,   b_is_to ) ;
3365*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_etherstatspkts256octetsto511octets,   stats_tx.tx_stat_etherstatspkts256octetsto511octets,   b_is_to ) ;
3366*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_etherstatspkts512octetsto1023octets,  stats_tx.tx_stat_etherstatspkts512octetsto1023octets,  b_is_to ) ;
3367*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_etherstatspkts1024octetsto1522octets, stats_tx.tx_stat_etherstatspkts1024octetsto1522octet,  b_is_to ) ;
3368*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_etherstatspktsover1522octets,         stats_tx.tx_stat_etherstatspktsover1522octets,         b_is_to ) ;
3369*d14abf15SRobert Mustacchi 
3370*d14abf15SRobert Mustacchi 
3371*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_mac_2047,                            stats_tx.tx_stat_etherstatspktsover1522octets_bmac_2047, b_is_to ) ; // EMAC 0 BMAC only
3372*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_mac_4095,                            stats_tx.tx_stat_etherstatspktsover1522octets_bmac_4095, b_is_to ) ; // EMAC 0 BMAC only
3373*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_mac_9216,                            stats_tx.tx_stat_etherstatspktsover1522octets_bmac_9216, b_is_to ) ; // EMAC 0 BMAC only
3374*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_mac_16383,                           stats_tx.tx_stat_etherstatspktsover1522octets_bmac_16383, b_is_to ) ; // EMAC 0 BMAC only
3375*d14abf15SRobert Mustacchi 
3376*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_etherstatsfragments,                  stats_rx.rx_stat_etherstatsfragments,                  b_is_to ) ;
3377*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_etherstatsjabbers,                    stats_rx.rx_stat_etherstatsjabbers,                    b_is_to ) ;
3378*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_dot3statsdeferredtransmissions,       stats_tx.tx_stat_dot3statsdeferredtransmissions,       b_is_to ) ; // BMAC 0
3379*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_dot3statsinternalmactransmiterrors,   stats_tx.tx_stat_dot3statsinternalmactransmiterrors,   b_is_to ) ;
3380*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_etherstatscollisions,                 stats_tx.tx_stat_etherstatscollisions,                 b_is_to ) ; // BMAC 0
3381*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_flowcontroldone,                      stats_tx.tx_stat_flowcontroldone,                      b_is_to ) ;
3382*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_xoffstateentered,                     stats_rx.rx_stat_xoffstateentered,                     b_is_to ) ;
3383*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_ifhcinbadoctets,                      stats_rx.rx_stat_ifhcinbadoctets,                      b_is_to ) ;
3384*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_ifhcoutbadoctets,                     stats_tx.tx_stat_ifhcoutbadoctets,                     b_is_to ) ; // BMAC 0
3385*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( tx_stat_mac_ufl,                              stats_tx.tx_stat_ifhcoutdiscards,                      b_is_to ) ; // EMAC 0
3386*d14abf15SRobert Mustacchi        LM_STATS_PMF_TO_FROM( rx_stat_dot3statscarriersenseerrors,          stats_rx.rx_stat_dot3statscarriersenseerrors,          b_is_to ) ; // BMAC 0
3387*d14abf15SRobert Mustacchi     }
3388*d14abf15SRobert Mustacchi 
3389*d14abf15SRobert Mustacchi     // NIG, MSTAT and EEE
3390*d14abf15SRobert Mustacchi     if( b_is_to)
3391*d14abf15SRobert Mustacchi     {
3392*d14abf15SRobert Mustacchi         LM_STATS_64_TO_HI_LO( stats_hw->nig.brb_discard, mcp_port->brb_drop ) ;
3393*d14abf15SRobert Mustacchi 
3394*d14abf15SRobert Mustacchi         LM_STATS_64_TO_HI_LO( stats_hw->macs->stats_tx.tx_stat_pfcPacketCounter, mcp_port->pfc_frames_tx );
3395*d14abf15SRobert Mustacchi         LM_STATS_64_TO_HI_LO( stats_hw->macs->stats_rx.rx_stat_pfcPacketCounter, mcp_port->pfc_frames_rx );
3396*d14abf15SRobert Mustacchi 
3397*d14abf15SRobert Mustacchi         LM_STATS_64_TO_HI_LO( stats_hw->misc.tx_lpi_count, mcp_port->eee_lpi_count);
3398*d14abf15SRobert Mustacchi     }
3399*d14abf15SRobert Mustacchi     else
3400*d14abf15SRobert Mustacchi     {
3401*d14abf15SRobert Mustacchi         LM_STATS_HI_LO_TO_64( mcp_port->brb_drop, stats_hw->nig.brb_discard ) ;
3402*d14abf15SRobert Mustacchi 
3403*d14abf15SRobert Mustacchi         LM_STATS_HI_LO_TO_64( mcp_port->pfc_frames_tx, stats_hw->macs->stats_tx.tx_stat_pfcPacketCounter );
3404*d14abf15SRobert Mustacchi         LM_STATS_HI_LO_TO_64( mcp_port->pfc_frames_rx, stats_hw->macs->stats_rx.rx_stat_pfcPacketCounter );
3405*d14abf15SRobert Mustacchi 
3406*d14abf15SRobert Mustacchi         LM_STATS_HI_LO_TO_64( mcp_port->eee_lpi_count, stats_hw->misc.tx_lpi_count);
3407*d14abf15SRobert Mustacchi     }
3408*d14abf15SRobert Mustacchi 
3409*d14abf15SRobert Mustacchi }
3410*d14abf15SRobert Mustacchi 
3411*d14abf15SRobert Mustacchi /*
3412*d14abf15SRobert Mustacchi  * \brief Calculate MCP status port size
3413*d14abf15SRobert Mustacchi  *
3414*d14abf15SRobert Mustacchi  * Calculate the size to be written.
3415*d14abf15SRobert Mustacchi  *
3416*d14abf15SRobert Mustacchi  * This logic is required as b10_l2_chip_statistics_t may increase in size
3417*d14abf15SRobert Mustacchi  * (due to driver change), while MCP area reserved does not follow suit
3418*d14abf15SRobert Mustacchi  * (as is the case, for example, when the driver and MFW do not version-
3419*d14abf15SRobert Mustacchi  * match).
3420*d14abf15SRobert Mustacchi  *
3421*d14abf15SRobert Mustacchi  * This logic calculates the size available based on MFW version, and an
3422*d14abf15SRobert Mustacchi  * additional shmem item added to specifically report size available, thus
3423*d14abf15SRobert Mustacchi  * making future changes to statistics MCP size proof.
3424*d14abf15SRobert Mustacchi  *
3425*d14abf15SRobert Mustacchi  */
3426*d14abf15SRobert Mustacchi 
lm_stats_port_size(IN struct _lm_device_t * pdev)3427*d14abf15SRobert Mustacchi STATIC u16_t lm_stats_port_size(IN struct _lm_device_t *pdev)
3428*d14abf15SRobert Mustacchi {
3429*d14abf15SRobert Mustacchi     const u32_t      bc_rev_major               = LM_GET_BC_REV_MAJOR(pdev);
3430*d14abf15SRobert Mustacchi     const u8_t       b_bc_pfc_support           = bc_rev_major >= REQ_BC_VER_4_PFC_STATS_SUPPORTED;
3431*d14abf15SRobert Mustacchi     size_t           sizeof_port_stats          = 0;
3432*d14abf15SRobert Mustacchi     u32_t            sizeof_port_satas_shmem    = 0;
3433*d14abf15SRobert Mustacchi 
3434*d14abf15SRobert Mustacchi     if (LM_SHMEM2_HAS(pdev,sizeof_port_stats))
3435*d14abf15SRobert Mustacchi     {
3436*d14abf15SRobert Mustacchi         LM_SHMEM2_READ(pdev,OFFSETOF(struct shmem2_region, sizeof_port_stats), &sizeof_port_satas_shmem);
3437*d14abf15SRobert Mustacchi 
3438*d14abf15SRobert Mustacchi         sizeof_port_stats = min((size_t)sizeof_port_satas_shmem, sizeof(pdev->vars.stats.stats_mirror.stats_mcp_port));
3439*d14abf15SRobert Mustacchi     }
3440*d14abf15SRobert Mustacchi     else
3441*d14abf15SRobert Mustacchi     {
3442*d14abf15SRobert Mustacchi         if (b_bc_pfc_support)
3443*d14abf15SRobert Mustacchi         {
3444*d14abf15SRobert Mustacchi             // "pfc_frames_rx_lo" is the last member of host_port_stats_t for that MFW version.
3445*d14abf15SRobert Mustacchi 
3446*d14abf15SRobert Mustacchi             sizeof_port_stats = OFFSETOF(host_port_stats_t, pfc_frames_rx_lo) +
3447*d14abf15SRobert Mustacchi                 sizeof(pdev->vars.stats.stats_mirror.stats_mcp_port.pfc_frames_rx_lo);
3448*d14abf15SRobert Mustacchi         }
3449*d14abf15SRobert Mustacchi         else
3450*d14abf15SRobert Mustacchi         {
3451*d14abf15SRobert Mustacchi             // "not_used" is the last member of host_port_stats_t for that MFW version.
3452*d14abf15SRobert Mustacchi 
3453*d14abf15SRobert Mustacchi             sizeof_port_stats = OFFSETOF(host_port_stats_t, not_used ) +
3454*d14abf15SRobert Mustacchi                 sizeof(pdev->vars.stats.stats_mirror.stats_mcp_port.not_used);
3455*d14abf15SRobert Mustacchi         }
3456*d14abf15SRobert Mustacchi     }
3457*d14abf15SRobert Mustacchi 
3458*d14abf15SRobert Mustacchi     sizeof_port_stats /= sizeof(u32_t) ;
3459*d14abf15SRobert Mustacchi 
3460*d14abf15SRobert Mustacchi     /*
3461*d14abf15SRobert Mustacchi      * we are returning only 16 bits of the size calculated. Check (CHK version only) if the size
3462*d14abf15SRobert Mustacchi      * is too big to be held in 16 bits, which either indicate an error wrt size, or DMAE
3463*d14abf15SRobert Mustacchi      * about to be provided with a task too big.
3464*d14abf15SRobert Mustacchi      */
3465*d14abf15SRobert Mustacchi 
3466*d14abf15SRobert Mustacchi     DbgBreakIf( sizeof_port_stats >= 1u<<(sizeof(u16_t)*8) );
3467*d14abf15SRobert Mustacchi 
3468*d14abf15SRobert Mustacchi     return (u16_t)sizeof_port_stats;
3469*d14abf15SRobert Mustacchi }
3470*d14abf15SRobert Mustacchi 
3471*d14abf15SRobert Mustacchi /*
3472*d14abf15SRobert Mustacchi  *Function Name:lm_stats_port_zero
3473*d14abf15SRobert Mustacchi  *
3474*d14abf15SRobert Mustacchi  *Parameters:
3475*d14abf15SRobert Mustacchi  *
3476*d14abf15SRobert Mustacchi  *Description:
3477*d14abf15SRobert Mustacchi  *  This function should be called by first function on port (PMF) - zeros MCP scatrch pad
3478*d14abf15SRobert Mustacchi  *Returns:
3479*d14abf15SRobert Mustacchi  *
3480*d14abf15SRobert Mustacchi  */
lm_stats_port_zero(IN struct _lm_device_t * pdev)3481*d14abf15SRobert Mustacchi lm_status_t lm_stats_port_zero( IN struct _lm_device_t* pdev )
3482*d14abf15SRobert Mustacchi {
3483*d14abf15SRobert Mustacchi     u16_t            size             = 0 ;
3484*d14abf15SRobert Mustacchi     lm_status_t      lm_status        = LM_STATUS_SUCCESS ;
3485*d14abf15SRobert Mustacchi 
3486*d14abf15SRobert Mustacchi     if( 0 == pdev->vars.fw_port_stats_ptr )
3487*d14abf15SRobert Mustacchi     {
3488*d14abf15SRobert Mustacchi         /* This could happen and therefore is not considered an error */
3489*d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
3490*d14abf15SRobert Mustacchi     }
3491*d14abf15SRobert Mustacchi 
3492*d14abf15SRobert Mustacchi     // Calculate the size to be written through DMAE
3493*d14abf15SRobert Mustacchi     size = lm_stats_port_size(pdev);
3494*d14abf15SRobert Mustacchi 
3495*d14abf15SRobert Mustacchi     // This code section must be under phy lock!
3496*d14abf15SRobert Mustacchi     REG_WR_DMAE_LEN_ZERO(pdev,
3497*d14abf15SRobert Mustacchi                          pdev->vars.fw_port_stats_ptr,
3498*d14abf15SRobert Mustacchi                          size ) ;
3499*d14abf15SRobert Mustacchi 
3500*d14abf15SRobert Mustacchi     return lm_status ;
3501*d14abf15SRobert Mustacchi }
3502*d14abf15SRobert Mustacchi 
3503*d14abf15SRobert Mustacchi /*
3504*d14abf15SRobert Mustacchi  *Function Name:lm_stats_port_save
3505*d14abf15SRobert Mustacchi  *
3506*d14abf15SRobert Mustacchi  *Parameters:
3507*d14abf15SRobert Mustacchi  *
3508*d14abf15SRobert Mustacchi  *Description:
3509*d14abf15SRobert Mustacchi  *  This function should be called before PMF is unloaded in order to preserve statitiscs for the next PMF
3510*d14abf15SRobert Mustacchi  *  ASSUMPTION: function must be called under PHY_LOCK (since it uses REG_WR_DMAE interface)
3511*d14abf15SRobert Mustacchi  *  ASSUMPTION: link can not change at this point and until PMF is down
3512*d14abf15SRobert Mustacchi  *Returns:
3513*d14abf15SRobert Mustacchi  *
3514*d14abf15SRobert Mustacchi  */
lm_stats_port_save(IN struct _lm_device_t * pdev)3515*d14abf15SRobert Mustacchi lm_status_t lm_stats_port_save( IN struct _lm_device_t* pdev )
3516*d14abf15SRobert Mustacchi {
3517*d14abf15SRobert Mustacchi     u16_t              size             = 0 ;
3518*d14abf15SRobert Mustacchi     lm_status_t        lm_status        = LM_STATUS_SUCCESS ;
3519*d14abf15SRobert Mustacchi     host_port_stats_t* mcp_port         = NULL ;
3520*d14abf15SRobert Mustacchi 
3521*d14abf15SRobert Mustacchi     if( 0 == pdev->vars.fw_port_stats_ptr )
3522*d14abf15SRobert Mustacchi     {
3523*d14abf15SRobert Mustacchi         /* This could happen and therefore is not considered an error */
3524*d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
3525*d14abf15SRobert Mustacchi     }
3526*d14abf15SRobert Mustacchi 
3527*d14abf15SRobert Mustacchi     lm_stats_port_to_from( pdev, TRUE ) ;
3528*d14abf15SRobert Mustacchi 
3529*d14abf15SRobert Mustacchi     // Calculate the size to be written through DMAE
3530*d14abf15SRobert Mustacchi     size = lm_stats_port_size(pdev);
3531*d14abf15SRobert Mustacchi 
3532*d14abf15SRobert Mustacchi     mcp_port = &pdev->vars.stats.stats_mirror.stats_mcp_port ;
3533*d14abf15SRobert Mustacchi     mcp_port->not_used = ++mcp_port->host_port_stats_counter ;
3534*d14abf15SRobert Mustacchi 
3535*d14abf15SRobert Mustacchi     // This code section must be under phy lock!
3536*d14abf15SRobert Mustacchi     REG_WR_DMAE_LEN(pdev,
3537*d14abf15SRobert Mustacchi                     pdev->vars.fw_port_stats_ptr,
3538*d14abf15SRobert Mustacchi                     mcp_port,
3539*d14abf15SRobert Mustacchi                     size ) ;
3540*d14abf15SRobert Mustacchi 
3541*d14abf15SRobert Mustacchi     return lm_status ;
3542*d14abf15SRobert Mustacchi }
3543*d14abf15SRobert Mustacchi 
3544*d14abf15SRobert Mustacchi /*
3545*d14abf15SRobert Mustacchi  *Function Name:lm_stats_port_load
3546*d14abf15SRobert Mustacchi  *
3547*d14abf15SRobert Mustacchi  *Parameters:
3548*d14abf15SRobert Mustacchi  *
3549*d14abf15SRobert Mustacchi  *Description:
3550*d14abf15SRobert Mustacchi  *  This function should be called before a new PMF is loaded in order to restore statitiscs from the previous PMF
3551*d14abf15SRobert Mustacchi  *  vars.is_pmf should be set to TRUE only after this function completed!
3552*d14abf15SRobert Mustacchi  *  ASSUMPTION: function must be called under PHY_LOCK (since it uses REG_RD_DMAE interface)
3553*d14abf15SRobert Mustacchi  *  ASSUMPTION: link can not change at this point and until PMF is up
3554*d14abf15SRobert Mustacchi  *Returns:
3555*d14abf15SRobert Mustacchi  *
3556*d14abf15SRobert Mustacchi  */
lm_stats_port_load(IN struct _lm_device_t * pdev)3557*d14abf15SRobert Mustacchi lm_status_t lm_stats_port_load( IN struct _lm_device_t* pdev )
3558*d14abf15SRobert Mustacchi {
3559*d14abf15SRobert Mustacchi     u16_t              size             = 0 ;
3560*d14abf15SRobert Mustacchi     lm_status_t        lm_status        = LM_STATUS_SUCCESS ;
3561*d14abf15SRobert Mustacchi     host_port_stats_t* mcp_port         = NULL ;
3562*d14abf15SRobert Mustacchi 
3563*d14abf15SRobert Mustacchi     if( 0 == pdev->vars.fw_port_stats_ptr )
3564*d14abf15SRobert Mustacchi     {
3565*d14abf15SRobert Mustacchi         /* This could happen and therefore is not considered an error */
3566*d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
3567*d14abf15SRobert Mustacchi     }
3568*d14abf15SRobert Mustacchi 
3569*d14abf15SRobert Mustacchi     // Calculate the size to be written through DMAE
3570*d14abf15SRobert Mustacchi     size = lm_stats_port_size(pdev);
3571*d14abf15SRobert Mustacchi 
3572*d14abf15SRobert Mustacchi     mcp_port = &pdev->vars.stats.stats_mirror.stats_mcp_port ;
3573*d14abf15SRobert Mustacchi     mcp_port->not_used = ++mcp_port->host_port_stats_counter ;
3574*d14abf15SRobert Mustacchi 
3575*d14abf15SRobert Mustacchi     // This code section must be under phy lock!
3576*d14abf15SRobert Mustacchi     REG_RD_DMAE_LEN(pdev,
3577*d14abf15SRobert Mustacchi                     pdev->vars.fw_port_stats_ptr,
3578*d14abf15SRobert Mustacchi                     mcp_port,
3579*d14abf15SRobert Mustacchi                     size ) ;
3580*d14abf15SRobert Mustacchi 
3581*d14abf15SRobert Mustacchi     lm_stats_port_to_from( pdev, FALSE ) ;
3582*d14abf15SRobert Mustacchi 
3583*d14abf15SRobert Mustacchi     return lm_status ;
3584*d14abf15SRobert Mustacchi }
3585*d14abf15SRobert Mustacchi 
3586*d14abf15SRobert Mustacchi /*
3587*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
3588*d14abf15SRobert Mustacchi  * lm_stats_mgmt_assign
3589*d14abf15SRobert Mustacchi  *
3590*d14abf15SRobert Mustacchi  * write values from mgmt structures into func and port  base structure
3591*d14abf15SRobert Mustacchi  * NOTE: function must be called under PHY_LOCK (since it uses REG_RD_DMAE interface)
3592*d14abf15SRobert Mustacchi  *------------------------------------------------------------------------
3593*d14abf15SRobert Mustacchi  */
lm_stats_mgmt_assign(IN struct _lm_device_t * pdev)3594*d14abf15SRobert Mustacchi void lm_stats_mgmt_assign( IN struct _lm_device_t* pdev )
3595*d14abf15SRobert Mustacchi {
3596*d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
3597*d14abf15SRobert Mustacchi     {
3598*d14abf15SRobert Mustacchi         return;
3599*d14abf15SRobert Mustacchi     }
3600*d14abf15SRobert Mustacchi 
3601*d14abf15SRobert Mustacchi     if ( GET_FLAGS(pdev->params.test_mode, TEST_MODE_NO_MCP ) )
3602*d14abf15SRobert Mustacchi     {
3603*d14abf15SRobert Mustacchi         return;
3604*d14abf15SRobert Mustacchi     }
3605*d14abf15SRobert Mustacchi 
3606*d14abf15SRobert Mustacchi     if( pdev->vars.fw_func_stats_ptr )
3607*d14abf15SRobert Mustacchi     {
3608*d14abf15SRobert Mustacchi         lm_stats_mgmt_assign_func(pdev);
3609*d14abf15SRobert Mustacchi     }
3610*d14abf15SRobert Mustacchi     if( pdev->vars.fw_port_stats_ptr )
3611*d14abf15SRobert Mustacchi     {
3612*d14abf15SRobert Mustacchi         // only PMF should assign port statistics
3613*d14abf15SRobert Mustacchi         if( IS_PMF(pdev) )
3614*d14abf15SRobert Mustacchi         {
3615*d14abf15SRobert Mustacchi             lm_stats_port_save(pdev);
3616*d14abf15SRobert Mustacchi         }
3617*d14abf15SRobert Mustacchi     }
3618*d14abf15SRobert Mustacchi }
3619*d14abf15SRobert Mustacchi 
3620*d14abf15SRobert Mustacchi /*
3621*d14abf15SRobert Mustacchi  *Function Name:lm_stats_on_pmf_update
3622*d14abf15SRobert Mustacchi  *
3623*d14abf15SRobert Mustacchi  *Parameters:
3624*d14abf15SRobert Mustacchi  *  b_on:
3625*d14abf15SRobert Mustacchi  *  TRUE  - the device is beocming now a PMF
3626*d14abf15SRobert Mustacchi  *  FALSE - the device is now going down and transfering PMF to another device
3627*d14abf15SRobert Mustacchi  *Description:
3628*d14abf15SRobert Mustacchi  *  the function should be called under PHY LOCK.
3629*d14abf15SRobert Mustacchi  *  TRUE when a device becoming a PMF and before the link status changed from last state when previous PMF was down after call for mcp driver load
3630*d14abf15SRobert Mustacchi  *  FALSE when a device going down and after the link status saved and can not be changed (interrupts are disabled) before call for mcp driver unload
3631*d14abf15SRobert Mustacchi  *Returns:
3632*d14abf15SRobert Mustacchi  *
3633*d14abf15SRobert Mustacchi  */
lm_stats_on_pmf_update(struct _lm_device_t * pdev,IN u8_t b_on)3634*d14abf15SRobert Mustacchi lm_status_t lm_stats_on_pmf_update( struct _lm_device_t* pdev, IN u8_t b_on )
3635*d14abf15SRobert Mustacchi {
3636*d14abf15SRobert Mustacchi     lm_status_t lm_status  = LM_STATUS_SUCCESS ;
3637*d14abf15SRobert Mustacchi 
3638*d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
3639*d14abf15SRobert Mustacchi     {
3640*d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
3641*d14abf15SRobert Mustacchi     }
3642*d14abf15SRobert Mustacchi 
3643*d14abf15SRobert Mustacchi     if( b_on )
3644*d14abf15SRobert Mustacchi     {
3645*d14abf15SRobert Mustacchi         lm_status = lm_stats_port_load( pdev );
3646*d14abf15SRobert Mustacchi     }
3647*d14abf15SRobert Mustacchi     else
3648*d14abf15SRobert Mustacchi     {
3649*d14abf15SRobert Mustacchi         lm_status = lm_stats_on_update_state(pdev);
3650*d14abf15SRobert Mustacchi 
3651*d14abf15SRobert Mustacchi         // check for success, but link down is a valid situation!
3652*d14abf15SRobert Mustacchi         DbgBreakIf( ( LM_STATUS_SUCCESS != lm_status ) && ( LM_STATUS_LINK_DOWN != lm_status ) );
3653*d14abf15SRobert Mustacchi 
3654*d14abf15SRobert Mustacchi         // we need to save port stats only if link is down
3655*d14abf15SRobert Mustacchi         // if link is up, it was already made on call to lm_stats_on_update_state.
3656*d14abf15SRobert Mustacchi         if( LM_STATUS_LINK_DOWN == lm_status )
3657*d14abf15SRobert Mustacchi         {
3658*d14abf15SRobert Mustacchi             lm_status = lm_stats_port_save( pdev );
3659*d14abf15SRobert Mustacchi         }
3660*d14abf15SRobert Mustacchi     }
3661*d14abf15SRobert Mustacchi     return lm_status ;
3662*d14abf15SRobert Mustacchi }
3663*d14abf15SRobert Mustacchi /*
3664*d14abf15SRobert Mustacchi  *Function Name:lm_stats_on_pmf_init
3665*d14abf15SRobert Mustacchi  *
3666*d14abf15SRobert Mustacchi  *Parameters:
3667*d14abf15SRobert Mustacchi  *
3668*d14abf15SRobert Mustacchi  *Description:
3669*d14abf15SRobert Mustacchi  *  call this function under PHY LOCK when FIRST ever PMF is on
3670*d14abf15SRobert Mustacchi  *Returns:
3671*d14abf15SRobert Mustacchi  *
3672*d14abf15SRobert Mustacchi  */
lm_stats_on_pmf_init(struct _lm_device_t * pdev)3673*d14abf15SRobert Mustacchi lm_status_t lm_stats_on_pmf_init( struct _lm_device_t* pdev )
3674*d14abf15SRobert Mustacchi {
3675*d14abf15SRobert Mustacchi     lm_status_t lm_status  = LM_STATUS_SUCCESS ;
3676*d14abf15SRobert Mustacchi     if CHK_NULL(pdev)
3677*d14abf15SRobert Mustacchi     {
3678*d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
3679*d14abf15SRobert Mustacchi     }
3680*d14abf15SRobert Mustacchi 
3681*d14abf15SRobert Mustacchi     lm_status = lm_stats_port_zero( pdev ) ;
3682*d14abf15SRobert Mustacchi 
3683*d14abf15SRobert Mustacchi     return lm_status ;
3684*d14abf15SRobert Mustacchi 
3685*d14abf15SRobert Mustacchi }
3686*d14abf15SRobert Mustacchi 
lm_stats_hw_collect(struct _lm_device_t * pdev)3687*d14abf15SRobert Mustacchi lm_status_t lm_stats_hw_collect( struct _lm_device_t* pdev )
3688*d14abf15SRobert Mustacchi {
3689*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
3690*d14abf15SRobert Mustacchi     u8_t port             = PORT_ID(pdev);
3691*d14abf15SRobert Mustacchi     const u32_t pkt0      = port ? NIG_REG_STAT1_EGRESS_MAC_PKT0  : NIG_REG_STAT0_EGRESS_MAC_PKT0  ;
3692*d14abf15SRobert Mustacchi     const u32_t pkt1      = port ? NIG_REG_STAT1_EGRESS_MAC_PKT1  : NIG_REG_STAT0_EGRESS_MAC_PKT1  ;
3693*d14abf15SRobert Mustacchi     const u32_t eee       = port ? MISC_REG_CPMU_LP_SM_ENT_CNT_P1 : MISC_REG_CPMU_LP_SM_ENT_CNT_P0 ;
3694*d14abf15SRobert Mustacchi 
3695*d14abf15SRobert Mustacchi     // call the dmae commands sequance
3696*d14abf15SRobert Mustacchi     lm_status = lm_stats_dmae( pdev ) ;
3697*d14abf15SRobert Mustacchi     if( LM_STATUS_SUCCESS != lm_status )
3698*d14abf15SRobert Mustacchi     {
3699*d14abf15SRobert Mustacchi         return lm_status;
3700*d14abf15SRobert Mustacchi     }
3701*d14abf15SRobert Mustacchi 
3702*d14abf15SRobert Mustacchi     // read two more NIG registers in the regular way - on E3 these do not exist!!!
3703*d14abf15SRobert Mustacchi     if (!CHIP_IS_E3(pdev))
3704*d14abf15SRobert Mustacchi     {
3705*d14abf15SRobert Mustacchi         REG_RD_DMAE( pdev,  pkt0, &pdev->vars.stats.stats_collect.stats_hw.nig_ex_stats_query.egress_mac_pkt0 );
3706*d14abf15SRobert Mustacchi         REG_RD_DMAE( pdev,  pkt1, &pdev->vars.stats.stats_collect.stats_hw.nig_ex_stats_query.egress_mac_pkt1 );
3707*d14abf15SRobert Mustacchi     }
3708*d14abf15SRobert Mustacchi 
3709*d14abf15SRobert Mustacchi     // EEE is only supported in E3 chip
3710*d14abf15SRobert Mustacchi     if (CHIP_IS_E3(pdev))
3711*d14abf15SRobert Mustacchi     {
3712*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_collect.stats_hw.misc_stats_query.tx_lpi_count = REG_RD(pdev, eee);
3713*d14abf15SRobert Mustacchi     }
3714*d14abf15SRobert Mustacchi 
3715*d14abf15SRobert Mustacchi     return lm_status ;
3716*d14abf15SRobert Mustacchi }
3717*d14abf15SRobert Mustacchi 
3718*d14abf15SRobert Mustacchi /*
3719*d14abf15SRobert Mustacchi  *Function Name:lm_stats_init_port_part
3720*d14abf15SRobert Mustacchi  *
3721*d14abf15SRobert Mustacchi  *Parameters:
3722*d14abf15SRobert Mustacchi  *
3723*d14abf15SRobert Mustacchi  *Description:
3724*d14abf15SRobert Mustacchi  *  call this function under PHY LOCK on port init
3725*d14abf15SRobert Mustacchi  *Returns:
3726*d14abf15SRobert Mustacchi  *
3727*d14abf15SRobert Mustacchi  */
lm_stats_init_port_part(struct _lm_device_t * pdev)3728*d14abf15SRobert Mustacchi void lm_stats_init_port_part( struct _lm_device_t* pdev )
3729*d14abf15SRobert Mustacchi {
3730*d14abf15SRobert Mustacchi     lm_stats_mgmt_clear_all_func(pdev);
3731*d14abf15SRobert Mustacchi }
3732*d14abf15SRobert Mustacchi 
3733*d14abf15SRobert Mustacchi /*
3734*d14abf15SRobert Mustacchi  *Function Name:lm_stats_init_port_part
3735*d14abf15SRobert Mustacchi  *
3736*d14abf15SRobert Mustacchi  *Parameters:
3737*d14abf15SRobert Mustacchi  *
3738*d14abf15SRobert Mustacchi  *Description:
3739*d14abf15SRobert Mustacchi  *  call this function under PHY LOCK on function init
3740*d14abf15SRobert Mustacchi  *Returns:
3741*d14abf15SRobert Mustacchi  *
3742*d14abf15SRobert Mustacchi  */
lm_stats_init_func_part(struct _lm_device_t * pdev)3743*d14abf15SRobert Mustacchi void lm_stats_init_func_part( struct _lm_device_t* pdev )
3744*d14abf15SRobert Mustacchi {
3745*d14abf15SRobert Mustacchi     if (IS_PMF(pdev) && IS_MULTI_VNIC(pdev))
3746*d14abf15SRobert Mustacchi     {
3747*d14abf15SRobert Mustacchi         lm_stats_on_pmf_init(pdev);
3748*d14abf15SRobert Mustacchi     }
3749*d14abf15SRobert Mustacchi     lm_stats_mgmt_read_func_base(pdev);
3750*d14abf15SRobert Mustacchi }
3751