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