18c2ecf20Sopenharmony_ci/****************************************************************************** 28c2ecf20Sopenharmony_ci * This software may be used and distributed according to the terms of 38c2ecf20Sopenharmony_ci * the GNU General Public License (GPL), incorporated herein by reference. 48c2ecf20Sopenharmony_ci * Drivers based on or derived from this code fall under the GPL and must 58c2ecf20Sopenharmony_ci * retain the authorship, copyright and license notice. This file is not 68c2ecf20Sopenharmony_ci * a complete program and may only be used when the entire operating 78c2ecf20Sopenharmony_ci * system is licensed under the GPL. 88c2ecf20Sopenharmony_ci * See the file COPYING in this distribution for more information. 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * vxge-ethtool.c: Driver for Exar Corp's X3100 Series 10GbE PCIe I/O 118c2ecf20Sopenharmony_ci * Virtualized Server Adapter. 128c2ecf20Sopenharmony_ci * Copyright(c) 2002-2010 Exar Corp. 138c2ecf20Sopenharmony_ci ******************************************************************************/ 148c2ecf20Sopenharmony_ci#include <linux/ethtool.h> 158c2ecf20Sopenharmony_ci#include <linux/slab.h> 168c2ecf20Sopenharmony_ci#include <linux/pci.h> 178c2ecf20Sopenharmony_ci#include <linux/etherdevice.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include "vxge-ethtool.h" 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cistatic const char ethtool_driver_stats_keys[][ETH_GSTRING_LEN] = { 228c2ecf20Sopenharmony_ci {"\n DRIVER STATISTICS"}, 238c2ecf20Sopenharmony_ci {"vpaths_opened"}, 248c2ecf20Sopenharmony_ci {"vpath_open_fail_cnt"}, 258c2ecf20Sopenharmony_ci {"link_up_cnt"}, 268c2ecf20Sopenharmony_ci {"link_down_cnt"}, 278c2ecf20Sopenharmony_ci {"tx_frms"}, 288c2ecf20Sopenharmony_ci {"tx_errors"}, 298c2ecf20Sopenharmony_ci {"tx_bytes"}, 308c2ecf20Sopenharmony_ci {"txd_not_free"}, 318c2ecf20Sopenharmony_ci {"txd_out_of_desc"}, 328c2ecf20Sopenharmony_ci {"rx_frms"}, 338c2ecf20Sopenharmony_ci {"rx_errors"}, 348c2ecf20Sopenharmony_ci {"rx_bytes"}, 358c2ecf20Sopenharmony_ci {"rx_mcast"}, 368c2ecf20Sopenharmony_ci {"pci_map_fail_cnt"}, 378c2ecf20Sopenharmony_ci {"skb_alloc_fail_cnt"} 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci/** 418c2ecf20Sopenharmony_ci * vxge_ethtool_set_link_ksettings - Sets different link parameters. 428c2ecf20Sopenharmony_ci * @dev: device pointer. 438c2ecf20Sopenharmony_ci * @cmd: pointer to the structure with parameters given by ethtool to set 448c2ecf20Sopenharmony_ci * link information. 458c2ecf20Sopenharmony_ci * 468c2ecf20Sopenharmony_ci * The function sets different link parameters provided by the user onto 478c2ecf20Sopenharmony_ci * the NIC. 488c2ecf20Sopenharmony_ci * Return value: 498c2ecf20Sopenharmony_ci * 0 on success. 508c2ecf20Sopenharmony_ci */ 518c2ecf20Sopenharmony_cistatic int 528c2ecf20Sopenharmony_civxge_ethtool_set_link_ksettings(struct net_device *dev, 538c2ecf20Sopenharmony_ci const struct ethtool_link_ksettings *cmd) 548c2ecf20Sopenharmony_ci{ 558c2ecf20Sopenharmony_ci /* We currently only support 10Gb/FULL */ 568c2ecf20Sopenharmony_ci if ((cmd->base.autoneg == AUTONEG_ENABLE) || 578c2ecf20Sopenharmony_ci (cmd->base.speed != SPEED_10000) || 588c2ecf20Sopenharmony_ci (cmd->base.duplex != DUPLEX_FULL)) 598c2ecf20Sopenharmony_ci return -EINVAL; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci return 0; 628c2ecf20Sopenharmony_ci} 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci/** 658c2ecf20Sopenharmony_ci * vxge_ethtool_get_link_ksettings - Return link specific information. 668c2ecf20Sopenharmony_ci * @dev: device pointer. 678c2ecf20Sopenharmony_ci * @cmd: pointer to the structure with parameters given by ethtool 688c2ecf20Sopenharmony_ci * to return link information. 698c2ecf20Sopenharmony_ci * 708c2ecf20Sopenharmony_ci * Returns link specific information like speed, duplex etc.. to ethtool. 718c2ecf20Sopenharmony_ci * Return value : 728c2ecf20Sopenharmony_ci * return 0 on success. 738c2ecf20Sopenharmony_ci */ 748c2ecf20Sopenharmony_cistatic int vxge_ethtool_get_link_ksettings(struct net_device *dev, 758c2ecf20Sopenharmony_ci struct ethtool_link_ksettings *cmd) 768c2ecf20Sopenharmony_ci{ 778c2ecf20Sopenharmony_ci ethtool_link_ksettings_zero_link_mode(cmd, supported); 788c2ecf20Sopenharmony_ci ethtool_link_ksettings_add_link_mode(cmd, supported, 10000baseT_Full); 798c2ecf20Sopenharmony_ci ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE); 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci ethtool_link_ksettings_zero_link_mode(cmd, advertising); 828c2ecf20Sopenharmony_ci ethtool_link_ksettings_add_link_mode(cmd, advertising, 10000baseT_Full); 838c2ecf20Sopenharmony_ci ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE); 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci cmd->base.port = PORT_FIBRE; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci if (netif_carrier_ok(dev)) { 888c2ecf20Sopenharmony_ci cmd->base.speed = SPEED_10000; 898c2ecf20Sopenharmony_ci cmd->base.duplex = DUPLEX_FULL; 908c2ecf20Sopenharmony_ci } else { 918c2ecf20Sopenharmony_ci cmd->base.speed = SPEED_UNKNOWN; 928c2ecf20Sopenharmony_ci cmd->base.duplex = DUPLEX_UNKNOWN; 938c2ecf20Sopenharmony_ci } 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci cmd->base.autoneg = AUTONEG_DISABLE; 968c2ecf20Sopenharmony_ci return 0; 978c2ecf20Sopenharmony_ci} 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci/** 1008c2ecf20Sopenharmony_ci * vxge_ethtool_gdrvinfo - Returns driver specific information. 1018c2ecf20Sopenharmony_ci * @dev: device pointer. 1028c2ecf20Sopenharmony_ci * @info: pointer to the structure with parameters given by ethtool to 1038c2ecf20Sopenharmony_ci * return driver information. 1048c2ecf20Sopenharmony_ci * 1058c2ecf20Sopenharmony_ci * Returns driver specefic information like name, version etc.. to ethtool. 1068c2ecf20Sopenharmony_ci */ 1078c2ecf20Sopenharmony_cistatic void vxge_ethtool_gdrvinfo(struct net_device *dev, 1088c2ecf20Sopenharmony_ci struct ethtool_drvinfo *info) 1098c2ecf20Sopenharmony_ci{ 1108c2ecf20Sopenharmony_ci struct vxgedev *vdev = netdev_priv(dev); 1118c2ecf20Sopenharmony_ci strlcpy(info->driver, VXGE_DRIVER_NAME, sizeof(info->driver)); 1128c2ecf20Sopenharmony_ci strlcpy(info->version, DRV_VERSION, sizeof(info->version)); 1138c2ecf20Sopenharmony_ci strlcpy(info->fw_version, vdev->fw_version, sizeof(info->fw_version)); 1148c2ecf20Sopenharmony_ci strlcpy(info->bus_info, pci_name(vdev->pdev), sizeof(info->bus_info)); 1158c2ecf20Sopenharmony_ci} 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci/** 1188c2ecf20Sopenharmony_ci * vxge_ethtool_gregs - dumps the entire space of Titan into the buffer. 1198c2ecf20Sopenharmony_ci * @dev: device pointer. 1208c2ecf20Sopenharmony_ci * @regs: pointer to the structure with parameters given by ethtool for 1218c2ecf20Sopenharmony_ci * dumping the registers. 1228c2ecf20Sopenharmony_ci * @space: The input argument into which all the registers are dumped. 1238c2ecf20Sopenharmony_ci * 1248c2ecf20Sopenharmony_ci * Dumps the vpath register space of Titan NIC into the user given 1258c2ecf20Sopenharmony_ci * buffer area. 1268c2ecf20Sopenharmony_ci */ 1278c2ecf20Sopenharmony_cistatic void vxge_ethtool_gregs(struct net_device *dev, 1288c2ecf20Sopenharmony_ci struct ethtool_regs *regs, void *space) 1298c2ecf20Sopenharmony_ci{ 1308c2ecf20Sopenharmony_ci int index, offset; 1318c2ecf20Sopenharmony_ci enum vxge_hw_status status; 1328c2ecf20Sopenharmony_ci u64 reg; 1338c2ecf20Sopenharmony_ci u64 *reg_space = (u64 *)space; 1348c2ecf20Sopenharmony_ci struct vxgedev *vdev = netdev_priv(dev); 1358c2ecf20Sopenharmony_ci struct __vxge_hw_device *hldev = vdev->devh; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci regs->len = sizeof(struct vxge_hw_vpath_reg) * vdev->no_of_vpath; 1388c2ecf20Sopenharmony_ci regs->version = vdev->pdev->subsystem_device; 1398c2ecf20Sopenharmony_ci for (index = 0; index < vdev->no_of_vpath; index++) { 1408c2ecf20Sopenharmony_ci for (offset = 0; offset < sizeof(struct vxge_hw_vpath_reg); 1418c2ecf20Sopenharmony_ci offset += 8) { 1428c2ecf20Sopenharmony_ci status = vxge_hw_mgmt_reg_read(hldev, 1438c2ecf20Sopenharmony_ci vxge_hw_mgmt_reg_type_vpath, 1448c2ecf20Sopenharmony_ci vdev->vpaths[index].device_id, 1458c2ecf20Sopenharmony_ci offset, ®); 1468c2ecf20Sopenharmony_ci if (status != VXGE_HW_OK) { 1478c2ecf20Sopenharmony_ci vxge_debug_init(VXGE_ERR, 1488c2ecf20Sopenharmony_ci "%s:%d Getting reg dump Failed", 1498c2ecf20Sopenharmony_ci __func__, __LINE__); 1508c2ecf20Sopenharmony_ci return; 1518c2ecf20Sopenharmony_ci } 1528c2ecf20Sopenharmony_ci *reg_space++ = reg; 1538c2ecf20Sopenharmony_ci } 1548c2ecf20Sopenharmony_ci } 1558c2ecf20Sopenharmony_ci} 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci/** 1588c2ecf20Sopenharmony_ci * vxge_ethtool_idnic - To physically identify the nic on the system. 1598c2ecf20Sopenharmony_ci * @dev : device pointer. 1608c2ecf20Sopenharmony_ci * @state : requested LED state 1618c2ecf20Sopenharmony_ci * 1628c2ecf20Sopenharmony_ci * Used to physically identify the NIC on the system. 1638c2ecf20Sopenharmony_ci * 0 on success 1648c2ecf20Sopenharmony_ci */ 1658c2ecf20Sopenharmony_cistatic int vxge_ethtool_idnic(struct net_device *dev, 1668c2ecf20Sopenharmony_ci enum ethtool_phys_id_state state) 1678c2ecf20Sopenharmony_ci{ 1688c2ecf20Sopenharmony_ci struct vxgedev *vdev = netdev_priv(dev); 1698c2ecf20Sopenharmony_ci struct __vxge_hw_device *hldev = vdev->devh; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci switch (state) { 1728c2ecf20Sopenharmony_ci case ETHTOOL_ID_ACTIVE: 1738c2ecf20Sopenharmony_ci vxge_hw_device_flick_link_led(hldev, VXGE_FLICKER_ON); 1748c2ecf20Sopenharmony_ci break; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci case ETHTOOL_ID_INACTIVE: 1778c2ecf20Sopenharmony_ci vxge_hw_device_flick_link_led(hldev, VXGE_FLICKER_OFF); 1788c2ecf20Sopenharmony_ci break; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci default: 1818c2ecf20Sopenharmony_ci return -EINVAL; 1828c2ecf20Sopenharmony_ci } 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci return 0; 1858c2ecf20Sopenharmony_ci} 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci/** 1888c2ecf20Sopenharmony_ci * vxge_ethtool_getpause_data - Pause frame frame generation and reception. 1898c2ecf20Sopenharmony_ci * @dev : device pointer. 1908c2ecf20Sopenharmony_ci * @ep : pointer to the structure with pause parameters given by ethtool. 1918c2ecf20Sopenharmony_ci * Description: 1928c2ecf20Sopenharmony_ci * Returns the Pause frame generation and reception capability of the NIC. 1938c2ecf20Sopenharmony_ci * Return value: 1948c2ecf20Sopenharmony_ci * void 1958c2ecf20Sopenharmony_ci */ 1968c2ecf20Sopenharmony_cistatic void vxge_ethtool_getpause_data(struct net_device *dev, 1978c2ecf20Sopenharmony_ci struct ethtool_pauseparam *ep) 1988c2ecf20Sopenharmony_ci{ 1998c2ecf20Sopenharmony_ci struct vxgedev *vdev = netdev_priv(dev); 2008c2ecf20Sopenharmony_ci struct __vxge_hw_device *hldev = vdev->devh; 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci vxge_hw_device_getpause_data(hldev, 0, &ep->tx_pause, &ep->rx_pause); 2038c2ecf20Sopenharmony_ci} 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci/** 2068c2ecf20Sopenharmony_ci * vxge_ethtool_setpause_data - set/reset pause frame generation. 2078c2ecf20Sopenharmony_ci * @dev : device pointer. 2088c2ecf20Sopenharmony_ci * @ep : pointer to the structure with pause parameters given by ethtool. 2098c2ecf20Sopenharmony_ci * Description: 2108c2ecf20Sopenharmony_ci * It can be used to set or reset Pause frame generation or reception 2118c2ecf20Sopenharmony_ci * support of the NIC. 2128c2ecf20Sopenharmony_ci * Return value: 2138c2ecf20Sopenharmony_ci * int, returns 0 on Success 2148c2ecf20Sopenharmony_ci */ 2158c2ecf20Sopenharmony_cistatic int vxge_ethtool_setpause_data(struct net_device *dev, 2168c2ecf20Sopenharmony_ci struct ethtool_pauseparam *ep) 2178c2ecf20Sopenharmony_ci{ 2188c2ecf20Sopenharmony_ci struct vxgedev *vdev = netdev_priv(dev); 2198c2ecf20Sopenharmony_ci struct __vxge_hw_device *hldev = vdev->devh; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci vxge_hw_device_setpause_data(hldev, 0, ep->tx_pause, ep->rx_pause); 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ci vdev->config.tx_pause_enable = ep->tx_pause; 2248c2ecf20Sopenharmony_ci vdev->config.rx_pause_enable = ep->rx_pause; 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci return 0; 2278c2ecf20Sopenharmony_ci} 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_cistatic void vxge_get_ethtool_stats(struct net_device *dev, 2308c2ecf20Sopenharmony_ci struct ethtool_stats *estats, u64 *tmp_stats) 2318c2ecf20Sopenharmony_ci{ 2328c2ecf20Sopenharmony_ci int j, k; 2338c2ecf20Sopenharmony_ci enum vxge_hw_status status; 2348c2ecf20Sopenharmony_ci enum vxge_hw_status swstatus; 2358c2ecf20Sopenharmony_ci struct vxge_vpath *vpath = NULL; 2368c2ecf20Sopenharmony_ci struct vxgedev *vdev = netdev_priv(dev); 2378c2ecf20Sopenharmony_ci struct __vxge_hw_device *hldev = vdev->devh; 2388c2ecf20Sopenharmony_ci struct vxge_hw_xmac_stats *xmac_stats; 2398c2ecf20Sopenharmony_ci struct vxge_hw_device_stats_sw_info *sw_stats; 2408c2ecf20Sopenharmony_ci struct vxge_hw_device_stats_hw_info *hw_stats; 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci u64 *ptr = tmp_stats; 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_ci memset(tmp_stats, 0, 2458c2ecf20Sopenharmony_ci vxge_ethtool_get_sset_count(dev, ETH_SS_STATS) * sizeof(u64)); 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci xmac_stats = kzalloc(sizeof(struct vxge_hw_xmac_stats), GFP_KERNEL); 2488c2ecf20Sopenharmony_ci if (xmac_stats == NULL) { 2498c2ecf20Sopenharmony_ci vxge_debug_init(VXGE_ERR, 2508c2ecf20Sopenharmony_ci "%s : %d Memory Allocation failed for xmac_stats", 2518c2ecf20Sopenharmony_ci __func__, __LINE__); 2528c2ecf20Sopenharmony_ci return; 2538c2ecf20Sopenharmony_ci } 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci sw_stats = kzalloc(sizeof(struct vxge_hw_device_stats_sw_info), 2568c2ecf20Sopenharmony_ci GFP_KERNEL); 2578c2ecf20Sopenharmony_ci if (sw_stats == NULL) { 2588c2ecf20Sopenharmony_ci kfree(xmac_stats); 2598c2ecf20Sopenharmony_ci vxge_debug_init(VXGE_ERR, 2608c2ecf20Sopenharmony_ci "%s : %d Memory Allocation failed for sw_stats", 2618c2ecf20Sopenharmony_ci __func__, __LINE__); 2628c2ecf20Sopenharmony_ci return; 2638c2ecf20Sopenharmony_ci } 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_ci hw_stats = kzalloc(sizeof(struct vxge_hw_device_stats_hw_info), 2668c2ecf20Sopenharmony_ci GFP_KERNEL); 2678c2ecf20Sopenharmony_ci if (hw_stats == NULL) { 2688c2ecf20Sopenharmony_ci kfree(xmac_stats); 2698c2ecf20Sopenharmony_ci kfree(sw_stats); 2708c2ecf20Sopenharmony_ci vxge_debug_init(VXGE_ERR, 2718c2ecf20Sopenharmony_ci "%s : %d Memory Allocation failed for hw_stats", 2728c2ecf20Sopenharmony_ci __func__, __LINE__); 2738c2ecf20Sopenharmony_ci return; 2748c2ecf20Sopenharmony_ci } 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci *ptr++ = 0; 2778c2ecf20Sopenharmony_ci status = vxge_hw_device_xmac_stats_get(hldev, xmac_stats); 2788c2ecf20Sopenharmony_ci if (status != VXGE_HW_OK) { 2798c2ecf20Sopenharmony_ci if (status != VXGE_HW_ERR_PRIVILEGED_OPERATION) { 2808c2ecf20Sopenharmony_ci vxge_debug_init(VXGE_ERR, 2818c2ecf20Sopenharmony_ci "%s : %d Failure in getting xmac stats", 2828c2ecf20Sopenharmony_ci __func__, __LINE__); 2838c2ecf20Sopenharmony_ci } 2848c2ecf20Sopenharmony_ci } 2858c2ecf20Sopenharmony_ci swstatus = vxge_hw_driver_stats_get(hldev, sw_stats); 2868c2ecf20Sopenharmony_ci if (swstatus != VXGE_HW_OK) { 2878c2ecf20Sopenharmony_ci vxge_debug_init(VXGE_ERR, 2888c2ecf20Sopenharmony_ci "%s : %d Failure in getting sw stats", 2898c2ecf20Sopenharmony_ci __func__, __LINE__); 2908c2ecf20Sopenharmony_ci } 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci status = vxge_hw_device_stats_get(hldev, hw_stats); 2938c2ecf20Sopenharmony_ci if (status != VXGE_HW_OK) { 2948c2ecf20Sopenharmony_ci vxge_debug_init(VXGE_ERR, 2958c2ecf20Sopenharmony_ci "%s : %d hw_stats_get error", __func__, __LINE__); 2968c2ecf20Sopenharmony_ci } 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_ci for (k = 0; k < vdev->no_of_vpath; k++) { 2998c2ecf20Sopenharmony_ci struct vxge_hw_vpath_stats_hw_info *vpath_info; 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci vpath = &vdev->vpaths[k]; 3028c2ecf20Sopenharmony_ci j = vpath->device_id; 3038c2ecf20Sopenharmony_ci vpath_info = hw_stats->vpath_info[j]; 3048c2ecf20Sopenharmony_ci if (!vpath_info) { 3058c2ecf20Sopenharmony_ci memset(ptr, 0, (VXGE_HW_VPATH_TX_STATS_LEN + 3068c2ecf20Sopenharmony_ci VXGE_HW_VPATH_RX_STATS_LEN) * sizeof(u64)); 3078c2ecf20Sopenharmony_ci ptr += (VXGE_HW_VPATH_TX_STATS_LEN + 3088c2ecf20Sopenharmony_ci VXGE_HW_VPATH_RX_STATS_LEN); 3098c2ecf20Sopenharmony_ci continue; 3108c2ecf20Sopenharmony_ci } 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_ttl_eth_frms; 3138c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_ttl_eth_octets; 3148c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_data_octets; 3158c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_mcast_frms; 3168c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_bcast_frms; 3178c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_ucast_frms; 3188c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_tagged_frms; 3198c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_vld_ip; 3208c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_vld_ip_octets; 3218c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_icmp; 3228c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_tcp; 3238c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_rst_tcp; 3248c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_udp; 3258c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_unknown_protocol; 3268c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_lost_ip; 3278c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_parse_error; 3288c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_tcp_offload; 3298c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_retx_tcp_offload; 3308c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_stats.tx_lost_ip_offload; 3318c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_eth_frms; 3328c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_vld_frms; 3338c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_offload_frms; 3348c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_eth_octets; 3358c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_data_octets; 3368c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_offload_octets; 3378c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_vld_mcast_frms; 3388c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_vld_bcast_frms; 3398c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_accepted_ucast_frms; 3408c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_accepted_nucast_frms; 3418c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_tagged_frms; 3428c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_long_frms; 3438c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_usized_frms; 3448c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_osized_frms; 3458c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_frag_frms; 3468c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_jabber_frms; 3478c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_64_frms; 3488c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_65_127_frms; 3498c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_128_255_frms; 3508c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_256_511_frms; 3518c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_512_1023_frms; 3528c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_1024_1518_frms; 3538c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_1519_4095_frms; 3548c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_4096_8191_frms; 3558c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_8192_max_frms; 3568c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ttl_gt_max_frms; 3578c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ip; 3588c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_accepted_ip; 3598c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_ip_octets; 3608c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_err_ip; 3618c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_icmp; 3628c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_tcp; 3638c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_udp; 3648c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_err_tcp; 3658c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_lost_frms; 3668c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_lost_ip; 3678c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_lost_ip_offload; 3688c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_various_discard; 3698c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_sleep_discard; 3708c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_red_discard; 3718c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_queue_full_discard; 3728c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_stats.rx_mpa_ok_frms; 3738c2ecf20Sopenharmony_ci } 3748c2ecf20Sopenharmony_ci *ptr++ = 0; 3758c2ecf20Sopenharmony_ci for (k = 0; k < vdev->max_config_port; k++) { 3768c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].tx_frms; 3778c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].tx_data_octets; 3788c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].tx_mcast_frms; 3798c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].tx_bcast_frms; 3808c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].tx_discarded_frms; 3818c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].tx_errored_frms; 3828c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].rx_frms; 3838c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].rx_data_octets; 3848c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].rx_mcast_frms; 3858c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].rx_bcast_frms; 3868c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].rx_discarded_frms; 3878c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].rx_errored_frms; 3888c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->aggr_stats[k].rx_unknown_slow_proto_frms; 3898c2ecf20Sopenharmony_ci } 3908c2ecf20Sopenharmony_ci *ptr++ = 0; 3918c2ecf20Sopenharmony_ci for (k = 0; k < vdev->max_config_port; k++) { 3928c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_ttl_frms; 3938c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_ttl_octets; 3948c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_data_octets; 3958c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_mcast_frms; 3968c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_bcast_frms; 3978c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_ucast_frms; 3988c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_tagged_frms; 3998c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_vld_ip; 4008c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_vld_ip_octets; 4018c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_icmp; 4028c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_tcp; 4038c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_rst_tcp; 4048c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_udp; 4058c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_parse_error; 4068c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_unknown_protocol; 4078c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_pause_ctrl_frms; 4088c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_marker_pdu_frms; 4098c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_lacpdu_frms; 4108c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_drop_ip; 4118c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_marker_resp_pdu_frms; 4128c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_xgmii_char2_match; 4138c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_xgmii_char1_match; 4148c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_xgmii_column2_match; 4158c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_xgmii_column1_match; 4168c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_any_err_frms; 4178c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].tx_drop_frms; 4188c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_frms; 4198c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_vld_frms; 4208c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_offload_frms; 4218c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_octets; 4228c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_data_octets; 4238c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_offload_octets; 4248c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_vld_mcast_frms; 4258c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_vld_bcast_frms; 4268c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_accepted_ucast_frms; 4278c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_accepted_nucast_frms; 4288c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_tagged_frms; 4298c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_long_frms; 4308c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_usized_frms; 4318c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_osized_frms; 4328c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_frag_frms; 4338c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_jabber_frms; 4348c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_64_frms; 4358c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_65_127_frms; 4368c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_128_255_frms; 4378c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_256_511_frms; 4388c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_512_1023_frms; 4398c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_1024_1518_frms; 4408c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_1519_4095_frms; 4418c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_4096_8191_frms; 4428c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_8192_max_frms; 4438c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ttl_gt_max_frms; 4448c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ip; 4458c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_accepted_ip; 4468c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_ip_octets; 4478c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_err_ip; 4488c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_icmp; 4498c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_tcp; 4508c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_udp; 4518c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_err_tcp; 4528c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_pause_count; 4538c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_pause_ctrl_frms; 4548c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_unsup_ctrl_frms; 4558c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_fcs_err_frms; 4568c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_in_rng_len_err_frms; 4578c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_out_rng_len_err_frms; 4588c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_drop_frms; 4598c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_discarded_frms; 4608c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_drop_ip; 4618c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_drop_udp; 4628c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_marker_pdu_frms; 4638c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_lacpdu_frms; 4648c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_unknown_pdu_frms; 4658c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_marker_resp_pdu_frms; 4668c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_fcs_discard; 4678c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_illegal_pdu_frms; 4688c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_switch_discard; 4698c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_len_discard; 4708c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_rpa_discard; 4718c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_l2_mgmt_discard; 4728c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_rts_discard; 4738c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_trash_discard; 4748c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_buff_full_discard; 4758c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_red_discard; 4768c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_xgmii_ctrl_err_cnt; 4778c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_xgmii_data_err_cnt; 4788c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_xgmii_char1_match; 4798c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_xgmii_err_sym; 4808c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_xgmii_column1_match; 4818c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_xgmii_char2_match; 4828c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_local_fault; 4838c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_xgmii_column2_match; 4848c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_jettison; 4858c2ecf20Sopenharmony_ci *ptr++ = xmac_stats->port_stats[k].rx_remote_fault; 4868c2ecf20Sopenharmony_ci } 4878c2ecf20Sopenharmony_ci 4888c2ecf20Sopenharmony_ci *ptr++ = 0; 4898c2ecf20Sopenharmony_ci for (k = 0; k < vdev->no_of_vpath; k++) { 4908c2ecf20Sopenharmony_ci struct vxge_hw_vpath_stats_sw_info *vpath_info; 4918c2ecf20Sopenharmony_ci 4928c2ecf20Sopenharmony_ci vpath = &vdev->vpaths[k]; 4938c2ecf20Sopenharmony_ci j = vpath->device_id; 4948c2ecf20Sopenharmony_ci vpath_info = (struct vxge_hw_vpath_stats_sw_info *) 4958c2ecf20Sopenharmony_ci &sw_stats->vpath_info[j]; 4968c2ecf20Sopenharmony_ci *ptr++ = vpath_info->soft_reset_cnt; 4978c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.unknown_alarms; 4988c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.network_sustained_fault; 4998c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.network_sustained_ok; 5008c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.kdfcctl_fifo0_overwrite; 5018c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.kdfcctl_fifo0_poison; 5028c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.kdfcctl_fifo0_dma_error; 5038c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.dblgen_fifo0_overflow; 5048c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.statsb_pif_chain_error; 5058c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.statsb_drop_timeout; 5068c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.target_illegal_access; 5078c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.ini_serr_det; 5088c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.prc_ring_bumps; 5098c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.prc_rxdcm_sc_err; 5108c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.prc_rxdcm_sc_abort; 5118c2ecf20Sopenharmony_ci *ptr++ = vpath_info->error_stats.prc_quanta_size_err; 5128c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ring_stats.common_stats.full_cnt; 5138c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ring_stats.common_stats.usage_cnt; 5148c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ring_stats.common_stats.usage_max; 5158c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ring_stats.common_stats. 5168c2ecf20Sopenharmony_ci reserve_free_swaps_cnt; 5178c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ring_stats.common_stats.total_compl_cnt; 5188c2ecf20Sopenharmony_ci for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++) 5198c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ring_stats.rxd_t_code_err_cnt[j]; 5208c2ecf20Sopenharmony_ci *ptr++ = vpath_info->fifo_stats.common_stats.full_cnt; 5218c2ecf20Sopenharmony_ci *ptr++ = vpath_info->fifo_stats.common_stats.usage_cnt; 5228c2ecf20Sopenharmony_ci *ptr++ = vpath_info->fifo_stats.common_stats.usage_max; 5238c2ecf20Sopenharmony_ci *ptr++ = vpath_info->fifo_stats.common_stats. 5248c2ecf20Sopenharmony_ci reserve_free_swaps_cnt; 5258c2ecf20Sopenharmony_ci *ptr++ = vpath_info->fifo_stats.common_stats.total_compl_cnt; 5268c2ecf20Sopenharmony_ci *ptr++ = vpath_info->fifo_stats.total_posts; 5278c2ecf20Sopenharmony_ci *ptr++ = vpath_info->fifo_stats.total_buffers; 5288c2ecf20Sopenharmony_ci for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++) 5298c2ecf20Sopenharmony_ci *ptr++ = vpath_info->fifo_stats.txd_t_code_err_cnt[j]; 5308c2ecf20Sopenharmony_ci } 5318c2ecf20Sopenharmony_ci 5328c2ecf20Sopenharmony_ci *ptr++ = 0; 5338c2ecf20Sopenharmony_ci for (k = 0; k < vdev->no_of_vpath; k++) { 5348c2ecf20Sopenharmony_ci struct vxge_hw_vpath_stats_hw_info *vpath_info; 5358c2ecf20Sopenharmony_ci vpath = &vdev->vpaths[k]; 5368c2ecf20Sopenharmony_ci j = vpath->device_id; 5378c2ecf20Sopenharmony_ci vpath_info = hw_stats->vpath_info[j]; 5388c2ecf20Sopenharmony_ci if (!vpath_info) { 5398c2ecf20Sopenharmony_ci memset(ptr, 0, VXGE_HW_VPATH_STATS_LEN * sizeof(u64)); 5408c2ecf20Sopenharmony_ci ptr += VXGE_HW_VPATH_STATS_LEN; 5418c2ecf20Sopenharmony_ci continue; 5428c2ecf20Sopenharmony_ci } 5438c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ini_num_mwr_sent; 5448c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ini_num_mrd_sent; 5458c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ini_num_cpl_rcvd; 5468c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ini_num_mwr_byte_sent; 5478c2ecf20Sopenharmony_ci *ptr++ = vpath_info->ini_num_cpl_byte_rcvd; 5488c2ecf20Sopenharmony_ci *ptr++ = vpath_info->wrcrdtarb_xoff; 5498c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rdcrdtarb_xoff; 5508c2ecf20Sopenharmony_ci *ptr++ = vpath_info->vpath_genstats_count0; 5518c2ecf20Sopenharmony_ci *ptr++ = vpath_info->vpath_genstats_count1; 5528c2ecf20Sopenharmony_ci *ptr++ = vpath_info->vpath_genstats_count2; 5538c2ecf20Sopenharmony_ci *ptr++ = vpath_info->vpath_genstats_count3; 5548c2ecf20Sopenharmony_ci *ptr++ = vpath_info->vpath_genstats_count4; 5558c2ecf20Sopenharmony_ci *ptr++ = vpath_info->vpath_genstats_count5; 5568c2ecf20Sopenharmony_ci *ptr++ = vpath_info->prog_event_vnum0; 5578c2ecf20Sopenharmony_ci *ptr++ = vpath_info->prog_event_vnum1; 5588c2ecf20Sopenharmony_ci *ptr++ = vpath_info->prog_event_vnum2; 5598c2ecf20Sopenharmony_ci *ptr++ = vpath_info->prog_event_vnum3; 5608c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_multi_cast_frame_discard; 5618c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_frm_transferred; 5628c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rxd_returned; 5638c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_mpa_len_fail_frms; 5648c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_mpa_mrk_fail_frms; 5658c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_mpa_crc_fail_frms; 5668c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_permitted_frms; 5678c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_vp_reset_discarded_frms; 5688c2ecf20Sopenharmony_ci *ptr++ = vpath_info->rx_wol_frms; 5698c2ecf20Sopenharmony_ci *ptr++ = vpath_info->tx_vp_reset_discarded_frms; 5708c2ecf20Sopenharmony_ci } 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_ci *ptr++ = 0; 5738c2ecf20Sopenharmony_ci *ptr++ = vdev->stats.vpaths_open; 5748c2ecf20Sopenharmony_ci *ptr++ = vdev->stats.vpath_open_fail; 5758c2ecf20Sopenharmony_ci *ptr++ = vdev->stats.link_up; 5768c2ecf20Sopenharmony_ci *ptr++ = vdev->stats.link_down; 5778c2ecf20Sopenharmony_ci 5788c2ecf20Sopenharmony_ci for (k = 0; k < vdev->no_of_vpath; k++) { 5798c2ecf20Sopenharmony_ci *ptr += vdev->vpaths[k].fifo.stats.tx_frms; 5808c2ecf20Sopenharmony_ci *(ptr + 1) += vdev->vpaths[k].fifo.stats.tx_errors; 5818c2ecf20Sopenharmony_ci *(ptr + 2) += vdev->vpaths[k].fifo.stats.tx_bytes; 5828c2ecf20Sopenharmony_ci *(ptr + 3) += vdev->vpaths[k].fifo.stats.txd_not_free; 5838c2ecf20Sopenharmony_ci *(ptr + 4) += vdev->vpaths[k].fifo.stats.txd_out_of_desc; 5848c2ecf20Sopenharmony_ci *(ptr + 5) += vdev->vpaths[k].ring.stats.rx_frms; 5858c2ecf20Sopenharmony_ci *(ptr + 6) += vdev->vpaths[k].ring.stats.rx_errors; 5868c2ecf20Sopenharmony_ci *(ptr + 7) += vdev->vpaths[k].ring.stats.rx_bytes; 5878c2ecf20Sopenharmony_ci *(ptr + 8) += vdev->vpaths[k].ring.stats.rx_mcast; 5888c2ecf20Sopenharmony_ci *(ptr + 9) += vdev->vpaths[k].fifo.stats.pci_map_fail + 5898c2ecf20Sopenharmony_ci vdev->vpaths[k].ring.stats.pci_map_fail; 5908c2ecf20Sopenharmony_ci *(ptr + 10) += vdev->vpaths[k].ring.stats.skb_alloc_fail; 5918c2ecf20Sopenharmony_ci } 5928c2ecf20Sopenharmony_ci 5938c2ecf20Sopenharmony_ci ptr += 12; 5948c2ecf20Sopenharmony_ci 5958c2ecf20Sopenharmony_ci kfree(xmac_stats); 5968c2ecf20Sopenharmony_ci kfree(sw_stats); 5978c2ecf20Sopenharmony_ci kfree(hw_stats); 5988c2ecf20Sopenharmony_ci} 5998c2ecf20Sopenharmony_ci 6008c2ecf20Sopenharmony_cistatic void vxge_ethtool_get_strings(struct net_device *dev, u32 stringset, 6018c2ecf20Sopenharmony_ci u8 *data) 6028c2ecf20Sopenharmony_ci{ 6038c2ecf20Sopenharmony_ci int stat_size = 0; 6048c2ecf20Sopenharmony_ci int i, j; 6058c2ecf20Sopenharmony_ci struct vxgedev *vdev = netdev_priv(dev); 6068c2ecf20Sopenharmony_ci switch (stringset) { 6078c2ecf20Sopenharmony_ci case ETH_SS_STATS: 6088c2ecf20Sopenharmony_ci vxge_add_string("VPATH STATISTICS%s\t\t\t", 6098c2ecf20Sopenharmony_ci &stat_size, data, ""); 6108c2ecf20Sopenharmony_ci for (i = 0; i < vdev->no_of_vpath; i++) { 6118c2ecf20Sopenharmony_ci vxge_add_string("tx_ttl_eth_frms_%d\t\t\t", 6128c2ecf20Sopenharmony_ci &stat_size, data, i); 6138c2ecf20Sopenharmony_ci vxge_add_string("tx_ttl_eth_octects_%d\t\t", 6148c2ecf20Sopenharmony_ci &stat_size, data, i); 6158c2ecf20Sopenharmony_ci vxge_add_string("tx_data_octects_%d\t\t\t", 6168c2ecf20Sopenharmony_ci &stat_size, data, i); 6178c2ecf20Sopenharmony_ci vxge_add_string("tx_mcast_frms_%d\t\t\t", 6188c2ecf20Sopenharmony_ci &stat_size, data, i); 6198c2ecf20Sopenharmony_ci vxge_add_string("tx_bcast_frms_%d\t\t\t", 6208c2ecf20Sopenharmony_ci &stat_size, data, i); 6218c2ecf20Sopenharmony_ci vxge_add_string("tx_ucast_frms_%d\t\t\t", 6228c2ecf20Sopenharmony_ci &stat_size, data, i); 6238c2ecf20Sopenharmony_ci vxge_add_string("tx_tagged_frms_%d\t\t\t", 6248c2ecf20Sopenharmony_ci &stat_size, data, i); 6258c2ecf20Sopenharmony_ci vxge_add_string("tx_vld_ip_%d\t\t\t", 6268c2ecf20Sopenharmony_ci &stat_size, data, i); 6278c2ecf20Sopenharmony_ci vxge_add_string("tx_vld_ip_octects_%d\t\t", 6288c2ecf20Sopenharmony_ci &stat_size, data, i); 6298c2ecf20Sopenharmony_ci vxge_add_string("tx_icmp_%d\t\t\t\t", 6308c2ecf20Sopenharmony_ci &stat_size, data, i); 6318c2ecf20Sopenharmony_ci vxge_add_string("tx_tcp_%d\t\t\t\t", 6328c2ecf20Sopenharmony_ci &stat_size, data, i); 6338c2ecf20Sopenharmony_ci vxge_add_string("tx_rst_tcp_%d\t\t\t", 6348c2ecf20Sopenharmony_ci &stat_size, data, i); 6358c2ecf20Sopenharmony_ci vxge_add_string("tx_udp_%d\t\t\t\t", 6368c2ecf20Sopenharmony_ci &stat_size, data, i); 6378c2ecf20Sopenharmony_ci vxge_add_string("tx_unknown_proto_%d\t\t\t", 6388c2ecf20Sopenharmony_ci &stat_size, data, i); 6398c2ecf20Sopenharmony_ci vxge_add_string("tx_lost_ip_%d\t\t\t", 6408c2ecf20Sopenharmony_ci &stat_size, data, i); 6418c2ecf20Sopenharmony_ci vxge_add_string("tx_parse_error_%d\t\t\t", 6428c2ecf20Sopenharmony_ci &stat_size, data, i); 6438c2ecf20Sopenharmony_ci vxge_add_string("tx_tcp_offload_%d\t\t\t", 6448c2ecf20Sopenharmony_ci &stat_size, data, i); 6458c2ecf20Sopenharmony_ci vxge_add_string("tx_retx_tcp_offload_%d\t\t", 6468c2ecf20Sopenharmony_ci &stat_size, data, i); 6478c2ecf20Sopenharmony_ci vxge_add_string("tx_lost_ip_offload_%d\t\t", 6488c2ecf20Sopenharmony_ci &stat_size, data, i); 6498c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_eth_frms_%d\t\t\t", 6508c2ecf20Sopenharmony_ci &stat_size, data, i); 6518c2ecf20Sopenharmony_ci vxge_add_string("rx_vld_frms_%d\t\t\t", 6528c2ecf20Sopenharmony_ci &stat_size, data, i); 6538c2ecf20Sopenharmony_ci vxge_add_string("rx_offload_frms_%d\t\t\t", 6548c2ecf20Sopenharmony_ci &stat_size, data, i); 6558c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_eth_octects_%d\t\t", 6568c2ecf20Sopenharmony_ci &stat_size, data, i); 6578c2ecf20Sopenharmony_ci vxge_add_string("rx_data_octects_%d\t\t\t", 6588c2ecf20Sopenharmony_ci &stat_size, data, i); 6598c2ecf20Sopenharmony_ci vxge_add_string("rx_offload_octects_%d\t\t", 6608c2ecf20Sopenharmony_ci &stat_size, data, i); 6618c2ecf20Sopenharmony_ci vxge_add_string("rx_vld_mcast_frms_%d\t\t", 6628c2ecf20Sopenharmony_ci &stat_size, data, i); 6638c2ecf20Sopenharmony_ci vxge_add_string("rx_vld_bcast_frms_%d\t\t", 6648c2ecf20Sopenharmony_ci &stat_size, data, i); 6658c2ecf20Sopenharmony_ci vxge_add_string("rx_accepted_ucast_frms_%d\t\t", 6668c2ecf20Sopenharmony_ci &stat_size, data, i); 6678c2ecf20Sopenharmony_ci vxge_add_string("rx_accepted_nucast_frms_%d\t\t", 6688c2ecf20Sopenharmony_ci &stat_size, data, i); 6698c2ecf20Sopenharmony_ci vxge_add_string("rx_tagged_frms_%d\t\t\t", 6708c2ecf20Sopenharmony_ci &stat_size, data, i); 6718c2ecf20Sopenharmony_ci vxge_add_string("rx_long_frms_%d\t\t\t", 6728c2ecf20Sopenharmony_ci &stat_size, data, i); 6738c2ecf20Sopenharmony_ci vxge_add_string("rx_usized_frms_%d\t\t\t", 6748c2ecf20Sopenharmony_ci &stat_size, data, i); 6758c2ecf20Sopenharmony_ci vxge_add_string("rx_osized_frms_%d\t\t\t", 6768c2ecf20Sopenharmony_ci &stat_size, data, i); 6778c2ecf20Sopenharmony_ci vxge_add_string("rx_frag_frms_%d\t\t\t", 6788c2ecf20Sopenharmony_ci &stat_size, data, i); 6798c2ecf20Sopenharmony_ci vxge_add_string("rx_jabber_frms_%d\t\t\t", 6808c2ecf20Sopenharmony_ci &stat_size, data, i); 6818c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_64_frms_%d\t\t\t", 6828c2ecf20Sopenharmony_ci &stat_size, data, i); 6838c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_65_127_frms_%d\t\t", 6848c2ecf20Sopenharmony_ci &stat_size, data, i); 6858c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_128_255_frms_%d\t\t", 6868c2ecf20Sopenharmony_ci &stat_size, data, i); 6878c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_256_511_frms_%d\t\t", 6888c2ecf20Sopenharmony_ci &stat_size, data, i); 6898c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_512_1023_frms_%d\t\t", 6908c2ecf20Sopenharmony_ci &stat_size, data, i); 6918c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_1024_1518_frms_%d\t\t", 6928c2ecf20Sopenharmony_ci &stat_size, data, i); 6938c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_1519_4095_frms_%d\t\t", 6948c2ecf20Sopenharmony_ci &stat_size, data, i); 6958c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_4096_8191_frms_%d\t\t", 6968c2ecf20Sopenharmony_ci &stat_size, data, i); 6978c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_8192_max_frms_%d\t\t", 6988c2ecf20Sopenharmony_ci &stat_size, data, i); 6998c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_gt_max_frms_%d\t\t", 7008c2ecf20Sopenharmony_ci &stat_size, data, i); 7018c2ecf20Sopenharmony_ci vxge_add_string("rx_ip%d\t\t\t\t", 7028c2ecf20Sopenharmony_ci &stat_size, data, i); 7038c2ecf20Sopenharmony_ci vxge_add_string("rx_accepted_ip_%d\t\t\t", 7048c2ecf20Sopenharmony_ci &stat_size, data, i); 7058c2ecf20Sopenharmony_ci vxge_add_string("rx_ip_octects_%d\t\t\t", 7068c2ecf20Sopenharmony_ci &stat_size, data, i); 7078c2ecf20Sopenharmony_ci vxge_add_string("rx_err_ip_%d\t\t\t", 7088c2ecf20Sopenharmony_ci &stat_size, data, i); 7098c2ecf20Sopenharmony_ci vxge_add_string("rx_icmp_%d\t\t\t\t", 7108c2ecf20Sopenharmony_ci &stat_size, data, i); 7118c2ecf20Sopenharmony_ci vxge_add_string("rx_tcp_%d\t\t\t\t", 7128c2ecf20Sopenharmony_ci &stat_size, data, i); 7138c2ecf20Sopenharmony_ci vxge_add_string("rx_udp_%d\t\t\t\t", 7148c2ecf20Sopenharmony_ci &stat_size, data, i); 7158c2ecf20Sopenharmony_ci vxge_add_string("rx_err_tcp_%d\t\t\t", 7168c2ecf20Sopenharmony_ci &stat_size, data, i); 7178c2ecf20Sopenharmony_ci vxge_add_string("rx_lost_frms_%d\t\t\t", 7188c2ecf20Sopenharmony_ci &stat_size, data, i); 7198c2ecf20Sopenharmony_ci vxge_add_string("rx_lost_ip_%d\t\t\t", 7208c2ecf20Sopenharmony_ci &stat_size, data, i); 7218c2ecf20Sopenharmony_ci vxge_add_string("rx_lost_ip_offload_%d\t\t", 7228c2ecf20Sopenharmony_ci &stat_size, data, i); 7238c2ecf20Sopenharmony_ci vxge_add_string("rx_various_discard_%d\t\t", 7248c2ecf20Sopenharmony_ci &stat_size, data, i); 7258c2ecf20Sopenharmony_ci vxge_add_string("rx_sleep_discard_%d\t\t\t", 7268c2ecf20Sopenharmony_ci &stat_size, data, i); 7278c2ecf20Sopenharmony_ci vxge_add_string("rx_red_discard_%d\t\t\t", 7288c2ecf20Sopenharmony_ci &stat_size, data, i); 7298c2ecf20Sopenharmony_ci vxge_add_string("rx_queue_full_discard_%d\t\t", 7308c2ecf20Sopenharmony_ci &stat_size, data, i); 7318c2ecf20Sopenharmony_ci vxge_add_string("rx_mpa_ok_frms_%d\t\t\t", 7328c2ecf20Sopenharmony_ci &stat_size, data, i); 7338c2ecf20Sopenharmony_ci } 7348c2ecf20Sopenharmony_ci 7358c2ecf20Sopenharmony_ci vxge_add_string("\nAGGR STATISTICS%s\t\t\t\t", 7368c2ecf20Sopenharmony_ci &stat_size, data, ""); 7378c2ecf20Sopenharmony_ci for (i = 0; i < vdev->max_config_port; i++) { 7388c2ecf20Sopenharmony_ci vxge_add_string("tx_frms_%d\t\t\t\t", 7398c2ecf20Sopenharmony_ci &stat_size, data, i); 7408c2ecf20Sopenharmony_ci vxge_add_string("tx_data_octects_%d\t\t\t", 7418c2ecf20Sopenharmony_ci &stat_size, data, i); 7428c2ecf20Sopenharmony_ci vxge_add_string("tx_mcast_frms_%d\t\t\t", 7438c2ecf20Sopenharmony_ci &stat_size, data, i); 7448c2ecf20Sopenharmony_ci vxge_add_string("tx_bcast_frms_%d\t\t\t", 7458c2ecf20Sopenharmony_ci &stat_size, data, i); 7468c2ecf20Sopenharmony_ci vxge_add_string("tx_discarded_frms_%d\t\t", 7478c2ecf20Sopenharmony_ci &stat_size, data, i); 7488c2ecf20Sopenharmony_ci vxge_add_string("tx_errored_frms_%d\t\t\t", 7498c2ecf20Sopenharmony_ci &stat_size, data, i); 7508c2ecf20Sopenharmony_ci vxge_add_string("rx_frms_%d\t\t\t\t", 7518c2ecf20Sopenharmony_ci &stat_size, data, i); 7528c2ecf20Sopenharmony_ci vxge_add_string("rx_data_octects_%d\t\t\t", 7538c2ecf20Sopenharmony_ci &stat_size, data, i); 7548c2ecf20Sopenharmony_ci vxge_add_string("rx_mcast_frms_%d\t\t\t", 7558c2ecf20Sopenharmony_ci &stat_size, data, i); 7568c2ecf20Sopenharmony_ci vxge_add_string("rx_bcast_frms_%d\t\t\t", 7578c2ecf20Sopenharmony_ci &stat_size, data, i); 7588c2ecf20Sopenharmony_ci vxge_add_string("rx_discarded_frms_%d\t\t", 7598c2ecf20Sopenharmony_ci &stat_size, data, i); 7608c2ecf20Sopenharmony_ci vxge_add_string("rx_errored_frms_%d\t\t\t", 7618c2ecf20Sopenharmony_ci &stat_size, data, i); 7628c2ecf20Sopenharmony_ci vxge_add_string("rx_unknown_slow_proto_frms_%d\t", 7638c2ecf20Sopenharmony_ci &stat_size, data, i); 7648c2ecf20Sopenharmony_ci } 7658c2ecf20Sopenharmony_ci 7668c2ecf20Sopenharmony_ci vxge_add_string("\nPORT STATISTICS%s\t\t\t\t", 7678c2ecf20Sopenharmony_ci &stat_size, data, ""); 7688c2ecf20Sopenharmony_ci for (i = 0; i < vdev->max_config_port; i++) { 7698c2ecf20Sopenharmony_ci vxge_add_string("tx_ttl_frms_%d\t\t\t", 7708c2ecf20Sopenharmony_ci &stat_size, data, i); 7718c2ecf20Sopenharmony_ci vxge_add_string("tx_ttl_octects_%d\t\t\t", 7728c2ecf20Sopenharmony_ci &stat_size, data, i); 7738c2ecf20Sopenharmony_ci vxge_add_string("tx_data_octects_%d\t\t\t", 7748c2ecf20Sopenharmony_ci &stat_size, data, i); 7758c2ecf20Sopenharmony_ci vxge_add_string("tx_mcast_frms_%d\t\t\t", 7768c2ecf20Sopenharmony_ci &stat_size, data, i); 7778c2ecf20Sopenharmony_ci vxge_add_string("tx_bcast_frms_%d\t\t\t", 7788c2ecf20Sopenharmony_ci &stat_size, data, i); 7798c2ecf20Sopenharmony_ci vxge_add_string("tx_ucast_frms_%d\t\t\t", 7808c2ecf20Sopenharmony_ci &stat_size, data, i); 7818c2ecf20Sopenharmony_ci vxge_add_string("tx_tagged_frms_%d\t\t\t", 7828c2ecf20Sopenharmony_ci &stat_size, data, i); 7838c2ecf20Sopenharmony_ci vxge_add_string("tx_vld_ip_%d\t\t\t", 7848c2ecf20Sopenharmony_ci &stat_size, data, i); 7858c2ecf20Sopenharmony_ci vxge_add_string("tx_vld_ip_octects_%d\t\t", 7868c2ecf20Sopenharmony_ci &stat_size, data, i); 7878c2ecf20Sopenharmony_ci vxge_add_string("tx_icmp_%d\t\t\t\t", 7888c2ecf20Sopenharmony_ci &stat_size, data, i); 7898c2ecf20Sopenharmony_ci vxge_add_string("tx_tcp_%d\t\t\t\t", 7908c2ecf20Sopenharmony_ci &stat_size, data, i); 7918c2ecf20Sopenharmony_ci vxge_add_string("tx_rst_tcp_%d\t\t\t", 7928c2ecf20Sopenharmony_ci &stat_size, data, i); 7938c2ecf20Sopenharmony_ci vxge_add_string("tx_udp_%d\t\t\t\t", 7948c2ecf20Sopenharmony_ci &stat_size, data, i); 7958c2ecf20Sopenharmony_ci vxge_add_string("tx_parse_error_%d\t\t\t", 7968c2ecf20Sopenharmony_ci &stat_size, data, i); 7978c2ecf20Sopenharmony_ci vxge_add_string("tx_unknown_protocol_%d\t\t", 7988c2ecf20Sopenharmony_ci &stat_size, data, i); 7998c2ecf20Sopenharmony_ci vxge_add_string("tx_pause_ctrl_frms_%d\t\t", 8008c2ecf20Sopenharmony_ci &stat_size, data, i); 8018c2ecf20Sopenharmony_ci vxge_add_string("tx_marker_pdu_frms_%d\t\t", 8028c2ecf20Sopenharmony_ci &stat_size, data, i); 8038c2ecf20Sopenharmony_ci vxge_add_string("tx_lacpdu_frms_%d\t\t\t", 8048c2ecf20Sopenharmony_ci &stat_size, data, i); 8058c2ecf20Sopenharmony_ci vxge_add_string("tx_drop_ip_%d\t\t\t", 8068c2ecf20Sopenharmony_ci &stat_size, data, i); 8078c2ecf20Sopenharmony_ci vxge_add_string("tx_marker_resp_pdu_frms_%d\t\t", 8088c2ecf20Sopenharmony_ci &stat_size, data, i); 8098c2ecf20Sopenharmony_ci vxge_add_string("tx_xgmii_char2_match_%d\t\t", 8108c2ecf20Sopenharmony_ci &stat_size, data, i); 8118c2ecf20Sopenharmony_ci vxge_add_string("tx_xgmii_char1_match_%d\t\t", 8128c2ecf20Sopenharmony_ci &stat_size, data, i); 8138c2ecf20Sopenharmony_ci vxge_add_string("tx_xgmii_column2_match_%d\t\t", 8148c2ecf20Sopenharmony_ci &stat_size, data, i); 8158c2ecf20Sopenharmony_ci vxge_add_string("tx_xgmii_column1_match_%d\t\t", 8168c2ecf20Sopenharmony_ci &stat_size, data, i); 8178c2ecf20Sopenharmony_ci vxge_add_string("tx_any_err_frms_%d\t\t\t", 8188c2ecf20Sopenharmony_ci &stat_size, data, i); 8198c2ecf20Sopenharmony_ci vxge_add_string("tx_drop_frms_%d\t\t\t", 8208c2ecf20Sopenharmony_ci &stat_size, data, i); 8218c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_frms_%d\t\t\t", 8228c2ecf20Sopenharmony_ci &stat_size, data, i); 8238c2ecf20Sopenharmony_ci vxge_add_string("rx_vld_frms_%d\t\t\t", 8248c2ecf20Sopenharmony_ci &stat_size, data, i); 8258c2ecf20Sopenharmony_ci vxge_add_string("rx_offload_frms_%d\t\t\t", 8268c2ecf20Sopenharmony_ci &stat_size, data, i); 8278c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_octects_%d\t\t\t", 8288c2ecf20Sopenharmony_ci &stat_size, data, i); 8298c2ecf20Sopenharmony_ci vxge_add_string("rx_data_octects_%d\t\t\t", 8308c2ecf20Sopenharmony_ci &stat_size, data, i); 8318c2ecf20Sopenharmony_ci vxge_add_string("rx_offload_octects_%d\t\t", 8328c2ecf20Sopenharmony_ci &stat_size, data, i); 8338c2ecf20Sopenharmony_ci vxge_add_string("rx_vld_mcast_frms_%d\t\t", 8348c2ecf20Sopenharmony_ci &stat_size, data, i); 8358c2ecf20Sopenharmony_ci vxge_add_string("rx_vld_bcast_frms_%d\t\t", 8368c2ecf20Sopenharmony_ci &stat_size, data, i); 8378c2ecf20Sopenharmony_ci vxge_add_string("rx_accepted_ucast_frms_%d\t\t", 8388c2ecf20Sopenharmony_ci &stat_size, data, i); 8398c2ecf20Sopenharmony_ci vxge_add_string("rx_accepted_nucast_frms_%d\t\t", 8408c2ecf20Sopenharmony_ci &stat_size, data, i); 8418c2ecf20Sopenharmony_ci vxge_add_string("rx_tagged_frms_%d\t\t\t", 8428c2ecf20Sopenharmony_ci &stat_size, data, i); 8438c2ecf20Sopenharmony_ci vxge_add_string("rx_long_frms_%d\t\t\t", 8448c2ecf20Sopenharmony_ci &stat_size, data, i); 8458c2ecf20Sopenharmony_ci vxge_add_string("rx_usized_frms_%d\t\t\t", 8468c2ecf20Sopenharmony_ci &stat_size, data, i); 8478c2ecf20Sopenharmony_ci vxge_add_string("rx_osized_frms_%d\t\t\t", 8488c2ecf20Sopenharmony_ci &stat_size, data, i); 8498c2ecf20Sopenharmony_ci vxge_add_string("rx_frag_frms_%d\t\t\t", 8508c2ecf20Sopenharmony_ci &stat_size, data, i); 8518c2ecf20Sopenharmony_ci vxge_add_string("rx_jabber_frms_%d\t\t\t", 8528c2ecf20Sopenharmony_ci &stat_size, data, i); 8538c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_64_frms_%d\t\t\t", 8548c2ecf20Sopenharmony_ci &stat_size, data, i); 8558c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_65_127_frms_%d\t\t", 8568c2ecf20Sopenharmony_ci &stat_size, data, i); 8578c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_128_255_frms_%d\t\t", 8588c2ecf20Sopenharmony_ci &stat_size, data, i); 8598c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_256_511_frms_%d\t\t", 8608c2ecf20Sopenharmony_ci &stat_size, data, i); 8618c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_512_1023_frms_%d\t\t", 8628c2ecf20Sopenharmony_ci &stat_size, data, i); 8638c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_1024_1518_frms_%d\t\t", 8648c2ecf20Sopenharmony_ci &stat_size, data, i); 8658c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_1519_4095_frms_%d\t\t", 8668c2ecf20Sopenharmony_ci &stat_size, data, i); 8678c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_4096_8191_frms_%d\t\t", 8688c2ecf20Sopenharmony_ci &stat_size, data, i); 8698c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_8192_max_frms_%d\t\t", 8708c2ecf20Sopenharmony_ci &stat_size, data, i); 8718c2ecf20Sopenharmony_ci vxge_add_string("rx_ttl_gt_max_frms_%d\t\t", 8728c2ecf20Sopenharmony_ci &stat_size, data, i); 8738c2ecf20Sopenharmony_ci vxge_add_string("rx_ip_%d\t\t\t\t", 8748c2ecf20Sopenharmony_ci &stat_size, data, i); 8758c2ecf20Sopenharmony_ci vxge_add_string("rx_accepted_ip_%d\t\t\t", 8768c2ecf20Sopenharmony_ci &stat_size, data, i); 8778c2ecf20Sopenharmony_ci vxge_add_string("rx_ip_octets_%d\t\t\t", 8788c2ecf20Sopenharmony_ci &stat_size, data, i); 8798c2ecf20Sopenharmony_ci vxge_add_string("rx_err_ip_%d\t\t\t", 8808c2ecf20Sopenharmony_ci &stat_size, data, i); 8818c2ecf20Sopenharmony_ci vxge_add_string("rx_icmp_%d\t\t\t\t", 8828c2ecf20Sopenharmony_ci &stat_size, data, i); 8838c2ecf20Sopenharmony_ci vxge_add_string("rx_tcp_%d\t\t\t\t", 8848c2ecf20Sopenharmony_ci &stat_size, data, i); 8858c2ecf20Sopenharmony_ci vxge_add_string("rx_udp_%d\t\t\t\t", 8868c2ecf20Sopenharmony_ci &stat_size, data, i); 8878c2ecf20Sopenharmony_ci vxge_add_string("rx_err_tcp_%d\t\t\t", 8888c2ecf20Sopenharmony_ci &stat_size, data, i); 8898c2ecf20Sopenharmony_ci vxge_add_string("rx_pause_count_%d\t\t\t", 8908c2ecf20Sopenharmony_ci &stat_size, data, i); 8918c2ecf20Sopenharmony_ci vxge_add_string("rx_pause_ctrl_frms_%d\t\t", 8928c2ecf20Sopenharmony_ci &stat_size, data, i); 8938c2ecf20Sopenharmony_ci vxge_add_string("rx_unsup_ctrl_frms_%d\t\t", 8948c2ecf20Sopenharmony_ci &stat_size, data, i); 8958c2ecf20Sopenharmony_ci vxge_add_string("rx_fcs_err_frms_%d\t\t\t", 8968c2ecf20Sopenharmony_ci &stat_size, data, i); 8978c2ecf20Sopenharmony_ci vxge_add_string("rx_in_rng_len_err_frms_%d\t\t", 8988c2ecf20Sopenharmony_ci &stat_size, data, i); 8998c2ecf20Sopenharmony_ci vxge_add_string("rx_out_rng_len_err_frms_%d\t\t", 9008c2ecf20Sopenharmony_ci &stat_size, data, i); 9018c2ecf20Sopenharmony_ci vxge_add_string("rx_drop_frms_%d\t\t\t", 9028c2ecf20Sopenharmony_ci &stat_size, data, i); 9038c2ecf20Sopenharmony_ci vxge_add_string("rx_discard_frms_%d\t\t\t", 9048c2ecf20Sopenharmony_ci &stat_size, data, i); 9058c2ecf20Sopenharmony_ci vxge_add_string("rx_drop_ip_%d\t\t\t", 9068c2ecf20Sopenharmony_ci &stat_size, data, i); 9078c2ecf20Sopenharmony_ci vxge_add_string("rx_drop_udp_%d\t\t\t", 9088c2ecf20Sopenharmony_ci &stat_size, data, i); 9098c2ecf20Sopenharmony_ci vxge_add_string("rx_marker_pdu_frms_%d\t\t", 9108c2ecf20Sopenharmony_ci &stat_size, data, i); 9118c2ecf20Sopenharmony_ci vxge_add_string("rx_lacpdu_frms_%d\t\t\t", 9128c2ecf20Sopenharmony_ci &stat_size, data, i); 9138c2ecf20Sopenharmony_ci vxge_add_string("rx_unknown_pdu_frms_%d\t\t", 9148c2ecf20Sopenharmony_ci &stat_size, data, i); 9158c2ecf20Sopenharmony_ci vxge_add_string("rx_marker_resp_pdu_frms_%d\t\t", 9168c2ecf20Sopenharmony_ci &stat_size, data, i); 9178c2ecf20Sopenharmony_ci vxge_add_string("rx_fcs_discard_%d\t\t\t", 9188c2ecf20Sopenharmony_ci &stat_size, data, i); 9198c2ecf20Sopenharmony_ci vxge_add_string("rx_illegal_pdu_frms_%d\t\t", 9208c2ecf20Sopenharmony_ci &stat_size, data, i); 9218c2ecf20Sopenharmony_ci vxge_add_string("rx_switch_discard_%d\t\t", 9228c2ecf20Sopenharmony_ci &stat_size, data, i); 9238c2ecf20Sopenharmony_ci vxge_add_string("rx_len_discard_%d\t\t\t", 9248c2ecf20Sopenharmony_ci &stat_size, data, i); 9258c2ecf20Sopenharmony_ci vxge_add_string("rx_rpa_discard_%d\t\t\t", 9268c2ecf20Sopenharmony_ci &stat_size, data, i); 9278c2ecf20Sopenharmony_ci vxge_add_string("rx_l2_mgmt_discard_%d\t\t", 9288c2ecf20Sopenharmony_ci &stat_size, data, i); 9298c2ecf20Sopenharmony_ci vxge_add_string("rx_rts_discard_%d\t\t\t", 9308c2ecf20Sopenharmony_ci &stat_size, data, i); 9318c2ecf20Sopenharmony_ci vxge_add_string("rx_trash_discard_%d\t\t\t", 9328c2ecf20Sopenharmony_ci &stat_size, data, i); 9338c2ecf20Sopenharmony_ci vxge_add_string("rx_buff_full_discard_%d\t\t", 9348c2ecf20Sopenharmony_ci &stat_size, data, i); 9358c2ecf20Sopenharmony_ci vxge_add_string("rx_red_discard_%d\t\t\t", 9368c2ecf20Sopenharmony_ci &stat_size, data, i); 9378c2ecf20Sopenharmony_ci vxge_add_string("rx_xgmii_ctrl_err_cnt_%d\t\t", 9388c2ecf20Sopenharmony_ci &stat_size, data, i); 9398c2ecf20Sopenharmony_ci vxge_add_string("rx_xgmii_data_err_cnt_%d\t\t", 9408c2ecf20Sopenharmony_ci &stat_size, data, i); 9418c2ecf20Sopenharmony_ci vxge_add_string("rx_xgmii_char1_match_%d\t\t", 9428c2ecf20Sopenharmony_ci &stat_size, data, i); 9438c2ecf20Sopenharmony_ci vxge_add_string("rx_xgmii_err_sym_%d\t\t\t", 9448c2ecf20Sopenharmony_ci &stat_size, data, i); 9458c2ecf20Sopenharmony_ci vxge_add_string("rx_xgmii_column1_match_%d\t\t", 9468c2ecf20Sopenharmony_ci &stat_size, data, i); 9478c2ecf20Sopenharmony_ci vxge_add_string("rx_xgmii_char2_match_%d\t\t", 9488c2ecf20Sopenharmony_ci &stat_size, data, i); 9498c2ecf20Sopenharmony_ci vxge_add_string("rx_local_fault_%d\t\t\t", 9508c2ecf20Sopenharmony_ci &stat_size, data, i); 9518c2ecf20Sopenharmony_ci vxge_add_string("rx_xgmii_column2_match_%d\t\t", 9528c2ecf20Sopenharmony_ci &stat_size, data, i); 9538c2ecf20Sopenharmony_ci vxge_add_string("rx_jettison_%d\t\t\t", 9548c2ecf20Sopenharmony_ci &stat_size, data, i); 9558c2ecf20Sopenharmony_ci vxge_add_string("rx_remote_fault_%d\t\t\t", 9568c2ecf20Sopenharmony_ci &stat_size, data, i); 9578c2ecf20Sopenharmony_ci } 9588c2ecf20Sopenharmony_ci 9598c2ecf20Sopenharmony_ci vxge_add_string("\n SOFTWARE STATISTICS%s\t\t\t", 9608c2ecf20Sopenharmony_ci &stat_size, data, ""); 9618c2ecf20Sopenharmony_ci for (i = 0; i < vdev->no_of_vpath; i++) { 9628c2ecf20Sopenharmony_ci vxge_add_string("soft_reset_cnt_%d\t\t\t", 9638c2ecf20Sopenharmony_ci &stat_size, data, i); 9648c2ecf20Sopenharmony_ci vxge_add_string("unknown_alarms_%d\t\t\t", 9658c2ecf20Sopenharmony_ci &stat_size, data, i); 9668c2ecf20Sopenharmony_ci vxge_add_string("network_sustained_fault_%d\t\t", 9678c2ecf20Sopenharmony_ci &stat_size, data, i); 9688c2ecf20Sopenharmony_ci vxge_add_string("network_sustained_ok_%d\t\t", 9698c2ecf20Sopenharmony_ci &stat_size, data, i); 9708c2ecf20Sopenharmony_ci vxge_add_string("kdfcctl_fifo0_overwrite_%d\t\t", 9718c2ecf20Sopenharmony_ci &stat_size, data, i); 9728c2ecf20Sopenharmony_ci vxge_add_string("kdfcctl_fifo0_poison_%d\t\t", 9738c2ecf20Sopenharmony_ci &stat_size, data, i); 9748c2ecf20Sopenharmony_ci vxge_add_string("kdfcctl_fifo0_dma_error_%d\t\t", 9758c2ecf20Sopenharmony_ci &stat_size, data, i); 9768c2ecf20Sopenharmony_ci vxge_add_string("dblgen_fifo0_overflow_%d\t\t", 9778c2ecf20Sopenharmony_ci &stat_size, data, i); 9788c2ecf20Sopenharmony_ci vxge_add_string("statsb_pif_chain_error_%d\t\t", 9798c2ecf20Sopenharmony_ci &stat_size, data, i); 9808c2ecf20Sopenharmony_ci vxge_add_string("statsb_drop_timeout_%d\t\t", 9818c2ecf20Sopenharmony_ci &stat_size, data, i); 9828c2ecf20Sopenharmony_ci vxge_add_string("target_illegal_access_%d\t\t", 9838c2ecf20Sopenharmony_ci &stat_size, data, i); 9848c2ecf20Sopenharmony_ci vxge_add_string("ini_serr_det_%d\t\t\t", 9858c2ecf20Sopenharmony_ci &stat_size, data, i); 9868c2ecf20Sopenharmony_ci vxge_add_string("prc_ring_bumps_%d\t\t\t", 9878c2ecf20Sopenharmony_ci &stat_size, data, i); 9888c2ecf20Sopenharmony_ci vxge_add_string("prc_rxdcm_sc_err_%d\t\t\t", 9898c2ecf20Sopenharmony_ci &stat_size, data, i); 9908c2ecf20Sopenharmony_ci vxge_add_string("prc_rxdcm_sc_abort_%d\t\t", 9918c2ecf20Sopenharmony_ci &stat_size, data, i); 9928c2ecf20Sopenharmony_ci vxge_add_string("prc_quanta_size_err_%d\t\t", 9938c2ecf20Sopenharmony_ci &stat_size, data, i); 9948c2ecf20Sopenharmony_ci vxge_add_string("ring_full_cnt_%d\t\t\t", 9958c2ecf20Sopenharmony_ci &stat_size, data, i); 9968c2ecf20Sopenharmony_ci vxge_add_string("ring_usage_cnt_%d\t\t\t", 9978c2ecf20Sopenharmony_ci &stat_size, data, i); 9988c2ecf20Sopenharmony_ci vxge_add_string("ring_usage_max_%d\t\t\t", 9998c2ecf20Sopenharmony_ci &stat_size, data, i); 10008c2ecf20Sopenharmony_ci vxge_add_string("ring_reserve_free_swaps_cnt_%d\t", 10018c2ecf20Sopenharmony_ci &stat_size, data, i); 10028c2ecf20Sopenharmony_ci vxge_add_string("ring_total_compl_cnt_%d\t\t", 10038c2ecf20Sopenharmony_ci &stat_size, data, i); 10048c2ecf20Sopenharmony_ci for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++) 10058c2ecf20Sopenharmony_ci vxge_add_string("rxd_t_code_err_cnt%d_%d\t\t", 10068c2ecf20Sopenharmony_ci &stat_size, data, j, i); 10078c2ecf20Sopenharmony_ci vxge_add_string("fifo_full_cnt_%d\t\t\t", 10088c2ecf20Sopenharmony_ci &stat_size, data, i); 10098c2ecf20Sopenharmony_ci vxge_add_string("fifo_usage_cnt_%d\t\t\t", 10108c2ecf20Sopenharmony_ci &stat_size, data, i); 10118c2ecf20Sopenharmony_ci vxge_add_string("fifo_usage_max_%d\t\t\t", 10128c2ecf20Sopenharmony_ci &stat_size, data, i); 10138c2ecf20Sopenharmony_ci vxge_add_string("fifo_reserve_free_swaps_cnt_%d\t", 10148c2ecf20Sopenharmony_ci &stat_size, data, i); 10158c2ecf20Sopenharmony_ci vxge_add_string("fifo_total_compl_cnt_%d\t\t", 10168c2ecf20Sopenharmony_ci &stat_size, data, i); 10178c2ecf20Sopenharmony_ci vxge_add_string("fifo_total_posts_%d\t\t\t", 10188c2ecf20Sopenharmony_ci &stat_size, data, i); 10198c2ecf20Sopenharmony_ci vxge_add_string("fifo_total_buffers_%d\t\t", 10208c2ecf20Sopenharmony_ci &stat_size, data, i); 10218c2ecf20Sopenharmony_ci for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++) 10228c2ecf20Sopenharmony_ci vxge_add_string("txd_t_code_err_cnt%d_%d\t\t", 10238c2ecf20Sopenharmony_ci &stat_size, data, j, i); 10248c2ecf20Sopenharmony_ci } 10258c2ecf20Sopenharmony_ci 10268c2ecf20Sopenharmony_ci vxge_add_string("\n HARDWARE STATISTICS%s\t\t\t", 10278c2ecf20Sopenharmony_ci &stat_size, data, ""); 10288c2ecf20Sopenharmony_ci for (i = 0; i < vdev->no_of_vpath; i++) { 10298c2ecf20Sopenharmony_ci vxge_add_string("ini_num_mwr_sent_%d\t\t\t", 10308c2ecf20Sopenharmony_ci &stat_size, data, i); 10318c2ecf20Sopenharmony_ci vxge_add_string("ini_num_mrd_sent_%d\t\t\t", 10328c2ecf20Sopenharmony_ci &stat_size, data, i); 10338c2ecf20Sopenharmony_ci vxge_add_string("ini_num_cpl_rcvd_%d\t\t\t", 10348c2ecf20Sopenharmony_ci &stat_size, data, i); 10358c2ecf20Sopenharmony_ci vxge_add_string("ini_num_mwr_byte_sent_%d\t\t", 10368c2ecf20Sopenharmony_ci &stat_size, data, i); 10378c2ecf20Sopenharmony_ci vxge_add_string("ini_num_cpl_byte_rcvd_%d\t\t", 10388c2ecf20Sopenharmony_ci &stat_size, data, i); 10398c2ecf20Sopenharmony_ci vxge_add_string("wrcrdtarb_xoff_%d\t\t\t", 10408c2ecf20Sopenharmony_ci &stat_size, data, i); 10418c2ecf20Sopenharmony_ci vxge_add_string("rdcrdtarb_xoff_%d\t\t\t", 10428c2ecf20Sopenharmony_ci &stat_size, data, i); 10438c2ecf20Sopenharmony_ci vxge_add_string("vpath_genstats_count0_%d\t\t", 10448c2ecf20Sopenharmony_ci &stat_size, data, i); 10458c2ecf20Sopenharmony_ci vxge_add_string("vpath_genstats_count1_%d\t\t", 10468c2ecf20Sopenharmony_ci &stat_size, data, i); 10478c2ecf20Sopenharmony_ci vxge_add_string("vpath_genstats_count2_%d\t\t", 10488c2ecf20Sopenharmony_ci &stat_size, data, i); 10498c2ecf20Sopenharmony_ci vxge_add_string("vpath_genstats_count3_%d\t\t", 10508c2ecf20Sopenharmony_ci &stat_size, data, i); 10518c2ecf20Sopenharmony_ci vxge_add_string("vpath_genstats_count4_%d\t\t", 10528c2ecf20Sopenharmony_ci &stat_size, data, i); 10538c2ecf20Sopenharmony_ci vxge_add_string("vpath_genstats_count5_%d\t\t", 10548c2ecf20Sopenharmony_ci &stat_size, data, i); 10558c2ecf20Sopenharmony_ci vxge_add_string("prog_event_vnum0_%d\t\t\t", 10568c2ecf20Sopenharmony_ci &stat_size, data, i); 10578c2ecf20Sopenharmony_ci vxge_add_string("prog_event_vnum1_%d\t\t\t", 10588c2ecf20Sopenharmony_ci &stat_size, data, i); 10598c2ecf20Sopenharmony_ci vxge_add_string("prog_event_vnum2_%d\t\t\t", 10608c2ecf20Sopenharmony_ci &stat_size, data, i); 10618c2ecf20Sopenharmony_ci vxge_add_string("prog_event_vnum3_%d\t\t\t", 10628c2ecf20Sopenharmony_ci &stat_size, data, i); 10638c2ecf20Sopenharmony_ci vxge_add_string("rx_multi_cast_frame_discard_%d\t", 10648c2ecf20Sopenharmony_ci &stat_size, data, i); 10658c2ecf20Sopenharmony_ci vxge_add_string("rx_frm_transferred_%d\t\t", 10668c2ecf20Sopenharmony_ci &stat_size, data, i); 10678c2ecf20Sopenharmony_ci vxge_add_string("rxd_returned_%d\t\t\t", 10688c2ecf20Sopenharmony_ci &stat_size, data, i); 10698c2ecf20Sopenharmony_ci vxge_add_string("rx_mpa_len_fail_frms_%d\t\t", 10708c2ecf20Sopenharmony_ci &stat_size, data, i); 10718c2ecf20Sopenharmony_ci vxge_add_string("rx_mpa_mrk_fail_frms_%d\t\t", 10728c2ecf20Sopenharmony_ci &stat_size, data, i); 10738c2ecf20Sopenharmony_ci vxge_add_string("rx_mpa_crc_fail_frms_%d\t\t", 10748c2ecf20Sopenharmony_ci &stat_size, data, i); 10758c2ecf20Sopenharmony_ci vxge_add_string("rx_permitted_frms_%d\t\t", 10768c2ecf20Sopenharmony_ci &stat_size, data, i); 10778c2ecf20Sopenharmony_ci vxge_add_string("rx_vp_reset_discarded_frms_%d\t", 10788c2ecf20Sopenharmony_ci &stat_size, data, i); 10798c2ecf20Sopenharmony_ci vxge_add_string("rx_wol_frms_%d\t\t\t", 10808c2ecf20Sopenharmony_ci &stat_size, data, i); 10818c2ecf20Sopenharmony_ci vxge_add_string("tx_vp_reset_discarded_frms_%d\t", 10828c2ecf20Sopenharmony_ci &stat_size, data, i); 10838c2ecf20Sopenharmony_ci } 10848c2ecf20Sopenharmony_ci 10858c2ecf20Sopenharmony_ci memcpy(data + stat_size, ðtool_driver_stats_keys, 10868c2ecf20Sopenharmony_ci sizeof(ethtool_driver_stats_keys)); 10878c2ecf20Sopenharmony_ci } 10888c2ecf20Sopenharmony_ci} 10898c2ecf20Sopenharmony_ci 10908c2ecf20Sopenharmony_cistatic int vxge_ethtool_get_regs_len(struct net_device *dev) 10918c2ecf20Sopenharmony_ci{ 10928c2ecf20Sopenharmony_ci struct vxgedev *vdev = netdev_priv(dev); 10938c2ecf20Sopenharmony_ci 10948c2ecf20Sopenharmony_ci return sizeof(struct vxge_hw_vpath_reg) * vdev->no_of_vpath; 10958c2ecf20Sopenharmony_ci} 10968c2ecf20Sopenharmony_ci 10978c2ecf20Sopenharmony_cistatic int vxge_ethtool_get_sset_count(struct net_device *dev, int sset) 10988c2ecf20Sopenharmony_ci{ 10998c2ecf20Sopenharmony_ci struct vxgedev *vdev = netdev_priv(dev); 11008c2ecf20Sopenharmony_ci 11018c2ecf20Sopenharmony_ci switch (sset) { 11028c2ecf20Sopenharmony_ci case ETH_SS_STATS: 11038c2ecf20Sopenharmony_ci return VXGE_TITLE_LEN + 11048c2ecf20Sopenharmony_ci (vdev->no_of_vpath * VXGE_HW_VPATH_STATS_LEN) + 11058c2ecf20Sopenharmony_ci (vdev->max_config_port * VXGE_HW_AGGR_STATS_LEN) + 11068c2ecf20Sopenharmony_ci (vdev->max_config_port * VXGE_HW_PORT_STATS_LEN) + 11078c2ecf20Sopenharmony_ci (vdev->no_of_vpath * VXGE_HW_VPATH_TX_STATS_LEN) + 11088c2ecf20Sopenharmony_ci (vdev->no_of_vpath * VXGE_HW_VPATH_RX_STATS_LEN) + 11098c2ecf20Sopenharmony_ci (vdev->no_of_vpath * VXGE_SW_STATS_LEN) + 11108c2ecf20Sopenharmony_ci DRIVER_STAT_LEN; 11118c2ecf20Sopenharmony_ci default: 11128c2ecf20Sopenharmony_ci return -EOPNOTSUPP; 11138c2ecf20Sopenharmony_ci } 11148c2ecf20Sopenharmony_ci} 11158c2ecf20Sopenharmony_ci 11168c2ecf20Sopenharmony_cistatic int vxge_fw_flash(struct net_device *dev, struct ethtool_flash *parms) 11178c2ecf20Sopenharmony_ci{ 11188c2ecf20Sopenharmony_ci struct vxgedev *vdev = netdev_priv(dev); 11198c2ecf20Sopenharmony_ci 11208c2ecf20Sopenharmony_ci if (vdev->max_vpath_supported != VXGE_HW_MAX_VIRTUAL_PATHS) { 11218c2ecf20Sopenharmony_ci printk(KERN_INFO "Single Function Mode is required to flash the" 11228c2ecf20Sopenharmony_ci " firmware\n"); 11238c2ecf20Sopenharmony_ci return -EINVAL; 11248c2ecf20Sopenharmony_ci } 11258c2ecf20Sopenharmony_ci 11268c2ecf20Sopenharmony_ci if (netif_running(dev)) { 11278c2ecf20Sopenharmony_ci printk(KERN_INFO "Interface %s must be down to flash the " 11288c2ecf20Sopenharmony_ci "firmware\n", dev->name); 11298c2ecf20Sopenharmony_ci return -EBUSY; 11308c2ecf20Sopenharmony_ci } 11318c2ecf20Sopenharmony_ci 11328c2ecf20Sopenharmony_ci return vxge_fw_upgrade(vdev, parms->data, 1); 11338c2ecf20Sopenharmony_ci} 11348c2ecf20Sopenharmony_ci 11358c2ecf20Sopenharmony_cistatic const struct ethtool_ops vxge_ethtool_ops = { 11368c2ecf20Sopenharmony_ci .get_drvinfo = vxge_ethtool_gdrvinfo, 11378c2ecf20Sopenharmony_ci .get_regs_len = vxge_ethtool_get_regs_len, 11388c2ecf20Sopenharmony_ci .get_regs = vxge_ethtool_gregs, 11398c2ecf20Sopenharmony_ci .get_link = ethtool_op_get_link, 11408c2ecf20Sopenharmony_ci .get_pauseparam = vxge_ethtool_getpause_data, 11418c2ecf20Sopenharmony_ci .set_pauseparam = vxge_ethtool_setpause_data, 11428c2ecf20Sopenharmony_ci .get_strings = vxge_ethtool_get_strings, 11438c2ecf20Sopenharmony_ci .set_phys_id = vxge_ethtool_idnic, 11448c2ecf20Sopenharmony_ci .get_sset_count = vxge_ethtool_get_sset_count, 11458c2ecf20Sopenharmony_ci .get_ethtool_stats = vxge_get_ethtool_stats, 11468c2ecf20Sopenharmony_ci .flash_device = vxge_fw_flash, 11478c2ecf20Sopenharmony_ci .get_link_ksettings = vxge_ethtool_get_link_ksettings, 11488c2ecf20Sopenharmony_ci .set_link_ksettings = vxge_ethtool_set_link_ksettings, 11498c2ecf20Sopenharmony_ci}; 11508c2ecf20Sopenharmony_ci 11518c2ecf20Sopenharmony_civoid vxge_initialize_ethtool_ops(struct net_device *ndev) 11528c2ecf20Sopenharmony_ci{ 11538c2ecf20Sopenharmony_ci ndev->ethtool_ops = &vxge_ethtool_ops; 11548c2ecf20Sopenharmony_ci} 1155