vxge-ethtool.c (42027B)
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 21static 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 */ 51static int 52vxge_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 */ 74static 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 */ 107static 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 * @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 */ 127static 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, ®); 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 */ 165static 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 */ 196static 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 */ 215static 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 229static 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 600static 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, ðtool_driver_stats_keys, 1086 sizeof(ethtool_driver_stats_keys)); 1087 } 1088} 1089 1090static 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 1097static 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 1116static 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 1135static 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 1151void vxge_initialize_ethtool_ops(struct net_device *ndev) 1152{ 1153 ndev->ethtool_ops = &vxge_ethtool_ops; 1154}