Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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