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