Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
vxge-ethtool.c
Go to the documentation of this file.
1 /******************************************************************************
2  * This software may be used and distributed according to the terms of
3  * the GNU General Public License (GPL), incorporated herein by reference.
4  * Drivers based on or derived from this code fall under the GPL and must
5  * retain the authorship, copyright and license notice. This file is not
6  * a complete program and may only be used when the entire operating
7  * system is licensed under the GPL.
8  * See the file COPYING in this distribution for more information.
9  *
10  * vxge-ethtool.c: Driver for Exar Corp's X3100 Series 10GbE PCIe I/O
11  * Virtualized Server Adapter.
12  * Copyright(c) 2002-2010 Exar Corp.
13  ******************************************************************************/
14 #include <linux/ethtool.h>
15 #include <linux/slab.h>
16 #include <linux/pci.h>
17 #include <linux/etherdevice.h>
18 
19 #include "vxge-ethtool.h"
20 
32 static int vxge_ethtool_sset(struct net_device *dev, struct ethtool_cmd *info)
33 {
34  /* We currently only support 10Gb/FULL */
35  if ((info->autoneg == AUTONEG_ENABLE) ||
36  (ethtool_cmd_speed(info) != SPEED_10000) ||
37  (info->duplex != DUPLEX_FULL))
38  return -EINVAL;
39 
40  return 0;
41 }
42 
53 static int vxge_ethtool_gset(struct net_device *dev, struct ethtool_cmd *info)
54 {
57  info->port = PORT_FIBRE;
58 
59  info->transceiver = XCVR_EXTERNAL;
60 
61  if (netif_carrier_ok(dev)) {
62  ethtool_cmd_speed_set(info, SPEED_10000);
63  info->duplex = DUPLEX_FULL;
64  } else {
65  ethtool_cmd_speed_set(info, -1);
66  info->duplex = -1;
67  }
68 
69  info->autoneg = AUTONEG_DISABLE;
70  return 0;
71 }
72 
81 static void vxge_ethtool_gdrvinfo(struct net_device *dev,
82  struct ethtool_drvinfo *info)
83 {
84  struct vxgedev *vdev = netdev_priv(dev);
86  strlcpy(info->version, DRV_VERSION, sizeof(DRV_VERSION));
88  strlcpy(info->bus_info, pci_name(vdev->pdev), sizeof(info->bus_info));
89  info->regdump_len = sizeof(struct vxge_hw_vpath_reg)
90  * vdev->no_of_vpath;
91 
92  info->n_stats = STAT_LEN;
93 }
94 
105 static void vxge_ethtool_gregs(struct net_device *dev,
106  struct ethtool_regs *regs, void *space)
107 {
108  int index, offset;
109  enum vxge_hw_status status;
110  u64 reg;
111  u64 *reg_space = (u64 *)space;
112  struct vxgedev *vdev = netdev_priv(dev);
113  struct __vxge_hw_device *hldev = vdev->devh;
114 
115  regs->len = sizeof(struct vxge_hw_vpath_reg) * vdev->no_of_vpath;
116  regs->version = vdev->pdev->subsystem_device;
117  for (index = 0; index < vdev->no_of_vpath; index++) {
118  for (offset = 0; offset < sizeof(struct vxge_hw_vpath_reg);
119  offset += 8) {
120  status = vxge_hw_mgmt_reg_read(hldev,
122  vdev->vpaths[index].device_id,
123  offset, &reg);
124  if (status != VXGE_HW_OK) {
126  "%s:%d Getting reg dump Failed",
127  __func__, __LINE__);
128  return;
129  }
130  *reg_space++ = reg;
131  }
132  }
133 }
134 
143 static int vxge_ethtool_idnic(struct net_device *dev,
145 {
146  struct vxgedev *vdev = netdev_priv(dev);
147  struct __vxge_hw_device *hldev = vdev->devh;
148 
149  switch (state) {
150  case ETHTOOL_ID_ACTIVE:
152  break;
153 
154  case ETHTOOL_ID_INACTIVE:
156  break;
157 
158  default:
159  return -EINVAL;
160  }
161 
162  return 0;
163 }
164 
174 static void vxge_ethtool_getpause_data(struct net_device *dev,
175  struct ethtool_pauseparam *ep)
176 {
177  struct vxgedev *vdev = netdev_priv(dev);
178  struct __vxge_hw_device *hldev = vdev->devh;
179 
180  vxge_hw_device_getpause_data(hldev, 0, &ep->tx_pause, &ep->rx_pause);
181 }
182 
193 static int vxge_ethtool_setpause_data(struct net_device *dev,
194  struct ethtool_pauseparam *ep)
195 {
196  struct vxgedev *vdev = netdev_priv(dev);
197  struct __vxge_hw_device *hldev = vdev->devh;
198 
199  vxge_hw_device_setpause_data(hldev, 0, ep->tx_pause, ep->rx_pause);
200 
201  vdev->config.tx_pause_enable = ep->tx_pause;
202  vdev->config.rx_pause_enable = ep->rx_pause;
203 
204  return 0;
205 }
206 
207 static void vxge_get_ethtool_stats(struct net_device *dev,
208  struct ethtool_stats *estats, u64 *tmp_stats)
209 {
210  int j, k;
211  enum vxge_hw_status status;
212  enum vxge_hw_status swstatus;
213  struct vxge_vpath *vpath = NULL;
214  struct vxgedev *vdev = netdev_priv(dev);
215  struct __vxge_hw_device *hldev = vdev->devh;
216  struct vxge_hw_xmac_stats *xmac_stats;
217  struct vxge_hw_device_stats_sw_info *sw_stats;
218  struct vxge_hw_device_stats_hw_info *hw_stats;
219 
220  u64 *ptr = tmp_stats;
221 
222  memset(tmp_stats, 0,
223  vxge_ethtool_get_sset_count(dev, ETH_SS_STATS) * sizeof(u64));
224 
225  xmac_stats = kzalloc(sizeof(struct vxge_hw_xmac_stats), GFP_KERNEL);
226  if (xmac_stats == NULL) {
228  "%s : %d Memory Allocation failed for xmac_stats",
229  __func__, __LINE__);
230  return;
231  }
232 
233  sw_stats = kzalloc(sizeof(struct vxge_hw_device_stats_sw_info),
234  GFP_KERNEL);
235  if (sw_stats == NULL) {
236  kfree(xmac_stats);
238  "%s : %d Memory Allocation failed for sw_stats",
239  __func__, __LINE__);
240  return;
241  }
242 
243  hw_stats = kzalloc(sizeof(struct vxge_hw_device_stats_hw_info),
244  GFP_KERNEL);
245  if (hw_stats == NULL) {
246  kfree(xmac_stats);
247  kfree(sw_stats);
249  "%s : %d Memory Allocation failed for hw_stats",
250  __func__, __LINE__);
251  return;
252  }
253 
254  *ptr++ = 0;
255  status = vxge_hw_device_xmac_stats_get(hldev, xmac_stats);
256  if (status != VXGE_HW_OK) {
257  if (status != VXGE_HW_ERR_PRIVILAGED_OPEARATION) {
259  "%s : %d Failure in getting xmac stats",
260  __func__, __LINE__);
261  }
262  }
263  swstatus = vxge_hw_driver_stats_get(hldev, sw_stats);
264  if (swstatus != VXGE_HW_OK) {
266  "%s : %d Failure in getting sw stats",
267  __func__, __LINE__);
268  }
269 
270  status = vxge_hw_device_stats_get(hldev, hw_stats);
271  if (status != VXGE_HW_OK) {
273  "%s : %d hw_stats_get error", __func__, __LINE__);
274  }
275 
276  for (k = 0; k < vdev->no_of_vpath; k++) {
277  struct vxge_hw_vpath_stats_hw_info *vpath_info;
278 
279  vpath = &vdev->vpaths[k];
280  j = vpath->device_id;
281  vpath_info = hw_stats->vpath_info[j];
282  if (!vpath_info) {
284  VXGE_HW_VPATH_RX_STATS_LEN) * sizeof(u64));
287  continue;
288  }
289 
290  *ptr++ = vpath_info->tx_stats.tx_ttl_eth_frms;
291  *ptr++ = vpath_info->tx_stats.tx_ttl_eth_octets;
292  *ptr++ = vpath_info->tx_stats.tx_data_octets;
293  *ptr++ = vpath_info->tx_stats.tx_mcast_frms;
294  *ptr++ = vpath_info->tx_stats.tx_bcast_frms;
295  *ptr++ = vpath_info->tx_stats.tx_ucast_frms;
296  *ptr++ = vpath_info->tx_stats.tx_tagged_frms;
297  *ptr++ = vpath_info->tx_stats.tx_vld_ip;
298  *ptr++ = vpath_info->tx_stats.tx_vld_ip_octets;
299  *ptr++ = vpath_info->tx_stats.tx_icmp;
300  *ptr++ = vpath_info->tx_stats.tx_tcp;
301  *ptr++ = vpath_info->tx_stats.tx_rst_tcp;
302  *ptr++ = vpath_info->tx_stats.tx_udp;
303  *ptr++ = vpath_info->tx_stats.tx_unknown_protocol;
304  *ptr++ = vpath_info->tx_stats.tx_lost_ip;
305  *ptr++ = vpath_info->tx_stats.tx_parse_error;
306  *ptr++ = vpath_info->tx_stats.tx_tcp_offload;
307  *ptr++ = vpath_info->tx_stats.tx_retx_tcp_offload;
308  *ptr++ = vpath_info->tx_stats.tx_lost_ip_offload;
309  *ptr++ = vpath_info->rx_stats.rx_ttl_eth_frms;
310  *ptr++ = vpath_info->rx_stats.rx_vld_frms;
311  *ptr++ = vpath_info->rx_stats.rx_offload_frms;
312  *ptr++ = vpath_info->rx_stats.rx_ttl_eth_octets;
313  *ptr++ = vpath_info->rx_stats.rx_data_octets;
314  *ptr++ = vpath_info->rx_stats.rx_offload_octets;
315  *ptr++ = vpath_info->rx_stats.rx_vld_mcast_frms;
316  *ptr++ = vpath_info->rx_stats.rx_vld_bcast_frms;
317  *ptr++ = vpath_info->rx_stats.rx_accepted_ucast_frms;
318  *ptr++ = vpath_info->rx_stats.rx_accepted_nucast_frms;
319  *ptr++ = vpath_info->rx_stats.rx_tagged_frms;
320  *ptr++ = vpath_info->rx_stats.rx_long_frms;
321  *ptr++ = vpath_info->rx_stats.rx_usized_frms;
322  *ptr++ = vpath_info->rx_stats.rx_osized_frms;
323  *ptr++ = vpath_info->rx_stats.rx_frag_frms;
324  *ptr++ = vpath_info->rx_stats.rx_jabber_frms;
325  *ptr++ = vpath_info->rx_stats.rx_ttl_64_frms;
326  *ptr++ = vpath_info->rx_stats.rx_ttl_65_127_frms;
327  *ptr++ = vpath_info->rx_stats.rx_ttl_128_255_frms;
328  *ptr++ = vpath_info->rx_stats.rx_ttl_256_511_frms;
329  *ptr++ = vpath_info->rx_stats.rx_ttl_512_1023_frms;
330  *ptr++ = vpath_info->rx_stats.rx_ttl_1024_1518_frms;
331  *ptr++ = vpath_info->rx_stats.rx_ttl_1519_4095_frms;
332  *ptr++ = vpath_info->rx_stats.rx_ttl_4096_8191_frms;
333  *ptr++ = vpath_info->rx_stats.rx_ttl_8192_max_frms;
334  *ptr++ = vpath_info->rx_stats.rx_ttl_gt_max_frms;
335  *ptr++ = vpath_info->rx_stats.rx_ip;
336  *ptr++ = vpath_info->rx_stats.rx_accepted_ip;
337  *ptr++ = vpath_info->rx_stats.rx_ip_octets;
338  *ptr++ = vpath_info->rx_stats.rx_err_ip;
339  *ptr++ = vpath_info->rx_stats.rx_icmp;
340  *ptr++ = vpath_info->rx_stats.rx_tcp;
341  *ptr++ = vpath_info->rx_stats.rx_udp;
342  *ptr++ = vpath_info->rx_stats.rx_err_tcp;
343  *ptr++ = vpath_info->rx_stats.rx_lost_frms;
344  *ptr++ = vpath_info->rx_stats.rx_lost_ip;
345  *ptr++ = vpath_info->rx_stats.rx_lost_ip_offload;
346  *ptr++ = vpath_info->rx_stats.rx_various_discard;
347  *ptr++ = vpath_info->rx_stats.rx_sleep_discard;
348  *ptr++ = vpath_info->rx_stats.rx_red_discard;
349  *ptr++ = vpath_info->rx_stats.rx_queue_full_discard;
350  *ptr++ = vpath_info->rx_stats.rx_mpa_ok_frms;
351  }
352  *ptr++ = 0;
353  for (k = 0; k < vdev->max_config_port; k++) {
354  *ptr++ = xmac_stats->aggr_stats[k].tx_frms;
355  *ptr++ = xmac_stats->aggr_stats[k].tx_data_octets;
356  *ptr++ = xmac_stats->aggr_stats[k].tx_mcast_frms;
357  *ptr++ = xmac_stats->aggr_stats[k].tx_bcast_frms;
358  *ptr++ = xmac_stats->aggr_stats[k].tx_discarded_frms;
359  *ptr++ = xmac_stats->aggr_stats[k].tx_errored_frms;
360  *ptr++ = xmac_stats->aggr_stats[k].rx_frms;
361  *ptr++ = xmac_stats->aggr_stats[k].rx_data_octets;
362  *ptr++ = xmac_stats->aggr_stats[k].rx_mcast_frms;
363  *ptr++ = xmac_stats->aggr_stats[k].rx_bcast_frms;
364  *ptr++ = xmac_stats->aggr_stats[k].rx_discarded_frms;
365  *ptr++ = xmac_stats->aggr_stats[k].rx_errored_frms;
366  *ptr++ = xmac_stats->aggr_stats[k].rx_unknown_slow_proto_frms;
367  }
368  *ptr++ = 0;
369  for (k = 0; k < vdev->max_config_port; k++) {
370  *ptr++ = xmac_stats->port_stats[k].tx_ttl_frms;
371  *ptr++ = xmac_stats->port_stats[k].tx_ttl_octets;
372  *ptr++ = xmac_stats->port_stats[k].tx_data_octets;
373  *ptr++ = xmac_stats->port_stats[k].tx_mcast_frms;
374  *ptr++ = xmac_stats->port_stats[k].tx_bcast_frms;
375  *ptr++ = xmac_stats->port_stats[k].tx_ucast_frms;
376  *ptr++ = xmac_stats->port_stats[k].tx_tagged_frms;
377  *ptr++ = xmac_stats->port_stats[k].tx_vld_ip;
378  *ptr++ = xmac_stats->port_stats[k].tx_vld_ip_octets;
379  *ptr++ = xmac_stats->port_stats[k].tx_icmp;
380  *ptr++ = xmac_stats->port_stats[k].tx_tcp;
381  *ptr++ = xmac_stats->port_stats[k].tx_rst_tcp;
382  *ptr++ = xmac_stats->port_stats[k].tx_udp;
383  *ptr++ = xmac_stats->port_stats[k].tx_parse_error;
384  *ptr++ = xmac_stats->port_stats[k].tx_unknown_protocol;
385  *ptr++ = xmac_stats->port_stats[k].tx_pause_ctrl_frms;
386  *ptr++ = xmac_stats->port_stats[k].tx_marker_pdu_frms;
387  *ptr++ = xmac_stats->port_stats[k].tx_lacpdu_frms;
388  *ptr++ = xmac_stats->port_stats[k].tx_drop_ip;
389  *ptr++ = xmac_stats->port_stats[k].tx_marker_resp_pdu_frms;
390  *ptr++ = xmac_stats->port_stats[k].tx_xgmii_char2_match;
391  *ptr++ = xmac_stats->port_stats[k].tx_xgmii_char1_match;
392  *ptr++ = xmac_stats->port_stats[k].tx_xgmii_column2_match;
393  *ptr++ = xmac_stats->port_stats[k].tx_xgmii_column1_match;
394  *ptr++ = xmac_stats->port_stats[k].tx_any_err_frms;
395  *ptr++ = xmac_stats->port_stats[k].tx_drop_frms;
396  *ptr++ = xmac_stats->port_stats[k].rx_ttl_frms;
397  *ptr++ = xmac_stats->port_stats[k].rx_vld_frms;
398  *ptr++ = xmac_stats->port_stats[k].rx_offload_frms;
399  *ptr++ = xmac_stats->port_stats[k].rx_ttl_octets;
400  *ptr++ = xmac_stats->port_stats[k].rx_data_octets;
401  *ptr++ = xmac_stats->port_stats[k].rx_offload_octets;
402  *ptr++ = xmac_stats->port_stats[k].rx_vld_mcast_frms;
403  *ptr++ = xmac_stats->port_stats[k].rx_vld_bcast_frms;
404  *ptr++ = xmac_stats->port_stats[k].rx_accepted_ucast_frms;
405  *ptr++ = xmac_stats->port_stats[k].rx_accepted_nucast_frms;
406  *ptr++ = xmac_stats->port_stats[k].rx_tagged_frms;
407  *ptr++ = xmac_stats->port_stats[k].rx_long_frms;
408  *ptr++ = xmac_stats->port_stats[k].rx_usized_frms;
409  *ptr++ = xmac_stats->port_stats[k].rx_osized_frms;
410  *ptr++ = xmac_stats->port_stats[k].rx_frag_frms;
411  *ptr++ = xmac_stats->port_stats[k].rx_jabber_frms;
412  *ptr++ = xmac_stats->port_stats[k].rx_ttl_64_frms;
413  *ptr++ = xmac_stats->port_stats[k].rx_ttl_65_127_frms;
414  *ptr++ = xmac_stats->port_stats[k].rx_ttl_128_255_frms;
415  *ptr++ = xmac_stats->port_stats[k].rx_ttl_256_511_frms;
416  *ptr++ = xmac_stats->port_stats[k].rx_ttl_512_1023_frms;
417  *ptr++ = xmac_stats->port_stats[k].rx_ttl_1024_1518_frms;
418  *ptr++ = xmac_stats->port_stats[k].rx_ttl_1519_4095_frms;
419  *ptr++ = xmac_stats->port_stats[k].rx_ttl_4096_8191_frms;
420  *ptr++ = xmac_stats->port_stats[k].rx_ttl_8192_max_frms;
421  *ptr++ = xmac_stats->port_stats[k].rx_ttl_gt_max_frms;
422  *ptr++ = xmac_stats->port_stats[k].rx_ip;
423  *ptr++ = xmac_stats->port_stats[k].rx_accepted_ip;
424  *ptr++ = xmac_stats->port_stats[k].rx_ip_octets;
425  *ptr++ = xmac_stats->port_stats[k].rx_err_ip;
426  *ptr++ = xmac_stats->port_stats[k].rx_icmp;
427  *ptr++ = xmac_stats->port_stats[k].rx_tcp;
428  *ptr++ = xmac_stats->port_stats[k].rx_udp;
429  *ptr++ = xmac_stats->port_stats[k].rx_err_tcp;
430  *ptr++ = xmac_stats->port_stats[k].rx_pause_count;
431  *ptr++ = xmac_stats->port_stats[k].rx_pause_ctrl_frms;
432  *ptr++ = xmac_stats->port_stats[k].rx_unsup_ctrl_frms;
433  *ptr++ = xmac_stats->port_stats[k].rx_fcs_err_frms;
434  *ptr++ = xmac_stats->port_stats[k].rx_in_rng_len_err_frms;
435  *ptr++ = xmac_stats->port_stats[k].rx_out_rng_len_err_frms;
436  *ptr++ = xmac_stats->port_stats[k].rx_drop_frms;
437  *ptr++ = xmac_stats->port_stats[k].rx_discarded_frms;
438  *ptr++ = xmac_stats->port_stats[k].rx_drop_ip;
439  *ptr++ = xmac_stats->port_stats[k].rx_drop_udp;
440  *ptr++ = xmac_stats->port_stats[k].rx_marker_pdu_frms;
441  *ptr++ = xmac_stats->port_stats[k].rx_lacpdu_frms;
442  *ptr++ = xmac_stats->port_stats[k].rx_unknown_pdu_frms;
443  *ptr++ = xmac_stats->port_stats[k].rx_marker_resp_pdu_frms;
444  *ptr++ = xmac_stats->port_stats[k].rx_fcs_discard;
445  *ptr++ = xmac_stats->port_stats[k].rx_illegal_pdu_frms;
446  *ptr++ = xmac_stats->port_stats[k].rx_switch_discard;
447  *ptr++ = xmac_stats->port_stats[k].rx_len_discard;
448  *ptr++ = xmac_stats->port_stats[k].rx_rpa_discard;
449  *ptr++ = xmac_stats->port_stats[k].rx_l2_mgmt_discard;
450  *ptr++ = xmac_stats->port_stats[k].rx_rts_discard;
451  *ptr++ = xmac_stats->port_stats[k].rx_trash_discard;
452  *ptr++ = xmac_stats->port_stats[k].rx_buff_full_discard;
453  *ptr++ = xmac_stats->port_stats[k].rx_red_discard;
454  *ptr++ = xmac_stats->port_stats[k].rx_xgmii_ctrl_err_cnt;
455  *ptr++ = xmac_stats->port_stats[k].rx_xgmii_data_err_cnt;
456  *ptr++ = xmac_stats->port_stats[k].rx_xgmii_char1_match;
457  *ptr++ = xmac_stats->port_stats[k].rx_xgmii_err_sym;
458  *ptr++ = xmac_stats->port_stats[k].rx_xgmii_column1_match;
459  *ptr++ = xmac_stats->port_stats[k].rx_xgmii_char2_match;
460  *ptr++ = xmac_stats->port_stats[k].rx_local_fault;
461  *ptr++ = xmac_stats->port_stats[k].rx_xgmii_column2_match;
462  *ptr++ = xmac_stats->port_stats[k].rx_jettison;
463  *ptr++ = xmac_stats->port_stats[k].rx_remote_fault;
464  }
465 
466  *ptr++ = 0;
467  for (k = 0; k < vdev->no_of_vpath; k++) {
468  struct vxge_hw_vpath_stats_sw_info *vpath_info;
469 
470  vpath = &vdev->vpaths[k];
471  j = vpath->device_id;
472  vpath_info = (struct vxge_hw_vpath_stats_sw_info *)
473  &sw_stats->vpath_info[j];
474  *ptr++ = vpath_info->soft_reset_cnt;
475  *ptr++ = vpath_info->error_stats.unknown_alarms;
476  *ptr++ = vpath_info->error_stats.network_sustained_fault;
477  *ptr++ = vpath_info->error_stats.network_sustained_ok;
478  *ptr++ = vpath_info->error_stats.kdfcctl_fifo0_overwrite;
479  *ptr++ = vpath_info->error_stats.kdfcctl_fifo0_poison;
480  *ptr++ = vpath_info->error_stats.kdfcctl_fifo0_dma_error;
481  *ptr++ = vpath_info->error_stats.dblgen_fifo0_overflow;
482  *ptr++ = vpath_info->error_stats.statsb_pif_chain_error;
483  *ptr++ = vpath_info->error_stats.statsb_drop_timeout;
484  *ptr++ = vpath_info->error_stats.target_illegal_access;
485  *ptr++ = vpath_info->error_stats.ini_serr_det;
486  *ptr++ = vpath_info->error_stats.prc_ring_bumps;
487  *ptr++ = vpath_info->error_stats.prc_rxdcm_sc_err;
488  *ptr++ = vpath_info->error_stats.prc_rxdcm_sc_abort;
489  *ptr++ = vpath_info->error_stats.prc_quanta_size_err;
490  *ptr++ = vpath_info->ring_stats.common_stats.full_cnt;
491  *ptr++ = vpath_info->ring_stats.common_stats.usage_cnt;
492  *ptr++ = vpath_info->ring_stats.common_stats.usage_max;
493  *ptr++ = vpath_info->ring_stats.common_stats.
494  reserve_free_swaps_cnt;
495  *ptr++ = vpath_info->ring_stats.common_stats.total_compl_cnt;
496  for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++)
497  *ptr++ = vpath_info->ring_stats.rxd_t_code_err_cnt[j];
498  *ptr++ = vpath_info->fifo_stats.common_stats.full_cnt;
499  *ptr++ = vpath_info->fifo_stats.common_stats.usage_cnt;
500  *ptr++ = vpath_info->fifo_stats.common_stats.usage_max;
501  *ptr++ = vpath_info->fifo_stats.common_stats.
502  reserve_free_swaps_cnt;
503  *ptr++ = vpath_info->fifo_stats.common_stats.total_compl_cnt;
504  *ptr++ = vpath_info->fifo_stats.total_posts;
505  *ptr++ = vpath_info->fifo_stats.total_buffers;
506  for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++)
507  *ptr++ = vpath_info->fifo_stats.txd_t_code_err_cnt[j];
508  }
509 
510  *ptr++ = 0;
511  for (k = 0; k < vdev->no_of_vpath; k++) {
512  struct vxge_hw_vpath_stats_hw_info *vpath_info;
513  vpath = &vdev->vpaths[k];
514  j = vpath->device_id;
515  vpath_info = hw_stats->vpath_info[j];
516  if (!vpath_info) {
517  memset(ptr, 0, VXGE_HW_VPATH_STATS_LEN * sizeof(u64));
519  continue;
520  }
521  *ptr++ = vpath_info->ini_num_mwr_sent;
522  *ptr++ = vpath_info->ini_num_mrd_sent;
523  *ptr++ = vpath_info->ini_num_cpl_rcvd;
524  *ptr++ = vpath_info->ini_num_mwr_byte_sent;
525  *ptr++ = vpath_info->ini_num_cpl_byte_rcvd;
526  *ptr++ = vpath_info->wrcrdtarb_xoff;
527  *ptr++ = vpath_info->rdcrdtarb_xoff;
528  *ptr++ = vpath_info->vpath_genstats_count0;
529  *ptr++ = vpath_info->vpath_genstats_count1;
530  *ptr++ = vpath_info->vpath_genstats_count2;
531  *ptr++ = vpath_info->vpath_genstats_count3;
532  *ptr++ = vpath_info->vpath_genstats_count4;
533  *ptr++ = vpath_info->vpath_genstats_count5;
534  *ptr++ = vpath_info->prog_event_vnum0;
535  *ptr++ = vpath_info->prog_event_vnum1;
536  *ptr++ = vpath_info->prog_event_vnum2;
537  *ptr++ = vpath_info->prog_event_vnum3;
538  *ptr++ = vpath_info->rx_multi_cast_frame_discard;
539  *ptr++ = vpath_info->rx_frm_transferred;
540  *ptr++ = vpath_info->rxd_returned;
541  *ptr++ = vpath_info->rx_mpa_len_fail_frms;
542  *ptr++ = vpath_info->rx_mpa_mrk_fail_frms;
543  *ptr++ = vpath_info->rx_mpa_crc_fail_frms;
544  *ptr++ = vpath_info->rx_permitted_frms;
545  *ptr++ = vpath_info->rx_vp_reset_discarded_frms;
546  *ptr++ = vpath_info->rx_wol_frms;
547  *ptr++ = vpath_info->tx_vp_reset_discarded_frms;
548  }
549 
550  *ptr++ = 0;
551  *ptr++ = vdev->stats.vpaths_open;
552  *ptr++ = vdev->stats.vpath_open_fail;
553  *ptr++ = vdev->stats.link_up;
554  *ptr++ = vdev->stats.link_down;
555 
556  for (k = 0; k < vdev->no_of_vpath; k++) {
557  *ptr += vdev->vpaths[k].fifo.stats.tx_frms;
558  *(ptr + 1) += vdev->vpaths[k].fifo.stats.tx_errors;
559  *(ptr + 2) += vdev->vpaths[k].fifo.stats.tx_bytes;
560  *(ptr + 3) += vdev->vpaths[k].fifo.stats.txd_not_free;
561  *(ptr + 4) += vdev->vpaths[k].fifo.stats.txd_out_of_desc;
562  *(ptr + 5) += vdev->vpaths[k].ring.stats.rx_frms;
563  *(ptr + 6) += vdev->vpaths[k].ring.stats.rx_errors;
564  *(ptr + 7) += vdev->vpaths[k].ring.stats.rx_bytes;
565  *(ptr + 8) += vdev->vpaths[k].ring.stats.rx_mcast;
566  *(ptr + 9) += vdev->vpaths[k].fifo.stats.pci_map_fail +
567  vdev->vpaths[k].ring.stats.pci_map_fail;
568  *(ptr + 10) += vdev->vpaths[k].ring.stats.skb_alloc_fail;
569  }
570 
571  ptr += 12;
572 
573  kfree(xmac_stats);
574  kfree(sw_stats);
575  kfree(hw_stats);
576 }
577 
578 static void vxge_ethtool_get_strings(struct net_device *dev, u32 stringset,
579  u8 *data)
580 {
581  int stat_size = 0;
582  int i, j;
583  struct vxgedev *vdev = netdev_priv(dev);
584  switch (stringset) {
585  case ETH_SS_STATS:
586  vxge_add_string("VPATH STATISTICS%s\t\t\t",
587  &stat_size, data, "");
588  for (i = 0; i < vdev->no_of_vpath; i++) {
589  vxge_add_string("tx_ttl_eth_frms_%d\t\t\t",
590  &stat_size, data, i);
591  vxge_add_string("tx_ttl_eth_octects_%d\t\t",
592  &stat_size, data, i);
593  vxge_add_string("tx_data_octects_%d\t\t\t",
594  &stat_size, data, i);
595  vxge_add_string("tx_mcast_frms_%d\t\t\t",
596  &stat_size, data, i);
597  vxge_add_string("tx_bcast_frms_%d\t\t\t",
598  &stat_size, data, i);
599  vxge_add_string("tx_ucast_frms_%d\t\t\t",
600  &stat_size, data, i);
601  vxge_add_string("tx_tagged_frms_%d\t\t\t",
602  &stat_size, data, i);
603  vxge_add_string("tx_vld_ip_%d\t\t\t",
604  &stat_size, data, i);
605  vxge_add_string("tx_vld_ip_octects_%d\t\t",
606  &stat_size, data, i);
607  vxge_add_string("tx_icmp_%d\t\t\t\t",
608  &stat_size, data, i);
609  vxge_add_string("tx_tcp_%d\t\t\t\t",
610  &stat_size, data, i);
611  vxge_add_string("tx_rst_tcp_%d\t\t\t",
612  &stat_size, data, i);
613  vxge_add_string("tx_udp_%d\t\t\t\t",
614  &stat_size, data, i);
615  vxge_add_string("tx_unknown_proto_%d\t\t\t",
616  &stat_size, data, i);
617  vxge_add_string("tx_lost_ip_%d\t\t\t",
618  &stat_size, data, i);
619  vxge_add_string("tx_parse_error_%d\t\t\t",
620  &stat_size, data, i);
621  vxge_add_string("tx_tcp_offload_%d\t\t\t",
622  &stat_size, data, i);
623  vxge_add_string("tx_retx_tcp_offload_%d\t\t",
624  &stat_size, data, i);
625  vxge_add_string("tx_lost_ip_offload_%d\t\t",
626  &stat_size, data, i);
627  vxge_add_string("rx_ttl_eth_frms_%d\t\t\t",
628  &stat_size, data, i);
629  vxge_add_string("rx_vld_frms_%d\t\t\t",
630  &stat_size, data, i);
631  vxge_add_string("rx_offload_frms_%d\t\t\t",
632  &stat_size, data, i);
633  vxge_add_string("rx_ttl_eth_octects_%d\t\t",
634  &stat_size, data, i);
635  vxge_add_string("rx_data_octects_%d\t\t\t",
636  &stat_size, data, i);
637  vxge_add_string("rx_offload_octects_%d\t\t",
638  &stat_size, data, i);
639  vxge_add_string("rx_vld_mcast_frms_%d\t\t",
640  &stat_size, data, i);
641  vxge_add_string("rx_vld_bcast_frms_%d\t\t",
642  &stat_size, data, i);
643  vxge_add_string("rx_accepted_ucast_frms_%d\t\t",
644  &stat_size, data, i);
645  vxge_add_string("rx_accepted_nucast_frms_%d\t\t",
646  &stat_size, data, i);
647  vxge_add_string("rx_tagged_frms_%d\t\t\t",
648  &stat_size, data, i);
649  vxge_add_string("rx_long_frms_%d\t\t\t",
650  &stat_size, data, i);
651  vxge_add_string("rx_usized_frms_%d\t\t\t",
652  &stat_size, data, i);
653  vxge_add_string("rx_osized_frms_%d\t\t\t",
654  &stat_size, data, i);
655  vxge_add_string("rx_frag_frms_%d\t\t\t",
656  &stat_size, data, i);
657  vxge_add_string("rx_jabber_frms_%d\t\t\t",
658  &stat_size, data, i);
659  vxge_add_string("rx_ttl_64_frms_%d\t\t\t",
660  &stat_size, data, i);
661  vxge_add_string("rx_ttl_65_127_frms_%d\t\t",
662  &stat_size, data, i);
663  vxge_add_string("rx_ttl_128_255_frms_%d\t\t",
664  &stat_size, data, i);
665  vxge_add_string("rx_ttl_256_511_frms_%d\t\t",
666  &stat_size, data, i);
667  vxge_add_string("rx_ttl_512_1023_frms_%d\t\t",
668  &stat_size, data, i);
669  vxge_add_string("rx_ttl_1024_1518_frms_%d\t\t",
670  &stat_size, data, i);
671  vxge_add_string("rx_ttl_1519_4095_frms_%d\t\t",
672  &stat_size, data, i);
673  vxge_add_string("rx_ttl_4096_8191_frms_%d\t\t",
674  &stat_size, data, i);
675  vxge_add_string("rx_ttl_8192_max_frms_%d\t\t",
676  &stat_size, data, i);
677  vxge_add_string("rx_ttl_gt_max_frms_%d\t\t",
678  &stat_size, data, i);
679  vxge_add_string("rx_ip%d\t\t\t\t",
680  &stat_size, data, i);
681  vxge_add_string("rx_accepted_ip_%d\t\t\t",
682  &stat_size, data, i);
683  vxge_add_string("rx_ip_octects_%d\t\t\t",
684  &stat_size, data, i);
685  vxge_add_string("rx_err_ip_%d\t\t\t",
686  &stat_size, data, i);
687  vxge_add_string("rx_icmp_%d\t\t\t\t",
688  &stat_size, data, i);
689  vxge_add_string("rx_tcp_%d\t\t\t\t",
690  &stat_size, data, i);
691  vxge_add_string("rx_udp_%d\t\t\t\t",
692  &stat_size, data, i);
693  vxge_add_string("rx_err_tcp_%d\t\t\t",
694  &stat_size, data, i);
695  vxge_add_string("rx_lost_frms_%d\t\t\t",
696  &stat_size, data, i);
697  vxge_add_string("rx_lost_ip_%d\t\t\t",
698  &stat_size, data, i);
699  vxge_add_string("rx_lost_ip_offload_%d\t\t",
700  &stat_size, data, i);
701  vxge_add_string("rx_various_discard_%d\t\t",
702  &stat_size, data, i);
703  vxge_add_string("rx_sleep_discard_%d\t\t\t",
704  &stat_size, data, i);
705  vxge_add_string("rx_red_discard_%d\t\t\t",
706  &stat_size, data, i);
707  vxge_add_string("rx_queue_full_discard_%d\t\t",
708  &stat_size, data, i);
709  vxge_add_string("rx_mpa_ok_frms_%d\t\t\t",
710  &stat_size, data, i);
711  }
712 
713  vxge_add_string("\nAGGR STATISTICS%s\t\t\t\t",
714  &stat_size, data, "");
715  for (i = 0; i < vdev->max_config_port; i++) {
716  vxge_add_string("tx_frms_%d\t\t\t\t",
717  &stat_size, data, i);
718  vxge_add_string("tx_data_octects_%d\t\t\t",
719  &stat_size, data, i);
720  vxge_add_string("tx_mcast_frms_%d\t\t\t",
721  &stat_size, data, i);
722  vxge_add_string("tx_bcast_frms_%d\t\t\t",
723  &stat_size, data, i);
724  vxge_add_string("tx_discarded_frms_%d\t\t",
725  &stat_size, data, i);
726  vxge_add_string("tx_errored_frms_%d\t\t\t",
727  &stat_size, data, i);
728  vxge_add_string("rx_frms_%d\t\t\t\t",
729  &stat_size, data, i);
730  vxge_add_string("rx_data_octects_%d\t\t\t",
731  &stat_size, data, i);
732  vxge_add_string("rx_mcast_frms_%d\t\t\t",
733  &stat_size, data, i);
734  vxge_add_string("rx_bcast_frms_%d\t\t\t",
735  &stat_size, data, i);
736  vxge_add_string("rx_discarded_frms_%d\t\t",
737  &stat_size, data, i);
738  vxge_add_string("rx_errored_frms_%d\t\t\t",
739  &stat_size, data, i);
740  vxge_add_string("rx_unknown_slow_proto_frms_%d\t",
741  &stat_size, data, i);
742  }
743 
744  vxge_add_string("\nPORT STATISTICS%s\t\t\t\t",
745  &stat_size, data, "");
746  for (i = 0; i < vdev->max_config_port; i++) {
747  vxge_add_string("tx_ttl_frms_%d\t\t\t",
748  &stat_size, data, i);
749  vxge_add_string("tx_ttl_octects_%d\t\t\t",
750  &stat_size, data, i);
751  vxge_add_string("tx_data_octects_%d\t\t\t",
752  &stat_size, data, i);
753  vxge_add_string("tx_mcast_frms_%d\t\t\t",
754  &stat_size, data, i);
755  vxge_add_string("tx_bcast_frms_%d\t\t\t",
756  &stat_size, data, i);
757  vxge_add_string("tx_ucast_frms_%d\t\t\t",
758  &stat_size, data, i);
759  vxge_add_string("tx_tagged_frms_%d\t\t\t",
760  &stat_size, data, i);
761  vxge_add_string("tx_vld_ip_%d\t\t\t",
762  &stat_size, data, i);
763  vxge_add_string("tx_vld_ip_octects_%d\t\t",
764  &stat_size, data, i);
765  vxge_add_string("tx_icmp_%d\t\t\t\t",
766  &stat_size, data, i);
767  vxge_add_string("tx_tcp_%d\t\t\t\t",
768  &stat_size, data, i);
769  vxge_add_string("tx_rst_tcp_%d\t\t\t",
770  &stat_size, data, i);
771  vxge_add_string("tx_udp_%d\t\t\t\t",
772  &stat_size, data, i);
773  vxge_add_string("tx_parse_error_%d\t\t\t",
774  &stat_size, data, i);
775  vxge_add_string("tx_unknown_protocol_%d\t\t",
776  &stat_size, data, i);
777  vxge_add_string("tx_pause_ctrl_frms_%d\t\t",
778  &stat_size, data, i);
779  vxge_add_string("tx_marker_pdu_frms_%d\t\t",
780  &stat_size, data, i);
781  vxge_add_string("tx_lacpdu_frms_%d\t\t\t",
782  &stat_size, data, i);
783  vxge_add_string("tx_drop_ip_%d\t\t\t",
784  &stat_size, data, i);
785  vxge_add_string("tx_marker_resp_pdu_frms_%d\t\t",
786  &stat_size, data, i);
787  vxge_add_string("tx_xgmii_char2_match_%d\t\t",
788  &stat_size, data, i);
789  vxge_add_string("tx_xgmii_char1_match_%d\t\t",
790  &stat_size, data, i);
791  vxge_add_string("tx_xgmii_column2_match_%d\t\t",
792  &stat_size, data, i);
793  vxge_add_string("tx_xgmii_column1_match_%d\t\t",
794  &stat_size, data, i);
795  vxge_add_string("tx_any_err_frms_%d\t\t\t",
796  &stat_size, data, i);
797  vxge_add_string("tx_drop_frms_%d\t\t\t",
798  &stat_size, data, i);
799  vxge_add_string("rx_ttl_frms_%d\t\t\t",
800  &stat_size, data, i);
801  vxge_add_string("rx_vld_frms_%d\t\t\t",
802  &stat_size, data, i);
803  vxge_add_string("rx_offload_frms_%d\t\t\t",
804  &stat_size, data, i);
805  vxge_add_string("rx_ttl_octects_%d\t\t\t",
806  &stat_size, data, i);
807  vxge_add_string("rx_data_octects_%d\t\t\t",
808  &stat_size, data, i);
809  vxge_add_string("rx_offload_octects_%d\t\t",
810  &stat_size, data, i);
811  vxge_add_string("rx_vld_mcast_frms_%d\t\t",
812  &stat_size, data, i);
813  vxge_add_string("rx_vld_bcast_frms_%d\t\t",
814  &stat_size, data, i);
815  vxge_add_string("rx_accepted_ucast_frms_%d\t\t",
816  &stat_size, data, i);
817  vxge_add_string("rx_accepted_nucast_frms_%d\t\t",
818  &stat_size, data, i);
819  vxge_add_string("rx_tagged_frms_%d\t\t\t",
820  &stat_size, data, i);
821  vxge_add_string("rx_long_frms_%d\t\t\t",
822  &stat_size, data, i);
823  vxge_add_string("rx_usized_frms_%d\t\t\t",
824  &stat_size, data, i);
825  vxge_add_string("rx_osized_frms_%d\t\t\t",
826  &stat_size, data, i);
827  vxge_add_string("rx_frag_frms_%d\t\t\t",
828  &stat_size, data, i);
829  vxge_add_string("rx_jabber_frms_%d\t\t\t",
830  &stat_size, data, i);
831  vxge_add_string("rx_ttl_64_frms_%d\t\t\t",
832  &stat_size, data, i);
833  vxge_add_string("rx_ttl_65_127_frms_%d\t\t",
834  &stat_size, data, i);
835  vxge_add_string("rx_ttl_128_255_frms_%d\t\t",
836  &stat_size, data, i);
837  vxge_add_string("rx_ttl_256_511_frms_%d\t\t",
838  &stat_size, data, i);
839  vxge_add_string("rx_ttl_512_1023_frms_%d\t\t",
840  &stat_size, data, i);
841  vxge_add_string("rx_ttl_1024_1518_frms_%d\t\t",
842  &stat_size, data, i);
843  vxge_add_string("rx_ttl_1519_4095_frms_%d\t\t",
844  &stat_size, data, i);
845  vxge_add_string("rx_ttl_4096_8191_frms_%d\t\t",
846  &stat_size, data, i);
847  vxge_add_string("rx_ttl_8192_max_frms_%d\t\t",
848  &stat_size, data, i);
849  vxge_add_string("rx_ttl_gt_max_frms_%d\t\t",
850  &stat_size, data, i);
851  vxge_add_string("rx_ip_%d\t\t\t\t",
852  &stat_size, data, i);
853  vxge_add_string("rx_accepted_ip_%d\t\t\t",
854  &stat_size, data, i);
855  vxge_add_string("rx_ip_octets_%d\t\t\t",
856  &stat_size, data, i);
857  vxge_add_string("rx_err_ip_%d\t\t\t",
858  &stat_size, data, i);
859  vxge_add_string("rx_icmp_%d\t\t\t\t",
860  &stat_size, data, i);
861  vxge_add_string("rx_tcp_%d\t\t\t\t",
862  &stat_size, data, i);
863  vxge_add_string("rx_udp_%d\t\t\t\t",
864  &stat_size, data, i);
865  vxge_add_string("rx_err_tcp_%d\t\t\t",
866  &stat_size, data, i);
867  vxge_add_string("rx_pause_count_%d\t\t\t",
868  &stat_size, data, i);
869  vxge_add_string("rx_pause_ctrl_frms_%d\t\t",
870  &stat_size, data, i);
871  vxge_add_string("rx_unsup_ctrl_frms_%d\t\t",
872  &stat_size, data, i);
873  vxge_add_string("rx_fcs_err_frms_%d\t\t\t",
874  &stat_size, data, i);
875  vxge_add_string("rx_in_rng_len_err_frms_%d\t\t",
876  &stat_size, data, i);
877  vxge_add_string("rx_out_rng_len_err_frms_%d\t\t",
878  &stat_size, data, i);
879  vxge_add_string("rx_drop_frms_%d\t\t\t",
880  &stat_size, data, i);
881  vxge_add_string("rx_discard_frms_%d\t\t\t",
882  &stat_size, data, i);
883  vxge_add_string("rx_drop_ip_%d\t\t\t",
884  &stat_size, data, i);
885  vxge_add_string("rx_drop_udp_%d\t\t\t",
886  &stat_size, data, i);
887  vxge_add_string("rx_marker_pdu_frms_%d\t\t",
888  &stat_size, data, i);
889  vxge_add_string("rx_lacpdu_frms_%d\t\t\t",
890  &stat_size, data, i);
891  vxge_add_string("rx_unknown_pdu_frms_%d\t\t",
892  &stat_size, data, i);
893  vxge_add_string("rx_marker_resp_pdu_frms_%d\t\t",
894  &stat_size, data, i);
895  vxge_add_string("rx_fcs_discard_%d\t\t\t",
896  &stat_size, data, i);
897  vxge_add_string("rx_illegal_pdu_frms_%d\t\t",
898  &stat_size, data, i);
899  vxge_add_string("rx_switch_discard_%d\t\t",
900  &stat_size, data, i);
901  vxge_add_string("rx_len_discard_%d\t\t\t",
902  &stat_size, data, i);
903  vxge_add_string("rx_rpa_discard_%d\t\t\t",
904  &stat_size, data, i);
905  vxge_add_string("rx_l2_mgmt_discard_%d\t\t",
906  &stat_size, data, i);
907  vxge_add_string("rx_rts_discard_%d\t\t\t",
908  &stat_size, data, i);
909  vxge_add_string("rx_trash_discard_%d\t\t\t",
910  &stat_size, data, i);
911  vxge_add_string("rx_buff_full_discard_%d\t\t",
912  &stat_size, data, i);
913  vxge_add_string("rx_red_discard_%d\t\t\t",
914  &stat_size, data, i);
915  vxge_add_string("rx_xgmii_ctrl_err_cnt_%d\t\t",
916  &stat_size, data, i);
917  vxge_add_string("rx_xgmii_data_err_cnt_%d\t\t",
918  &stat_size, data, i);
919  vxge_add_string("rx_xgmii_char1_match_%d\t\t",
920  &stat_size, data, i);
921  vxge_add_string("rx_xgmii_err_sym_%d\t\t\t",
922  &stat_size, data, i);
923  vxge_add_string("rx_xgmii_column1_match_%d\t\t",
924  &stat_size, data, i);
925  vxge_add_string("rx_xgmii_char2_match_%d\t\t",
926  &stat_size, data, i);
927  vxge_add_string("rx_local_fault_%d\t\t\t",
928  &stat_size, data, i);
929  vxge_add_string("rx_xgmii_column2_match_%d\t\t",
930  &stat_size, data, i);
931  vxge_add_string("rx_jettison_%d\t\t\t",
932  &stat_size, data, i);
933  vxge_add_string("rx_remote_fault_%d\t\t\t",
934  &stat_size, data, i);
935  }
936 
937  vxge_add_string("\n SOFTWARE STATISTICS%s\t\t\t",
938  &stat_size, data, "");
939  for (i = 0; i < vdev->no_of_vpath; i++) {
940  vxge_add_string("soft_reset_cnt_%d\t\t\t",
941  &stat_size, data, i);
942  vxge_add_string("unknown_alarms_%d\t\t\t",
943  &stat_size, data, i);
944  vxge_add_string("network_sustained_fault_%d\t\t",
945  &stat_size, data, i);
946  vxge_add_string("network_sustained_ok_%d\t\t",
947  &stat_size, data, i);
948  vxge_add_string("kdfcctl_fifo0_overwrite_%d\t\t",
949  &stat_size, data, i);
950  vxge_add_string("kdfcctl_fifo0_poison_%d\t\t",
951  &stat_size, data, i);
952  vxge_add_string("kdfcctl_fifo0_dma_error_%d\t\t",
953  &stat_size, data, i);
954  vxge_add_string("dblgen_fifo0_overflow_%d\t\t",
955  &stat_size, data, i);
956  vxge_add_string("statsb_pif_chain_error_%d\t\t",
957  &stat_size, data, i);
958  vxge_add_string("statsb_drop_timeout_%d\t\t",
959  &stat_size, data, i);
960  vxge_add_string("target_illegal_access_%d\t\t",
961  &stat_size, data, i);
962  vxge_add_string("ini_serr_det_%d\t\t\t",
963  &stat_size, data, i);
964  vxge_add_string("prc_ring_bumps_%d\t\t\t",
965  &stat_size, data, i);
966  vxge_add_string("prc_rxdcm_sc_err_%d\t\t\t",
967  &stat_size, data, i);
968  vxge_add_string("prc_rxdcm_sc_abort_%d\t\t",
969  &stat_size, data, i);
970  vxge_add_string("prc_quanta_size_err_%d\t\t",
971  &stat_size, data, i);
972  vxge_add_string("ring_full_cnt_%d\t\t\t",
973  &stat_size, data, i);
974  vxge_add_string("ring_usage_cnt_%d\t\t\t",
975  &stat_size, data, i);
976  vxge_add_string("ring_usage_max_%d\t\t\t",
977  &stat_size, data, i);
978  vxge_add_string("ring_reserve_free_swaps_cnt_%d\t",
979  &stat_size, data, i);
980  vxge_add_string("ring_total_compl_cnt_%d\t\t",
981  &stat_size, data, i);
982  for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++)
983  vxge_add_string("rxd_t_code_err_cnt%d_%d\t\t",
984  &stat_size, data, j, i);
985  vxge_add_string("fifo_full_cnt_%d\t\t\t",
986  &stat_size, data, i);
987  vxge_add_string("fifo_usage_cnt_%d\t\t\t",
988  &stat_size, data, i);
989  vxge_add_string("fifo_usage_max_%d\t\t\t",
990  &stat_size, data, i);
991  vxge_add_string("fifo_reserve_free_swaps_cnt_%d\t",
992  &stat_size, data, i);
993  vxge_add_string("fifo_total_compl_cnt_%d\t\t",
994  &stat_size, data, i);
995  vxge_add_string("fifo_total_posts_%d\t\t\t",
996  &stat_size, data, i);
997  vxge_add_string("fifo_total_buffers_%d\t\t",
998  &stat_size, data, i);
999  for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++)
1000  vxge_add_string("txd_t_code_err_cnt%d_%d\t\t",
1001  &stat_size, data, j, i);
1002  }
1003 
1004  vxge_add_string("\n HARDWARE STATISTICS%s\t\t\t",
1005  &stat_size, data, "");
1006  for (i = 0; i < vdev->no_of_vpath; i++) {
1007  vxge_add_string("ini_num_mwr_sent_%d\t\t\t",
1008  &stat_size, data, i);
1009  vxge_add_string("ini_num_mrd_sent_%d\t\t\t",
1010  &stat_size, data, i);
1011  vxge_add_string("ini_num_cpl_rcvd_%d\t\t\t",
1012  &stat_size, data, i);
1013  vxge_add_string("ini_num_mwr_byte_sent_%d\t\t",
1014  &stat_size, data, i);
1015  vxge_add_string("ini_num_cpl_byte_rcvd_%d\t\t",
1016  &stat_size, data, i);
1017  vxge_add_string("wrcrdtarb_xoff_%d\t\t\t",
1018  &stat_size, data, i);
1019  vxge_add_string("rdcrdtarb_xoff_%d\t\t\t",
1020  &stat_size, data, i);
1021  vxge_add_string("vpath_genstats_count0_%d\t\t",
1022  &stat_size, data, i);
1023  vxge_add_string("vpath_genstats_count1_%d\t\t",
1024  &stat_size, data, i);
1025  vxge_add_string("vpath_genstats_count2_%d\t\t",
1026  &stat_size, data, i);
1027  vxge_add_string("vpath_genstats_count3_%d\t\t",
1028  &stat_size, data, i);
1029  vxge_add_string("vpath_genstats_count4_%d\t\t",
1030  &stat_size, data, i);
1031  vxge_add_string("vpath_genstats_count5_%d\t\t",
1032  &stat_size, data, i);
1033  vxge_add_string("prog_event_vnum0_%d\t\t\t",
1034  &stat_size, data, i);
1035  vxge_add_string("prog_event_vnum1_%d\t\t\t",
1036  &stat_size, data, i);
1037  vxge_add_string("prog_event_vnum2_%d\t\t\t",
1038  &stat_size, data, i);
1039  vxge_add_string("prog_event_vnum3_%d\t\t\t",
1040  &stat_size, data, i);
1041  vxge_add_string("rx_multi_cast_frame_discard_%d\t",
1042  &stat_size, data, i);
1043  vxge_add_string("rx_frm_transferred_%d\t\t",
1044  &stat_size, data, i);
1045  vxge_add_string("rxd_returned_%d\t\t\t",
1046  &stat_size, data, i);
1047  vxge_add_string("rx_mpa_len_fail_frms_%d\t\t",
1048  &stat_size, data, i);
1049  vxge_add_string("rx_mpa_mrk_fail_frms_%d\t\t",
1050  &stat_size, data, i);
1051  vxge_add_string("rx_mpa_crc_fail_frms_%d\t\t",
1052  &stat_size, data, i);
1053  vxge_add_string("rx_permitted_frms_%d\t\t",
1054  &stat_size, data, i);
1055  vxge_add_string("rx_vp_reset_discarded_frms_%d\t",
1056  &stat_size, data, i);
1057  vxge_add_string("rx_wol_frms_%d\t\t\t",
1058  &stat_size, data, i);
1059  vxge_add_string("tx_vp_reset_discarded_frms_%d\t",
1060  &stat_size, data, i);
1061  }
1062 
1063  memcpy(data + stat_size, &ethtool_driver_stats_keys,
1064  sizeof(ethtool_driver_stats_keys));
1065  }
1066 }
1067 
1068 static int vxge_ethtool_get_regs_len(struct net_device *dev)
1069 {
1070  struct vxgedev *vdev = netdev_priv(dev);
1071 
1072  return sizeof(struct vxge_hw_vpath_reg) * vdev->no_of_vpath;
1073 }
1074 
1075 static int vxge_ethtool_get_sset_count(struct net_device *dev, int sset)
1076 {
1077  struct vxgedev *vdev = netdev_priv(dev);
1078 
1079  switch (sset) {
1080  case ETH_SS_STATS:
1081  return VXGE_TITLE_LEN +
1087  (vdev->no_of_vpath * VXGE_SW_STATS_LEN) +
1089  default:
1090  return -EOPNOTSUPP;
1091  }
1092 }
1093 
1094 static int vxge_fw_flash(struct net_device *dev, struct ethtool_flash *parms)
1095 {
1096  struct vxgedev *vdev = netdev_priv(dev);
1097 
1099  printk(KERN_INFO "Single Function Mode is required to flash the"
1100  " firmware\n");
1101  return -EINVAL;
1102  }
1103 
1104  if (netif_running(dev)) {
1105  printk(KERN_INFO "Interface %s must be down to flash the "
1106  "firmware\n", dev->name);
1107  return -EBUSY;
1108  }
1109 
1110  return vxge_fw_upgrade(vdev, parms->data, 1);
1111 }
1112 
1113 static const struct ethtool_ops vxge_ethtool_ops = {
1114  .get_settings = vxge_ethtool_gset,
1115  .set_settings = vxge_ethtool_sset,
1116  .get_drvinfo = vxge_ethtool_gdrvinfo,
1117  .get_regs_len = vxge_ethtool_get_regs_len,
1118  .get_regs = vxge_ethtool_gregs,
1119  .get_link = ethtool_op_get_link,
1120  .get_pauseparam = vxge_ethtool_getpause_data,
1121  .set_pauseparam = vxge_ethtool_setpause_data,
1122  .get_strings = vxge_ethtool_get_strings,
1123  .set_phys_id = vxge_ethtool_idnic,
1124  .get_sset_count = vxge_ethtool_get_sset_count,
1125  .get_ethtool_stats = vxge_get_ethtool_stats,
1126  .flash_device = vxge_fw_flash,
1127 };
1128 
1130 {
1131  SET_ETHTOOL_OPS(ndev, &vxge_ethtool_ops);
1132 }