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