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