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