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.
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>
19 #include "vxge-ethtool.h"
21 static const char ethtool_driver_stats_keys
[][ETH_GSTRING_LEN
] = {
22 {"\n DRIVER STATISTICS"},
24 {"vpath_open_fail_cnt"},
37 {"skb_alloc_fail_cnt"}
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
46 * The function sets different link parameters provided by the user onto
52 vxge_ethtool_set_link_ksettings(struct net_device
*dev
,
53 const struct ethtool_link_ksettings
*cmd
)
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
))
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.
70 * Returns link specific information like speed, duplex etc.. to ethtool.
72 * return 0 on success.
74 static int vxge_ethtool_get_link_ksettings(struct net_device
*dev
,
75 struct ethtool_link_ksettings
*cmd
)
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
);
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
);
85 cmd
->base
.port
= PORT_FIBRE
;
87 if (netif_carrier_ok(dev
)) {
88 cmd
->base
.speed
= SPEED_10000
;
89 cmd
->base
.duplex
= DUPLEX_FULL
;
91 cmd
->base
.speed
= SPEED_UNKNOWN
;
92 cmd
->base
.duplex
= DUPLEX_UNKNOWN
;
95 cmd
->base
.autoneg
= AUTONEG_DISABLE
;
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.
105 * Returns driver specefic information like name, version etc.. to ethtool.
107 static void vxge_ethtool_gdrvinfo(struct net_device
*dev
,
108 struct ethtool_drvinfo
*info
)
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
));
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.
124 * Dumps the vpath register space of Titan NIC into the user given
127 static void vxge_ethtool_gregs(struct net_device
*dev
,
128 struct ethtool_regs
*regs
, void *space
)
131 enum vxge_hw_status status
;
133 u64
*reg_space
= (u64
*)space
;
134 struct vxgedev
*vdev
= netdev_priv(dev
);
135 struct __vxge_hw_device
*hldev
= vdev
->devh
;
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
);
142 status
= vxge_hw_mgmt_reg_read(hldev
,
143 vxge_hw_mgmt_reg_type_vpath
,
144 vdev
->vpaths
[index
].device_id
,
146 if (status
!= VXGE_HW_OK
) {
147 vxge_debug_init(VXGE_ERR
,
148 "%s:%d Getting reg dump Failed",
158 * vxge_ethtool_idnic - To physically identify the nic on the system.
159 * @dev : device pointer.
160 * @state : requested LED state
162 * Used to physically identify the NIC on the system.
165 static int vxge_ethtool_idnic(struct net_device
*dev
,
166 enum ethtool_phys_id_state state
)
168 struct vxgedev
*vdev
= netdev_priv(dev
);
169 struct __vxge_hw_device
*hldev
= vdev
->devh
;
172 case ETHTOOL_ID_ACTIVE
:
173 vxge_hw_device_flick_link_led(hldev
, VXGE_FLICKER_ON
);
176 case ETHTOOL_ID_INACTIVE
:
177 vxge_hw_device_flick_link_led(hldev
, VXGE_FLICKER_OFF
);
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.
192 * Returns the Pause frame generation and reception capability of the NIC.
196 static void vxge_ethtool_getpause_data(struct net_device
*dev
,
197 struct ethtool_pauseparam
*ep
)
199 struct vxgedev
*vdev
= netdev_priv(dev
);
200 struct __vxge_hw_device
*hldev
= vdev
->devh
;
202 vxge_hw_device_getpause_data(hldev
, 0, &ep
->tx_pause
, &ep
->rx_pause
);
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.
210 * It can be used to set or reset Pause frame generation or reception
211 * support of the NIC.
213 * int, returns 0 on Success
215 static int vxge_ethtool_setpause_data(struct net_device
*dev
,
216 struct ethtool_pauseparam
*ep
)
218 struct vxgedev
*vdev
= netdev_priv(dev
);
219 struct __vxge_hw_device
*hldev
= vdev
->devh
;
221 vxge_hw_device_setpause_data(hldev
, 0, ep
->tx_pause
, ep
->rx_pause
);
223 vdev
->config
.tx_pause_enable
= ep
->tx_pause
;
224 vdev
->config
.rx_pause_enable
= ep
->rx_pause
;
229 static void vxge_get_ethtool_stats(struct net_device
*dev
,
230 struct ethtool_stats
*estats
, u64
*tmp_stats
)
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
;
242 u64
*ptr
= tmp_stats
;
245 vxge_ethtool_get_sset_count(dev
, ETH_SS_STATS
) * sizeof(u64
));
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",
255 sw_stats
= kzalloc(sizeof(struct vxge_hw_device_stats_sw_info
),
257 if (sw_stats
== NULL
) {
259 vxge_debug_init(VXGE_ERR
,
260 "%s : %d Memory Allocation failed for sw_stats",
265 hw_stats
= kzalloc(sizeof(struct vxge_hw_device_stats_hw_info
),
267 if (hw_stats
== NULL
) {
270 vxge_debug_init(VXGE_ERR
,
271 "%s : %d Memory Allocation failed for hw_stats",
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",
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",
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__
);
298 for (k
= 0; k
< vdev
->no_of_vpath
; k
++) {
299 struct vxge_hw_vpath_stats_hw_info
*vpath_info
;
301 vpath
= &vdev
->vpaths
[k
];
302 j
= vpath
->device_id
;
303 vpath_info
= hw_stats
->vpath_info
[j
];
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
);
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
;
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
;
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
;
489 for (k
= 0; k
< vdev
->no_of_vpath
; k
++) {
490 struct vxge_hw_vpath_stats_sw_info
*vpath_info
;
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
];
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
];
539 memset(ptr
, 0, VXGE_HW_VPATH_STATS_LEN
* sizeof(u64
));
540 ptr
+= VXGE_HW_VPATH_STATS_LEN
;
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
;
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
;
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
;
600 static void vxge_ethtool_get_strings(struct net_device
*dev
, u32 stringset
,
605 struct vxgedev
*vdev
= netdev_priv(dev
);
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
);
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
);
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
);
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
);
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
);
1085 memcpy(data
+ stat_size
, ðtool_driver_stats_keys
,
1086 sizeof(ethtool_driver_stats_keys
));
1090 static int vxge_ethtool_get_regs_len(struct net_device
*dev
)
1092 struct vxgedev
*vdev
= netdev_priv(dev
);
1094 return sizeof(struct vxge_hw_vpath_reg
) * vdev
->no_of_vpath
;
1097 static int vxge_ethtool_get_sset_count(struct net_device
*dev
, int sset
)
1099 struct vxgedev
*vdev
= netdev_priv(dev
);
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
) +
1116 static int vxge_fw_flash(struct net_device
*dev
, struct ethtool_flash
*parms
)
1118 struct vxgedev
*vdev
= netdev_priv(dev
);
1120 if (vdev
->max_vpath_supported
!= VXGE_HW_MAX_VIRTUAL_PATHS
) {
1121 printk(KERN_INFO
"Single Function Mode is required to flash the"
1126 if (netif_running(dev
)) {
1127 printk(KERN_INFO
"Interface %s must be down to flash the "
1128 "firmware\n", dev
->name
);
1132 return vxge_fw_upgrade(vdev
, parms
->data
, 1);
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
,
1151 void vxge_initialize_ethtool_ops(struct net_device
*ndev
)
1153 ndev
->ethtool_ops
= &vxge_ethtool_ops
;