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