xref: /openbmc/linux/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c (revision f677b30b487ca3763c3de3f1b4d8c976c2961cd1)
1 /*
2  * QLogic qlcnic NIC Driver
3  * Copyright (c) 2009-2013 QLogic Corporation
4  *
5  * See LICENSE.qlcnic for copyright and licensing details.
6  */
7 
8 #include <linux/types.h>
9 #include <linux/delay.h>
10 #include <linux/pci.h>
11 #include <linux/io.h>
12 #include <linux/netdevice.h>
13 #include <linux/ethtool.h>
14 
15 #include "qlcnic.h"
16 
17 struct qlcnic_stats {
18 	char stat_string[ETH_GSTRING_LEN];
19 	int sizeof_stat;
20 	int stat_offset;
21 };
22 
23 #define QLC_SIZEOF(m) FIELD_SIZEOF(struct qlcnic_adapter, m)
24 #define QLC_OFF(m) offsetof(struct qlcnic_adapter, m)
25 static const u32 qlcnic_fw_dump_level[] = {
26 	0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff
27 };
28 
29 static const struct qlcnic_stats qlcnic_gstrings_stats[] = {
30 	{"xmit_on", QLC_SIZEOF(stats.xmit_on), QLC_OFF(stats.xmit_on)},
31 	{"xmit_off", QLC_SIZEOF(stats.xmit_off), QLC_OFF(stats.xmit_off)},
32 	{"xmit_called", QLC_SIZEOF(stats.xmitcalled),
33 	 QLC_OFF(stats.xmitcalled)},
34 	{"xmit_finished", QLC_SIZEOF(stats.xmitfinished),
35 	 QLC_OFF(stats.xmitfinished)},
36 	{"tx dma map error", QLC_SIZEOF(stats.tx_dma_map_error),
37 	 QLC_OFF(stats.tx_dma_map_error)},
38 	{"tx_bytes", QLC_SIZEOF(stats.txbytes), QLC_OFF(stats.txbytes)},
39 	{"tx_dropped", QLC_SIZEOF(stats.txdropped), QLC_OFF(stats.txdropped)},
40 	{"rx dma map error", QLC_SIZEOF(stats.rx_dma_map_error),
41 	 QLC_OFF(stats.rx_dma_map_error)},
42 	{"rx_pkts", QLC_SIZEOF(stats.rx_pkts), QLC_OFF(stats.rx_pkts)},
43 	{"rx_bytes", QLC_SIZEOF(stats.rxbytes), QLC_OFF(stats.rxbytes)},
44 	{"rx_dropped", QLC_SIZEOF(stats.rxdropped), QLC_OFF(stats.rxdropped)},
45 	{"null rxbuf", QLC_SIZEOF(stats.null_rxbuf), QLC_OFF(stats.null_rxbuf)},
46 	{"csummed", QLC_SIZEOF(stats.csummed), QLC_OFF(stats.csummed)},
47 	{"lro_pkts", QLC_SIZEOF(stats.lro_pkts), QLC_OFF(stats.lro_pkts)},
48 	{"lrobytes", QLC_SIZEOF(stats.lrobytes), QLC_OFF(stats.lrobytes)},
49 	{"lso_frames", QLC_SIZEOF(stats.lso_frames), QLC_OFF(stats.lso_frames)},
50 	{"skb_alloc_failure", QLC_SIZEOF(stats.skb_alloc_failure),
51 	 QLC_OFF(stats.skb_alloc_failure)},
52 	{"mac_filter_limit_overrun", QLC_SIZEOF(stats.mac_filter_limit_overrun),
53 	 QLC_OFF(stats.mac_filter_limit_overrun)},
54 	{"spurious intr", QLC_SIZEOF(stats.spurious_intr),
55 	 QLC_OFF(stats.spurious_intr)},
56 
57 };
58 
59 static const char qlcnic_device_gstrings_stats[][ETH_GSTRING_LEN] = {
60 	"tx unicast frames",
61 	"tx multicast frames",
62 	"tx broadcast frames",
63 	"tx dropped frames",
64 	"tx errors",
65 	"tx local frames",
66 	"tx numbytes",
67 	"rx unicast frames",
68 	"rx multicast frames",
69 	"rx broadcast frames",
70 	"rx dropped frames",
71 	"rx errors",
72 	"rx local frames",
73 	"rx numbytes",
74 };
75 
76 static const char qlcnic_83xx_tx_stats_strings[][ETH_GSTRING_LEN] = {
77 	"ctx_tx_bytes",
78 	"ctx_tx_pkts",
79 	"ctx_tx_errors",
80 	"ctx_tx_dropped_pkts",
81 	"ctx_tx_num_buffers",
82 };
83 
84 static const char qlcnic_83xx_mac_stats_strings[][ETH_GSTRING_LEN] = {
85 	"mac_tx_frames",
86 	"mac_tx_bytes",
87 	"mac_tx_mcast_pkts",
88 	"mac_tx_bcast_pkts",
89 	"mac_tx_pause_cnt",
90 	"mac_tx_ctrl_pkt",
91 	"mac_tx_lt_64b_pkts",
92 	"mac_tx_lt_127b_pkts",
93 	"mac_tx_lt_255b_pkts",
94 	"mac_tx_lt_511b_pkts",
95 	"mac_tx_lt_1023b_pkts",
96 	"mac_tx_lt_1518b_pkts",
97 	"mac_tx_gt_1518b_pkts",
98 	"mac_rx_frames",
99 	"mac_rx_bytes",
100 	"mac_rx_mcast_pkts",
101 	"mac_rx_bcast_pkts",
102 	"mac_rx_pause_cnt",
103 	"mac_rx_ctrl_pkt",
104 	"mac_rx_lt_64b_pkts",
105 	"mac_rx_lt_127b_pkts",
106 	"mac_rx_lt_255b_pkts",
107 	"mac_rx_lt_511b_pkts",
108 	"mac_rx_lt_1023b_pkts",
109 	"mac_rx_lt_1518b_pkts",
110 	"mac_rx_gt_1518b_pkts",
111 	"mac_rx_length_error",
112 	"mac_rx_length_small",
113 	"mac_rx_length_large",
114 	"mac_rx_jabber",
115 	"mac_rx_dropped",
116 	"mac_crc_error",
117 	"mac_align_error",
118 	"eswitch_frames",
119 	"eswitch_bytes",
120 	"eswitch_multicast_frames",
121 	"eswitch_broadcast_frames",
122 	"eswitch_unicast_frames",
123 	"eswitch_error_free_frames",
124 	"eswitch_error_free_bytes",
125 };
126 
127 #define QLCNIC_STATS_LEN	ARRAY_SIZE(qlcnic_gstrings_stats)
128 
129 static const char qlcnic_tx_queue_stats_strings[][ETH_GSTRING_LEN] = {
130 	"xmit_on",
131 	"xmit_off",
132 	"xmit_called",
133 	"xmit_finished",
134 	"tx_bytes",
135 };
136 
137 #define QLCNIC_TX_STATS_LEN	ARRAY_SIZE(qlcnic_tx_queue_stats_strings)
138 
139 static const char qlcnic_83xx_rx_stats_strings[][ETH_GSTRING_LEN] = {
140 	"ctx_rx_bytes",
141 	"ctx_rx_pkts",
142 	"ctx_lro_pkt_cnt",
143 	"ctx_ip_csum_error",
144 	"ctx_rx_pkts_wo_ctx",
145 	"ctx_rx_pkts_drop_wo_sds_on_card",
146 	"ctx_rx_pkts_drop_wo_sds_on_host",
147 	"ctx_rx_osized_pkts",
148 	"ctx_rx_pkts_dropped_wo_rds",
149 	"ctx_rx_unexpected_mcast_pkts",
150 	"ctx_invalid_mac_address",
151 	"ctx_rx_rds_ring_prim_attempted",
152 	"ctx_rx_rds_ring_prim_success",
153 	"ctx_num_lro_flows_added",
154 	"ctx_num_lro_flows_removed",
155 	"ctx_num_lro_flows_active",
156 	"ctx_pkts_dropped_unknown",
157 };
158 
159 static const char qlcnic_gstrings_test[][ETH_GSTRING_LEN] = {
160 	"Register_Test_on_offline",
161 	"Link_Test_on_offline",
162 	"Interrupt_Test_offline",
163 	"Internal_Loopback_offline",
164 	"External_Loopback_offline",
165 	"EEPROM_Test_offline"
166 };
167 
168 #define QLCNIC_TEST_LEN	ARRAY_SIZE(qlcnic_gstrings_test)
169 
170 static inline int qlcnic_82xx_statistics(struct qlcnic_adapter *adapter)
171 {
172 	return ARRAY_SIZE(qlcnic_gstrings_stats) +
173 	       ARRAY_SIZE(qlcnic_83xx_mac_stats_strings) +
174 	       QLCNIC_TX_STATS_LEN * adapter->drv_tx_rings;
175 }
176 
177 static inline int qlcnic_83xx_statistics(struct qlcnic_adapter *adapter)
178 {
179 	return ARRAY_SIZE(qlcnic_gstrings_stats) +
180 	       ARRAY_SIZE(qlcnic_83xx_tx_stats_strings) +
181 	       ARRAY_SIZE(qlcnic_83xx_mac_stats_strings) +
182 	       ARRAY_SIZE(qlcnic_83xx_rx_stats_strings) +
183 	       QLCNIC_TX_STATS_LEN * adapter->drv_tx_rings;
184 }
185 
186 static int qlcnic_dev_statistics_len(struct qlcnic_adapter *adapter)
187 {
188 	int len = -1;
189 
190 	if (qlcnic_82xx_check(adapter)) {
191 		len = qlcnic_82xx_statistics(adapter);
192 		if (adapter->flags & QLCNIC_ESWITCH_ENABLED)
193 			len += ARRAY_SIZE(qlcnic_device_gstrings_stats);
194 	} else if (qlcnic_83xx_check(adapter)) {
195 		len = qlcnic_83xx_statistics(adapter);
196 	}
197 
198 	return len;
199 }
200 
201 #define	QLCNIC_TX_INTR_NOT_CONFIGURED	0X78563412
202 
203 #define QLCNIC_MAX_EEPROM_LEN   1024
204 
205 static const u32 diag_registers[] = {
206 	QLCNIC_CMDPEG_STATE,
207 	QLCNIC_RCVPEG_STATE,
208 	QLCNIC_FW_CAPABILITIES,
209 	QLCNIC_CRB_DRV_ACTIVE,
210 	QLCNIC_CRB_DEV_STATE,
211 	QLCNIC_CRB_DRV_STATE,
212 	QLCNIC_CRB_DRV_SCRATCH,
213 	QLCNIC_CRB_DEV_PARTITION_INFO,
214 	QLCNIC_CRB_DRV_IDC_VER,
215 	QLCNIC_PEG_ALIVE_COUNTER,
216 	QLCNIC_PEG_HALT_STATUS1,
217 	QLCNIC_PEG_HALT_STATUS2,
218 	-1
219 };
220 
221 
222 static const u32 ext_diag_registers[] = {
223 	CRB_XG_STATE_P3P,
224 	ISR_INT_STATE_REG,
225 	QLCNIC_CRB_PEG_NET_0+0x3c,
226 	QLCNIC_CRB_PEG_NET_1+0x3c,
227 	QLCNIC_CRB_PEG_NET_2+0x3c,
228 	QLCNIC_CRB_PEG_NET_4+0x3c,
229 	-1
230 };
231 
232 #define QLCNIC_MGMT_API_VERSION	2
233 #define QLCNIC_ETHTOOL_REGS_VER	4
234 
235 static inline int qlcnic_get_ring_regs_len(struct qlcnic_adapter *adapter)
236 {
237 	int ring_regs_cnt = (adapter->drv_tx_rings * 5) +
238 			    (adapter->max_rds_rings * 2) +
239 			    (adapter->drv_sds_rings * 3) + 5;
240 	return ring_regs_cnt * sizeof(u32);
241 }
242 
243 static int qlcnic_get_regs_len(struct net_device *dev)
244 {
245 	struct qlcnic_adapter *adapter = netdev_priv(dev);
246 	u32 len;
247 
248 	if (qlcnic_83xx_check(adapter))
249 		len = qlcnic_83xx_get_regs_len(adapter);
250 	else
251 		len = sizeof(ext_diag_registers) + sizeof(diag_registers);
252 
253 	len += ((QLCNIC_DEV_INFO_SIZE + 2) * sizeof(u32));
254 	len += qlcnic_get_ring_regs_len(adapter);
255 	return len;
256 }
257 
258 static int qlcnic_get_eeprom_len(struct net_device *dev)
259 {
260 	return QLCNIC_FLASH_TOTAL_SIZE;
261 }
262 
263 static void
264 qlcnic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo)
265 {
266 	struct qlcnic_adapter *adapter = netdev_priv(dev);
267 	u32 fw_major, fw_minor, fw_build;
268 	fw_major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR);
269 	fw_minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR);
270 	fw_build = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB);
271 	snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
272 		"%d.%d.%d", fw_major, fw_minor, fw_build);
273 
274 	strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
275 		sizeof(drvinfo->bus_info));
276 	strlcpy(drvinfo->driver, qlcnic_driver_name, sizeof(drvinfo->driver));
277 	strlcpy(drvinfo->version, QLCNIC_LINUX_VERSIONID,
278 		sizeof(drvinfo->version));
279 }
280 
281 static int
282 qlcnic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
283 {
284 	struct qlcnic_adapter *adapter = netdev_priv(dev);
285 
286 	if (qlcnic_82xx_check(adapter))
287 		return qlcnic_82xx_get_settings(adapter, ecmd);
288 	else if (qlcnic_83xx_check(adapter))
289 		return qlcnic_83xx_get_settings(adapter, ecmd);
290 
291 	return -EIO;
292 }
293 
294 int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter,
295 			     struct ethtool_cmd *ecmd)
296 {
297 	struct qlcnic_hardware_context *ahw = adapter->ahw;
298 	u32 speed, reg;
299 	int check_sfp_module = 0, err = 0;
300 	u16 pcifn = ahw->pci_func;
301 
302 	/* read which mode */
303 	if (adapter->ahw->port_type == QLCNIC_GBE) {
304 		ecmd->supported = (SUPPORTED_10baseT_Half |
305 				   SUPPORTED_10baseT_Full |
306 				   SUPPORTED_100baseT_Half |
307 				   SUPPORTED_100baseT_Full |
308 				   SUPPORTED_1000baseT_Half |
309 				   SUPPORTED_1000baseT_Full);
310 
311 		ecmd->advertising = (ADVERTISED_100baseT_Half |
312 				     ADVERTISED_100baseT_Full |
313 				     ADVERTISED_1000baseT_Half |
314 				     ADVERTISED_1000baseT_Full);
315 
316 		ethtool_cmd_speed_set(ecmd, adapter->ahw->link_speed);
317 		ecmd->duplex = adapter->ahw->link_duplex;
318 		ecmd->autoneg = adapter->ahw->link_autoneg;
319 
320 	} else if (adapter->ahw->port_type == QLCNIC_XGBE) {
321 		u32 val = 0;
322 		val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR, &err);
323 
324 		if (val == QLCNIC_PORT_MODE_802_3_AP) {
325 			ecmd->supported = SUPPORTED_1000baseT_Full;
326 			ecmd->advertising = ADVERTISED_1000baseT_Full;
327 		} else {
328 			ecmd->supported = SUPPORTED_10000baseT_Full;
329 			ecmd->advertising = ADVERTISED_10000baseT_Full;
330 		}
331 
332 		if (netif_running(adapter->netdev) && ahw->has_link_events) {
333 			if (ahw->linkup) {
334 				reg = QLCRD32(adapter,
335 					      P3P_LINK_SPEED_REG(pcifn), &err);
336 				speed = P3P_LINK_SPEED_VAL(pcifn, reg);
337 				ahw->link_speed = speed * P3P_LINK_SPEED_MHZ;
338 			}
339 
340 			ethtool_cmd_speed_set(ecmd, ahw->link_speed);
341 			ecmd->autoneg = ahw->link_autoneg;
342 			ecmd->duplex = ahw->link_duplex;
343 			goto skip;
344 		}
345 
346 		ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
347 		ecmd->duplex = DUPLEX_UNKNOWN;
348 		ecmd->autoneg = AUTONEG_DISABLE;
349 	} else
350 		return -EIO;
351 
352 skip:
353 	ecmd->phy_address = adapter->ahw->physical_port;
354 	ecmd->transceiver = XCVR_EXTERNAL;
355 
356 	switch (adapter->ahw->board_type) {
357 	case QLCNIC_BRDTYPE_P3P_REF_QG:
358 	case QLCNIC_BRDTYPE_P3P_4_GB:
359 	case QLCNIC_BRDTYPE_P3P_4_GB_MM:
360 
361 		ecmd->supported |= SUPPORTED_Autoneg;
362 		ecmd->advertising |= ADVERTISED_Autoneg;
363 	case QLCNIC_BRDTYPE_P3P_10G_CX4:
364 	case QLCNIC_BRDTYPE_P3P_10G_CX4_LP:
365 	case QLCNIC_BRDTYPE_P3P_10000_BASE_T:
366 		ecmd->supported |= SUPPORTED_TP;
367 		ecmd->advertising |= ADVERTISED_TP;
368 		ecmd->port = PORT_TP;
369 		ecmd->autoneg =  adapter->ahw->link_autoneg;
370 		break;
371 	case QLCNIC_BRDTYPE_P3P_IMEZ:
372 	case QLCNIC_BRDTYPE_P3P_XG_LOM:
373 	case QLCNIC_BRDTYPE_P3P_HMEZ:
374 		ecmd->supported |= SUPPORTED_MII;
375 		ecmd->advertising |= ADVERTISED_MII;
376 		ecmd->port = PORT_MII;
377 		ecmd->autoneg = AUTONEG_DISABLE;
378 		break;
379 	case QLCNIC_BRDTYPE_P3P_10G_SFP_PLUS:
380 	case QLCNIC_BRDTYPE_P3P_10G_SFP_CT:
381 	case QLCNIC_BRDTYPE_P3P_10G_SFP_QT:
382 		ecmd->advertising |= ADVERTISED_TP;
383 		ecmd->supported |= SUPPORTED_TP;
384 		check_sfp_module = netif_running(adapter->netdev) &&
385 				   ahw->has_link_events;
386 	case QLCNIC_BRDTYPE_P3P_10G_XFP:
387 		ecmd->supported |= SUPPORTED_FIBRE;
388 		ecmd->advertising |= ADVERTISED_FIBRE;
389 		ecmd->port = PORT_FIBRE;
390 		ecmd->autoneg = AUTONEG_DISABLE;
391 		break;
392 	case QLCNIC_BRDTYPE_P3P_10G_TP:
393 		if (adapter->ahw->port_type == QLCNIC_XGBE) {
394 			ecmd->autoneg = AUTONEG_DISABLE;
395 			ecmd->supported |= (SUPPORTED_FIBRE | SUPPORTED_TP);
396 			ecmd->advertising |=
397 				(ADVERTISED_FIBRE | ADVERTISED_TP);
398 			ecmd->port = PORT_FIBRE;
399 			check_sfp_module = netif_running(adapter->netdev) &&
400 					   ahw->has_link_events;
401 		} else {
402 			ecmd->autoneg = AUTONEG_ENABLE;
403 			ecmd->supported |= (SUPPORTED_TP | SUPPORTED_Autoneg);
404 			ecmd->advertising |=
405 				(ADVERTISED_TP | ADVERTISED_Autoneg);
406 			ecmd->port = PORT_TP;
407 		}
408 		break;
409 	default:
410 		dev_err(&adapter->pdev->dev, "Unsupported board model %d\n",
411 			adapter->ahw->board_type);
412 		return -EIO;
413 	}
414 
415 	if (check_sfp_module) {
416 		switch (adapter->ahw->module_type) {
417 		case LINKEVENT_MODULE_OPTICAL_UNKNOWN:
418 		case LINKEVENT_MODULE_OPTICAL_SRLR:
419 		case LINKEVENT_MODULE_OPTICAL_LRM:
420 		case LINKEVENT_MODULE_OPTICAL_SFP_1G:
421 			ecmd->port = PORT_FIBRE;
422 			break;
423 		case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE:
424 		case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN:
425 		case LINKEVENT_MODULE_TWINAX:
426 			ecmd->port = PORT_TP;
427 			break;
428 		default:
429 			ecmd->port = PORT_OTHER;
430 		}
431 	}
432 
433 	return 0;
434 }
435 
436 static int qlcnic_set_port_config(struct qlcnic_adapter *adapter,
437 				  struct ethtool_cmd *ecmd)
438 {
439 	u32 ret = 0, config = 0;
440 	/* read which mode */
441 	if (ecmd->duplex)
442 		config |= 0x1;
443 
444 	if (ecmd->autoneg)
445 		config |= 0x2;
446 
447 	switch (ethtool_cmd_speed(ecmd)) {
448 	case SPEED_10:
449 		config |= (0 << 8);
450 		break;
451 	case SPEED_100:
452 		config |= (1 << 8);
453 		break;
454 	case SPEED_1000:
455 		config |= (10 << 8);
456 		break;
457 	default:
458 		return -EIO;
459 	}
460 
461 	ret = qlcnic_fw_cmd_set_port(adapter, config);
462 
463 	if (ret == QLCNIC_RCODE_NOT_SUPPORTED)
464 		return -EOPNOTSUPP;
465 	else if (ret)
466 		return -EIO;
467 	return ret;
468 }
469 
470 static int qlcnic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
471 {
472 	u32 ret = 0;
473 	struct qlcnic_adapter *adapter = netdev_priv(dev);
474 
475 	if (adapter->ahw->port_type != QLCNIC_GBE)
476 		return -EOPNOTSUPP;
477 
478 	if (qlcnic_83xx_check(adapter))
479 		ret = qlcnic_83xx_set_settings(adapter, ecmd);
480 	else
481 		ret = qlcnic_set_port_config(adapter, ecmd);
482 
483 	if (!ret)
484 		return ret;
485 
486 	adapter->ahw->link_speed = ethtool_cmd_speed(ecmd);
487 	adapter->ahw->link_duplex = ecmd->duplex;
488 	adapter->ahw->link_autoneg = ecmd->autoneg;
489 
490 	if (!netif_running(dev))
491 		return 0;
492 
493 	dev->netdev_ops->ndo_stop(dev);
494 	return dev->netdev_ops->ndo_open(dev);
495 }
496 
497 static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter,
498 				     u32 *regs_buff)
499 {
500 	int i, j = 0, err = 0;
501 
502 	for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++)
503 		regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]);
504 	j = 0;
505 	while (ext_diag_registers[j] != -1)
506 		regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++],
507 					 &err);
508 	return i;
509 }
510 
511 static void
512 qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
513 {
514 	struct qlcnic_adapter *adapter = netdev_priv(dev);
515 	struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
516 	struct qlcnic_host_sds_ring *sds_ring;
517 	struct qlcnic_host_rds_ring *rds_rings;
518 	struct qlcnic_host_tx_ring *tx_ring;
519 	u32 *regs_buff = p;
520 	int ring, i = 0;
521 
522 	memset(p, 0, qlcnic_get_regs_len(dev));
523 
524 	regs->version = (QLCNIC_ETHTOOL_REGS_VER << 24) |
525 		(adapter->ahw->revision_id << 16) | (adapter->pdev)->device;
526 
527 	regs_buff[0] = (0xcafe0000 | (QLCNIC_DEV_INFO_SIZE & 0xffff));
528 	regs_buff[1] = QLCNIC_MGMT_API_VERSION;
529 
530 	if (qlcnic_82xx_check(adapter))
531 		i = qlcnic_82xx_get_registers(adapter, regs_buff);
532 	else
533 		i = qlcnic_83xx_get_registers(adapter, regs_buff);
534 
535 	if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
536 		return;
537 
538 	/* Marker btw regs and TX ring count */
539 	regs_buff[i++] = 0xFFEFCDAB;
540 
541 	regs_buff[i++] = adapter->drv_tx_rings; /* No. of TX ring */
542 	for (ring = 0; ring < adapter->drv_tx_rings; ring++) {
543 		tx_ring = &adapter->tx_ring[ring];
544 		regs_buff[i++] = le32_to_cpu(*(tx_ring->hw_consumer));
545 		regs_buff[i++] = tx_ring->sw_consumer;
546 		regs_buff[i++] = readl(tx_ring->crb_cmd_producer);
547 		regs_buff[i++] = tx_ring->producer;
548 		if (tx_ring->crb_intr_mask)
549 			regs_buff[i++] = readl(tx_ring->crb_intr_mask);
550 		else
551 			regs_buff[i++] = QLCNIC_TX_INTR_NOT_CONFIGURED;
552 	}
553 
554 	regs_buff[i++] = adapter->max_rds_rings; /* No. of RX ring */
555 	for (ring = 0; ring < adapter->max_rds_rings; ring++) {
556 		rds_rings = &recv_ctx->rds_rings[ring];
557 		regs_buff[i++] = readl(rds_rings->crb_rcv_producer);
558 		regs_buff[i++] = rds_rings->producer;
559 	}
560 
561 	regs_buff[i++] = adapter->drv_sds_rings; /* No. of SDS ring */
562 	for (ring = 0; ring < adapter->drv_sds_rings; ring++) {
563 		sds_ring = &(recv_ctx->sds_rings[ring]);
564 		regs_buff[i++] = readl(sds_ring->crb_sts_consumer);
565 		regs_buff[i++] = sds_ring->consumer;
566 		regs_buff[i++] = readl(sds_ring->crb_intr_mask);
567 	}
568 }
569 
570 static u32 qlcnic_test_link(struct net_device *dev)
571 {
572 	struct qlcnic_adapter *adapter = netdev_priv(dev);
573 	int err = 0;
574 	u32 val;
575 
576 	if (qlcnic_83xx_check(adapter)) {
577 		val = qlcnic_83xx_test_link(adapter);
578 		return (val & 1) ? 0 : 1;
579 	}
580 	val = QLCRD32(adapter, CRB_XG_STATE_P3P, &err);
581 	if (err == -EIO)
582 		return err;
583 	val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val);
584 	return (val == XG_LINK_UP_P3P) ? 0 : 1;
585 }
586 
587 static int
588 qlcnic_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
589 		      u8 *bytes)
590 {
591 	struct qlcnic_adapter *adapter = netdev_priv(dev);
592 	int offset;
593 	int ret = -1;
594 
595 	if (qlcnic_83xx_check(adapter))
596 		return 0;
597 	if (eeprom->len == 0)
598 		return -EINVAL;
599 
600 	eeprom->magic = (adapter->pdev)->vendor |
601 			((adapter->pdev)->device << 16);
602 	offset = eeprom->offset;
603 
604 	if (qlcnic_82xx_check(adapter))
605 		ret = qlcnic_rom_fast_read_words(adapter, offset, bytes,
606 						 eeprom->len);
607 	if (ret < 0)
608 		return ret;
609 
610 	return 0;
611 }
612 
613 static void
614 qlcnic_get_ringparam(struct net_device *dev,
615 		struct ethtool_ringparam *ring)
616 {
617 	struct qlcnic_adapter *adapter = netdev_priv(dev);
618 
619 	ring->rx_pending = adapter->num_rxd;
620 	ring->rx_jumbo_pending = adapter->num_jumbo_rxd;
621 	ring->tx_pending = adapter->num_txd;
622 
623 	ring->rx_max_pending = adapter->max_rxd;
624 	ring->rx_jumbo_max_pending = adapter->max_jumbo_rxd;
625 	ring->tx_max_pending = MAX_CMD_DESCRIPTORS;
626 }
627 
628 static u32
629 qlcnic_validate_ringparam(u32 val, u32 min, u32 max, char *r_name)
630 {
631 	u32 num_desc;
632 	num_desc = max(val, min);
633 	num_desc = min(num_desc, max);
634 	num_desc = roundup_pow_of_two(num_desc);
635 
636 	if (val != num_desc) {
637 		printk(KERN_INFO "%s: setting %s ring size %d instead of %d\n",
638 		       qlcnic_driver_name, r_name, num_desc, val);
639 	}
640 
641 	return num_desc;
642 }
643 
644 static int
645 qlcnic_set_ringparam(struct net_device *dev,
646 		struct ethtool_ringparam *ring)
647 {
648 	struct qlcnic_adapter *adapter = netdev_priv(dev);
649 	u16 num_rxd, num_jumbo_rxd, num_txd;
650 
651 	if (ring->rx_mini_pending)
652 		return -EOPNOTSUPP;
653 
654 	num_rxd = qlcnic_validate_ringparam(ring->rx_pending,
655 			MIN_RCV_DESCRIPTORS, adapter->max_rxd, "rx");
656 
657 	num_jumbo_rxd = qlcnic_validate_ringparam(ring->rx_jumbo_pending,
658 			MIN_JUMBO_DESCRIPTORS, adapter->max_jumbo_rxd,
659 						"rx jumbo");
660 
661 	num_txd = qlcnic_validate_ringparam(ring->tx_pending,
662 			MIN_CMD_DESCRIPTORS, MAX_CMD_DESCRIPTORS, "tx");
663 
664 	if (num_rxd == adapter->num_rxd && num_txd == adapter->num_txd &&
665 			num_jumbo_rxd == adapter->num_jumbo_rxd)
666 		return 0;
667 
668 	adapter->num_rxd = num_rxd;
669 	adapter->num_jumbo_rxd = num_jumbo_rxd;
670 	adapter->num_txd = num_txd;
671 
672 	return qlcnic_reset_context(adapter);
673 }
674 
675 static int qlcnic_validate_ring_count(struct qlcnic_adapter *adapter,
676 				      u8 rx_ring, u8 tx_ring)
677 {
678 	if (rx_ring == 0 || tx_ring == 0)
679 		return -EINVAL;
680 
681 	if (rx_ring != 0) {
682 		if (rx_ring > adapter->max_sds_rings) {
683 			netdev_err(adapter->netdev,
684 				   "Invalid ring count, SDS ring count %d should not be greater than max %d driver sds rings.\n",
685 				   rx_ring, adapter->max_sds_rings);
686 			return -EINVAL;
687 		}
688 	}
689 
690 	 if (tx_ring != 0) {
691 		if (tx_ring > adapter->max_tx_rings) {
692 			netdev_err(adapter->netdev,
693 				   "Invalid ring count, Tx ring count %d should not be greater than max %d driver Tx rings.\n",
694 				   tx_ring, adapter->max_tx_rings);
695 			return -EINVAL;
696 		}
697 	}
698 
699 	return 0;
700 }
701 
702 static void qlcnic_get_channels(struct net_device *dev,
703 		struct ethtool_channels *channel)
704 {
705 	struct qlcnic_adapter *adapter = netdev_priv(dev);
706 
707 	channel->max_rx = adapter->max_sds_rings;
708 	channel->max_tx = adapter->max_tx_rings;
709 	channel->rx_count = adapter->drv_sds_rings;
710 	channel->tx_count = adapter->drv_tx_rings;
711 }
712 
713 static int qlcnic_set_channels(struct net_device *dev,
714 			       struct ethtool_channels *channel)
715 {
716 	struct qlcnic_adapter *adapter = netdev_priv(dev);
717 	int err;
718 
719 	if (channel->other_count || channel->combined_count)
720 		return -EINVAL;
721 
722 	err = qlcnic_validate_ring_count(adapter, channel->rx_count,
723 					 channel->tx_count);
724 	if (err)
725 		return err;
726 
727 	if (channel->rx_count) {
728 		err = qlcnic_validate_rings(adapter, channel->rx_count,
729 					    QLCNIC_RX_QUEUE);
730 		if (err) {
731 			netdev_err(dev, "Unable to configure %u SDS rings\n",
732 				   channel->rx_count);
733 			return err;
734 		}
735 	}
736 
737 	if (channel->tx_count) {
738 		err = qlcnic_validate_rings(adapter, channel->tx_count,
739 					    QLCNIC_TX_QUEUE);
740 		if (err) {
741 			netdev_err(dev, "Unable to configure %u Tx rings\n",
742 				   channel->tx_count);
743 			return err;
744 		}
745 	}
746 
747 	err = qlcnic_setup_rings(adapter, channel->rx_count,
748 				 channel->tx_count);
749 	netdev_info(dev, "Allocated %d SDS rings and %d Tx rings\n",
750 		    adapter->drv_sds_rings, adapter->drv_tx_rings);
751 
752 	return err;
753 }
754 
755 static void
756 qlcnic_get_pauseparam(struct net_device *netdev,
757 			  struct ethtool_pauseparam *pause)
758 {
759 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
760 	int port = adapter->ahw->physical_port;
761 	int err = 0;
762 	__u32 val;
763 
764 	if (qlcnic_83xx_check(adapter)) {
765 		qlcnic_83xx_get_pauseparam(adapter, pause);
766 		return;
767 	}
768 	if (adapter->ahw->port_type == QLCNIC_GBE) {
769 		if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
770 			return;
771 		/* get flow control settings */
772 		val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err);
773 		if (err == -EIO)
774 			return;
775 		pause->rx_pause = qlcnic_gb_get_rx_flowctl(val);
776 		val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err);
777 		if (err == -EIO)
778 			return;
779 		switch (port) {
780 		case 0:
781 			pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val));
782 			break;
783 		case 1:
784 			pause->tx_pause = !(qlcnic_gb_get_gb1_mask(val));
785 			break;
786 		case 2:
787 			pause->tx_pause = !(qlcnic_gb_get_gb2_mask(val));
788 			break;
789 		case 3:
790 		default:
791 			pause->tx_pause = !(qlcnic_gb_get_gb3_mask(val));
792 			break;
793 		}
794 	} else if (adapter->ahw->port_type == QLCNIC_XGBE) {
795 		if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
796 			return;
797 		pause->rx_pause = 1;
798 		val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err);
799 		if (err == -EIO)
800 			return;
801 		if (port == 0)
802 			pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val));
803 		else
804 			pause->tx_pause = !(qlcnic_xg_get_xg1_mask(val));
805 	} else {
806 		dev_err(&netdev->dev, "Unknown board type: %x\n",
807 					adapter->ahw->port_type);
808 	}
809 }
810 
811 static int
812 qlcnic_set_pauseparam(struct net_device *netdev,
813 			  struct ethtool_pauseparam *pause)
814 {
815 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
816 	int port = adapter->ahw->physical_port;
817 	int err = 0;
818 	__u32 val;
819 
820 	if (qlcnic_83xx_check(adapter))
821 		return qlcnic_83xx_set_pauseparam(adapter, pause);
822 
823 	/* read mode */
824 	if (adapter->ahw->port_type == QLCNIC_GBE) {
825 		if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
826 			return -EIO;
827 		/* set flow control */
828 		val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err);
829 		if (err == -EIO)
830 			return err;
831 
832 		if (pause->rx_pause)
833 			qlcnic_gb_rx_flowctl(val);
834 		else
835 			qlcnic_gb_unset_rx_flowctl(val);
836 
837 		QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port),
838 				val);
839 		QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val);
840 		/* set autoneg */
841 		val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err);
842 		if (err == -EIO)
843 			return err;
844 		switch (port) {
845 		case 0:
846 			if (pause->tx_pause)
847 				qlcnic_gb_unset_gb0_mask(val);
848 			else
849 				qlcnic_gb_set_gb0_mask(val);
850 			break;
851 		case 1:
852 			if (pause->tx_pause)
853 				qlcnic_gb_unset_gb1_mask(val);
854 			else
855 				qlcnic_gb_set_gb1_mask(val);
856 			break;
857 		case 2:
858 			if (pause->tx_pause)
859 				qlcnic_gb_unset_gb2_mask(val);
860 			else
861 				qlcnic_gb_set_gb2_mask(val);
862 			break;
863 		case 3:
864 		default:
865 			if (pause->tx_pause)
866 				qlcnic_gb_unset_gb3_mask(val);
867 			else
868 				qlcnic_gb_set_gb3_mask(val);
869 			break;
870 		}
871 		QLCWR32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, val);
872 	} else if (adapter->ahw->port_type == QLCNIC_XGBE) {
873 		if (!pause->rx_pause || pause->autoneg)
874 			return -EOPNOTSUPP;
875 
876 		if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
877 			return -EIO;
878 
879 		val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err);
880 		if (err == -EIO)
881 			return err;
882 		if (port == 0) {
883 			if (pause->tx_pause)
884 				qlcnic_xg_unset_xg0_mask(val);
885 			else
886 				qlcnic_xg_set_xg0_mask(val);
887 		} else {
888 			if (pause->tx_pause)
889 				qlcnic_xg_unset_xg1_mask(val);
890 			else
891 				qlcnic_xg_set_xg1_mask(val);
892 		}
893 		QLCWR32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, val);
894 	} else {
895 		dev_err(&netdev->dev, "Unknown board type: %x\n",
896 				adapter->ahw->port_type);
897 	}
898 	return 0;
899 }
900 
901 static int qlcnic_reg_test(struct net_device *dev)
902 {
903 	struct qlcnic_adapter *adapter = netdev_priv(dev);
904 	u32 data_read;
905 	int err = 0;
906 
907 	if (qlcnic_83xx_check(adapter))
908 		return qlcnic_83xx_reg_test(adapter);
909 
910 	data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0), &err);
911 	if (err == -EIO)
912 		return err;
913 	if ((data_read & 0xffff) != adapter->pdev->vendor)
914 		return 1;
915 
916 	return 0;
917 }
918 
919 static int qlcnic_eeprom_test(struct net_device *dev)
920 {
921 	struct qlcnic_adapter *adapter = netdev_priv(dev);
922 
923 	if (qlcnic_82xx_check(adapter))
924 		return 0;
925 
926 	return qlcnic_83xx_flash_test(adapter);
927 }
928 
929 static int qlcnic_get_sset_count(struct net_device *dev, int sset)
930 {
931 
932 	struct qlcnic_adapter *adapter = netdev_priv(dev);
933 	switch (sset) {
934 	case ETH_SS_TEST:
935 		return QLCNIC_TEST_LEN;
936 	case ETH_SS_STATS:
937 		return qlcnic_dev_statistics_len(adapter);
938 	default:
939 		return -EOPNOTSUPP;
940 	}
941 }
942 
943 static int qlcnic_irq_test(struct net_device *netdev)
944 {
945 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
946 	struct qlcnic_hardware_context *ahw = adapter->ahw;
947 	struct qlcnic_cmd_args cmd;
948 	int ret, drv_sds_rings = adapter->drv_sds_rings;
949 	int drv_tx_rings = adapter->drv_tx_rings;
950 
951 	if (qlcnic_83xx_check(adapter))
952 		return qlcnic_83xx_interrupt_test(netdev);
953 
954 	if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
955 		return -EIO;
956 
957 	ret = qlcnic_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST);
958 	if (ret)
959 		goto clear_diag_irq;
960 
961 	ahw->diag_cnt = 0;
962 	ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST);
963 	if (ret)
964 		goto free_diag_res;
965 
966 	cmd.req.arg[1] = ahw->pci_func;
967 	ret = qlcnic_issue_cmd(adapter, &cmd);
968 	if (ret)
969 		goto done;
970 
971 	usleep_range(1000, 12000);
972 	ret = !ahw->diag_cnt;
973 
974 done:
975 	qlcnic_free_mbx_args(&cmd);
976 
977 free_diag_res:
978 	qlcnic_diag_free_res(netdev, drv_sds_rings);
979 
980 clear_diag_irq:
981 	adapter->drv_sds_rings = drv_sds_rings;
982 	adapter->drv_tx_rings = drv_tx_rings;
983 	clear_bit(__QLCNIC_RESETTING, &adapter->state);
984 
985 	return ret;
986 }
987 
988 #define QLCNIC_ILB_PKT_SIZE		64
989 #define QLCNIC_NUM_ILB_PKT		16
990 #define QLCNIC_ILB_MAX_RCV_LOOP		10
991 #define QLCNIC_LB_PKT_POLL_DELAY_MSEC	1
992 #define QLCNIC_LB_PKT_POLL_COUNT	20
993 
994 static void qlcnic_create_loopback_buff(unsigned char *data, u8 mac[])
995 {
996 	unsigned char random_data[] = {0xa8, 0x06, 0x45, 0x00};
997 
998 	memset(data, 0x4e, QLCNIC_ILB_PKT_SIZE);
999 
1000 	memcpy(data, mac, ETH_ALEN);
1001 	memcpy(data + ETH_ALEN, mac, ETH_ALEN);
1002 
1003 	memcpy(data + 2 * ETH_ALEN, random_data, sizeof(random_data));
1004 }
1005 
1006 int qlcnic_check_loopback_buff(unsigned char *data, u8 mac[])
1007 {
1008 	unsigned char buff[QLCNIC_ILB_PKT_SIZE];
1009 	qlcnic_create_loopback_buff(buff, mac);
1010 	return memcmp(data, buff, QLCNIC_ILB_PKT_SIZE);
1011 }
1012 
1013 int qlcnic_do_lb_test(struct qlcnic_adapter *adapter, u8 mode)
1014 {
1015 	struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
1016 	struct qlcnic_host_sds_ring *sds_ring = &recv_ctx->sds_rings[0];
1017 	struct sk_buff *skb;
1018 	int i, loop, cnt = 0;
1019 
1020 	for (i = 0; i < QLCNIC_NUM_ILB_PKT; i++) {
1021 		skb = netdev_alloc_skb(adapter->netdev, QLCNIC_ILB_PKT_SIZE);
1022 		qlcnic_create_loopback_buff(skb->data, adapter->mac_addr);
1023 		skb_put(skb, QLCNIC_ILB_PKT_SIZE);
1024 		adapter->ahw->diag_cnt = 0;
1025 		qlcnic_xmit_frame(skb, adapter->netdev);
1026 		loop = 0;
1027 
1028 		do {
1029 			msleep(QLCNIC_LB_PKT_POLL_DELAY_MSEC);
1030 			qlcnic_process_rcv_ring_diag(sds_ring);
1031 			if (loop++ > QLCNIC_LB_PKT_POLL_COUNT)
1032 				break;
1033 		} while (!adapter->ahw->diag_cnt);
1034 
1035 		dev_kfree_skb_any(skb);
1036 
1037 		if (!adapter->ahw->diag_cnt)
1038 			dev_warn(&adapter->pdev->dev,
1039 				 "LB Test: packet #%d was not received\n",
1040 				 i + 1);
1041 		else
1042 			cnt++;
1043 	}
1044 	if (cnt != i) {
1045 		dev_err(&adapter->pdev->dev,
1046 			"LB Test: failed, TX[%d], RX[%d]\n", i, cnt);
1047 		if (mode != QLCNIC_ILB_MODE)
1048 			dev_warn(&adapter->pdev->dev,
1049 				 "WARNING: Please check loopback cable\n");
1050 		return -1;
1051 	}
1052 	return 0;
1053 }
1054 
1055 int qlcnic_loopback_test(struct net_device *netdev, u8 mode)
1056 {
1057 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
1058 	int drv_tx_rings = adapter->drv_tx_rings;
1059 	int drv_sds_rings = adapter->drv_sds_rings;
1060 	struct qlcnic_host_sds_ring *sds_ring;
1061 	struct qlcnic_hardware_context *ahw = adapter->ahw;
1062 	int loop = 0;
1063 	int ret;
1064 
1065 	if (qlcnic_83xx_check(adapter))
1066 		return qlcnic_83xx_loopback_test(netdev, mode);
1067 
1068 	if (!(ahw->capabilities & QLCNIC_FW_CAPABILITY_MULTI_LOOPBACK)) {
1069 		dev_info(&adapter->pdev->dev,
1070 			 "Firmware do not support loopback test\n");
1071 		return -EOPNOTSUPP;
1072 	}
1073 
1074 	dev_warn(&adapter->pdev->dev, "%s loopback test in progress\n",
1075 		 mode == QLCNIC_ILB_MODE ? "internal" : "external");
1076 	if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
1077 		dev_warn(&adapter->pdev->dev,
1078 			 "Loopback test not supported in nonprivileged mode\n");
1079 		return 0;
1080 	}
1081 
1082 	if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
1083 		return -EBUSY;
1084 
1085 	ret = qlcnic_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST);
1086 	if (ret)
1087 		goto clear_it;
1088 
1089 	sds_ring = &adapter->recv_ctx->sds_rings[0];
1090 	ret = qlcnic_set_lb_mode(adapter, mode);
1091 	if (ret)
1092 		goto free_res;
1093 
1094 	ahw->diag_cnt = 0;
1095 	do {
1096 		msleep(500);
1097 		qlcnic_process_rcv_ring_diag(sds_ring);
1098 		if (loop++ > QLCNIC_ILB_MAX_RCV_LOOP) {
1099 			netdev_info(netdev,
1100 				    "Firmware didn't sent link up event to loopback request\n");
1101 			ret = -ETIMEDOUT;
1102 			goto free_res;
1103 		} else if (adapter->ahw->diag_cnt) {
1104 			ret = adapter->ahw->diag_cnt;
1105 			goto free_res;
1106 		}
1107 	} while (!QLCNIC_IS_LB_CONFIGURED(ahw->loopback_state));
1108 
1109 	ret = qlcnic_do_lb_test(adapter, mode);
1110 
1111 	qlcnic_clear_lb_mode(adapter, mode);
1112 
1113  free_res:
1114 	qlcnic_diag_free_res(netdev, drv_sds_rings);
1115 
1116  clear_it:
1117 	adapter->drv_sds_rings = drv_sds_rings;
1118 	adapter->drv_tx_rings = drv_tx_rings;
1119 	clear_bit(__QLCNIC_RESETTING, &adapter->state);
1120 	return ret;
1121 }
1122 
1123 static void
1124 qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test,
1125 		     u64 *data)
1126 {
1127 	memset(data, 0, sizeof(u64) * QLCNIC_TEST_LEN);
1128 
1129 	data[0] = qlcnic_reg_test(dev);
1130 	if (data[0])
1131 		eth_test->flags |= ETH_TEST_FL_FAILED;
1132 
1133 	data[1] = (u64) qlcnic_test_link(dev);
1134 	if (data[1])
1135 		eth_test->flags |= ETH_TEST_FL_FAILED;
1136 
1137 	if (eth_test->flags & ETH_TEST_FL_OFFLINE) {
1138 		data[2] = qlcnic_irq_test(dev);
1139 		if (data[2])
1140 			eth_test->flags |= ETH_TEST_FL_FAILED;
1141 
1142 		data[3] = qlcnic_loopback_test(dev, QLCNIC_ILB_MODE);
1143 		if (data[3])
1144 			eth_test->flags |= ETH_TEST_FL_FAILED;
1145 
1146 		if (eth_test->flags & ETH_TEST_FL_EXTERNAL_LB) {
1147 			data[4] = qlcnic_loopback_test(dev, QLCNIC_ELB_MODE);
1148 			if (data[4])
1149 				eth_test->flags |= ETH_TEST_FL_FAILED;
1150 			eth_test->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE;
1151 		}
1152 
1153 		data[5] = qlcnic_eeprom_test(dev);
1154 		if (data[5])
1155 			eth_test->flags |= ETH_TEST_FL_FAILED;
1156 	}
1157 }
1158 
1159 static void
1160 qlcnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
1161 {
1162 	struct qlcnic_adapter *adapter = netdev_priv(dev);
1163 	int index, i, num_stats;
1164 
1165 	switch (stringset) {
1166 	case ETH_SS_TEST:
1167 		memcpy(data, *qlcnic_gstrings_test,
1168 		       QLCNIC_TEST_LEN * ETH_GSTRING_LEN);
1169 		break;
1170 	case ETH_SS_STATS:
1171 		num_stats = ARRAY_SIZE(qlcnic_tx_queue_stats_strings);
1172 		for (i = 0; i < adapter->drv_tx_rings; i++) {
1173 			for (index = 0; index < num_stats; index++) {
1174 				sprintf(data, "tx_queue_%d %s", i,
1175 					qlcnic_tx_queue_stats_strings[index]);
1176 				data += ETH_GSTRING_LEN;
1177 			}
1178 		}
1179 
1180 		for (index = 0; index < QLCNIC_STATS_LEN; index++) {
1181 			memcpy(data + index * ETH_GSTRING_LEN,
1182 			       qlcnic_gstrings_stats[index].stat_string,
1183 			       ETH_GSTRING_LEN);
1184 		}
1185 
1186 		if (qlcnic_83xx_check(adapter)) {
1187 			num_stats = ARRAY_SIZE(qlcnic_83xx_tx_stats_strings);
1188 			for (i = 0; i < num_stats; i++, index++)
1189 				memcpy(data + index * ETH_GSTRING_LEN,
1190 				       qlcnic_83xx_tx_stats_strings[i],
1191 				       ETH_GSTRING_LEN);
1192 			num_stats = ARRAY_SIZE(qlcnic_83xx_mac_stats_strings);
1193 			for (i = 0; i < num_stats; i++, index++)
1194 				memcpy(data + index * ETH_GSTRING_LEN,
1195 				       qlcnic_83xx_mac_stats_strings[i],
1196 				       ETH_GSTRING_LEN);
1197 			num_stats = ARRAY_SIZE(qlcnic_83xx_rx_stats_strings);
1198 			for (i = 0; i < num_stats; i++, index++)
1199 				memcpy(data + index * ETH_GSTRING_LEN,
1200 				       qlcnic_83xx_rx_stats_strings[i],
1201 				       ETH_GSTRING_LEN);
1202 			return;
1203 		} else {
1204 			num_stats = ARRAY_SIZE(qlcnic_83xx_mac_stats_strings);
1205 			for (i = 0; i < num_stats; i++, index++)
1206 				memcpy(data + index * ETH_GSTRING_LEN,
1207 				       qlcnic_83xx_mac_stats_strings[i],
1208 				       ETH_GSTRING_LEN);
1209 		}
1210 		if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
1211 			return;
1212 		num_stats = ARRAY_SIZE(qlcnic_device_gstrings_stats);
1213 		for (i = 0; i < num_stats; index++, i++) {
1214 			memcpy(data + index * ETH_GSTRING_LEN,
1215 			       qlcnic_device_gstrings_stats[i],
1216 			       ETH_GSTRING_LEN);
1217 		}
1218 	}
1219 }
1220 
1221 static u64 *qlcnic_fill_stats(u64 *data, void *stats, int type)
1222 {
1223 	if (type == QLCNIC_MAC_STATS) {
1224 		struct qlcnic_mac_statistics *mac_stats =
1225 					(struct qlcnic_mac_statistics *)stats;
1226 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_frames);
1227 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_bytes);
1228 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_mcast_pkts);
1229 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_bcast_pkts);
1230 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_pause_cnt);
1231 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_ctrl_pkt);
1232 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_64b_pkts);
1233 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_127b_pkts);
1234 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_255b_pkts);
1235 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_511b_pkts);
1236 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_1023b_pkts);
1237 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_1518b_pkts);
1238 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_gt_1518b_pkts);
1239 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_frames);
1240 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_bytes);
1241 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_mcast_pkts);
1242 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_bcast_pkts);
1243 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_pause_cnt);
1244 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_ctrl_pkt);
1245 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_64b_pkts);
1246 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_127b_pkts);
1247 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_255b_pkts);
1248 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_511b_pkts);
1249 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_1023b_pkts);
1250 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_1518b_pkts);
1251 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_gt_1518b_pkts);
1252 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_length_error);
1253 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_length_small);
1254 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_length_large);
1255 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_jabber);
1256 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_dropped);
1257 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_crc_error);
1258 		*data++ = QLCNIC_FILL_STATS(mac_stats->mac_align_error);
1259 	} else if (type == QLCNIC_ESW_STATS) {
1260 		struct __qlcnic_esw_statistics *esw_stats =
1261 				(struct __qlcnic_esw_statistics *)stats;
1262 		*data++ = QLCNIC_FILL_STATS(esw_stats->unicast_frames);
1263 		*data++ = QLCNIC_FILL_STATS(esw_stats->multicast_frames);
1264 		*data++ = QLCNIC_FILL_STATS(esw_stats->broadcast_frames);
1265 		*data++ = QLCNIC_FILL_STATS(esw_stats->dropped_frames);
1266 		*data++ = QLCNIC_FILL_STATS(esw_stats->errors);
1267 		*data++ = QLCNIC_FILL_STATS(esw_stats->local_frames);
1268 		*data++ = QLCNIC_FILL_STATS(esw_stats->numbytes);
1269 	}
1270 	return data;
1271 }
1272 
1273 void qlcnic_update_stats(struct qlcnic_adapter *adapter)
1274 {
1275 	struct qlcnic_host_tx_ring *tx_ring;
1276 	int ring;
1277 
1278 	for (ring = 0; ring < adapter->drv_tx_rings; ring++) {
1279 		tx_ring = &adapter->tx_ring[ring];
1280 		adapter->stats.xmit_on += tx_ring->tx_stats.xmit_on;
1281 		adapter->stats.xmit_off += tx_ring->tx_stats.xmit_off;
1282 		adapter->stats.xmitcalled += tx_ring->tx_stats.xmit_called;
1283 		adapter->stats.xmitfinished += tx_ring->tx_stats.xmit_finished;
1284 		adapter->stats.txbytes += tx_ring->tx_stats.tx_bytes;
1285 	}
1286 }
1287 
1288 static u64 *qlcnic_fill_tx_queue_stats(u64 *data, void *stats)
1289 {
1290 	struct qlcnic_host_tx_ring *tx_ring;
1291 
1292 	tx_ring = (struct qlcnic_host_tx_ring *)stats;
1293 
1294 	*data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_on);
1295 	*data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_off);
1296 	*data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_called);
1297 	*data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_finished);
1298 	*data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.tx_bytes);
1299 
1300 	return data;
1301 }
1302 
1303 static void qlcnic_get_ethtool_stats(struct net_device *dev,
1304 				     struct ethtool_stats *stats, u64 *data)
1305 {
1306 	struct qlcnic_adapter *adapter = netdev_priv(dev);
1307 	struct qlcnic_host_tx_ring *tx_ring;
1308 	struct qlcnic_esw_statistics port_stats;
1309 	struct qlcnic_mac_statistics mac_stats;
1310 	int index, ret, length, size, tx_size, ring;
1311 	char *p;
1312 
1313 	tx_size = adapter->drv_tx_rings * QLCNIC_TX_STATS_LEN;
1314 
1315 	memset(data, 0, tx_size * sizeof(u64));
1316 	for (ring = 0, index = 0; ring < adapter->drv_tx_rings; ring++) {
1317 		if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
1318 			tx_ring = &adapter->tx_ring[ring];
1319 			data = qlcnic_fill_tx_queue_stats(data, tx_ring);
1320 			qlcnic_update_stats(adapter);
1321 		}
1322 	}
1323 
1324 	memset(data, 0, stats->n_stats * sizeof(u64));
1325 	length = QLCNIC_STATS_LEN;
1326 	for (index = 0; index < length; index++) {
1327 		p = (char *)adapter + qlcnic_gstrings_stats[index].stat_offset;
1328 		size = qlcnic_gstrings_stats[index].sizeof_stat;
1329 		*data++ = (size == sizeof(u64)) ? (*(u64 *)p) : ((*(u32 *)p));
1330 	}
1331 
1332 	if (qlcnic_83xx_check(adapter)) {
1333 		if (adapter->ahw->linkup)
1334 			qlcnic_83xx_get_stats(adapter, data);
1335 		return;
1336 	} else {
1337 		/* Retrieve MAC statistics from firmware */
1338 		memset(&mac_stats, 0, sizeof(struct qlcnic_mac_statistics));
1339 		qlcnic_get_mac_stats(adapter, &mac_stats);
1340 		data = qlcnic_fill_stats(data, &mac_stats, QLCNIC_MAC_STATS);
1341 	}
1342 
1343 	if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
1344 		return;
1345 
1346 	memset(&port_stats, 0, sizeof(struct qlcnic_esw_statistics));
1347 	ret = qlcnic_get_port_stats(adapter, adapter->ahw->pci_func,
1348 			QLCNIC_QUERY_RX_COUNTER, &port_stats.rx);
1349 	if (ret)
1350 		return;
1351 
1352 	data = qlcnic_fill_stats(data, &port_stats.rx, QLCNIC_ESW_STATS);
1353 	ret = qlcnic_get_port_stats(adapter, adapter->ahw->pci_func,
1354 			QLCNIC_QUERY_TX_COUNTER, &port_stats.tx);
1355 	if (ret)
1356 		return;
1357 
1358 	qlcnic_fill_stats(data, &port_stats.tx, QLCNIC_ESW_STATS);
1359 }
1360 
1361 static int qlcnic_set_led(struct net_device *dev,
1362 			  enum ethtool_phys_id_state state)
1363 {
1364 	struct qlcnic_adapter *adapter = netdev_priv(dev);
1365 	int drv_sds_rings = adapter->drv_sds_rings;
1366 	int err = -EIO, active = 1;
1367 
1368 	if (qlcnic_83xx_check(adapter))
1369 		return qlcnic_83xx_set_led(dev, state);
1370 
1371 	if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
1372 		netdev_warn(dev, "LED test not supported for non "
1373 				"privilege function\n");
1374 		return -EOPNOTSUPP;
1375 	}
1376 
1377 	switch (state) {
1378 	case ETHTOOL_ID_ACTIVE:
1379 		if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state))
1380 			return -EBUSY;
1381 
1382 		if (test_bit(__QLCNIC_RESETTING, &adapter->state))
1383 			break;
1384 
1385 		if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
1386 			if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST))
1387 				break;
1388 			set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
1389 		}
1390 
1391 		if (adapter->nic_ops->config_led(adapter, 1, 0xf) == 0) {
1392 			err = 0;
1393 			break;
1394 		}
1395 
1396 		dev_err(&adapter->pdev->dev,
1397 			"Failed to set LED blink state.\n");
1398 		break;
1399 
1400 	case ETHTOOL_ID_INACTIVE:
1401 		active = 0;
1402 
1403 		if (test_bit(__QLCNIC_RESETTING, &adapter->state))
1404 			break;
1405 
1406 		if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
1407 			if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST))
1408 				break;
1409 			set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
1410 		}
1411 
1412 		if (adapter->nic_ops->config_led(adapter, 0, 0xf))
1413 			dev_err(&adapter->pdev->dev,
1414 				"Failed to reset LED blink state.\n");
1415 
1416 		break;
1417 
1418 	default:
1419 		return -EINVAL;
1420 	}
1421 
1422 	if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state))
1423 		qlcnic_diag_free_res(dev, drv_sds_rings);
1424 
1425 	if (!active || err)
1426 		clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
1427 
1428 	return err;
1429 }
1430 
1431 static void
1432 qlcnic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1433 {
1434 	struct qlcnic_adapter *adapter = netdev_priv(dev);
1435 	u32 wol_cfg;
1436 	int err = 0;
1437 
1438 	if (qlcnic_83xx_check(adapter))
1439 		return;
1440 	wol->supported = 0;
1441 	wol->wolopts = 0;
1442 
1443 	wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1444 	if (err == -EIO)
1445 		return;
1446 	if (wol_cfg & (1UL << adapter->portnum))
1447 		wol->supported |= WAKE_MAGIC;
1448 
1449 	wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1450 	if (wol_cfg & (1UL << adapter->portnum))
1451 		wol->wolopts |= WAKE_MAGIC;
1452 }
1453 
1454 static int
1455 qlcnic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1456 {
1457 	struct qlcnic_adapter *adapter = netdev_priv(dev);
1458 	u32 wol_cfg;
1459 	int err = 0;
1460 
1461 	if (qlcnic_83xx_check(adapter))
1462 		return -EOPNOTSUPP;
1463 	if (wol->wolopts & ~WAKE_MAGIC)
1464 		return -EINVAL;
1465 
1466 	wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1467 	if (err == -EIO)
1468 		return err;
1469 	if (!(wol_cfg & (1 << adapter->portnum)))
1470 		return -EOPNOTSUPP;
1471 
1472 	wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1473 	if (err == -EIO)
1474 		return err;
1475 	if (wol->wolopts & WAKE_MAGIC)
1476 		wol_cfg |= 1UL << adapter->portnum;
1477 	else
1478 		wol_cfg &= ~(1UL << adapter->portnum);
1479 
1480 	QLCWR32(adapter, QLCNIC_WOL_CONFIG, wol_cfg);
1481 
1482 	return 0;
1483 }
1484 
1485 /*
1486  * Set the coalescing parameters. Currently only normal is supported.
1487  * If rx_coalesce_usecs == 0 or rx_max_coalesced_frames == 0 then set the
1488  * firmware coalescing to default.
1489  */
1490 static int qlcnic_set_intr_coalesce(struct net_device *netdev,
1491 			struct ethtool_coalesce *ethcoal)
1492 {
1493 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
1494 	struct qlcnic_nic_intr_coalesce *coal;
1495 	u32 rx_coalesce_usecs, rx_max_frames;
1496 	u32 tx_coalesce_usecs, tx_max_frames;
1497 
1498 	if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
1499 		return -EINVAL;
1500 
1501 	/*
1502 	* Return Error if unsupported values or
1503 	* unsupported parameters are set.
1504 	*/
1505 	if (ethcoal->rx_coalesce_usecs > 0xffff ||
1506 		ethcoal->rx_max_coalesced_frames > 0xffff ||
1507 		ethcoal->tx_coalesce_usecs > 0xffff ||
1508 		ethcoal->tx_max_coalesced_frames > 0xffff ||
1509 		ethcoal->rx_coalesce_usecs_irq ||
1510 		ethcoal->rx_max_coalesced_frames_irq ||
1511 		ethcoal->tx_coalesce_usecs_irq ||
1512 		ethcoal->tx_max_coalesced_frames_irq ||
1513 		ethcoal->stats_block_coalesce_usecs ||
1514 		ethcoal->use_adaptive_rx_coalesce ||
1515 		ethcoal->use_adaptive_tx_coalesce ||
1516 		ethcoal->pkt_rate_low ||
1517 		ethcoal->rx_coalesce_usecs_low ||
1518 		ethcoal->rx_max_coalesced_frames_low ||
1519 		ethcoal->tx_coalesce_usecs_low ||
1520 		ethcoal->tx_max_coalesced_frames_low ||
1521 		ethcoal->pkt_rate_high ||
1522 		ethcoal->rx_coalesce_usecs_high ||
1523 		ethcoal->rx_max_coalesced_frames_high ||
1524 		ethcoal->tx_coalesce_usecs_high ||
1525 		ethcoal->tx_max_coalesced_frames_high)
1526 		return -EINVAL;
1527 
1528 	coal = &adapter->ahw->coal;
1529 
1530 	if (qlcnic_83xx_check(adapter)) {
1531 		if (!ethcoal->tx_coalesce_usecs ||
1532 		    !ethcoal->tx_max_coalesced_frames ||
1533 		    !ethcoal->rx_coalesce_usecs ||
1534 		    !ethcoal->rx_max_coalesced_frames) {
1535 			coal->flag = QLCNIC_INTR_DEFAULT;
1536 			coal->type = QLCNIC_INTR_COAL_TYPE_RX;
1537 			coal->rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
1538 			coal->rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
1539 			coal->tx_time_us = QLCNIC_DEF_INTR_COALESCE_TX_TIME_US;
1540 			coal->tx_packets = QLCNIC_DEF_INTR_COALESCE_TX_PACKETS;
1541 		} else {
1542 			tx_coalesce_usecs = ethcoal->tx_coalesce_usecs;
1543 			tx_max_frames = ethcoal->tx_max_coalesced_frames;
1544 			rx_coalesce_usecs = ethcoal->rx_coalesce_usecs;
1545 			rx_max_frames = ethcoal->rx_max_coalesced_frames;
1546 			coal->flag = 0;
1547 
1548 			if ((coal->rx_time_us == rx_coalesce_usecs) &&
1549 			    (coal->rx_packets == rx_max_frames)) {
1550 				coal->type = QLCNIC_INTR_COAL_TYPE_TX;
1551 				coal->tx_time_us = tx_coalesce_usecs;
1552 				coal->tx_packets = tx_max_frames;
1553 			} else if ((coal->tx_time_us == tx_coalesce_usecs) &&
1554 				   (coal->tx_packets == tx_max_frames)) {
1555 				coal->type = QLCNIC_INTR_COAL_TYPE_RX;
1556 				coal->rx_time_us = rx_coalesce_usecs;
1557 				coal->rx_packets = rx_max_frames;
1558 			} else {
1559 				coal->type = QLCNIC_INTR_COAL_TYPE_RX;
1560 				coal->rx_time_us = rx_coalesce_usecs;
1561 				coal->rx_packets = rx_max_frames;
1562 				coal->tx_time_us = tx_coalesce_usecs;
1563 				coal->tx_packets = tx_max_frames;
1564 			}
1565 		}
1566 	} else {
1567 		if (!ethcoal->rx_coalesce_usecs ||
1568 		    !ethcoal->rx_max_coalesced_frames) {
1569 			coal->flag = QLCNIC_INTR_DEFAULT;
1570 			coal->rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
1571 			coal->rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
1572 		} else {
1573 			coal->flag = 0;
1574 			coal->rx_time_us = ethcoal->rx_coalesce_usecs;
1575 			coal->rx_packets = ethcoal->rx_max_coalesced_frames;
1576 		}
1577 	}
1578 
1579 	qlcnic_config_intr_coalesce(adapter);
1580 
1581 	return 0;
1582 }
1583 
1584 static int qlcnic_get_intr_coalesce(struct net_device *netdev,
1585 			struct ethtool_coalesce *ethcoal)
1586 {
1587 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
1588 
1589 	if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
1590 		return -EINVAL;
1591 
1592 	ethcoal->rx_coalesce_usecs = adapter->ahw->coal.rx_time_us;
1593 	ethcoal->rx_max_coalesced_frames = adapter->ahw->coal.rx_packets;
1594 	ethcoal->tx_coalesce_usecs = adapter->ahw->coal.tx_time_us;
1595 	ethcoal->tx_max_coalesced_frames = adapter->ahw->coal.tx_packets;
1596 
1597 	return 0;
1598 }
1599 
1600 static u32 qlcnic_get_msglevel(struct net_device *netdev)
1601 {
1602 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
1603 
1604 	return adapter->ahw->msg_enable;
1605 }
1606 
1607 static void qlcnic_set_msglevel(struct net_device *netdev, u32 msglvl)
1608 {
1609 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
1610 
1611 	adapter->ahw->msg_enable = msglvl;
1612 }
1613 
1614 int qlcnic_enable_fw_dump_state(struct qlcnic_adapter *adapter)
1615 {
1616 	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1617 	u32 val;
1618 
1619 	if (qlcnic_84xx_check(adapter)) {
1620 		if (qlcnic_83xx_lock_driver(adapter))
1621 			return -EBUSY;
1622 
1623 		val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
1624 		val &= ~QLC_83XX_IDC_DISABLE_FW_DUMP;
1625 		QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
1626 
1627 		qlcnic_83xx_unlock_driver(adapter);
1628 	} else {
1629 		fw_dump->enable = true;
1630 	}
1631 
1632 	dev_info(&adapter->pdev->dev, "FW dump enabled\n");
1633 
1634 	return 0;
1635 }
1636 
1637 static int qlcnic_disable_fw_dump_state(struct qlcnic_adapter *adapter)
1638 {
1639 	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1640 	u32 val;
1641 
1642 	if (qlcnic_84xx_check(adapter)) {
1643 		if (qlcnic_83xx_lock_driver(adapter))
1644 			return -EBUSY;
1645 
1646 		val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
1647 		val |= QLC_83XX_IDC_DISABLE_FW_DUMP;
1648 		QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
1649 
1650 		qlcnic_83xx_unlock_driver(adapter);
1651 	} else {
1652 		fw_dump->enable = false;
1653 	}
1654 
1655 	dev_info(&adapter->pdev->dev, "FW dump disabled\n");
1656 
1657 	return 0;
1658 }
1659 
1660 bool qlcnic_check_fw_dump_state(struct qlcnic_adapter *adapter)
1661 {
1662 	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1663 	bool state;
1664 	u32 val;
1665 
1666 	if (qlcnic_84xx_check(adapter)) {
1667 		val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
1668 		state = (val & QLC_83XX_IDC_DISABLE_FW_DUMP) ? false : true;
1669 	} else {
1670 		state = fw_dump->enable;
1671 	}
1672 
1673 	return state;
1674 }
1675 
1676 static int
1677 qlcnic_get_dump_flag(struct net_device *netdev, struct ethtool_dump *dump)
1678 {
1679 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
1680 	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1681 
1682 	if (!fw_dump->tmpl_hdr) {
1683 		netdev_err(adapter->netdev, "FW Dump not supported\n");
1684 		return -ENOTSUPP;
1685 	}
1686 
1687 	if (fw_dump->clr)
1688 		dump->len = fw_dump->tmpl_hdr->size + fw_dump->size;
1689 	else
1690 		dump->len = 0;
1691 
1692 	if (!qlcnic_check_fw_dump_state(adapter))
1693 		dump->flag = ETH_FW_DUMP_DISABLE;
1694 	else
1695 		dump->flag = fw_dump->tmpl_hdr->drv_cap_mask;
1696 
1697 	dump->version = adapter->fw_version;
1698 	return 0;
1699 }
1700 
1701 static int
1702 qlcnic_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump,
1703 			void *buffer)
1704 {
1705 	int i, copy_sz;
1706 	u32 *hdr_ptr;
1707 	__le32 *data;
1708 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
1709 	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1710 
1711 	if (!fw_dump->tmpl_hdr) {
1712 		netdev_err(netdev, "FW Dump not supported\n");
1713 		return -ENOTSUPP;
1714 	}
1715 
1716 	if (!fw_dump->clr) {
1717 		netdev_info(netdev, "Dump not available\n");
1718 		return -EINVAL;
1719 	}
1720 	/* Copy template header first */
1721 	copy_sz = fw_dump->tmpl_hdr->size;
1722 	hdr_ptr = (u32 *) fw_dump->tmpl_hdr;
1723 	data = buffer;
1724 	for (i = 0; i < copy_sz/sizeof(u32); i++)
1725 		*data++ = cpu_to_le32(*hdr_ptr++);
1726 
1727 	/* Copy captured dump data */
1728 	memcpy(buffer + copy_sz, fw_dump->data, fw_dump->size);
1729 	dump->len = copy_sz + fw_dump->size;
1730 	dump->flag = fw_dump->tmpl_hdr->drv_cap_mask;
1731 
1732 	/* Free dump area once data has been captured */
1733 	vfree(fw_dump->data);
1734 	fw_dump->data = NULL;
1735 	fw_dump->clr = 0;
1736 	netdev_info(netdev, "extracted the FW dump Successfully\n");
1737 	return 0;
1738 }
1739 
1740 static int qlcnic_set_dump_mask(struct qlcnic_adapter *adapter, u32 mask)
1741 {
1742 	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1743 	struct net_device *netdev = adapter->netdev;
1744 
1745 	if (!qlcnic_check_fw_dump_state(adapter)) {
1746 		netdev_info(netdev,
1747 			    "Can not change driver mask to 0x%x. FW dump not enabled\n",
1748 			    mask);
1749 		return -EOPNOTSUPP;
1750 	}
1751 
1752 	fw_dump->tmpl_hdr->drv_cap_mask = mask;
1753 	netdev_info(netdev, "Driver mask changed to: 0x%x\n", mask);
1754 	return 0;
1755 }
1756 
1757 static int
1758 qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
1759 {
1760 	struct qlcnic_adapter *adapter = netdev_priv(netdev);
1761 	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1762 	bool valid_mask = false;
1763 	int i, ret = 0;
1764 
1765 	switch (val->flag) {
1766 	case QLCNIC_FORCE_FW_DUMP_KEY:
1767 		if (!fw_dump->tmpl_hdr) {
1768 			netdev_err(netdev, "FW dump not supported\n");
1769 			ret = -EOPNOTSUPP;
1770 			break;
1771 		}
1772 
1773 		if (!qlcnic_check_fw_dump_state(adapter)) {
1774 			netdev_info(netdev, "FW dump not enabled\n");
1775 			ret = -EOPNOTSUPP;
1776 			break;
1777 		}
1778 
1779 		if (fw_dump->clr) {
1780 			netdev_info(netdev,
1781 				    "Previous dump not cleared, not forcing dump\n");
1782 			break;
1783 		}
1784 
1785 		netdev_info(netdev, "Forcing a FW dump\n");
1786 		qlcnic_dev_request_reset(adapter, val->flag);
1787 		break;
1788 	case QLCNIC_DISABLE_FW_DUMP:
1789 		if (!fw_dump->tmpl_hdr) {
1790 			netdev_err(netdev, "FW dump not supported\n");
1791 			ret = -EOPNOTSUPP;
1792 			break;
1793 		}
1794 
1795 		ret = qlcnic_disable_fw_dump_state(adapter);
1796 		break;
1797 
1798 	case QLCNIC_ENABLE_FW_DUMP:
1799 		if (!fw_dump->tmpl_hdr) {
1800 			netdev_err(netdev, "FW dump not supported\n");
1801 			ret = -EOPNOTSUPP;
1802 			break;
1803 		}
1804 
1805 		ret = qlcnic_enable_fw_dump_state(adapter);
1806 		break;
1807 
1808 	case QLCNIC_FORCE_FW_RESET:
1809 		netdev_info(netdev, "Forcing a FW reset\n");
1810 		qlcnic_dev_request_reset(adapter, val->flag);
1811 		adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
1812 		break;
1813 
1814 	case QLCNIC_SET_QUIESCENT:
1815 	case QLCNIC_RESET_QUIESCENT:
1816 		if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state))
1817 			netdev_info(netdev, "Device is in non-operational state\n");
1818 		break;
1819 
1820 	default:
1821 		if (!fw_dump->tmpl_hdr) {
1822 			netdev_err(netdev, "FW dump not supported\n");
1823 			ret = -EOPNOTSUPP;
1824 			break;
1825 		}
1826 
1827 		for (i = 0; i < ARRAY_SIZE(qlcnic_fw_dump_level); i++) {
1828 			if (val->flag == qlcnic_fw_dump_level[i]) {
1829 				valid_mask = true;
1830 				break;
1831 			}
1832 		}
1833 
1834 		if (valid_mask) {
1835 			ret = qlcnic_set_dump_mask(adapter, val->flag);
1836 		} else {
1837 			netdev_info(netdev, "Invalid dump level: 0x%x\n",
1838 				    val->flag);
1839 			ret = -EINVAL;
1840 		}
1841 	}
1842 	return ret;
1843 }
1844 
1845 const struct ethtool_ops qlcnic_ethtool_ops = {
1846 	.get_settings = qlcnic_get_settings,
1847 	.set_settings = qlcnic_set_settings,
1848 	.get_drvinfo = qlcnic_get_drvinfo,
1849 	.get_regs_len = qlcnic_get_regs_len,
1850 	.get_regs = qlcnic_get_regs,
1851 	.get_link = ethtool_op_get_link,
1852 	.get_eeprom_len = qlcnic_get_eeprom_len,
1853 	.get_eeprom = qlcnic_get_eeprom,
1854 	.get_ringparam = qlcnic_get_ringparam,
1855 	.set_ringparam = qlcnic_set_ringparam,
1856 	.get_channels = qlcnic_get_channels,
1857 	.set_channels = qlcnic_set_channels,
1858 	.get_pauseparam = qlcnic_get_pauseparam,
1859 	.set_pauseparam = qlcnic_set_pauseparam,
1860 	.get_wol = qlcnic_get_wol,
1861 	.set_wol = qlcnic_set_wol,
1862 	.self_test = qlcnic_diag_test,
1863 	.get_strings = qlcnic_get_strings,
1864 	.get_ethtool_stats = qlcnic_get_ethtool_stats,
1865 	.get_sset_count = qlcnic_get_sset_count,
1866 	.get_coalesce = qlcnic_get_intr_coalesce,
1867 	.set_coalesce = qlcnic_set_intr_coalesce,
1868 	.set_phys_id = qlcnic_set_led,
1869 	.set_msglevel = qlcnic_set_msglevel,
1870 	.get_msglevel = qlcnic_get_msglevel,
1871 	.get_dump_flag = qlcnic_get_dump_flag,
1872 	.get_dump_data = qlcnic_get_dump_data,
1873 	.set_dump = qlcnic_set_dump,
1874 };
1875 
1876 const struct ethtool_ops qlcnic_sriov_vf_ethtool_ops = {
1877 	.get_settings		= qlcnic_get_settings,
1878 	.get_drvinfo		= qlcnic_get_drvinfo,
1879 	.get_regs_len		= qlcnic_get_regs_len,
1880 	.get_regs		= qlcnic_get_regs,
1881 	.get_link		= ethtool_op_get_link,
1882 	.get_eeprom_len		= qlcnic_get_eeprom_len,
1883 	.get_eeprom		= qlcnic_get_eeprom,
1884 	.get_ringparam		= qlcnic_get_ringparam,
1885 	.set_ringparam		= qlcnic_set_ringparam,
1886 	.get_channels		= qlcnic_get_channels,
1887 	.get_pauseparam		= qlcnic_get_pauseparam,
1888 	.get_wol		= qlcnic_get_wol,
1889 	.get_strings		= qlcnic_get_strings,
1890 	.get_ethtool_stats	= qlcnic_get_ethtool_stats,
1891 	.get_sset_count		= qlcnic_get_sset_count,
1892 	.get_coalesce		= qlcnic_get_intr_coalesce,
1893 	.set_coalesce		= qlcnic_set_intr_coalesce,
1894 	.set_msglevel		= qlcnic_set_msglevel,
1895 	.get_msglevel		= qlcnic_get_msglevel,
1896 };
1897 
1898 const struct ethtool_ops qlcnic_ethtool_failed_ops = {
1899 	.get_settings		= qlcnic_get_settings,
1900 	.get_drvinfo		= qlcnic_get_drvinfo,
1901 	.set_msglevel		= qlcnic_set_msglevel,
1902 	.get_msglevel		= qlcnic_get_msglevel,
1903 	.set_dump		= qlcnic_set_dump,
1904 };
1905