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