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