@@ -153,57 +153,51 @@ static const char fm10k_prv_flags[FM10K_PRV_FLAG_LEN][ETH_GSTRING_LEN] = {
153
153
"debug-statistics" ,
154
154
};
155
155
156
+ static void fm10k_add_stat_strings (char * * p , const char * prefix ,
157
+ const struct fm10k_stats stats [],
158
+ const unsigned int size )
159
+ {
160
+ unsigned int i ;
161
+
162
+ for (i = 0 ; i < size ; i ++ ) {
163
+ snprintf (* p , ETH_GSTRING_LEN , "%s%s" ,
164
+ prefix , stats [i ].stat_string );
165
+ * p += ETH_GSTRING_LEN ;
166
+ }
167
+ }
168
+
156
169
static void fm10k_get_stat_strings (struct net_device * dev , u8 * data )
157
170
{
158
171
struct fm10k_intfc * interface = netdev_priv (dev );
159
172
struct fm10k_iov_data * iov_data = interface -> iov_data ;
160
173
char * p = (char * )data ;
161
174
unsigned int i ;
162
- unsigned int j ;
163
175
164
- for (i = 0 ; i < FM10K_NETDEV_STATS_LEN ; i ++ ) {
165
- memcpy (p , fm10k_gstrings_net_stats [i ].stat_string ,
166
- ETH_GSTRING_LEN );
167
- p += ETH_GSTRING_LEN ;
168
- }
176
+ fm10k_add_stat_strings (& p , "" , fm10k_gstrings_net_stats ,
177
+ FM10K_NETDEV_STATS_LEN );
169
178
170
- for (i = 0 ; i < FM10K_GLOBAL_STATS_LEN ; i ++ ) {
171
- memcpy (p , fm10k_gstrings_global_stats [i ].stat_string ,
172
- ETH_GSTRING_LEN );
173
- p += ETH_GSTRING_LEN ;
174
- }
179
+ fm10k_add_stat_strings (& p , "" , fm10k_gstrings_global_stats ,
180
+ FM10K_GLOBAL_STATS_LEN );
175
181
176
- if (interface -> flags & FM10K_FLAG_DEBUG_STATS ) {
177
- for (i = 0 ; i < FM10K_DEBUG_STATS_LEN ; i ++ ) {
178
- memcpy (p , fm10k_gstrings_debug_stats [i ].stat_string ,
179
- ETH_GSTRING_LEN );
180
- p += ETH_GSTRING_LEN ;
181
- }
182
- }
182
+ if (interface -> flags & FM10K_FLAG_DEBUG_STATS )
183
+ fm10k_add_stat_strings (& p , "" , fm10k_gstrings_debug_stats ,
184
+ FM10K_DEBUG_STATS_LEN );
183
185
184
- for (i = 0 ; i < FM10K_MBX_STATS_LEN ; i ++ ) {
185
- memcpy (p , fm10k_gstrings_mbx_stats [i ].stat_string ,
186
- ETH_GSTRING_LEN );
187
- p += ETH_GSTRING_LEN ;
188
- }
186
+ fm10k_add_stat_strings (& p , "" , fm10k_gstrings_mbx_stats ,
187
+ FM10K_MBX_STATS_LEN );
189
188
190
- if (interface -> hw .mac .type != fm10k_mac_vf ) {
191
- for (i = 0 ; i < FM10K_PF_STATS_LEN ; i ++ ) {
192
- memcpy (p , fm10k_gstrings_pf_stats [i ].stat_string ,
193
- ETH_GSTRING_LEN );
194
- p += ETH_GSTRING_LEN ;
195
- }
196
- }
189
+ if (interface -> hw .mac .type != fm10k_mac_vf )
190
+ fm10k_add_stat_strings (& p , "" , fm10k_gstrings_pf_stats ,
191
+ FM10K_PF_STATS_LEN );
197
192
198
193
if ((interface -> flags & FM10K_FLAG_DEBUG_STATS ) && iov_data ) {
199
194
for (i = 0 ; i < iov_data -> num_vfs ; i ++ ) {
200
- for (j = 0 ; j < FM10K_MBX_STATS_LEN ; j ++ ) {
201
- snprintf (p ,
202
- ETH_GSTRING_LEN ,
203
- "vf_%u_%s" , i ,
204
- fm10k_gstrings_mbx_stats [j ].stat_string );
205
- p += ETH_GSTRING_LEN ;
206
- }
195
+ char prefix [ETH_GSTRING_LEN ];
196
+
197
+ snprintf (prefix , ETH_GSTRING_LEN , "vf_%u_" , i );
198
+ fm10k_add_stat_strings (& p , prefix ,
199
+ fm10k_gstrings_mbx_stats ,
200
+ FM10K_MBX_STATS_LEN );
207
201
}
208
202
}
209
203
@@ -271,6 +265,41 @@ static int fm10k_get_sset_count(struct net_device *dev, int sset)
271
265
}
272
266
}
273
267
268
+ static void fm10k_add_ethtool_stats (u64 * * data , void * pointer ,
269
+ const struct fm10k_stats stats [],
270
+ const unsigned int size )
271
+ {
272
+ unsigned int i ;
273
+ char * p ;
274
+
275
+ /* simply skip forward if we were not given a valid pointer */
276
+ if (!pointer ) {
277
+ * data += size ;
278
+ return ;
279
+ }
280
+
281
+ for (i = 0 ; i < size ; i ++ ) {
282
+ p = (char * )pointer + stats [i ].stat_offset ;
283
+
284
+ switch (stats [i ].sizeof_stat ) {
285
+ case sizeof (u64 ):
286
+ * ((* data )++ ) = * (u64 * )p ;
287
+ break ;
288
+ case sizeof (u32 ):
289
+ * ((* data )++ ) = * (u32 * )p ;
290
+ break ;
291
+ case sizeof (u16 ):
292
+ * ((* data )++ ) = * (u16 * )p ;
293
+ break ;
294
+ case sizeof (u8 ):
295
+ * ((* data )++ ) = * (u8 * )p ;
296
+ break ;
297
+ default :
298
+ * ((* data )++ ) = 0 ;
299
+ }
300
+ }
301
+ }
302
+
274
303
static void fm10k_get_ethtool_stats (struct net_device * netdev ,
275
304
struct ethtool_stats __always_unused * stats ,
276
305
u64 * data )
@@ -279,47 +308,29 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,
279
308
struct fm10k_intfc * interface = netdev_priv (netdev );
280
309
struct fm10k_iov_data * iov_data = interface -> iov_data ;
281
310
struct net_device_stats * net_stats = & netdev -> stats ;
282
- char * p ;
283
311
int i , j ;
284
312
285
313
fm10k_update_stats (interface );
286
314
287
- for (i = 0 ; i < FM10K_NETDEV_STATS_LEN ; i ++ ) {
288
- p = (char * )net_stats + fm10k_gstrings_net_stats [i ].stat_offset ;
289
- * (data ++ ) = (fm10k_gstrings_net_stats [i ].sizeof_stat ==
290
- sizeof (u64 )) ? * (u64 * )p : * (u32 * )p ;
291
- }
315
+ fm10k_add_ethtool_stats (& data , net_stats , fm10k_gstrings_net_stats ,
316
+ FM10K_NETDEV_STATS_LEN );
292
317
293
- for (i = 0 ; i < FM10K_GLOBAL_STATS_LEN ; i ++ ) {
294
- p = (char * )interface +
295
- fm10k_gstrings_global_stats [i ].stat_offset ;
296
- * (data ++ ) = (fm10k_gstrings_global_stats [i ].sizeof_stat ==
297
- sizeof (u64 )) ? * (u64 * )p : * (u32 * )p ;
298
- }
318
+ fm10k_add_ethtool_stats (& data , interface , fm10k_gstrings_global_stats ,
319
+ FM10K_GLOBAL_STATS_LEN );
299
320
300
- if (interface -> flags & FM10K_FLAG_DEBUG_STATS ) {
301
- for (i = 0 ; i < FM10K_DEBUG_STATS_LEN ; i ++ ) {
302
- p = (char * )interface +
303
- fm10k_gstrings_debug_stats [i ].stat_offset ;
304
- * (data ++ ) = (fm10k_gstrings_debug_stats [i ].sizeof_stat ==
305
- sizeof (u64 )) ? * (u64 * )p : * (u32 * )p ;
306
- }
307
- }
321
+ if (interface -> flags & FM10K_FLAG_DEBUG_STATS )
322
+ fm10k_add_ethtool_stats (& data , interface ,
323
+ fm10k_gstrings_debug_stats ,
324
+ FM10K_DEBUG_STATS_LEN );
308
325
309
- for (i = 0 ; i < FM10K_MBX_STATS_LEN ; i ++ ) {
310
- p = (char * )& interface -> hw .mbx +
311
- fm10k_gstrings_mbx_stats [i ].stat_offset ;
312
- * (data ++ ) = (fm10k_gstrings_mbx_stats [i ].sizeof_stat ==
313
- sizeof (u64 )) ? * (u64 * )p : * (u32 * )p ;
314
- }
326
+ fm10k_add_ethtool_stats (& data , & interface -> hw .mbx ,
327
+ fm10k_gstrings_mbx_stats ,
328
+ FM10K_MBX_STATS_LEN );
315
329
316
330
if (interface -> hw .mac .type != fm10k_mac_vf ) {
317
- for (i = 0 ; i < FM10K_PF_STATS_LEN ; i ++ ) {
318
- p = (char * )interface +
319
- fm10k_gstrings_pf_stats [i ].stat_offset ;
320
- * (data ++ ) = (fm10k_gstrings_pf_stats [i ].sizeof_stat ==
321
- sizeof (u64 )) ? * (u64 * )p : * (u32 * )p ;
322
- }
331
+ fm10k_add_ethtool_stats (& data , interface ,
332
+ fm10k_gstrings_pf_stats ,
333
+ FM10K_PF_STATS_LEN );
323
334
}
324
335
325
336
if ((interface -> flags & FM10K_FLAG_DEBUG_STATS ) && iov_data ) {
@@ -328,18 +339,9 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,
328
339
329
340
vf_info = & iov_data -> vf_info [i ];
330
341
331
- /* skip stats if we don't have a vf info */
332
- if (!vf_info ) {
333
- data += FM10K_MBX_STATS_LEN ;
334
- continue ;
335
- }
336
-
337
- for (j = 0 ; j < FM10K_MBX_STATS_LEN ; j ++ ) {
338
- p = (char * )& vf_info -> mbx +
339
- fm10k_gstrings_mbx_stats [j ].stat_offset ;
340
- * (data ++ ) = (fm10k_gstrings_mbx_stats [j ].sizeof_stat ==
341
- sizeof (u64 )) ? * (u64 * )p : * (u32 * )p ;
342
- }
342
+ fm10k_add_ethtool_stats (& data , & vf_info -> mbx ,
343
+ fm10k_gstrings_mbx_stats ,
344
+ FM10K_MBX_STATS_LEN );
343
345
}
344
346
}
345
347
0 commit comments