1 /**********************************************************************
2  * Author: Cavium, Inc.
3  *
4  * Contact: support@cavium.com
5  *          Please include "LiquidIO" in the subject.
6  *
7  * Copyright (c) 2003-2016 Cavium, Inc.
8  *
9  * This file is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License, Version 2, as
11  * published by the Free Software Foundation.
12  *
13  * This file is distributed in the hope that it will be useful, but
14  * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
15  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
16  * NONINFRINGEMENT.  See the GNU General Public License for more details.
17  ***********************************************************************/
18 #include <linux/netdevice.h>
19 #include <linux/net_tstamp.h>
20 #include <linux/pci.h>
21 #include "liquidio_common.h"
22 #include "octeon_droq.h"
23 #include "octeon_iq.h"
24 #include "response_manager.h"
25 #include "octeon_device.h"
26 #include "octeon_nic.h"
27 #include "octeon_main.h"
28 #include "octeon_network.h"
29 #include "cn66xx_regs.h"
30 #include "cn66xx_device.h"
31 #include "cn23xx_pf_device.h"
32 #include "cn23xx_vf_device.h"
33 
34 static int lio_reset_queues(struct net_device *netdev, uint32_t num_qs);
35 static int octnet_get_link_stats(struct net_device *netdev);
36 
37 struct oct_intrmod_context {
38 	int octeon_id;
39 	wait_queue_head_t wc;
40 	int cond;
41 	int status;
42 };
43 
44 struct oct_intrmod_resp {
45 	u64     rh;
46 	struct oct_intrmod_cfg intrmod;
47 	u64     status;
48 };
49 
50 struct oct_mdio_cmd_context {
51 	int octeon_id;
52 	wait_queue_head_t wc;
53 	int cond;
54 };
55 
56 struct oct_mdio_cmd_resp {
57 	u64 rh;
58 	struct oct_mdio_cmd resp;
59 	u64 status;
60 };
61 
62 #define OCT_MDIO45_RESP_SIZE   (sizeof(struct oct_mdio_cmd_resp))
63 
64 /* Octeon's interface mode of operation */
65 enum {
66 	INTERFACE_MODE_DISABLED,
67 	INTERFACE_MODE_RGMII,
68 	INTERFACE_MODE_GMII,
69 	INTERFACE_MODE_SPI,
70 	INTERFACE_MODE_PCIE,
71 	INTERFACE_MODE_XAUI,
72 	INTERFACE_MODE_SGMII,
73 	INTERFACE_MODE_PICMG,
74 	INTERFACE_MODE_NPI,
75 	INTERFACE_MODE_LOOP,
76 	INTERFACE_MODE_SRIO,
77 	INTERFACE_MODE_ILK,
78 	INTERFACE_MODE_RXAUI,
79 	INTERFACE_MODE_QSGMII,
80 	INTERFACE_MODE_AGL,
81 	INTERFACE_MODE_XLAUI,
82 	INTERFACE_MODE_XFI,
83 	INTERFACE_MODE_10G_KR,
84 	INTERFACE_MODE_40G_KR4,
85 	INTERFACE_MODE_MIXED,
86 };
87 
88 #define OCT_ETHTOOL_REGDUMP_LEN  4096
89 #define OCT_ETHTOOL_REGDUMP_LEN_23XX  (4096 * 11)
90 #define OCT_ETHTOOL_REGDUMP_LEN_23XX_VF  (4096 * 2)
91 #define OCT_ETHTOOL_REGSVER  1
92 
93 /* statistics of PF */
94 static const char oct_stats_strings[][ETH_GSTRING_LEN] = {
95 	"rx_packets",
96 	"tx_packets",
97 	"rx_bytes",
98 	"tx_bytes",
99 	"rx_errors",	/*jabber_err+l2_err+frame_err */
100 	"tx_errors",	/*fw_err_pko+fw_err_link+fw_err_drop */
101 	"rx_dropped",   /*st->fromwire.total_rcvd - st->fromwire.fw_total_rcvd +
102 			 *st->fromwire.dmac_drop + st->fromwire.fw_err_drop
103 			 */
104 	"tx_dropped",
105 
106 	"tx_total_sent",
107 	"tx_total_fwd",
108 	"tx_err_pko",
109 	"tx_err_pki",
110 	"tx_err_link",
111 	"tx_err_drop",
112 
113 	"tx_tso",
114 	"tx_tso_packets",
115 	"tx_tso_err",
116 	"tx_vxlan",
117 
118 	"mac_tx_total_pkts",
119 	"mac_tx_total_bytes",
120 	"mac_tx_mcast_pkts",
121 	"mac_tx_bcast_pkts",
122 	"mac_tx_ctl_packets",	/*oct->link_stats.fromhost.ctl_sent */
123 	"mac_tx_total_collisions",
124 	"mac_tx_one_collision",
125 	"mac_tx_multi_collison",
126 	"mac_tx_max_collision_fail",
127 	"mac_tx_max_deferal_fail",
128 	"mac_tx_fifo_err",
129 	"mac_tx_runts",
130 
131 	"rx_total_rcvd",
132 	"rx_total_fwd",
133 	"rx_jabber_err",
134 	"rx_l2_err",
135 	"rx_frame_err",
136 	"rx_err_pko",
137 	"rx_err_link",
138 	"rx_err_drop",
139 
140 	"rx_vxlan",
141 	"rx_vxlan_err",
142 
143 	"rx_lro_pkts",
144 	"rx_lro_bytes",
145 	"rx_total_lro",
146 
147 	"rx_lro_aborts",
148 	"rx_lro_aborts_port",
149 	"rx_lro_aborts_seq",
150 	"rx_lro_aborts_tsval",
151 	"rx_lro_aborts_timer",
152 	"rx_fwd_rate",
153 
154 	"mac_rx_total_rcvd",
155 	"mac_rx_bytes",
156 	"mac_rx_total_bcst",
157 	"mac_rx_total_mcst",
158 	"mac_rx_runts",
159 	"mac_rx_ctl_packets",
160 	"mac_rx_fifo_err",
161 	"mac_rx_dma_drop",
162 	"mac_rx_fcs_err",
163 
164 	"link_state_changes",
165 };
166 
167 /* statistics of VF */
168 static const char oct_vf_stats_strings[][ETH_GSTRING_LEN] = {
169 	"rx_packets",
170 	"tx_packets",
171 	"rx_bytes",
172 	"tx_bytes",
173 	"rx_errors", /* jabber_err + l2_err+frame_err */
174 	"tx_errors", /* fw_err_pko + fw_err_link+fw_err_drop */
175 	"rx_dropped", /* total_rcvd - fw_total_rcvd + dmac_drop + fw_err_drop */
176 	"tx_dropped",
177 	"link_state_changes",
178 };
179 
180 /* statistics of host tx queue */
181 static const char oct_iq_stats_strings[][ETH_GSTRING_LEN] = {
182 	"packets",		/*oct->instr_queue[iq_no]->stats.tx_done*/
183 	"bytes",		/*oct->instr_queue[iq_no]->stats.tx_tot_bytes*/
184 	"dropped",
185 	"iq_busy",
186 	"sgentry_sent",
187 
188 	"fw_instr_posted",
189 	"fw_instr_processed",
190 	"fw_instr_dropped",
191 	"fw_bytes_sent",
192 
193 	"tso",
194 	"vxlan",
195 	"txq_restart",
196 };
197 
198 /* statistics of host rx queue */
199 static const char oct_droq_stats_strings[][ETH_GSTRING_LEN] = {
200 	"packets",		/*oct->droq[oq_no]->stats.rx_pkts_received */
201 	"bytes",		/*oct->droq[oq_no]->stats.rx_bytes_received */
202 	"dropped",		/*oct->droq[oq_no]->stats.rx_dropped+
203 				 *oct->droq[oq_no]->stats.dropped_nodispatch+
204 				 *oct->droq[oq_no]->stats.dropped_toomany+
205 				 *oct->droq[oq_no]->stats.dropped_nomem
206 				 */
207 	"dropped_nomem",
208 	"dropped_toomany",
209 	"fw_dropped",
210 	"fw_pkts_received",
211 	"fw_bytes_received",
212 	"fw_dropped_nodispatch",
213 
214 	"vxlan",
215 	"buffer_alloc_failure",
216 };
217 
218 /* LiquidIO driver private flags */
219 static const char oct_priv_flags_strings[][ETH_GSTRING_LEN] = {
220 };
221 
222 #define OCTNIC_NCMD_AUTONEG_ON  0x1
223 #define OCTNIC_NCMD_PHY_ON      0x2
224 
225 static int lio_get_link_ksettings(struct net_device *netdev,
226 				  struct ethtool_link_ksettings *ecmd)
227 {
228 	struct lio *lio = GET_LIO(netdev);
229 	struct octeon_device *oct = lio->oct_dev;
230 	struct oct_link_info *linfo;
231 	u32 supported = 0, advertising = 0;
232 
233 	linfo = &lio->linfo;
234 
235 	if (linfo->link.s.if_mode == INTERFACE_MODE_XAUI ||
236 	    linfo->link.s.if_mode == INTERFACE_MODE_RXAUI ||
237 	    linfo->link.s.if_mode == INTERFACE_MODE_XLAUI ||
238 	    linfo->link.s.if_mode == INTERFACE_MODE_XFI) {
239 		ecmd->base.port = PORT_FIBRE;
240 
241 		if (linfo->link.s.speed == SPEED_10000) {
242 			supported = SUPPORTED_10000baseT_Full;
243 			advertising = ADVERTISED_10000baseT_Full;
244 		}
245 
246 		supported |= SUPPORTED_FIBRE | SUPPORTED_Pause;
247 		advertising |= ADVERTISED_Pause;
248 		ethtool_convert_legacy_u32_to_link_mode(
249 			ecmd->link_modes.supported, supported);
250 		ethtool_convert_legacy_u32_to_link_mode(
251 			ecmd->link_modes.advertising, advertising);
252 		ecmd->base.autoneg = AUTONEG_DISABLE;
253 
254 	} else {
255 		dev_err(&oct->pci_dev->dev, "Unknown link interface reported %d\n",
256 			linfo->link.s.if_mode);
257 	}
258 
259 	if (linfo->link.s.link_up) {
260 		ecmd->base.speed = linfo->link.s.speed;
261 		ecmd->base.duplex = linfo->link.s.duplex;
262 	} else {
263 		ecmd->base.speed = SPEED_UNKNOWN;
264 		ecmd->base.duplex = DUPLEX_UNKNOWN;
265 	}
266 
267 	return 0;
268 }
269 
270 static void
271 lio_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
272 {
273 	struct lio *lio;
274 	struct octeon_device *oct;
275 
276 	lio = GET_LIO(netdev);
277 	oct = lio->oct_dev;
278 
279 	memset(drvinfo, 0, sizeof(struct ethtool_drvinfo));
280 	strcpy(drvinfo->driver, "liquidio");
281 	strcpy(drvinfo->version, LIQUIDIO_VERSION);
282 	strncpy(drvinfo->fw_version, oct->fw_info.liquidio_firmware_version,
283 		ETHTOOL_FWVERS_LEN);
284 	strncpy(drvinfo->bus_info, pci_name(oct->pci_dev), 32);
285 }
286 
287 static void
288 lio_get_vf_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
289 {
290 	struct octeon_device *oct;
291 	struct lio *lio;
292 
293 	lio = GET_LIO(netdev);
294 	oct = lio->oct_dev;
295 
296 	memset(drvinfo, 0, sizeof(struct ethtool_drvinfo));
297 	strcpy(drvinfo->driver, "liquidio_vf");
298 	strcpy(drvinfo->version, LIQUIDIO_VERSION);
299 	strncpy(drvinfo->fw_version, oct->fw_info.liquidio_firmware_version,
300 		ETHTOOL_FWVERS_LEN);
301 	strncpy(drvinfo->bus_info, pci_name(oct->pci_dev), 32);
302 }
303 
304 static int
305 lio_send_queue_count_update(struct net_device *netdev, uint32_t num_queues)
306 {
307 	struct lio *lio = GET_LIO(netdev);
308 	struct octeon_device *oct = lio->oct_dev;
309 	struct octnic_ctrl_pkt nctrl;
310 	int ret = 0;
311 
312 	memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt));
313 
314 	nctrl.ncmd.u64 = 0;
315 	nctrl.ncmd.s.cmd = OCTNET_CMD_QUEUE_COUNT_CTL;
316 	nctrl.ncmd.s.param1 = num_queues;
317 	nctrl.ncmd.s.param2 = num_queues;
318 	nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
319 	nctrl.wait_time = 100;
320 	nctrl.netpndev = (u64)netdev;
321 	nctrl.cb_fn = liquidio_link_ctrl_cmd_completion;
322 
323 	ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl);
324 	if (ret < 0) {
325 		dev_err(&oct->pci_dev->dev, "Failed to send Queue reset command (ret: 0x%x)\n",
326 			ret);
327 		return -1;
328 	}
329 
330 	return 0;
331 }
332 
333 static void
334 lio_ethtool_get_channels(struct net_device *dev,
335 			 struct ethtool_channels *channel)
336 {
337 	struct lio *lio = GET_LIO(dev);
338 	struct octeon_device *oct = lio->oct_dev;
339 	u32 max_rx = 0, max_tx = 0, tx_count = 0, rx_count = 0;
340 	u32 combined_count = 0, max_combined = 0;
341 
342 	if (OCTEON_CN6XXX(oct)) {
343 		struct octeon_config *conf6x = CHIP_CONF(oct, cn6xxx);
344 
345 		max_rx = CFG_GET_OQ_MAX_Q(conf6x);
346 		max_tx = CFG_GET_IQ_MAX_Q(conf6x);
347 		rx_count = CFG_GET_NUM_RXQS_NIC_IF(conf6x, lio->ifidx);
348 		tx_count = CFG_GET_NUM_TXQS_NIC_IF(conf6x, lio->ifidx);
349 	} else if (OCTEON_CN23XX_PF(oct)) {
350 		max_combined = lio->linfo.num_txpciq;
351 		combined_count = oct->num_iqs;
352 	} else if (OCTEON_CN23XX_VF(oct)) {
353 		u64 reg_val = 0ULL;
354 		u64 ctrl = CN23XX_VF_SLI_IQ_PKT_CONTROL64(0);
355 
356 		reg_val = octeon_read_csr64(oct, ctrl);
357 		reg_val = reg_val >> CN23XX_PKT_INPUT_CTL_RPVF_POS;
358 		max_combined = reg_val & CN23XX_PKT_INPUT_CTL_RPVF_MASK;
359 		combined_count = oct->num_iqs;
360 	}
361 
362 	channel->max_rx = max_rx;
363 	channel->max_tx = max_tx;
364 	channel->max_combined = max_combined;
365 	channel->rx_count = rx_count;
366 	channel->tx_count = tx_count;
367 	channel->combined_count = combined_count;
368 }
369 
370 static int
371 lio_irq_reallocate_irqs(struct octeon_device *oct, uint32_t num_ioqs)
372 {
373 	struct msix_entry *msix_entries;
374 	int num_msix_irqs = 0;
375 	int i;
376 
377 	if (!oct->msix_on)
378 		return 0;
379 
380 	/* Disable the input and output queues now. No more packets will
381 	 * arrive from Octeon.
382 	 */
383 	oct->fn_list.disable_interrupt(oct, OCTEON_ALL_INTR);
384 
385 	if (oct->msix_on) {
386 		if (OCTEON_CN23XX_PF(oct))
387 			num_msix_irqs = oct->num_msix_irqs - 1;
388 		else if (OCTEON_CN23XX_VF(oct))
389 			num_msix_irqs = oct->num_msix_irqs;
390 
391 		msix_entries = (struct msix_entry *)oct->msix_entries;
392 		for (i = 0; i < num_msix_irqs; i++) {
393 			if (oct->ioq_vector[i].vector) {
394 				/* clear the affinity_cpumask */
395 				irq_set_affinity_hint(msix_entries[i].vector,
396 						      NULL);
397 				free_irq(msix_entries[i].vector,
398 					 &oct->ioq_vector[i]);
399 				oct->ioq_vector[i].vector = 0;
400 			}
401 		}
402 
403 		/* non-iov vector's argument is oct struct */
404 		if (OCTEON_CN23XX_PF(oct))
405 			free_irq(msix_entries[i].vector, oct);
406 
407 		pci_disable_msix(oct->pci_dev);
408 		kfree(oct->msix_entries);
409 		oct->msix_entries = NULL;
410 	}
411 
412 	kfree(oct->irq_name_storage);
413 	oct->irq_name_storage = NULL;
414 	if (octeon_setup_interrupt(oct, num_ioqs)) {
415 		dev_info(&oct->pci_dev->dev, "Setup interrupt failed\n");
416 		return 1;
417 	}
418 
419 	/* Enable Octeon device interrupts */
420 	oct->fn_list.enable_interrupt(oct, OCTEON_ALL_INTR);
421 
422 	return 0;
423 }
424 
425 static int
426 lio_ethtool_set_channels(struct net_device *dev,
427 			 struct ethtool_channels *channel)
428 {
429 	u32 combined_count, max_combined;
430 	struct lio *lio = GET_LIO(dev);
431 	struct octeon_device *oct = lio->oct_dev;
432 	int stopped = 0;
433 
434 	if (strcmp(oct->fw_info.liquidio_firmware_version, "1.6.1") < 0) {
435 		dev_err(&oct->pci_dev->dev, "Minimum firmware version required is 1.6.1\n");
436 		return -EINVAL;
437 	}
438 
439 	if (!channel->combined_count || channel->other_count ||
440 	    channel->rx_count || channel->tx_count)
441 		return -EINVAL;
442 
443 	combined_count = channel->combined_count;
444 
445 	if (OCTEON_CN23XX_PF(oct)) {
446 		max_combined = channel->max_combined;
447 	} else if (OCTEON_CN23XX_VF(oct)) {
448 		u64 reg_val = 0ULL;
449 		u64 ctrl = CN23XX_VF_SLI_IQ_PKT_CONTROL64(0);
450 
451 		reg_val = octeon_read_csr64(oct, ctrl);
452 		reg_val = reg_val >> CN23XX_PKT_INPUT_CTL_RPVF_POS;
453 		max_combined = reg_val & CN23XX_PKT_INPUT_CTL_RPVF_MASK;
454 	} else {
455 		return -EINVAL;
456 	}
457 
458 	if (combined_count > max_combined || combined_count < 1)
459 		return -EINVAL;
460 
461 	if (combined_count == oct->num_iqs)
462 		return 0;
463 
464 	ifstate_set(lio, LIO_IFSTATE_RESETTING);
465 
466 	if (netif_running(dev)) {
467 		dev->netdev_ops->ndo_stop(dev);
468 		stopped = 1;
469 	}
470 
471 	if (lio_reset_queues(dev, combined_count))
472 		return -EINVAL;
473 
474 	lio_irq_reallocate_irqs(oct, combined_count);
475 	if (stopped)
476 		dev->netdev_ops->ndo_open(dev);
477 
478 	ifstate_reset(lio, LIO_IFSTATE_RESETTING);
479 
480 	return 0;
481 }
482 
483 static int lio_get_eeprom_len(struct net_device *netdev)
484 {
485 	u8 buf[192];
486 	struct lio *lio = GET_LIO(netdev);
487 	struct octeon_device *oct_dev = lio->oct_dev;
488 	struct octeon_board_info *board_info;
489 	int len;
490 
491 	board_info = (struct octeon_board_info *)(&oct_dev->boardinfo);
492 	len = sprintf(buf, "boardname:%s serialnum:%s maj:%lld min:%lld\n",
493 		      board_info->name, board_info->serial_number,
494 		      board_info->major, board_info->minor);
495 
496 	return len;
497 }
498 
499 static int
500 lio_get_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom,
501 	       u8 *bytes)
502 {
503 	struct lio *lio = GET_LIO(netdev);
504 	struct octeon_device *oct_dev = lio->oct_dev;
505 	struct octeon_board_info *board_info;
506 
507 	if (eeprom->offset)
508 		return -EINVAL;
509 
510 	eeprom->magic = oct_dev->pci_dev->vendor;
511 	board_info = (struct octeon_board_info *)(&oct_dev->boardinfo);
512 	sprintf((char *)bytes,
513 		"boardname:%s serialnum:%s maj:%lld min:%lld\n",
514 		board_info->name, board_info->serial_number,
515 		board_info->major, board_info->minor);
516 
517 	return 0;
518 }
519 
520 static int octnet_gpio_access(struct net_device *netdev, int addr, int val)
521 {
522 	struct lio *lio = GET_LIO(netdev);
523 	struct octeon_device *oct = lio->oct_dev;
524 	struct octnic_ctrl_pkt nctrl;
525 	int ret = 0;
526 
527 	memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt));
528 
529 	nctrl.ncmd.u64 = 0;
530 	nctrl.ncmd.s.cmd = OCTNET_CMD_GPIO_ACCESS;
531 	nctrl.ncmd.s.param1 = addr;
532 	nctrl.ncmd.s.param2 = val;
533 	nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
534 	nctrl.wait_time = 100;
535 	nctrl.netpndev = (u64)netdev;
536 	nctrl.cb_fn = liquidio_link_ctrl_cmd_completion;
537 
538 	ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl);
539 	if (ret < 0) {
540 		dev_err(&oct->pci_dev->dev, "Failed to configure gpio value\n");
541 		return -EINVAL;
542 	}
543 
544 	return 0;
545 }
546 
547 static int octnet_id_active(struct net_device *netdev, int val)
548 {
549 	struct lio *lio = GET_LIO(netdev);
550 	struct octeon_device *oct = lio->oct_dev;
551 	struct octnic_ctrl_pkt nctrl;
552 	int ret = 0;
553 
554 	memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt));
555 
556 	nctrl.ncmd.u64 = 0;
557 	nctrl.ncmd.s.cmd = OCTNET_CMD_ID_ACTIVE;
558 	nctrl.ncmd.s.param1 = val;
559 	nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
560 	nctrl.wait_time = 100;
561 	nctrl.netpndev = (u64)netdev;
562 	nctrl.cb_fn = liquidio_link_ctrl_cmd_completion;
563 
564 	ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl);
565 	if (ret < 0) {
566 		dev_err(&oct->pci_dev->dev, "Failed to configure gpio value\n");
567 		return -EINVAL;
568 	}
569 
570 	return 0;
571 }
572 
573 /* Callback for when mdio command response arrives
574  */
575 static void octnet_mdio_resp_callback(struct octeon_device *oct,
576 				      u32 status,
577 				      void *buf)
578 {
579 	struct oct_mdio_cmd_context *mdio_cmd_ctx;
580 	struct octeon_soft_command *sc = (struct octeon_soft_command *)buf;
581 
582 	mdio_cmd_ctx = (struct oct_mdio_cmd_context *)sc->ctxptr;
583 
584 	oct = lio_get_device(mdio_cmd_ctx->octeon_id);
585 	if (status) {
586 		dev_err(&oct->pci_dev->dev, "MIDO instruction failed. Status: %llx\n",
587 			CVM_CAST64(status));
588 		WRITE_ONCE(mdio_cmd_ctx->cond, -1);
589 	} else {
590 		WRITE_ONCE(mdio_cmd_ctx->cond, 1);
591 	}
592 	wake_up_interruptible(&mdio_cmd_ctx->wc);
593 }
594 
595 /* This routine provides PHY access routines for
596  * mdio  clause45 .
597  */
598 static int
599 octnet_mdio45_access(struct lio *lio, int op, int loc, int *value)
600 {
601 	struct octeon_device *oct_dev = lio->oct_dev;
602 	struct octeon_soft_command *sc;
603 	struct oct_mdio_cmd_resp *mdio_cmd_rsp;
604 	struct oct_mdio_cmd_context *mdio_cmd_ctx;
605 	struct oct_mdio_cmd *mdio_cmd;
606 	int retval = 0;
607 
608 	sc = (struct octeon_soft_command *)
609 		octeon_alloc_soft_command(oct_dev,
610 					  sizeof(struct oct_mdio_cmd),
611 					  sizeof(struct oct_mdio_cmd_resp),
612 					  sizeof(struct oct_mdio_cmd_context));
613 
614 	if (!sc)
615 		return -ENOMEM;
616 
617 	mdio_cmd_ctx = (struct oct_mdio_cmd_context *)sc->ctxptr;
618 	mdio_cmd_rsp = (struct oct_mdio_cmd_resp *)sc->virtrptr;
619 	mdio_cmd = (struct oct_mdio_cmd *)sc->virtdptr;
620 
621 	WRITE_ONCE(mdio_cmd_ctx->cond, 0);
622 	mdio_cmd_ctx->octeon_id = lio_get_device_id(oct_dev);
623 	mdio_cmd->op = op;
624 	mdio_cmd->mdio_addr = loc;
625 	if (op)
626 		mdio_cmd->value1 = *value;
627 	octeon_swap_8B_data((u64 *)mdio_cmd, sizeof(struct oct_mdio_cmd) / 8);
628 
629 	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
630 
631 	octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC, OPCODE_NIC_MDIO45,
632 				    0, 0, 0);
633 
634 	sc->wait_time = 1000;
635 	sc->callback = octnet_mdio_resp_callback;
636 	sc->callback_arg = sc;
637 
638 	init_waitqueue_head(&mdio_cmd_ctx->wc);
639 
640 	retval = octeon_send_soft_command(oct_dev, sc);
641 
642 	if (retval == IQ_SEND_FAILED) {
643 		dev_err(&oct_dev->pci_dev->dev,
644 			"octnet_mdio45_access instruction failed status: %x\n",
645 			retval);
646 		retval = -EBUSY;
647 	} else {
648 		/* Sleep on a wait queue till the cond flag indicates that the
649 		 * response arrived
650 		 */
651 		sleep_cond(&mdio_cmd_ctx->wc, &mdio_cmd_ctx->cond);
652 		retval = mdio_cmd_rsp->status;
653 		if (retval) {
654 			dev_err(&oct_dev->pci_dev->dev, "octnet mdio45 access failed\n");
655 			retval = -EBUSY;
656 		} else {
657 			octeon_swap_8B_data((u64 *)(&mdio_cmd_rsp->resp),
658 					    sizeof(struct oct_mdio_cmd) / 8);
659 
660 			if (READ_ONCE(mdio_cmd_ctx->cond) == 1) {
661 				if (!op)
662 					*value = mdio_cmd_rsp->resp.value1;
663 			} else {
664 				retval = -EINVAL;
665 			}
666 		}
667 	}
668 
669 	octeon_free_soft_command(oct_dev, sc);
670 
671 	return retval;
672 }
673 
674 static int lio_set_phys_id(struct net_device *netdev,
675 			   enum ethtool_phys_id_state state)
676 {
677 	struct lio *lio = GET_LIO(netdev);
678 	struct octeon_device *oct = lio->oct_dev;
679 	int value, ret;
680 
681 	switch (state) {
682 	case ETHTOOL_ID_ACTIVE:
683 		if (oct->chip_id == OCTEON_CN66XX) {
684 			octnet_gpio_access(netdev, VITESSE_PHY_GPIO_CFG,
685 					   VITESSE_PHY_GPIO_DRIVEON);
686 			return 2;
687 
688 		} else if (oct->chip_id == OCTEON_CN68XX) {
689 			/* Save the current LED settings */
690 			ret = octnet_mdio45_access(lio, 0,
691 						   LIO68XX_LED_BEACON_ADDR,
692 						   &lio->phy_beacon_val);
693 			if (ret)
694 				return ret;
695 
696 			ret = octnet_mdio45_access(lio, 0,
697 						   LIO68XX_LED_CTRL_ADDR,
698 						   &lio->led_ctrl_val);
699 			if (ret)
700 				return ret;
701 
702 			/* Configure Beacon values */
703 			value = LIO68XX_LED_BEACON_CFGON;
704 			ret = octnet_mdio45_access(lio, 1,
705 						   LIO68XX_LED_BEACON_ADDR,
706 						   &value);
707 			if (ret)
708 				return ret;
709 
710 			value = LIO68XX_LED_CTRL_CFGON;
711 			ret = octnet_mdio45_access(lio, 1,
712 						   LIO68XX_LED_CTRL_ADDR,
713 						   &value);
714 			if (ret)
715 				return ret;
716 		} else if (oct->chip_id == OCTEON_CN23XX_PF_VID) {
717 			octnet_id_active(netdev, LED_IDENTIFICATION_ON);
718 
719 			/* returns 0 since updates are asynchronous */
720 			return 0;
721 		} else {
722 			return -EINVAL;
723 		}
724 		break;
725 
726 	case ETHTOOL_ID_ON:
727 		if (oct->chip_id == OCTEON_CN66XX)
728 			octnet_gpio_access(netdev, VITESSE_PHY_GPIO_CFG,
729 					   VITESSE_PHY_GPIO_HIGH);
730 		else
731 			return -EINVAL;
732 
733 		break;
734 
735 	case ETHTOOL_ID_OFF:
736 		if (oct->chip_id == OCTEON_CN66XX)
737 			octnet_gpio_access(netdev, VITESSE_PHY_GPIO_CFG,
738 					   VITESSE_PHY_GPIO_LOW);
739 		else
740 			return -EINVAL;
741 
742 		break;
743 
744 	case ETHTOOL_ID_INACTIVE:
745 		if (oct->chip_id == OCTEON_CN66XX) {
746 			octnet_gpio_access(netdev, VITESSE_PHY_GPIO_CFG,
747 					   VITESSE_PHY_GPIO_DRIVEOFF);
748 		} else if (oct->chip_id == OCTEON_CN68XX) {
749 			/* Restore LED settings */
750 			ret = octnet_mdio45_access(lio, 1,
751 						   LIO68XX_LED_CTRL_ADDR,
752 						   &lio->led_ctrl_val);
753 			if (ret)
754 				return ret;
755 
756 			ret = octnet_mdio45_access(lio, 1,
757 						   LIO68XX_LED_BEACON_ADDR,
758 						   &lio->phy_beacon_val);
759 			if (ret)
760 				return ret;
761 		} else if (oct->chip_id == OCTEON_CN23XX_PF_VID) {
762 			octnet_id_active(netdev, LED_IDENTIFICATION_OFF);
763 
764 			return 0;
765 		} else {
766 			return -EINVAL;
767 		}
768 		break;
769 
770 	default:
771 		return -EINVAL;
772 	}
773 
774 	return 0;
775 }
776 
777 static void
778 lio_ethtool_get_ringparam(struct net_device *netdev,
779 			  struct ethtool_ringparam *ering)
780 {
781 	struct lio *lio = GET_LIO(netdev);
782 	struct octeon_device *oct = lio->oct_dev;
783 	u32 tx_max_pending = 0, rx_max_pending = 0, tx_pending = 0,
784 	    rx_pending = 0;
785 
786 	if (ifstate_check(lio, LIO_IFSTATE_RESETTING))
787 		return;
788 
789 	if (OCTEON_CN6XXX(oct)) {
790 		struct octeon_config *conf6x = CHIP_CONF(oct, cn6xxx);
791 
792 		tx_max_pending = CN6XXX_MAX_IQ_DESCRIPTORS;
793 		rx_max_pending = CN6XXX_MAX_OQ_DESCRIPTORS;
794 		rx_pending = CFG_GET_NUM_RX_DESCS_NIC_IF(conf6x, lio->ifidx);
795 		tx_pending = CFG_GET_NUM_TX_DESCS_NIC_IF(conf6x, lio->ifidx);
796 	} else if (OCTEON_CN23XX_PF(oct) || OCTEON_CN23XX_VF(oct)) {
797 		tx_max_pending = CN23XX_MAX_IQ_DESCRIPTORS;
798 		rx_max_pending = CN23XX_MAX_OQ_DESCRIPTORS;
799 		rx_pending = oct->droq[0]->max_count;
800 		tx_pending = oct->instr_queue[0]->max_count;
801 	}
802 
803 	ering->tx_pending = tx_pending;
804 	ering->tx_max_pending = tx_max_pending;
805 	ering->rx_pending = rx_pending;
806 	ering->rx_max_pending = rx_max_pending;
807 	ering->rx_mini_pending = 0;
808 	ering->rx_jumbo_pending = 0;
809 	ering->rx_mini_max_pending = 0;
810 	ering->rx_jumbo_max_pending = 0;
811 }
812 
813 static int lio_reset_queues(struct net_device *netdev, uint32_t num_qs)
814 {
815 	struct lio *lio = GET_LIO(netdev);
816 	struct octeon_device *oct = lio->oct_dev;
817 	struct napi_struct *napi, *n;
818 	int i, update = 0;
819 
820 	if (wait_for_pending_requests(oct))
821 		dev_err(&oct->pci_dev->dev, "There were pending requests\n");
822 
823 	if (lio_wait_for_instr_fetch(oct))
824 		dev_err(&oct->pci_dev->dev, "IQ had pending instructions\n");
825 
826 	if (octeon_set_io_queues_off(oct)) {
827 		dev_err(&oct->pci_dev->dev, "setting io queues off failed\n");
828 		return -1;
829 	}
830 
831 	/* Disable the input and output queues now. No more packets will
832 	 * arrive from Octeon.
833 	 */
834 	oct->fn_list.disable_io_queues(oct);
835 	/* Delete NAPI */
836 	list_for_each_entry_safe(napi, n, &netdev->napi_list, dev_list)
837 		netif_napi_del(napi);
838 
839 	if (num_qs != oct->num_iqs) {
840 		netif_set_real_num_rx_queues(netdev, num_qs);
841 		netif_set_real_num_tx_queues(netdev, num_qs);
842 		update = 1;
843 	}
844 
845 	for (i = 0; i < MAX_OCTEON_OUTPUT_QUEUES(oct); i++) {
846 		if (!(oct->io_qmask.oq & BIT_ULL(i)))
847 			continue;
848 		octeon_delete_droq(oct, i);
849 	}
850 
851 	for (i = 0; i < MAX_OCTEON_INSTR_QUEUES(oct); i++) {
852 		if (!(oct->io_qmask.iq & BIT_ULL(i)))
853 			continue;
854 		octeon_delete_instr_queue(oct, i);
855 	}
856 
857 	if (oct->fn_list.setup_device_regs(oct)) {
858 		dev_err(&oct->pci_dev->dev, "Failed to configure device registers\n");
859 		return -1;
860 	}
861 
862 	if (liquidio_setup_io_queues(oct, 0, num_qs, num_qs)) {
863 		dev_err(&oct->pci_dev->dev, "IO queues initialization failed\n");
864 		return -1;
865 	}
866 
867 	/* Enable the input and output queues for this Octeon device */
868 	if (oct->fn_list.enable_io_queues(oct)) {
869 		dev_err(&oct->pci_dev->dev, "Failed to enable input/output queues");
870 		return -1;
871 	}
872 
873 	if (update && lio_send_queue_count_update(netdev, num_qs))
874 		return -1;
875 
876 	return 0;
877 }
878 
879 static int lio_ethtool_set_ringparam(struct net_device *netdev,
880 				     struct ethtool_ringparam *ering)
881 {
882 	u32 rx_count, tx_count, rx_count_old, tx_count_old;
883 	struct lio *lio = GET_LIO(netdev);
884 	struct octeon_device *oct = lio->oct_dev;
885 	int stopped = 0;
886 
887 	if (!OCTEON_CN23XX_PF(oct) && !OCTEON_CN23XX_VF(oct))
888 		return -EINVAL;
889 
890 	if (ering->rx_mini_pending || ering->rx_jumbo_pending)
891 		return -EINVAL;
892 
893 	rx_count = clamp_t(u32, ering->rx_pending, CN23XX_MIN_OQ_DESCRIPTORS,
894 			   CN23XX_MAX_OQ_DESCRIPTORS);
895 	tx_count = clamp_t(u32, ering->tx_pending, CN23XX_MIN_IQ_DESCRIPTORS,
896 			   CN23XX_MAX_IQ_DESCRIPTORS);
897 
898 	rx_count_old = oct->droq[0]->max_count;
899 	tx_count_old = oct->instr_queue[0]->max_count;
900 
901 	if (rx_count == rx_count_old && tx_count == tx_count_old)
902 		return 0;
903 
904 	ifstate_set(lio, LIO_IFSTATE_RESETTING);
905 
906 	if (netif_running(netdev)) {
907 		netdev->netdev_ops->ndo_stop(netdev);
908 		stopped = 1;
909 	}
910 
911 	/* Change RX/TX DESCS  count */
912 	if (tx_count != tx_count_old)
913 		CFG_SET_NUM_TX_DESCS_NIC_IF(octeon_get_conf(oct), lio->ifidx,
914 					    tx_count);
915 	if (rx_count != rx_count_old)
916 		CFG_SET_NUM_RX_DESCS_NIC_IF(octeon_get_conf(oct), lio->ifidx,
917 					    rx_count);
918 
919 	if (lio_reset_queues(netdev, lio->linfo.num_txpciq))
920 		goto err_lio_reset_queues;
921 
922 	if (stopped)
923 		netdev->netdev_ops->ndo_open(netdev);
924 
925 	ifstate_reset(lio, LIO_IFSTATE_RESETTING);
926 
927 	return 0;
928 
929 err_lio_reset_queues:
930 	if (tx_count != tx_count_old)
931 		CFG_SET_NUM_TX_DESCS_NIC_IF(octeon_get_conf(oct), lio->ifidx,
932 					    tx_count_old);
933 	if (rx_count != rx_count_old)
934 		CFG_SET_NUM_RX_DESCS_NIC_IF(octeon_get_conf(oct), lio->ifidx,
935 					    rx_count_old);
936 	return -EINVAL;
937 }
938 
939 static u32 lio_get_msglevel(struct net_device *netdev)
940 {
941 	struct lio *lio = GET_LIO(netdev);
942 
943 	return lio->msg_enable;
944 }
945 
946 static void lio_set_msglevel(struct net_device *netdev, u32 msglvl)
947 {
948 	struct lio *lio = GET_LIO(netdev);
949 
950 	if ((msglvl ^ lio->msg_enable) & NETIF_MSG_HW) {
951 		if (msglvl & NETIF_MSG_HW)
952 			liquidio_set_feature(netdev,
953 					     OCTNET_CMD_VERBOSE_ENABLE, 0);
954 		else
955 			liquidio_set_feature(netdev,
956 					     OCTNET_CMD_VERBOSE_DISABLE, 0);
957 	}
958 
959 	lio->msg_enable = msglvl;
960 }
961 
962 static void lio_vf_set_msglevel(struct net_device *netdev, u32 msglvl)
963 {
964 	struct lio *lio = GET_LIO(netdev);
965 
966 	lio->msg_enable = msglvl;
967 }
968 
969 static void
970 lio_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
971 {
972 	/* Notes: Not supporting any auto negotiation in these
973 	 * drivers. Just report pause frame support.
974 	 */
975 	struct lio *lio = GET_LIO(netdev);
976 	struct octeon_device *oct = lio->oct_dev;
977 
978 	pause->autoneg = 0;
979 
980 	pause->tx_pause = oct->tx_pause;
981 	pause->rx_pause = oct->rx_pause;
982 }
983 
984 static int
985 lio_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
986 {
987 	/* Notes: Not supporting any auto negotiation in these
988 	 * drivers.
989 	 */
990 	struct lio *lio = GET_LIO(netdev);
991 	struct octeon_device *oct = lio->oct_dev;
992 	struct octnic_ctrl_pkt nctrl;
993 	struct oct_link_info *linfo = &lio->linfo;
994 
995 	int ret = 0;
996 
997 	if (oct->chip_id != OCTEON_CN23XX_PF_VID)
998 		return -EINVAL;
999 
1000 	if (linfo->link.s.duplex == 0) {
1001 		/*no flow control for half duplex*/
1002 		if (pause->rx_pause || pause->tx_pause)
1003 			return -EINVAL;
1004 	}
1005 
1006 	/*do not support autoneg of link flow control*/
1007 	if (pause->autoneg == AUTONEG_ENABLE)
1008 		return -EINVAL;
1009 
1010 	memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt));
1011 
1012 	nctrl.ncmd.u64 = 0;
1013 	nctrl.ncmd.s.cmd = OCTNET_CMD_SET_FLOW_CTL;
1014 	nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
1015 	nctrl.wait_time = 100;
1016 	nctrl.netpndev = (u64)netdev;
1017 	nctrl.cb_fn = liquidio_link_ctrl_cmd_completion;
1018 
1019 	if (pause->rx_pause) {
1020 		/*enable rx pause*/
1021 		nctrl.ncmd.s.param1 = 1;
1022 	} else {
1023 		/*disable rx pause*/
1024 		nctrl.ncmd.s.param1 = 0;
1025 	}
1026 
1027 	if (pause->tx_pause) {
1028 		/*enable tx pause*/
1029 		nctrl.ncmd.s.param2 = 1;
1030 	} else {
1031 		/*disable tx pause*/
1032 		nctrl.ncmd.s.param2 = 0;
1033 	}
1034 
1035 	ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl);
1036 	if (ret < 0) {
1037 		dev_err(&oct->pci_dev->dev, "Failed to set pause parameter\n");
1038 		return -EINVAL;
1039 	}
1040 
1041 	oct->rx_pause = pause->rx_pause;
1042 	oct->tx_pause = pause->tx_pause;
1043 
1044 	return 0;
1045 }
1046 
1047 static void
1048 lio_get_ethtool_stats(struct net_device *netdev,
1049 		      struct ethtool_stats *stats  __attribute__((unused)),
1050 		      u64 *data)
1051 {
1052 	struct lio *lio = GET_LIO(netdev);
1053 	struct octeon_device *oct_dev = lio->oct_dev;
1054 	struct net_device_stats *netstats = &netdev->stats;
1055 	int i = 0, j;
1056 
1057 	if (ifstate_check(lio, LIO_IFSTATE_RESETTING))
1058 		return;
1059 
1060 	netdev->netdev_ops->ndo_get_stats(netdev);
1061 	octnet_get_link_stats(netdev);
1062 
1063 	/*sum of oct->droq[oq_no]->stats->rx_pkts_received */
1064 	data[i++] = CVM_CAST64(netstats->rx_packets);
1065 	/*sum of oct->instr_queue[iq_no]->stats.tx_done */
1066 	data[i++] = CVM_CAST64(netstats->tx_packets);
1067 	/*sum of oct->droq[oq_no]->stats->rx_bytes_received */
1068 	data[i++] = CVM_CAST64(netstats->rx_bytes);
1069 	/*sum of oct->instr_queue[iq_no]->stats.tx_tot_bytes */
1070 	data[i++] = CVM_CAST64(netstats->tx_bytes);
1071 	data[i++] = CVM_CAST64(netstats->rx_errors);
1072 	data[i++] = CVM_CAST64(netstats->tx_errors);
1073 	/*sum of oct->droq[oq_no]->stats->rx_dropped +
1074 	 *oct->droq[oq_no]->stats->dropped_nodispatch +
1075 	 *oct->droq[oq_no]->stats->dropped_toomany +
1076 	 *oct->droq[oq_no]->stats->dropped_nomem
1077 	 */
1078 	data[i++] = CVM_CAST64(netstats->rx_dropped);
1079 	/*sum of oct->instr_queue[iq_no]->stats.tx_dropped */
1080 	data[i++] = CVM_CAST64(netstats->tx_dropped);
1081 
1082 	/* firmware tx stats */
1083 	/*per_core_stats[cvmx_get_core_num()].link_stats[mdata->from_ifidx].
1084 	 *fromhost.fw_total_sent
1085 	 */
1086 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_total_sent);
1087 	/*per_core_stats[i].link_stats[port].fromwire.fw_total_fwd */
1088 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_total_fwd);
1089 	/*per_core_stats[j].link_stats[i].fromhost.fw_err_pko */
1090 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_err_pko);
1091 	/*per_core_stats[j].link_stats[i].fromhost.fw_err_pki */
1092 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_err_pki);
1093 	/*per_core_stats[j].link_stats[i].fromhost.fw_err_link */
1094 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_err_link);
1095 	/*per_core_stats[cvmx_get_core_num()].link_stats[idx].fromhost.
1096 	 *fw_err_drop
1097 	 */
1098 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_err_drop);
1099 
1100 	/*per_core_stats[cvmx_get_core_num()].link_stats[idx].fromhost.fw_tso */
1101 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_tso);
1102 	/*per_core_stats[cvmx_get_core_num()].link_stats[idx].fromhost.
1103 	 *fw_tso_fwd
1104 	 */
1105 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_tso_fwd);
1106 	/*per_core_stats[cvmx_get_core_num()].link_stats[idx].fromhost.
1107 	 *fw_err_tso
1108 	 */
1109 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_err_tso);
1110 	/*per_core_stats[cvmx_get_core_num()].link_stats[idx].fromhost.
1111 	 *fw_tx_vxlan
1112 	 */
1113 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_tx_vxlan);
1114 
1115 	/* mac tx statistics */
1116 	/*CVMX_BGXX_CMRX_TX_STAT5 */
1117 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.total_pkts_sent);
1118 	/*CVMX_BGXX_CMRX_TX_STAT4 */
1119 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.total_bytes_sent);
1120 	/*CVMX_BGXX_CMRX_TX_STAT15 */
1121 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.mcast_pkts_sent);
1122 	/*CVMX_BGXX_CMRX_TX_STAT14 */
1123 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.bcast_pkts_sent);
1124 	/*CVMX_BGXX_CMRX_TX_STAT17 */
1125 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.ctl_sent);
1126 	/*CVMX_BGXX_CMRX_TX_STAT0 */
1127 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.total_collisions);
1128 	/*CVMX_BGXX_CMRX_TX_STAT3 */
1129 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.one_collision_sent);
1130 	/*CVMX_BGXX_CMRX_TX_STAT2 */
1131 	data[i++] =
1132 		CVM_CAST64(oct_dev->link_stats.fromhost.multi_collision_sent);
1133 	/*CVMX_BGXX_CMRX_TX_STAT0 */
1134 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.max_collision_fail);
1135 	/*CVMX_BGXX_CMRX_TX_STAT1 */
1136 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.max_deferral_fail);
1137 	/*CVMX_BGXX_CMRX_TX_STAT16 */
1138 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fifo_err);
1139 	/*CVMX_BGXX_CMRX_TX_STAT6 */
1140 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.runts);
1141 
1142 	/* RX firmware stats */
1143 	/*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
1144 	 *fw_total_rcvd
1145 	 */
1146 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_total_rcvd);
1147 	/*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
1148 	 *fw_total_fwd
1149 	 */
1150 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_total_fwd);
1151 	/*per_core_stats[core_id].link_stats[ifidx].fromwire.jabber_err */
1152 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.jabber_err);
1153 	/*per_core_stats[core_id].link_stats[ifidx].fromwire.l2_err */
1154 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.l2_err);
1155 	/*per_core_stats[core_id].link_stats[ifidx].fromwire.frame_err */
1156 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.frame_err);
1157 	/*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
1158 	 *fw_err_pko
1159 	 */
1160 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_err_pko);
1161 	/*per_core_stats[j].link_stats[i].fromwire.fw_err_link */
1162 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_err_link);
1163 	/*per_core_stats[cvmx_get_core_num()].link_stats[lro_ctx->ifidx].
1164 	 *fromwire.fw_err_drop
1165 	 */
1166 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_err_drop);
1167 
1168 	/*per_core_stats[cvmx_get_core_num()].link_stats[lro_ctx->ifidx].
1169 	 *fromwire.fw_rx_vxlan
1170 	 */
1171 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_rx_vxlan);
1172 	/*per_core_stats[cvmx_get_core_num()].link_stats[lro_ctx->ifidx].
1173 	 *fromwire.fw_rx_vxlan_err
1174 	 */
1175 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_rx_vxlan_err);
1176 
1177 	/* LRO */
1178 	/*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
1179 	 *fw_lro_pkts
1180 	 */
1181 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_pkts);
1182 	/*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
1183 	 *fw_lro_octs
1184 	 */
1185 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_octs);
1186 	/*per_core_stats[j].link_stats[i].fromwire.fw_total_lro */
1187 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_total_lro);
1188 	/*per_core_stats[j].link_stats[i].fromwire.fw_lro_aborts */
1189 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_aborts);
1190 	/*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
1191 	 *fw_lro_aborts_port
1192 	 */
1193 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_aborts_port);
1194 	/*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
1195 	 *fw_lro_aborts_seq
1196 	 */
1197 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_aborts_seq);
1198 	/*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
1199 	 *fw_lro_aborts_tsval
1200 	 */
1201 	data[i++] =
1202 		CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_aborts_tsval);
1203 	/*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
1204 	 *fw_lro_aborts_timer
1205 	 */
1206 	/* intrmod: packet forward rate */
1207 	data[i++] =
1208 		CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_aborts_timer);
1209 	/*per_core_stats[j].link_stats[i].fromwire.fw_lro_aborts */
1210 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fwd_rate);
1211 
1212 	/* mac: link-level stats */
1213 	/*CVMX_BGXX_CMRX_RX_STAT0 */
1214 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.total_rcvd);
1215 	/*CVMX_BGXX_CMRX_RX_STAT1 */
1216 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.bytes_rcvd);
1217 	/*CVMX_PKI_STATX_STAT5 */
1218 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.total_bcst);
1219 	/*CVMX_PKI_STATX_STAT5 */
1220 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.total_mcst);
1221 	/*wqe->word2.err_code or wqe->word2.err_level */
1222 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.runts);
1223 	/*CVMX_BGXX_CMRX_RX_STAT2 */
1224 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.ctl_rcvd);
1225 	/*CVMX_BGXX_CMRX_RX_STAT6 */
1226 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fifo_err);
1227 	/*CVMX_BGXX_CMRX_RX_STAT4 */
1228 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.dmac_drop);
1229 	/*wqe->word2.err_code or wqe->word2.err_level */
1230 	data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fcs_err);
1231 	/*lio->link_changes*/
1232 	data[i++] = CVM_CAST64(lio->link_changes);
1233 
1234 	for (j = 0; j < MAX_OCTEON_INSTR_QUEUES(oct_dev); j++) {
1235 		if (!(oct_dev->io_qmask.iq & BIT_ULL(j)))
1236 			continue;
1237 		/*packets to network port*/
1238 		/*# of packets tx to network */
1239 		data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_done);
1240 		/*# of bytes tx to network */
1241 		data[i++] =
1242 			CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_tot_bytes);
1243 		/*# of packets dropped */
1244 		data[i++] =
1245 			CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_dropped);
1246 		/*# of tx fails due to queue full */
1247 		data[i++] =
1248 			CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_iq_busy);
1249 		/*XXX gather entries sent */
1250 		data[i++] =
1251 			CVM_CAST64(oct_dev->instr_queue[j]->stats.sgentry_sent);
1252 
1253 		/*instruction to firmware: data and control */
1254 		/*# of instructions to the queue */
1255 		data[i++] =
1256 			CVM_CAST64(oct_dev->instr_queue[j]->stats.instr_posted);
1257 		/*# of instructions processed */
1258 		data[i++] = CVM_CAST64(
1259 				oct_dev->instr_queue[j]->stats.instr_processed);
1260 		/*# of instructions could not be processed */
1261 		data[i++] = CVM_CAST64(
1262 				oct_dev->instr_queue[j]->stats.instr_dropped);
1263 		/*bytes sent through the queue */
1264 		data[i++] =
1265 			CVM_CAST64(oct_dev->instr_queue[j]->stats.bytes_sent);
1266 
1267 		/*tso request*/
1268 		data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_gso);
1269 		/*vxlan request*/
1270 		data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_vxlan);
1271 		/*txq restart*/
1272 		data[i++] =
1273 			CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_restart);
1274 	}
1275 
1276 	/* RX */
1277 	for (j = 0; j < MAX_OCTEON_OUTPUT_QUEUES(oct_dev); j++) {
1278 		if (!(oct_dev->io_qmask.oq & BIT_ULL(j)))
1279 			continue;
1280 
1281 		/*packets send to TCP/IP network stack */
1282 		/*# of packets to network stack */
1283 		data[i++] =
1284 			CVM_CAST64(oct_dev->droq[j]->stats.rx_pkts_received);
1285 		/*# of bytes to network stack */
1286 		data[i++] =
1287 			CVM_CAST64(oct_dev->droq[j]->stats.rx_bytes_received);
1288 		/*# of packets dropped */
1289 		data[i++] = CVM_CAST64(oct_dev->droq[j]->stats.dropped_nomem +
1290 				       oct_dev->droq[j]->stats.dropped_toomany +
1291 				       oct_dev->droq[j]->stats.rx_dropped);
1292 		data[i++] =
1293 			CVM_CAST64(oct_dev->droq[j]->stats.dropped_nomem);
1294 		data[i++] =
1295 			CVM_CAST64(oct_dev->droq[j]->stats.dropped_toomany);
1296 		data[i++] =
1297 			CVM_CAST64(oct_dev->droq[j]->stats.rx_dropped);
1298 
1299 		/*control and data path*/
1300 		data[i++] =
1301 			CVM_CAST64(oct_dev->droq[j]->stats.pkts_received);
1302 		data[i++] =
1303 			CVM_CAST64(oct_dev->droq[j]->stats.bytes_received);
1304 		data[i++] =
1305 			CVM_CAST64(oct_dev->droq[j]->stats.dropped_nodispatch);
1306 
1307 		data[i++] =
1308 			CVM_CAST64(oct_dev->droq[j]->stats.rx_vxlan);
1309 		data[i++] =
1310 			CVM_CAST64(oct_dev->droq[j]->stats.rx_alloc_failure);
1311 	}
1312 }
1313 
1314 static void lio_vf_get_ethtool_stats(struct net_device *netdev,
1315 				     struct ethtool_stats *stats
1316 				     __attribute__((unused)),
1317 				     u64 *data)
1318 {
1319 	struct net_device_stats *netstats = &netdev->stats;
1320 	struct lio *lio = GET_LIO(netdev);
1321 	struct octeon_device *oct_dev = lio->oct_dev;
1322 	int i = 0, j, vj;
1323 
1324 	if (ifstate_check(lio, LIO_IFSTATE_RESETTING))
1325 		return;
1326 
1327 	netdev->netdev_ops->ndo_get_stats(netdev);
1328 	/* sum of oct->droq[oq_no]->stats->rx_pkts_received */
1329 	data[i++] = CVM_CAST64(netstats->rx_packets);
1330 	/* sum of oct->instr_queue[iq_no]->stats.tx_done */
1331 	data[i++] = CVM_CAST64(netstats->tx_packets);
1332 	/* sum of oct->droq[oq_no]->stats->rx_bytes_received */
1333 	data[i++] = CVM_CAST64(netstats->rx_bytes);
1334 	/* sum of oct->instr_queue[iq_no]->stats.tx_tot_bytes */
1335 	data[i++] = CVM_CAST64(netstats->tx_bytes);
1336 	data[i++] = CVM_CAST64(netstats->rx_errors);
1337 	data[i++] = CVM_CAST64(netstats->tx_errors);
1338 	 /* sum of oct->droq[oq_no]->stats->rx_dropped +
1339 	  * oct->droq[oq_no]->stats->dropped_nodispatch +
1340 	  * oct->droq[oq_no]->stats->dropped_toomany +
1341 	  * oct->droq[oq_no]->stats->dropped_nomem
1342 	  */
1343 	data[i++] = CVM_CAST64(netstats->rx_dropped);
1344 	/* sum of oct->instr_queue[iq_no]->stats.tx_dropped */
1345 	data[i++] = CVM_CAST64(netstats->tx_dropped);
1346 	/* lio->link_changes */
1347 	data[i++] = CVM_CAST64(lio->link_changes);
1348 
1349 	for (vj = 0; vj < oct_dev->num_iqs; vj++) {
1350 		j = lio->linfo.txpciq[vj].s.q_no;
1351 
1352 		/* packets to network port */
1353 		/* # of packets tx to network */
1354 		data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_done);
1355 		 /* # of bytes tx to network */
1356 		data[i++] = CVM_CAST64(
1357 				oct_dev->instr_queue[j]->stats.tx_tot_bytes);
1358 		/* # of packets dropped */
1359 		data[i++] = CVM_CAST64(
1360 				oct_dev->instr_queue[j]->stats.tx_dropped);
1361 		/* # of tx fails due to queue full */
1362 		data[i++] = CVM_CAST64(
1363 				oct_dev->instr_queue[j]->stats.tx_iq_busy);
1364 		/* XXX gather entries sent */
1365 		data[i++] = CVM_CAST64(
1366 				oct_dev->instr_queue[j]->stats.sgentry_sent);
1367 
1368 		/* instruction to firmware: data and control */
1369 		/* # of instructions to the queue */
1370 		data[i++] = CVM_CAST64(
1371 				oct_dev->instr_queue[j]->stats.instr_posted);
1372 		/* # of instructions processed */
1373 		data[i++] =
1374 		    CVM_CAST64(oct_dev->instr_queue[j]->stats.instr_processed);
1375 		/* # of instructions could not be processed */
1376 		data[i++] =
1377 		    CVM_CAST64(oct_dev->instr_queue[j]->stats.instr_dropped);
1378 		/* bytes sent through the queue */
1379 		data[i++] = CVM_CAST64(
1380 				oct_dev->instr_queue[j]->stats.bytes_sent);
1381 		/* tso request */
1382 		data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_gso);
1383 		/* vxlan request */
1384 		data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_vxlan);
1385 		/* txq restart */
1386 		data[i++] = CVM_CAST64(
1387 				oct_dev->instr_queue[j]->stats.tx_restart);
1388 	}
1389 
1390 	/* RX */
1391 	for (vj = 0; vj < oct_dev->num_oqs; vj++) {
1392 		j = lio->linfo.rxpciq[vj].s.q_no;
1393 
1394 		/* packets send to TCP/IP network stack */
1395 		/* # of packets to network stack */
1396 		data[i++] = CVM_CAST64(
1397 				oct_dev->droq[j]->stats.rx_pkts_received);
1398 		/* # of bytes to network stack */
1399 		data[i++] = CVM_CAST64(
1400 				oct_dev->droq[j]->stats.rx_bytes_received);
1401 		data[i++] = CVM_CAST64(oct_dev->droq[j]->stats.dropped_nomem +
1402 				       oct_dev->droq[j]->stats.dropped_toomany +
1403 				       oct_dev->droq[j]->stats.rx_dropped);
1404 		data[i++] = CVM_CAST64(oct_dev->droq[j]->stats.dropped_nomem);
1405 		data[i++] = CVM_CAST64(oct_dev->droq[j]->stats.dropped_toomany);
1406 		data[i++] = CVM_CAST64(oct_dev->droq[j]->stats.rx_dropped);
1407 
1408 		/* control and data path */
1409 		data[i++] = CVM_CAST64(oct_dev->droq[j]->stats.pkts_received);
1410 		data[i++] = CVM_CAST64(oct_dev->droq[j]->stats.bytes_received);
1411 		data[i++] =
1412 			CVM_CAST64(oct_dev->droq[j]->stats.dropped_nodispatch);
1413 
1414 		data[i++] = CVM_CAST64(oct_dev->droq[j]->stats.rx_vxlan);
1415 		data[i++] =
1416 		    CVM_CAST64(oct_dev->droq[j]->stats.rx_alloc_failure);
1417 	}
1418 }
1419 
1420 static void lio_get_priv_flags_strings(struct lio *lio, u8 *data)
1421 {
1422 	struct octeon_device *oct_dev = lio->oct_dev;
1423 	int i;
1424 
1425 	switch (oct_dev->chip_id) {
1426 	case OCTEON_CN23XX_PF_VID:
1427 	case OCTEON_CN23XX_VF_VID:
1428 		for (i = 0; i < ARRAY_SIZE(oct_priv_flags_strings); i++) {
1429 			sprintf(data, "%s", oct_priv_flags_strings[i]);
1430 			data += ETH_GSTRING_LEN;
1431 		}
1432 		break;
1433 	case OCTEON_CN68XX:
1434 	case OCTEON_CN66XX:
1435 		break;
1436 	default:
1437 		netif_info(lio, drv, lio->netdev, "Unknown Chip !!\n");
1438 		break;
1439 	}
1440 }
1441 
1442 static void lio_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
1443 {
1444 	struct lio *lio = GET_LIO(netdev);
1445 	struct octeon_device *oct_dev = lio->oct_dev;
1446 	int num_iq_stats, num_oq_stats, i, j;
1447 	int num_stats;
1448 
1449 	switch (stringset) {
1450 	case ETH_SS_STATS:
1451 		num_stats = ARRAY_SIZE(oct_stats_strings);
1452 		for (j = 0; j < num_stats; j++) {
1453 			sprintf(data, "%s", oct_stats_strings[j]);
1454 			data += ETH_GSTRING_LEN;
1455 		}
1456 
1457 		num_iq_stats = ARRAY_SIZE(oct_iq_stats_strings);
1458 		for (i = 0; i < MAX_OCTEON_INSTR_QUEUES(oct_dev); i++) {
1459 			if (!(oct_dev->io_qmask.iq & BIT_ULL(i)))
1460 				continue;
1461 			for (j = 0; j < num_iq_stats; j++) {
1462 				sprintf(data, "tx-%d-%s", i,
1463 					oct_iq_stats_strings[j]);
1464 				data += ETH_GSTRING_LEN;
1465 			}
1466 		}
1467 
1468 		num_oq_stats = ARRAY_SIZE(oct_droq_stats_strings);
1469 		for (i = 0; i < MAX_OCTEON_OUTPUT_QUEUES(oct_dev); i++) {
1470 			if (!(oct_dev->io_qmask.oq & BIT_ULL(i)))
1471 				continue;
1472 			for (j = 0; j < num_oq_stats; j++) {
1473 				sprintf(data, "rx-%d-%s", i,
1474 					oct_droq_stats_strings[j]);
1475 				data += ETH_GSTRING_LEN;
1476 			}
1477 		}
1478 		break;
1479 
1480 	case ETH_SS_PRIV_FLAGS:
1481 		lio_get_priv_flags_strings(lio, data);
1482 		break;
1483 	default:
1484 		netif_info(lio, drv, lio->netdev, "Unknown Stringset !!\n");
1485 		break;
1486 	}
1487 }
1488 
1489 static void lio_vf_get_strings(struct net_device *netdev, u32 stringset,
1490 			       u8 *data)
1491 {
1492 	int num_iq_stats, num_oq_stats, i, j;
1493 	struct lio *lio = GET_LIO(netdev);
1494 	struct octeon_device *oct_dev = lio->oct_dev;
1495 	int num_stats;
1496 
1497 	switch (stringset) {
1498 	case ETH_SS_STATS:
1499 		num_stats = ARRAY_SIZE(oct_vf_stats_strings);
1500 		for (j = 0; j < num_stats; j++) {
1501 			sprintf(data, "%s", oct_vf_stats_strings[j]);
1502 			data += ETH_GSTRING_LEN;
1503 		}
1504 
1505 		num_iq_stats = ARRAY_SIZE(oct_iq_stats_strings);
1506 		for (i = 0; i < MAX_OCTEON_INSTR_QUEUES(oct_dev); i++) {
1507 			if (!(oct_dev->io_qmask.iq & BIT_ULL(i)))
1508 				continue;
1509 			for (j = 0; j < num_iq_stats; j++) {
1510 				sprintf(data, "tx-%d-%s", i,
1511 					oct_iq_stats_strings[j]);
1512 				data += ETH_GSTRING_LEN;
1513 			}
1514 		}
1515 
1516 		num_oq_stats = ARRAY_SIZE(oct_droq_stats_strings);
1517 		for (i = 0; i < MAX_OCTEON_OUTPUT_QUEUES(oct_dev); i++) {
1518 			if (!(oct_dev->io_qmask.oq & BIT_ULL(i)))
1519 				continue;
1520 			for (j = 0; j < num_oq_stats; j++) {
1521 				sprintf(data, "rx-%d-%s", i,
1522 					oct_droq_stats_strings[j]);
1523 				data += ETH_GSTRING_LEN;
1524 			}
1525 		}
1526 		break;
1527 
1528 	case ETH_SS_PRIV_FLAGS:
1529 		lio_get_priv_flags_strings(lio, data);
1530 		break;
1531 	default:
1532 		netif_info(lio, drv, lio->netdev, "Unknown Stringset !!\n");
1533 		break;
1534 	}
1535 }
1536 
1537 static int lio_get_priv_flags_ss_count(struct lio *lio)
1538 {
1539 	struct octeon_device *oct_dev = lio->oct_dev;
1540 
1541 	switch (oct_dev->chip_id) {
1542 	case OCTEON_CN23XX_PF_VID:
1543 	case OCTEON_CN23XX_VF_VID:
1544 		return ARRAY_SIZE(oct_priv_flags_strings);
1545 	case OCTEON_CN68XX:
1546 	case OCTEON_CN66XX:
1547 		return -EOPNOTSUPP;
1548 	default:
1549 		netif_info(lio, drv, lio->netdev, "Unknown Chip !!\n");
1550 		return -EOPNOTSUPP;
1551 	}
1552 }
1553 
1554 static int lio_get_sset_count(struct net_device *netdev, int sset)
1555 {
1556 	struct lio *lio = GET_LIO(netdev);
1557 	struct octeon_device *oct_dev = lio->oct_dev;
1558 
1559 	switch (sset) {
1560 	case ETH_SS_STATS:
1561 		return (ARRAY_SIZE(oct_stats_strings) +
1562 			ARRAY_SIZE(oct_iq_stats_strings) * oct_dev->num_iqs +
1563 			ARRAY_SIZE(oct_droq_stats_strings) * oct_dev->num_oqs);
1564 	case ETH_SS_PRIV_FLAGS:
1565 		return lio_get_priv_flags_ss_count(lio);
1566 	default:
1567 		return -EOPNOTSUPP;
1568 	}
1569 }
1570 
1571 static int lio_vf_get_sset_count(struct net_device *netdev, int sset)
1572 {
1573 	struct lio *lio = GET_LIO(netdev);
1574 	struct octeon_device *oct_dev = lio->oct_dev;
1575 
1576 	switch (sset) {
1577 	case ETH_SS_STATS:
1578 		return (ARRAY_SIZE(oct_vf_stats_strings) +
1579 			ARRAY_SIZE(oct_iq_stats_strings) * oct_dev->num_iqs +
1580 			ARRAY_SIZE(oct_droq_stats_strings) * oct_dev->num_oqs);
1581 	case ETH_SS_PRIV_FLAGS:
1582 		return lio_get_priv_flags_ss_count(lio);
1583 	default:
1584 		return -EOPNOTSUPP;
1585 	}
1586 }
1587 
1588 /* Callback function for intrmod */
1589 static void octnet_intrmod_callback(struct octeon_device *oct_dev,
1590 				    u32 status,
1591 				    void *ptr)
1592 {
1593 	struct octeon_soft_command *sc = (struct octeon_soft_command *)ptr;
1594 	struct oct_intrmod_context *ctx;
1595 
1596 	ctx  = (struct oct_intrmod_context *)sc->ctxptr;
1597 
1598 	ctx->status = status;
1599 
1600 	WRITE_ONCE(ctx->cond, 1);
1601 
1602 	/* This barrier is required to be sure that the response has been
1603 	 * written fully before waking up the handler
1604 	 */
1605 	wmb();
1606 
1607 	wake_up_interruptible(&ctx->wc);
1608 }
1609 
1610 /*  get interrupt moderation parameters */
1611 static int octnet_get_intrmod_cfg(struct lio *lio,
1612 				  struct oct_intrmod_cfg *intr_cfg)
1613 {
1614 	struct octeon_soft_command *sc;
1615 	struct oct_intrmod_context *ctx;
1616 	struct oct_intrmod_resp *resp;
1617 	int retval;
1618 	struct octeon_device *oct_dev = lio->oct_dev;
1619 
1620 	/* Alloc soft command */
1621 	sc = (struct octeon_soft_command *)
1622 		octeon_alloc_soft_command(oct_dev,
1623 					  0,
1624 					  sizeof(struct oct_intrmod_resp),
1625 					  sizeof(struct oct_intrmod_context));
1626 
1627 	if (!sc)
1628 		return -ENOMEM;
1629 
1630 	resp = (struct oct_intrmod_resp *)sc->virtrptr;
1631 	memset(resp, 0, sizeof(struct oct_intrmod_resp));
1632 
1633 	ctx = (struct oct_intrmod_context *)sc->ctxptr;
1634 	memset(ctx, 0, sizeof(struct oct_intrmod_context));
1635 	WRITE_ONCE(ctx->cond, 0);
1636 	ctx->octeon_id = lio_get_device_id(oct_dev);
1637 	init_waitqueue_head(&ctx->wc);
1638 
1639 	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
1640 
1641 	octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC,
1642 				    OPCODE_NIC_INTRMOD_PARAMS, 0, 0, 0);
1643 
1644 	sc->callback = octnet_intrmod_callback;
1645 	sc->callback_arg = sc;
1646 	sc->wait_time = 1000;
1647 
1648 	retval = octeon_send_soft_command(oct_dev, sc);
1649 	if (retval == IQ_SEND_FAILED) {
1650 		octeon_free_soft_command(oct_dev, sc);
1651 		return -EINVAL;
1652 	}
1653 
1654 	/* Sleep on a wait queue till the cond flag indicates that the
1655 	 * response arrived or timed-out.
1656 	 */
1657 	if (sleep_cond(&ctx->wc, &ctx->cond) == -EINTR) {
1658 		dev_err(&oct_dev->pci_dev->dev, "Wait interrupted\n");
1659 		goto intrmod_info_wait_intr;
1660 	}
1661 
1662 	retval = ctx->status || resp->status;
1663 	if (retval) {
1664 		dev_err(&oct_dev->pci_dev->dev,
1665 			"Get interrupt moderation parameters failed\n");
1666 		goto intrmod_info_wait_fail;
1667 	}
1668 
1669 	octeon_swap_8B_data((u64 *)&resp->intrmod,
1670 			    (sizeof(struct oct_intrmod_cfg)) / 8);
1671 	memcpy(intr_cfg, &resp->intrmod, sizeof(struct oct_intrmod_cfg));
1672 	octeon_free_soft_command(oct_dev, sc);
1673 
1674 	return 0;
1675 
1676 intrmod_info_wait_fail:
1677 
1678 	octeon_free_soft_command(oct_dev, sc);
1679 
1680 intrmod_info_wait_intr:
1681 
1682 	return -ENODEV;
1683 }
1684 
1685 /*  Configure interrupt moderation parameters */
1686 static int octnet_set_intrmod_cfg(struct lio *lio,
1687 				  struct oct_intrmod_cfg *intr_cfg)
1688 {
1689 	struct octeon_soft_command *sc;
1690 	struct oct_intrmod_context *ctx;
1691 	struct oct_intrmod_cfg *cfg;
1692 	int retval;
1693 	struct octeon_device *oct_dev = lio->oct_dev;
1694 
1695 	/* Alloc soft command */
1696 	sc = (struct octeon_soft_command *)
1697 		octeon_alloc_soft_command(oct_dev,
1698 					  sizeof(struct oct_intrmod_cfg),
1699 					  0,
1700 					  sizeof(struct oct_intrmod_context));
1701 
1702 	if (!sc)
1703 		return -ENOMEM;
1704 
1705 	ctx = (struct oct_intrmod_context *)sc->ctxptr;
1706 
1707 	WRITE_ONCE(ctx->cond, 0);
1708 	ctx->octeon_id = lio_get_device_id(oct_dev);
1709 	init_waitqueue_head(&ctx->wc);
1710 
1711 	cfg = (struct oct_intrmod_cfg *)sc->virtdptr;
1712 
1713 	memcpy(cfg, intr_cfg, sizeof(struct oct_intrmod_cfg));
1714 	octeon_swap_8B_data((u64 *)cfg, (sizeof(struct oct_intrmod_cfg)) / 8);
1715 
1716 	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
1717 
1718 	octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC,
1719 				    OPCODE_NIC_INTRMOD_CFG, 0, 0, 0);
1720 
1721 	sc->callback = octnet_intrmod_callback;
1722 	sc->callback_arg = sc;
1723 	sc->wait_time = 1000;
1724 
1725 	retval = octeon_send_soft_command(oct_dev, sc);
1726 	if (retval == IQ_SEND_FAILED) {
1727 		octeon_free_soft_command(oct_dev, sc);
1728 		return -EINVAL;
1729 	}
1730 
1731 	/* Sleep on a wait queue till the cond flag indicates that the
1732 	 * response arrived or timed-out.
1733 	 */
1734 	if (sleep_cond(&ctx->wc, &ctx->cond) != -EINTR) {
1735 		retval = ctx->status;
1736 		if (retval)
1737 			dev_err(&oct_dev->pci_dev->dev,
1738 				"intrmod config failed. Status: %llx\n",
1739 				CVM_CAST64(retval));
1740 		else
1741 			dev_info(&oct_dev->pci_dev->dev,
1742 				 "Rx-Adaptive Interrupt moderation %s\n",
1743 				 (intr_cfg->rx_enable) ?
1744 				 "enabled" : "disabled");
1745 
1746 		octeon_free_soft_command(oct_dev, sc);
1747 
1748 		return ((retval) ? -ENODEV : 0);
1749 	}
1750 
1751 	dev_err(&oct_dev->pci_dev->dev, "iq/oq config failed\n");
1752 
1753 	return -EINTR;
1754 }
1755 
1756 static void
1757 octnet_nic_stats_callback(struct octeon_device *oct_dev,
1758 			  u32 status, void *ptr)
1759 {
1760 	struct octeon_soft_command *sc = (struct octeon_soft_command *)ptr;
1761 	struct oct_nic_stats_resp *resp =
1762 	    (struct oct_nic_stats_resp *)sc->virtrptr;
1763 	struct oct_nic_stats_ctrl *ctrl =
1764 	    (struct oct_nic_stats_ctrl *)sc->ctxptr;
1765 	struct nic_rx_stats *rsp_rstats = &resp->stats.fromwire;
1766 	struct nic_tx_stats *rsp_tstats = &resp->stats.fromhost;
1767 
1768 	struct nic_rx_stats *rstats = &oct_dev->link_stats.fromwire;
1769 	struct nic_tx_stats *tstats = &oct_dev->link_stats.fromhost;
1770 
1771 	if ((status != OCTEON_REQUEST_TIMEOUT) && !resp->status) {
1772 		octeon_swap_8B_data((u64 *)&resp->stats,
1773 				    (sizeof(struct oct_link_stats)) >> 3);
1774 
1775 		/* RX link-level stats */
1776 		rstats->total_rcvd = rsp_rstats->total_rcvd;
1777 		rstats->bytes_rcvd = rsp_rstats->bytes_rcvd;
1778 		rstats->total_bcst = rsp_rstats->total_bcst;
1779 		rstats->total_mcst = rsp_rstats->total_mcst;
1780 		rstats->runts      = rsp_rstats->runts;
1781 		rstats->ctl_rcvd   = rsp_rstats->ctl_rcvd;
1782 		/* Accounts for over/under-run of buffers */
1783 		rstats->fifo_err  = rsp_rstats->fifo_err;
1784 		rstats->dmac_drop = rsp_rstats->dmac_drop;
1785 		rstats->fcs_err   = rsp_rstats->fcs_err;
1786 		rstats->jabber_err = rsp_rstats->jabber_err;
1787 		rstats->l2_err    = rsp_rstats->l2_err;
1788 		rstats->frame_err = rsp_rstats->frame_err;
1789 
1790 		/* RX firmware stats */
1791 		rstats->fw_total_rcvd = rsp_rstats->fw_total_rcvd;
1792 		rstats->fw_total_fwd = rsp_rstats->fw_total_fwd;
1793 		rstats->fw_err_pko = rsp_rstats->fw_err_pko;
1794 		rstats->fw_err_link = rsp_rstats->fw_err_link;
1795 		rstats->fw_err_drop = rsp_rstats->fw_err_drop;
1796 		rstats->fw_rx_vxlan = rsp_rstats->fw_rx_vxlan;
1797 		rstats->fw_rx_vxlan_err = rsp_rstats->fw_rx_vxlan_err;
1798 
1799 		/* Number of packets that are LROed      */
1800 		rstats->fw_lro_pkts = rsp_rstats->fw_lro_pkts;
1801 		/* Number of octets that are LROed       */
1802 		rstats->fw_lro_octs = rsp_rstats->fw_lro_octs;
1803 		/* Number of LRO packets formed          */
1804 		rstats->fw_total_lro = rsp_rstats->fw_total_lro;
1805 		/* Number of times lRO of packet aborted */
1806 		rstats->fw_lro_aborts = rsp_rstats->fw_lro_aborts;
1807 		rstats->fw_lro_aborts_port = rsp_rstats->fw_lro_aborts_port;
1808 		rstats->fw_lro_aborts_seq = rsp_rstats->fw_lro_aborts_seq;
1809 		rstats->fw_lro_aborts_tsval = rsp_rstats->fw_lro_aborts_tsval;
1810 		rstats->fw_lro_aborts_timer = rsp_rstats->fw_lro_aborts_timer;
1811 		/* intrmod: packet forward rate */
1812 		rstats->fwd_rate = rsp_rstats->fwd_rate;
1813 
1814 		/* TX link-level stats */
1815 		tstats->total_pkts_sent = rsp_tstats->total_pkts_sent;
1816 		tstats->total_bytes_sent = rsp_tstats->total_bytes_sent;
1817 		tstats->mcast_pkts_sent = rsp_tstats->mcast_pkts_sent;
1818 		tstats->bcast_pkts_sent = rsp_tstats->bcast_pkts_sent;
1819 		tstats->ctl_sent = rsp_tstats->ctl_sent;
1820 		/* Packets sent after one collision*/
1821 		tstats->one_collision_sent = rsp_tstats->one_collision_sent;
1822 		/* Packets sent after multiple collision*/
1823 		tstats->multi_collision_sent = rsp_tstats->multi_collision_sent;
1824 		/* Packets not sent due to max collisions */
1825 		tstats->max_collision_fail = rsp_tstats->max_collision_fail;
1826 		/* Packets not sent due to max deferrals */
1827 		tstats->max_deferral_fail = rsp_tstats->max_deferral_fail;
1828 		/* Accounts for over/under-run of buffers */
1829 		tstats->fifo_err = rsp_tstats->fifo_err;
1830 		tstats->runts = rsp_tstats->runts;
1831 		/* Total number of collisions detected */
1832 		tstats->total_collisions = rsp_tstats->total_collisions;
1833 
1834 		/* firmware stats */
1835 		tstats->fw_total_sent = rsp_tstats->fw_total_sent;
1836 		tstats->fw_total_fwd = rsp_tstats->fw_total_fwd;
1837 		tstats->fw_err_pko = rsp_tstats->fw_err_pko;
1838 		tstats->fw_err_pki = rsp_tstats->fw_err_pki;
1839 		tstats->fw_err_link = rsp_tstats->fw_err_link;
1840 		tstats->fw_err_drop = rsp_tstats->fw_err_drop;
1841 		tstats->fw_tso = rsp_tstats->fw_tso;
1842 		tstats->fw_tso_fwd = rsp_tstats->fw_tso_fwd;
1843 		tstats->fw_err_tso = rsp_tstats->fw_err_tso;
1844 		tstats->fw_tx_vxlan = rsp_tstats->fw_tx_vxlan;
1845 
1846 		resp->status = 1;
1847 	} else {
1848 		resp->status = -1;
1849 	}
1850 	complete(&ctrl->complete);
1851 }
1852 
1853 /*  Configure interrupt moderation parameters */
1854 static int octnet_get_link_stats(struct net_device *netdev)
1855 {
1856 	struct lio *lio = GET_LIO(netdev);
1857 	struct octeon_device *oct_dev = lio->oct_dev;
1858 
1859 	struct octeon_soft_command *sc;
1860 	struct oct_nic_stats_ctrl *ctrl;
1861 	struct oct_nic_stats_resp *resp;
1862 
1863 	int retval;
1864 
1865 	/* Alloc soft command */
1866 	sc = (struct octeon_soft_command *)
1867 		octeon_alloc_soft_command(oct_dev,
1868 					  0,
1869 					  sizeof(struct oct_nic_stats_resp),
1870 					  sizeof(struct octnic_ctrl_pkt));
1871 
1872 	if (!sc)
1873 		return -ENOMEM;
1874 
1875 	resp = (struct oct_nic_stats_resp *)sc->virtrptr;
1876 	memset(resp, 0, sizeof(struct oct_nic_stats_resp));
1877 
1878 	ctrl = (struct oct_nic_stats_ctrl *)sc->ctxptr;
1879 	memset(ctrl, 0, sizeof(struct oct_nic_stats_ctrl));
1880 	ctrl->netdev = netdev;
1881 	init_completion(&ctrl->complete);
1882 
1883 	sc->iq_no = lio->linfo.txpciq[0].s.q_no;
1884 
1885 	octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC,
1886 				    OPCODE_NIC_PORT_STATS, 0, 0, 0);
1887 
1888 	sc->callback = octnet_nic_stats_callback;
1889 	sc->callback_arg = sc;
1890 	sc->wait_time = 500;	/*in milli seconds*/
1891 
1892 	retval = octeon_send_soft_command(oct_dev, sc);
1893 	if (retval == IQ_SEND_FAILED) {
1894 		octeon_free_soft_command(oct_dev, sc);
1895 		return -EINVAL;
1896 	}
1897 
1898 	wait_for_completion_timeout(&ctrl->complete, msecs_to_jiffies(1000));
1899 
1900 	if (resp->status != 1) {
1901 		octeon_free_soft_command(oct_dev, sc);
1902 
1903 		return -EINVAL;
1904 	}
1905 
1906 	octeon_free_soft_command(oct_dev, sc);
1907 
1908 	return 0;
1909 }
1910 
1911 static int lio_get_intr_coalesce(struct net_device *netdev,
1912 				 struct ethtool_coalesce *intr_coal)
1913 {
1914 	struct lio *lio = GET_LIO(netdev);
1915 	struct octeon_device *oct = lio->oct_dev;
1916 	struct octeon_instr_queue *iq;
1917 	struct oct_intrmod_cfg intrmod_cfg;
1918 
1919 	if (octnet_get_intrmod_cfg(lio, &intrmod_cfg))
1920 		return -ENODEV;
1921 
1922 	switch (oct->chip_id) {
1923 	case OCTEON_CN23XX_PF_VID:
1924 	case OCTEON_CN23XX_VF_VID: {
1925 		if (!intrmod_cfg.rx_enable) {
1926 			intr_coal->rx_coalesce_usecs = oct->rx_coalesce_usecs;
1927 			intr_coal->rx_max_coalesced_frames =
1928 				oct->rx_max_coalesced_frames;
1929 		}
1930 		if (!intrmod_cfg.tx_enable)
1931 			intr_coal->tx_max_coalesced_frames =
1932 				oct->tx_max_coalesced_frames;
1933 		break;
1934 	}
1935 	case OCTEON_CN68XX:
1936 	case OCTEON_CN66XX: {
1937 		struct octeon_cn6xxx *cn6xxx =
1938 			(struct octeon_cn6xxx *)oct->chip;
1939 
1940 		if (!intrmod_cfg.rx_enable) {
1941 			intr_coal->rx_coalesce_usecs =
1942 				CFG_GET_OQ_INTR_TIME(cn6xxx->conf);
1943 			intr_coal->rx_max_coalesced_frames =
1944 				CFG_GET_OQ_INTR_PKT(cn6xxx->conf);
1945 		}
1946 		iq = oct->instr_queue[lio->linfo.txpciq[0].s.q_no];
1947 		intr_coal->tx_max_coalesced_frames = iq->fill_threshold;
1948 		break;
1949 	}
1950 	default:
1951 		netif_info(lio, drv, lio->netdev, "Unknown Chip !!\n");
1952 		return -EINVAL;
1953 	}
1954 	if (intrmod_cfg.rx_enable) {
1955 		intr_coal->use_adaptive_rx_coalesce =
1956 			intrmod_cfg.rx_enable;
1957 		intr_coal->rate_sample_interval =
1958 			intrmod_cfg.check_intrvl;
1959 		intr_coal->pkt_rate_high =
1960 			intrmod_cfg.maxpkt_ratethr;
1961 		intr_coal->pkt_rate_low =
1962 			intrmod_cfg.minpkt_ratethr;
1963 		intr_coal->rx_max_coalesced_frames_high =
1964 			intrmod_cfg.rx_maxcnt_trigger;
1965 		intr_coal->rx_coalesce_usecs_high =
1966 			intrmod_cfg.rx_maxtmr_trigger;
1967 		intr_coal->rx_coalesce_usecs_low =
1968 			intrmod_cfg.rx_mintmr_trigger;
1969 		intr_coal->rx_max_coalesced_frames_low =
1970 			intrmod_cfg.rx_mincnt_trigger;
1971 	}
1972 	if ((OCTEON_CN23XX_PF(oct) || OCTEON_CN23XX_VF(oct)) &&
1973 	    (intrmod_cfg.tx_enable)) {
1974 		intr_coal->use_adaptive_tx_coalesce =
1975 			intrmod_cfg.tx_enable;
1976 		intr_coal->tx_max_coalesced_frames_high =
1977 			intrmod_cfg.tx_maxcnt_trigger;
1978 		intr_coal->tx_max_coalesced_frames_low =
1979 			intrmod_cfg.tx_mincnt_trigger;
1980 	}
1981 	return 0;
1982 }
1983 
1984 /* Enable/Disable auto interrupt Moderation */
1985 static int oct_cfg_adaptive_intr(struct lio *lio,
1986 				 struct oct_intrmod_cfg *intrmod_cfg,
1987 				 struct ethtool_coalesce *intr_coal)
1988 {
1989 	int ret = 0;
1990 
1991 	if (intrmod_cfg->rx_enable || intrmod_cfg->tx_enable) {
1992 		intrmod_cfg->check_intrvl = intr_coal->rate_sample_interval;
1993 		intrmod_cfg->maxpkt_ratethr = intr_coal->pkt_rate_high;
1994 		intrmod_cfg->minpkt_ratethr = intr_coal->pkt_rate_low;
1995 	}
1996 	if (intrmod_cfg->rx_enable) {
1997 		intrmod_cfg->rx_maxcnt_trigger =
1998 			intr_coal->rx_max_coalesced_frames_high;
1999 		intrmod_cfg->rx_maxtmr_trigger =
2000 			intr_coal->rx_coalesce_usecs_high;
2001 		intrmod_cfg->rx_mintmr_trigger =
2002 			intr_coal->rx_coalesce_usecs_low;
2003 		intrmod_cfg->rx_mincnt_trigger =
2004 			intr_coal->rx_max_coalesced_frames_low;
2005 	}
2006 	if (intrmod_cfg->tx_enable) {
2007 		intrmod_cfg->tx_maxcnt_trigger =
2008 			intr_coal->tx_max_coalesced_frames_high;
2009 		intrmod_cfg->tx_mincnt_trigger =
2010 			intr_coal->tx_max_coalesced_frames_low;
2011 	}
2012 
2013 	ret = octnet_set_intrmod_cfg(lio, intrmod_cfg);
2014 
2015 	return ret;
2016 }
2017 
2018 static int
2019 oct_cfg_rx_intrcnt(struct lio *lio,
2020 		   struct oct_intrmod_cfg *intrmod,
2021 		   struct ethtool_coalesce *intr_coal)
2022 {
2023 	struct octeon_device *oct = lio->oct_dev;
2024 	u32 rx_max_coalesced_frames;
2025 
2026 	/* Config Cnt based interrupt values */
2027 	switch (oct->chip_id) {
2028 	case OCTEON_CN68XX:
2029 	case OCTEON_CN66XX: {
2030 		struct octeon_cn6xxx *cn6xxx =
2031 			(struct octeon_cn6xxx *)oct->chip;
2032 
2033 		if (!intr_coal->rx_max_coalesced_frames)
2034 			rx_max_coalesced_frames = CN6XXX_OQ_INTR_PKT;
2035 		else
2036 			rx_max_coalesced_frames =
2037 				intr_coal->rx_max_coalesced_frames;
2038 		octeon_write_csr(oct, CN6XXX_SLI_OQ_INT_LEVEL_PKTS,
2039 				 rx_max_coalesced_frames);
2040 		CFG_SET_OQ_INTR_PKT(cn6xxx->conf, rx_max_coalesced_frames);
2041 		break;
2042 	}
2043 	case OCTEON_CN23XX_PF_VID: {
2044 		int q_no;
2045 
2046 		if (!intr_coal->rx_max_coalesced_frames)
2047 			rx_max_coalesced_frames = intrmod->rx_frames;
2048 		else
2049 			rx_max_coalesced_frames =
2050 			    intr_coal->rx_max_coalesced_frames;
2051 		for (q_no = 0; q_no < oct->num_oqs; q_no++) {
2052 			q_no += oct->sriov_info.pf_srn;
2053 			octeon_write_csr64(
2054 			    oct, CN23XX_SLI_OQ_PKT_INT_LEVELS(q_no),
2055 			    (octeon_read_csr64(
2056 				 oct, CN23XX_SLI_OQ_PKT_INT_LEVELS(q_no)) &
2057 			     (0x3fffff00000000UL)) |
2058 				(rx_max_coalesced_frames - 1));
2059 			/*consider setting resend bit*/
2060 		}
2061 		intrmod->rx_frames = rx_max_coalesced_frames;
2062 		oct->rx_max_coalesced_frames = rx_max_coalesced_frames;
2063 		break;
2064 	}
2065 	case OCTEON_CN23XX_VF_VID: {
2066 		int q_no;
2067 
2068 		if (!intr_coal->rx_max_coalesced_frames)
2069 			rx_max_coalesced_frames = intrmod->rx_frames;
2070 		else
2071 			rx_max_coalesced_frames =
2072 			    intr_coal->rx_max_coalesced_frames;
2073 		for (q_no = 0; q_no < oct->num_oqs; q_no++) {
2074 			octeon_write_csr64(
2075 			    oct, CN23XX_VF_SLI_OQ_PKT_INT_LEVELS(q_no),
2076 			    (octeon_read_csr64(
2077 				 oct, CN23XX_VF_SLI_OQ_PKT_INT_LEVELS(q_no)) &
2078 			     (0x3fffff00000000UL)) |
2079 				(rx_max_coalesced_frames - 1));
2080 			/*consider writing to resend bit here*/
2081 		}
2082 		intrmod->rx_frames = rx_max_coalesced_frames;
2083 		oct->rx_max_coalesced_frames = rx_max_coalesced_frames;
2084 		break;
2085 	}
2086 	default:
2087 		return -EINVAL;
2088 	}
2089 	return 0;
2090 }
2091 
2092 static int oct_cfg_rx_intrtime(struct lio *lio,
2093 			       struct oct_intrmod_cfg *intrmod,
2094 			       struct ethtool_coalesce *intr_coal)
2095 {
2096 	struct octeon_device *oct = lio->oct_dev;
2097 	u32 time_threshold, rx_coalesce_usecs;
2098 
2099 	/* Config Time based interrupt values */
2100 	switch (oct->chip_id) {
2101 	case OCTEON_CN68XX:
2102 	case OCTEON_CN66XX: {
2103 		struct octeon_cn6xxx *cn6xxx =
2104 			(struct octeon_cn6xxx *)oct->chip;
2105 		if (!intr_coal->rx_coalesce_usecs)
2106 			rx_coalesce_usecs = CN6XXX_OQ_INTR_TIME;
2107 		else
2108 			rx_coalesce_usecs = intr_coal->rx_coalesce_usecs;
2109 
2110 		time_threshold = lio_cn6xxx_get_oq_ticks(oct,
2111 							 rx_coalesce_usecs);
2112 		octeon_write_csr(oct,
2113 				 CN6XXX_SLI_OQ_INT_LEVEL_TIME,
2114 				 time_threshold);
2115 
2116 		CFG_SET_OQ_INTR_TIME(cn6xxx->conf, rx_coalesce_usecs);
2117 		break;
2118 	}
2119 	case OCTEON_CN23XX_PF_VID: {
2120 		u64 time_threshold;
2121 		int q_no;
2122 
2123 		if (!intr_coal->rx_coalesce_usecs)
2124 			rx_coalesce_usecs = intrmod->rx_usecs;
2125 		else
2126 			rx_coalesce_usecs = intr_coal->rx_coalesce_usecs;
2127 		time_threshold =
2128 		    cn23xx_pf_get_oq_ticks(oct, (u32)rx_coalesce_usecs);
2129 		for (q_no = 0; q_no < oct->num_oqs; q_no++) {
2130 			q_no += oct->sriov_info.pf_srn;
2131 			octeon_write_csr64(oct,
2132 					   CN23XX_SLI_OQ_PKT_INT_LEVELS(q_no),
2133 					   (intrmod->rx_frames |
2134 					    ((u64)time_threshold << 32)));
2135 			/*consider writing to resend bit here*/
2136 		}
2137 		intrmod->rx_usecs = rx_coalesce_usecs;
2138 		oct->rx_coalesce_usecs = rx_coalesce_usecs;
2139 		break;
2140 	}
2141 	case OCTEON_CN23XX_VF_VID: {
2142 		u64 time_threshold;
2143 		int q_no;
2144 
2145 		if (!intr_coal->rx_coalesce_usecs)
2146 			rx_coalesce_usecs = intrmod->rx_usecs;
2147 		else
2148 			rx_coalesce_usecs = intr_coal->rx_coalesce_usecs;
2149 
2150 		time_threshold =
2151 		    cn23xx_vf_get_oq_ticks(oct, (u32)rx_coalesce_usecs);
2152 		for (q_no = 0; q_no < oct->num_oqs; q_no++) {
2153 			octeon_write_csr64(
2154 				oct, CN23XX_VF_SLI_OQ_PKT_INT_LEVELS(q_no),
2155 				(intrmod->rx_frames |
2156 				 ((u64)time_threshold << 32)));
2157 			/*consider setting resend bit*/
2158 		}
2159 		intrmod->rx_usecs = rx_coalesce_usecs;
2160 		oct->rx_coalesce_usecs = rx_coalesce_usecs;
2161 		break;
2162 	}
2163 	default:
2164 		return -EINVAL;
2165 	}
2166 
2167 	return 0;
2168 }
2169 
2170 static int
2171 oct_cfg_tx_intrcnt(struct lio *lio,
2172 		   struct oct_intrmod_cfg *intrmod,
2173 		   struct ethtool_coalesce *intr_coal)
2174 {
2175 	struct octeon_device *oct = lio->oct_dev;
2176 	u32 iq_intr_pkt;
2177 	void __iomem *inst_cnt_reg;
2178 	u64 val;
2179 
2180 	/* Config Cnt based interrupt values */
2181 	switch (oct->chip_id) {
2182 	case OCTEON_CN68XX:
2183 	case OCTEON_CN66XX:
2184 		break;
2185 	case OCTEON_CN23XX_VF_VID:
2186 	case OCTEON_CN23XX_PF_VID: {
2187 		int q_no;
2188 
2189 		if (!intr_coal->tx_max_coalesced_frames)
2190 			iq_intr_pkt = CN23XX_DEF_IQ_INTR_THRESHOLD &
2191 				      CN23XX_PKT_IN_DONE_WMARK_MASK;
2192 		else
2193 			iq_intr_pkt = intr_coal->tx_max_coalesced_frames &
2194 				      CN23XX_PKT_IN_DONE_WMARK_MASK;
2195 		for (q_no = 0; q_no < oct->num_iqs; q_no++) {
2196 			inst_cnt_reg = (oct->instr_queue[q_no])->inst_cnt_reg;
2197 			val = readq(inst_cnt_reg);
2198 			/*clear wmark and count.dont want to write count back*/
2199 			val = (val & 0xFFFF000000000000ULL) |
2200 			      ((u64)(iq_intr_pkt - 1)
2201 			       << CN23XX_PKT_IN_DONE_WMARK_BIT_POS);
2202 			writeq(val, inst_cnt_reg);
2203 			/*consider setting resend bit*/
2204 		}
2205 		intrmod->tx_frames = iq_intr_pkt;
2206 		oct->tx_max_coalesced_frames = iq_intr_pkt;
2207 		break;
2208 	}
2209 	default:
2210 		return -EINVAL;
2211 	}
2212 	return 0;
2213 }
2214 
2215 static int lio_set_intr_coalesce(struct net_device *netdev,
2216 				 struct ethtool_coalesce *intr_coal)
2217 {
2218 	struct lio *lio = GET_LIO(netdev);
2219 	int ret;
2220 	struct octeon_device *oct = lio->oct_dev;
2221 	struct oct_intrmod_cfg intrmod = {0};
2222 	u32 j, q_no;
2223 	int db_max, db_min;
2224 
2225 	switch (oct->chip_id) {
2226 	case OCTEON_CN68XX:
2227 	case OCTEON_CN66XX:
2228 		db_min = CN6XXX_DB_MIN;
2229 		db_max = CN6XXX_DB_MAX;
2230 		if ((intr_coal->tx_max_coalesced_frames >= db_min) &&
2231 		    (intr_coal->tx_max_coalesced_frames <= db_max)) {
2232 			for (j = 0; j < lio->linfo.num_txpciq; j++) {
2233 				q_no = lio->linfo.txpciq[j].s.q_no;
2234 				oct->instr_queue[q_no]->fill_threshold =
2235 					intr_coal->tx_max_coalesced_frames;
2236 			}
2237 		} else {
2238 			dev_err(&oct->pci_dev->dev,
2239 				"LIQUIDIO: Invalid tx-frames:%d. Range is min:%d max:%d\n",
2240 				intr_coal->tx_max_coalesced_frames,
2241 				db_min, db_max);
2242 			return -EINVAL;
2243 		}
2244 		break;
2245 	case OCTEON_CN23XX_PF_VID:
2246 	case OCTEON_CN23XX_VF_VID:
2247 		break;
2248 	default:
2249 		return -EINVAL;
2250 	}
2251 
2252 	intrmod.rx_enable = intr_coal->use_adaptive_rx_coalesce ? 1 : 0;
2253 	intrmod.tx_enable = intr_coal->use_adaptive_tx_coalesce ? 1 : 0;
2254 	intrmod.rx_frames = CFG_GET_OQ_INTR_PKT(octeon_get_conf(oct));
2255 	intrmod.rx_usecs = CFG_GET_OQ_INTR_TIME(octeon_get_conf(oct));
2256 	intrmod.tx_frames = CFG_GET_IQ_INTR_PKT(octeon_get_conf(oct));
2257 
2258 	ret = oct_cfg_adaptive_intr(lio, &intrmod, intr_coal);
2259 
2260 	if (!intr_coal->use_adaptive_rx_coalesce) {
2261 		ret = oct_cfg_rx_intrtime(lio, &intrmod, intr_coal);
2262 		if (ret)
2263 			goto ret_intrmod;
2264 
2265 		ret = oct_cfg_rx_intrcnt(lio, &intrmod, intr_coal);
2266 		if (ret)
2267 			goto ret_intrmod;
2268 	} else {
2269 		oct->rx_coalesce_usecs =
2270 			CFG_GET_OQ_INTR_TIME(octeon_get_conf(oct));
2271 		oct->rx_max_coalesced_frames =
2272 			CFG_GET_OQ_INTR_PKT(octeon_get_conf(oct));
2273 	}
2274 
2275 	if (!intr_coal->use_adaptive_tx_coalesce) {
2276 		ret = oct_cfg_tx_intrcnt(lio, &intrmod, intr_coal);
2277 		if (ret)
2278 			goto ret_intrmod;
2279 	} else {
2280 		oct->tx_max_coalesced_frames =
2281 			CFG_GET_IQ_INTR_PKT(octeon_get_conf(oct));
2282 	}
2283 
2284 	return 0;
2285 ret_intrmod:
2286 	return ret;
2287 }
2288 
2289 static int lio_get_ts_info(struct net_device *netdev,
2290 			   struct ethtool_ts_info *info)
2291 {
2292 	struct lio *lio = GET_LIO(netdev);
2293 
2294 	info->so_timestamping =
2295 #ifdef PTP_HARDWARE_TIMESTAMPING
2296 		SOF_TIMESTAMPING_TX_HARDWARE |
2297 		SOF_TIMESTAMPING_RX_HARDWARE |
2298 		SOF_TIMESTAMPING_RAW_HARDWARE |
2299 		SOF_TIMESTAMPING_TX_SOFTWARE |
2300 #endif
2301 		SOF_TIMESTAMPING_RX_SOFTWARE |
2302 		SOF_TIMESTAMPING_SOFTWARE;
2303 
2304 	if (lio->ptp_clock)
2305 		info->phc_index = ptp_clock_index(lio->ptp_clock);
2306 	else
2307 		info->phc_index = -1;
2308 
2309 #ifdef PTP_HARDWARE_TIMESTAMPING
2310 	info->tx_types = (1 << HWTSTAMP_TX_OFF) | (1 << HWTSTAMP_TX_ON);
2311 
2312 	info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) |
2313 			   (1 << HWTSTAMP_FILTER_PTP_V1_L4_EVENT) |
2314 			   (1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
2315 			   (1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT);
2316 #endif
2317 
2318 	return 0;
2319 }
2320 
2321 /* Return register dump len. */
2322 static int lio_get_regs_len(struct net_device *dev)
2323 {
2324 	struct lio *lio = GET_LIO(dev);
2325 	struct octeon_device *oct = lio->oct_dev;
2326 
2327 	switch (oct->chip_id) {
2328 	case OCTEON_CN23XX_PF_VID:
2329 		return OCT_ETHTOOL_REGDUMP_LEN_23XX;
2330 	case OCTEON_CN23XX_VF_VID:
2331 		return OCT_ETHTOOL_REGDUMP_LEN_23XX_VF;
2332 	default:
2333 		return OCT_ETHTOOL_REGDUMP_LEN;
2334 	}
2335 }
2336 
2337 static int cn23xx_read_csr_reg(char *s, struct octeon_device *oct)
2338 {
2339 	u32 reg;
2340 	u8 pf_num = oct->pf_num;
2341 	int len = 0;
2342 	int i;
2343 
2344 	/* PCI  Window Registers */
2345 
2346 	len += sprintf(s + len, "\n\t Octeon CSR Registers\n\n");
2347 
2348 	/*0x29030 or 0x29040*/
2349 	reg = CN23XX_SLI_PKT_MAC_RINFO64(oct->pcie_port, oct->pf_num);
2350 	len += sprintf(s + len,
2351 		       "\n[%08x] (SLI_PKT_MAC%d_PF%d_RINFO): %016llx\n",
2352 		       reg, oct->pcie_port, oct->pf_num,
2353 		       (u64)octeon_read_csr64(oct, reg));
2354 
2355 	/*0x27080 or 0x27090*/
2356 	reg = CN23XX_SLI_MAC_PF_INT_ENB64(oct->pcie_port, oct->pf_num);
2357 	len +=
2358 	    sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_INT_ENB): %016llx\n",
2359 		    reg, oct->pcie_port, oct->pf_num,
2360 		    (u64)octeon_read_csr64(oct, reg));
2361 
2362 	/*0x27000 or 0x27010*/
2363 	reg = CN23XX_SLI_MAC_PF_INT_SUM64(oct->pcie_port, oct->pf_num);
2364 	len +=
2365 	    sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_INT_SUM): %016llx\n",
2366 		    reg, oct->pcie_port, oct->pf_num,
2367 		    (u64)octeon_read_csr64(oct, reg));
2368 
2369 	/*0x29120*/
2370 	reg = 0x29120;
2371 	len += sprintf(s + len, "\n[%08x] (SLI_PKT_MEM_CTL): %016llx\n", reg,
2372 		       (u64)octeon_read_csr64(oct, reg));
2373 
2374 	/*0x27300*/
2375 	reg = 0x27300 + oct->pcie_port * CN23XX_MAC_INT_OFFSET +
2376 	      (oct->pf_num) * CN23XX_PF_INT_OFFSET;
2377 	len += sprintf(
2378 	    s + len, "\n[%08x] (SLI_MAC%d_PF%d_PKT_VF_INT): %016llx\n", reg,
2379 	    oct->pcie_port, oct->pf_num, (u64)octeon_read_csr64(oct, reg));
2380 
2381 	/*0x27200*/
2382 	reg = 0x27200 + oct->pcie_port * CN23XX_MAC_INT_OFFSET +
2383 	      (oct->pf_num) * CN23XX_PF_INT_OFFSET;
2384 	len += sprintf(s + len,
2385 		       "\n[%08x] (SLI_MAC%d_PF%d_PP_VF_INT): %016llx\n",
2386 		       reg, oct->pcie_port, oct->pf_num,
2387 		       (u64)octeon_read_csr64(oct, reg));
2388 
2389 	/*29130*/
2390 	reg = CN23XX_SLI_PKT_CNT_INT;
2391 	len += sprintf(s + len, "\n[%08x] (SLI_PKT_CNT_INT): %016llx\n", reg,
2392 		       (u64)octeon_read_csr64(oct, reg));
2393 
2394 	/*0x29140*/
2395 	reg = CN23XX_SLI_PKT_TIME_INT;
2396 	len += sprintf(s + len, "\n[%08x] (SLI_PKT_TIME_INT): %016llx\n", reg,
2397 		       (u64)octeon_read_csr64(oct, reg));
2398 
2399 	/*0x29160*/
2400 	reg = 0x29160;
2401 	len += sprintf(s + len, "\n[%08x] (SLI_PKT_INT): %016llx\n", reg,
2402 		       (u64)octeon_read_csr64(oct, reg));
2403 
2404 	/*0x29180*/
2405 	reg = CN23XX_SLI_OQ_WMARK;
2406 	len += sprintf(s + len, "\n[%08x] (SLI_PKT_OUTPUT_WMARK): %016llx\n",
2407 		       reg, (u64)octeon_read_csr64(oct, reg));
2408 
2409 	/*0x291E0*/
2410 	reg = CN23XX_SLI_PKT_IOQ_RING_RST;
2411 	len += sprintf(s + len, "\n[%08x] (SLI_PKT_RING_RST): %016llx\n", reg,
2412 		       (u64)octeon_read_csr64(oct, reg));
2413 
2414 	/*0x29210*/
2415 	reg = CN23XX_SLI_GBL_CONTROL;
2416 	len += sprintf(s + len,
2417 		       "\n[%08x] (SLI_PKT_GBL_CONTROL): %016llx\n", reg,
2418 		       (u64)octeon_read_csr64(oct, reg));
2419 
2420 	/*0x29220*/
2421 	reg = 0x29220;
2422 	len += sprintf(s + len, "\n[%08x] (SLI_PKT_BIST_STATUS): %016llx\n",
2423 		       reg, (u64)octeon_read_csr64(oct, reg));
2424 
2425 	/*PF only*/
2426 	if (pf_num == 0) {
2427 		/*0x29260*/
2428 		reg = CN23XX_SLI_OUT_BP_EN_W1S;
2429 		len += sprintf(s + len,
2430 			       "\n[%08x] (SLI_PKT_OUT_BP_EN_W1S):  %016llx\n",
2431 			       reg, (u64)octeon_read_csr64(oct, reg));
2432 	} else if (pf_num == 1) {
2433 		/*0x29270*/
2434 		reg = CN23XX_SLI_OUT_BP_EN2_W1S;
2435 		len += sprintf(s + len,
2436 			       "\n[%08x] (SLI_PKT_OUT_BP_EN2_W1S): %016llx\n",
2437 			       reg, (u64)octeon_read_csr64(oct, reg));
2438 	}
2439 
2440 	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
2441 		reg = CN23XX_SLI_OQ_BUFF_INFO_SIZE(i);
2442 		len +=
2443 		    sprintf(s + len, "\n[%08x] (SLI_PKT%d_OUT_SIZE): %016llx\n",
2444 			    reg, i, (u64)octeon_read_csr64(oct, reg));
2445 	}
2446 
2447 	/*0x10040*/
2448 	for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) {
2449 		reg = CN23XX_SLI_IQ_INSTR_COUNT64(i);
2450 		len += sprintf(s + len,
2451 			       "\n[%08x] (SLI_PKT_IN_DONE%d_CNTS): %016llx\n",
2452 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2453 	}
2454 
2455 	/*0x10080*/
2456 	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
2457 		reg = CN23XX_SLI_OQ_PKTS_CREDIT(i);
2458 		len += sprintf(s + len,
2459 			       "\n[%08x] (SLI_PKT%d_SLIST_BAOFF_DBELL): %016llx\n",
2460 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2461 	}
2462 
2463 	/*0x10090*/
2464 	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
2465 		reg = CN23XX_SLI_OQ_SIZE(i);
2466 		len += sprintf(
2467 		    s + len, "\n[%08x] (SLI_PKT%d_SLIST_FIFO_RSIZE): %016llx\n",
2468 		    reg, i, (u64)octeon_read_csr64(oct, reg));
2469 	}
2470 
2471 	/*0x10050*/
2472 	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
2473 		reg = CN23XX_SLI_OQ_PKT_CONTROL(i);
2474 		len += sprintf(
2475 			s + len,
2476 			"\n[%08x] (SLI_PKT%d__OUTPUT_CONTROL): %016llx\n",
2477 			reg, i, (u64)octeon_read_csr64(oct, reg));
2478 	}
2479 
2480 	/*0x10070*/
2481 	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
2482 		reg = CN23XX_SLI_OQ_BASE_ADDR64(i);
2483 		len += sprintf(s + len,
2484 			       "\n[%08x] (SLI_PKT%d_SLIST_BADDR): %016llx\n",
2485 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2486 	}
2487 
2488 	/*0x100a0*/
2489 	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
2490 		reg = CN23XX_SLI_OQ_PKT_INT_LEVELS(i);
2491 		len += sprintf(s + len,
2492 			       "\n[%08x] (SLI_PKT%d_INT_LEVELS): %016llx\n",
2493 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2494 	}
2495 
2496 	/*0x100b0*/
2497 	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
2498 		reg = CN23XX_SLI_OQ_PKTS_SENT(i);
2499 		len += sprintf(s + len, "\n[%08x] (SLI_PKT%d_CNTS): %016llx\n",
2500 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2501 	}
2502 
2503 	/*0x100c0*/
2504 	for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) {
2505 		reg = 0x100c0 + i * CN23XX_OQ_OFFSET;
2506 		len += sprintf(s + len,
2507 			       "\n[%08x] (SLI_PKT%d_ERROR_INFO): %016llx\n",
2508 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2509 
2510 		/*0x10000*/
2511 		for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) {
2512 			reg = CN23XX_SLI_IQ_PKT_CONTROL64(i);
2513 			len += sprintf(
2514 				s + len,
2515 				"\n[%08x] (SLI_PKT%d_INPUT_CONTROL): %016llx\n",
2516 				reg, i, (u64)octeon_read_csr64(oct, reg));
2517 		}
2518 
2519 		/*0x10010*/
2520 		for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) {
2521 			reg = CN23XX_SLI_IQ_BASE_ADDR64(i);
2522 			len += sprintf(
2523 			    s + len,
2524 			    "\n[%08x] (SLI_PKT%d_INSTR_BADDR): %016llx\n", reg,
2525 			    i, (u64)octeon_read_csr64(oct, reg));
2526 		}
2527 
2528 		/*0x10020*/
2529 		for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) {
2530 			reg = CN23XX_SLI_IQ_DOORBELL(i);
2531 			len += sprintf(
2532 			    s + len,
2533 			    "\n[%08x] (SLI_PKT%d_INSTR_BAOFF_DBELL): %016llx\n",
2534 			    reg, i, (u64)octeon_read_csr64(oct, reg));
2535 		}
2536 
2537 		/*0x10030*/
2538 		for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) {
2539 			reg = CN23XX_SLI_IQ_SIZE(i);
2540 			len += sprintf(
2541 			    s + len,
2542 			    "\n[%08x] (SLI_PKT%d_INSTR_FIFO_RSIZE): %016llx\n",
2543 			    reg, i, (u64)octeon_read_csr64(oct, reg));
2544 		}
2545 
2546 		/*0x10040*/
2547 		for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++)
2548 			reg = CN23XX_SLI_IQ_INSTR_COUNT64(i);
2549 		len += sprintf(s + len,
2550 			       "\n[%08x] (SLI_PKT_IN_DONE%d_CNTS): %016llx\n",
2551 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2552 	}
2553 
2554 	return len;
2555 }
2556 
2557 static int cn23xx_vf_read_csr_reg(char *s, struct octeon_device *oct)
2558 {
2559 	int len = 0;
2560 	u32 reg;
2561 	int i;
2562 
2563 	/* PCI  Window Registers */
2564 
2565 	len += sprintf(s + len, "\n\t Octeon CSR Registers\n\n");
2566 
2567 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2568 		reg = CN23XX_VF_SLI_OQ_BUFF_INFO_SIZE(i);
2569 		len += sprintf(s + len,
2570 			       "\n[%08x] (SLI_PKT%d_OUT_SIZE): %016llx\n",
2571 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2572 	}
2573 
2574 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2575 		reg = CN23XX_VF_SLI_IQ_INSTR_COUNT64(i);
2576 		len += sprintf(s + len,
2577 			       "\n[%08x] (SLI_PKT_IN_DONE%d_CNTS): %016llx\n",
2578 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2579 	}
2580 
2581 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2582 		reg = CN23XX_VF_SLI_OQ_PKTS_CREDIT(i);
2583 		len += sprintf(s + len,
2584 			       "\n[%08x] (SLI_PKT%d_SLIST_BAOFF_DBELL): %016llx\n",
2585 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2586 	}
2587 
2588 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2589 		reg = CN23XX_VF_SLI_OQ_SIZE(i);
2590 		len += sprintf(s + len,
2591 			       "\n[%08x] (SLI_PKT%d_SLIST_FIFO_RSIZE): %016llx\n",
2592 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2593 	}
2594 
2595 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2596 		reg = CN23XX_VF_SLI_OQ_PKT_CONTROL(i);
2597 		len += sprintf(s + len,
2598 			       "\n[%08x] (SLI_PKT%d__OUTPUT_CONTROL): %016llx\n",
2599 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2600 	}
2601 
2602 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2603 		reg = CN23XX_VF_SLI_OQ_BASE_ADDR64(i);
2604 		len += sprintf(s + len,
2605 			       "\n[%08x] (SLI_PKT%d_SLIST_BADDR): %016llx\n",
2606 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2607 	}
2608 
2609 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2610 		reg = CN23XX_VF_SLI_OQ_PKT_INT_LEVELS(i);
2611 		len += sprintf(s + len,
2612 			       "\n[%08x] (SLI_PKT%d_INT_LEVELS): %016llx\n",
2613 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2614 	}
2615 
2616 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2617 		reg = CN23XX_VF_SLI_OQ_PKTS_SENT(i);
2618 		len += sprintf(s + len, "\n[%08x] (SLI_PKT%d_CNTS): %016llx\n",
2619 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2620 	}
2621 
2622 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2623 		reg = 0x100c0 + i * CN23XX_VF_OQ_OFFSET;
2624 		len += sprintf(s + len,
2625 			       "\n[%08x] (SLI_PKT%d_ERROR_INFO): %016llx\n",
2626 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2627 	}
2628 
2629 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2630 		reg = 0x100d0 + i * CN23XX_VF_IQ_OFFSET;
2631 		len += sprintf(s + len,
2632 			       "\n[%08x] (SLI_PKT%d_VF_INT_SUM): %016llx\n",
2633 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2634 	}
2635 
2636 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2637 		reg = CN23XX_VF_SLI_IQ_PKT_CONTROL64(i);
2638 		len += sprintf(s + len,
2639 			       "\n[%08x] (SLI_PKT%d_INPUT_CONTROL): %016llx\n",
2640 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2641 	}
2642 
2643 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2644 		reg = CN23XX_VF_SLI_IQ_BASE_ADDR64(i);
2645 		len += sprintf(s + len,
2646 			       "\n[%08x] (SLI_PKT%d_INSTR_BADDR): %016llx\n",
2647 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2648 	}
2649 
2650 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2651 		reg = CN23XX_VF_SLI_IQ_DOORBELL(i);
2652 		len += sprintf(s + len,
2653 			       "\n[%08x] (SLI_PKT%d_INSTR_BAOFF_DBELL): %016llx\n",
2654 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2655 	}
2656 
2657 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2658 		reg = CN23XX_VF_SLI_IQ_SIZE(i);
2659 		len += sprintf(s + len,
2660 			       "\n[%08x] (SLI_PKT%d_INSTR_FIFO_RSIZE): %016llx\n",
2661 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2662 	}
2663 
2664 	for (i = 0; i < (oct->sriov_info.rings_per_vf); i++) {
2665 		reg = CN23XX_VF_SLI_IQ_INSTR_COUNT64(i);
2666 		len += sprintf(s + len,
2667 			       "\n[%08x] (SLI_PKT_IN_DONE%d_CNTS): %016llx\n",
2668 			       reg, i, (u64)octeon_read_csr64(oct, reg));
2669 	}
2670 
2671 	return len;
2672 }
2673 
2674 static int cn6xxx_read_csr_reg(char *s, struct octeon_device *oct)
2675 {
2676 	u32 reg;
2677 	int i, len = 0;
2678 
2679 	/* PCI  Window Registers */
2680 
2681 	len += sprintf(s + len, "\n\t Octeon CSR Registers\n\n");
2682 	reg = CN6XXX_WIN_WR_ADDR_LO;
2683 	len += sprintf(s + len, "\n[%02x] (WIN_WR_ADDR_LO): %08x\n",
2684 		       CN6XXX_WIN_WR_ADDR_LO, octeon_read_csr(oct, reg));
2685 	reg = CN6XXX_WIN_WR_ADDR_HI;
2686 	len += sprintf(s + len, "[%02x] (WIN_WR_ADDR_HI): %08x\n",
2687 		       CN6XXX_WIN_WR_ADDR_HI, octeon_read_csr(oct, reg));
2688 	reg = CN6XXX_WIN_RD_ADDR_LO;
2689 	len += sprintf(s + len, "[%02x] (WIN_RD_ADDR_LO): %08x\n",
2690 		       CN6XXX_WIN_RD_ADDR_LO, octeon_read_csr(oct, reg));
2691 	reg = CN6XXX_WIN_RD_ADDR_HI;
2692 	len += sprintf(s + len, "[%02x] (WIN_RD_ADDR_HI): %08x\n",
2693 		       CN6XXX_WIN_RD_ADDR_HI, octeon_read_csr(oct, reg));
2694 	reg = CN6XXX_WIN_WR_DATA_LO;
2695 	len += sprintf(s + len, "[%02x] (WIN_WR_DATA_LO): %08x\n",
2696 		       CN6XXX_WIN_WR_DATA_LO, octeon_read_csr(oct, reg));
2697 	reg = CN6XXX_WIN_WR_DATA_HI;
2698 	len += sprintf(s + len, "[%02x] (WIN_WR_DATA_HI): %08x\n",
2699 		       CN6XXX_WIN_WR_DATA_HI, octeon_read_csr(oct, reg));
2700 	len += sprintf(s + len, "[%02x] (WIN_WR_MASK_REG): %08x\n",
2701 		       CN6XXX_WIN_WR_MASK_REG,
2702 		       octeon_read_csr(oct, CN6XXX_WIN_WR_MASK_REG));
2703 
2704 	/* PCI  Interrupt Register */
2705 	len += sprintf(s + len, "\n[%x] (INT_ENABLE PORT 0): %08x\n",
2706 		       CN6XXX_SLI_INT_ENB64_PORT0, octeon_read_csr(oct,
2707 						CN6XXX_SLI_INT_ENB64_PORT0));
2708 	len += sprintf(s + len, "\n[%x] (INT_ENABLE PORT 1): %08x\n",
2709 		       CN6XXX_SLI_INT_ENB64_PORT1,
2710 		       octeon_read_csr(oct, CN6XXX_SLI_INT_ENB64_PORT1));
2711 	len += sprintf(s + len, "[%x] (INT_SUM): %08x\n", CN6XXX_SLI_INT_SUM64,
2712 		       octeon_read_csr(oct, CN6XXX_SLI_INT_SUM64));
2713 
2714 	/* PCI  Output queue registers */
2715 	for (i = 0; i < oct->num_oqs; i++) {
2716 		reg = CN6XXX_SLI_OQ_PKTS_SENT(i);
2717 		len += sprintf(s + len, "\n[%x] (PKTS_SENT_%d): %08x\n",
2718 			       reg, i, octeon_read_csr(oct, reg));
2719 		reg = CN6XXX_SLI_OQ_PKTS_CREDIT(i);
2720 		len += sprintf(s + len, "[%x] (PKT_CREDITS_%d): %08x\n",
2721 			       reg, i, octeon_read_csr(oct, reg));
2722 	}
2723 	reg = CN6XXX_SLI_OQ_INT_LEVEL_PKTS;
2724 	len += sprintf(s + len, "\n[%x] (PKTS_SENT_INT_LEVEL): %08x\n",
2725 		       reg, octeon_read_csr(oct, reg));
2726 	reg = CN6XXX_SLI_OQ_INT_LEVEL_TIME;
2727 	len += sprintf(s + len, "[%x] (PKTS_SENT_TIME): %08x\n",
2728 		       reg, octeon_read_csr(oct, reg));
2729 
2730 	/* PCI  Input queue registers */
2731 	for (i = 0; i <= 3; i++) {
2732 		u32 reg;
2733 
2734 		reg = CN6XXX_SLI_IQ_DOORBELL(i);
2735 		len += sprintf(s + len, "\n[%x] (INSTR_DOORBELL_%d): %08x\n",
2736 			       reg, i, octeon_read_csr(oct, reg));
2737 		reg = CN6XXX_SLI_IQ_INSTR_COUNT(i);
2738 		len += sprintf(s + len, "[%x] (INSTR_COUNT_%d): %08x\n",
2739 			       reg, i, octeon_read_csr(oct, reg));
2740 	}
2741 
2742 	/* PCI  DMA registers */
2743 
2744 	len += sprintf(s + len, "\n[%x] (DMA_CNT_0): %08x\n",
2745 		       CN6XXX_DMA_CNT(0),
2746 		       octeon_read_csr(oct, CN6XXX_DMA_CNT(0)));
2747 	reg = CN6XXX_DMA_PKT_INT_LEVEL(0);
2748 	len += sprintf(s + len, "[%x] (DMA_INT_LEV_0): %08x\n",
2749 		       CN6XXX_DMA_PKT_INT_LEVEL(0), octeon_read_csr(oct, reg));
2750 	reg = CN6XXX_DMA_TIME_INT_LEVEL(0);
2751 	len += sprintf(s + len, "[%x] (DMA_TIME_0): %08x\n",
2752 		       CN6XXX_DMA_TIME_INT_LEVEL(0),
2753 		       octeon_read_csr(oct, reg));
2754 
2755 	len += sprintf(s + len, "\n[%x] (DMA_CNT_1): %08x\n",
2756 		       CN6XXX_DMA_CNT(1),
2757 		       octeon_read_csr(oct, CN6XXX_DMA_CNT(1)));
2758 	reg = CN6XXX_DMA_PKT_INT_LEVEL(1);
2759 	len += sprintf(s + len, "[%x] (DMA_INT_LEV_1): %08x\n",
2760 		       CN6XXX_DMA_PKT_INT_LEVEL(1),
2761 		       octeon_read_csr(oct, reg));
2762 	reg = CN6XXX_DMA_PKT_INT_LEVEL(1);
2763 	len += sprintf(s + len, "[%x] (DMA_TIME_1): %08x\n",
2764 		       CN6XXX_DMA_TIME_INT_LEVEL(1),
2765 		       octeon_read_csr(oct, reg));
2766 
2767 	/* PCI  Index registers */
2768 
2769 	len += sprintf(s + len, "\n");
2770 
2771 	for (i = 0; i < 16; i++) {
2772 		reg = lio_pci_readq(oct, CN6XXX_BAR1_REG(i, oct->pcie_port));
2773 		len += sprintf(s + len, "[%llx] (BAR1_INDEX_%02d): %08x\n",
2774 			       CN6XXX_BAR1_REG(i, oct->pcie_port), i, reg);
2775 	}
2776 
2777 	return len;
2778 }
2779 
2780 static int cn6xxx_read_config_reg(char *s, struct octeon_device *oct)
2781 {
2782 	u32 val;
2783 	int i, len = 0;
2784 
2785 	/* PCI CONFIG Registers */
2786 
2787 	len += sprintf(s + len,
2788 		       "\n\t Octeon Config space Registers\n\n");
2789 
2790 	for (i = 0; i <= 13; i++) {
2791 		pci_read_config_dword(oct->pci_dev, (i * 4), &val);
2792 		len += sprintf(s + len, "[0x%x] (Config[%d]): 0x%08x\n",
2793 			       (i * 4), i, val);
2794 	}
2795 
2796 	for (i = 30; i <= 34; i++) {
2797 		pci_read_config_dword(oct->pci_dev, (i * 4), &val);
2798 		len += sprintf(s + len, "[0x%x] (Config[%d]): 0x%08x\n",
2799 			       (i * 4), i, val);
2800 	}
2801 
2802 	return len;
2803 }
2804 
2805 /*  Return register dump user app.  */
2806 static void lio_get_regs(struct net_device *dev,
2807 			 struct ethtool_regs *regs, void *regbuf)
2808 {
2809 	struct lio *lio = GET_LIO(dev);
2810 	int len = 0;
2811 	struct octeon_device *oct = lio->oct_dev;
2812 
2813 	regs->version = OCT_ETHTOOL_REGSVER;
2814 
2815 	switch (oct->chip_id) {
2816 	case OCTEON_CN23XX_PF_VID:
2817 		memset(regbuf, 0, OCT_ETHTOOL_REGDUMP_LEN_23XX);
2818 		len += cn23xx_read_csr_reg(regbuf + len, oct);
2819 		break;
2820 	case OCTEON_CN23XX_VF_VID:
2821 		memset(regbuf, 0, OCT_ETHTOOL_REGDUMP_LEN_23XX_VF);
2822 		len += cn23xx_vf_read_csr_reg(regbuf + len, oct);
2823 		break;
2824 	case OCTEON_CN68XX:
2825 	case OCTEON_CN66XX:
2826 		memset(regbuf, 0, OCT_ETHTOOL_REGDUMP_LEN);
2827 		len += cn6xxx_read_csr_reg(regbuf + len, oct);
2828 		len += cn6xxx_read_config_reg(regbuf + len, oct);
2829 		break;
2830 	default:
2831 		dev_err(&oct->pci_dev->dev, "%s Unknown chipid: %d\n",
2832 			__func__, oct->chip_id);
2833 	}
2834 }
2835 
2836 static u32 lio_get_priv_flags(struct net_device *netdev)
2837 {
2838 	struct lio *lio = GET_LIO(netdev);
2839 
2840 	return lio->oct_dev->priv_flags;
2841 }
2842 
2843 static int lio_set_priv_flags(struct net_device *netdev, u32 flags)
2844 {
2845 	struct lio *lio = GET_LIO(netdev);
2846 	bool intr_by_tx_bytes = !!(flags & (0x1 << OCT_PRIV_FLAG_TX_BYTES));
2847 
2848 	lio_set_priv_flag(lio->oct_dev, OCT_PRIV_FLAG_TX_BYTES,
2849 			  intr_by_tx_bytes);
2850 	return 0;
2851 }
2852 
2853 static const struct ethtool_ops lio_ethtool_ops = {
2854 	.get_link_ksettings	= lio_get_link_ksettings,
2855 	.get_link		= ethtool_op_get_link,
2856 	.get_drvinfo		= lio_get_drvinfo,
2857 	.get_ringparam		= lio_ethtool_get_ringparam,
2858 	.set_ringparam		= lio_ethtool_set_ringparam,
2859 	.get_channels		= lio_ethtool_get_channels,
2860 	.set_channels		= lio_ethtool_set_channels,
2861 	.set_phys_id		= lio_set_phys_id,
2862 	.get_eeprom_len		= lio_get_eeprom_len,
2863 	.get_eeprom		= lio_get_eeprom,
2864 	.get_strings		= lio_get_strings,
2865 	.get_ethtool_stats	= lio_get_ethtool_stats,
2866 	.get_pauseparam		= lio_get_pauseparam,
2867 	.set_pauseparam		= lio_set_pauseparam,
2868 	.get_regs_len		= lio_get_regs_len,
2869 	.get_regs		= lio_get_regs,
2870 	.get_msglevel		= lio_get_msglevel,
2871 	.set_msglevel		= lio_set_msglevel,
2872 	.get_sset_count		= lio_get_sset_count,
2873 	.get_coalesce		= lio_get_intr_coalesce,
2874 	.set_coalesce		= lio_set_intr_coalesce,
2875 	.get_priv_flags		= lio_get_priv_flags,
2876 	.set_priv_flags		= lio_set_priv_flags,
2877 	.get_ts_info		= lio_get_ts_info,
2878 };
2879 
2880 static const struct ethtool_ops lio_vf_ethtool_ops = {
2881 	.get_link_ksettings	= lio_get_link_ksettings,
2882 	.get_link		= ethtool_op_get_link,
2883 	.get_drvinfo		= lio_get_vf_drvinfo,
2884 	.get_ringparam		= lio_ethtool_get_ringparam,
2885 	.set_ringparam          = lio_ethtool_set_ringparam,
2886 	.get_channels		= lio_ethtool_get_channels,
2887 	.set_channels		= lio_ethtool_set_channels,
2888 	.get_strings		= lio_vf_get_strings,
2889 	.get_ethtool_stats	= lio_vf_get_ethtool_stats,
2890 	.get_regs_len		= lio_get_regs_len,
2891 	.get_regs		= lio_get_regs,
2892 	.get_msglevel		= lio_get_msglevel,
2893 	.set_msglevel		= lio_vf_set_msglevel,
2894 	.get_sset_count		= lio_vf_get_sset_count,
2895 	.get_coalesce		= lio_get_intr_coalesce,
2896 	.set_coalesce		= lio_set_intr_coalesce,
2897 	.get_priv_flags		= lio_get_priv_flags,
2898 	.set_priv_flags		= lio_set_priv_flags,
2899 	.get_ts_info		= lio_get_ts_info,
2900 };
2901 
2902 void liquidio_set_ethtool_ops(struct net_device *netdev)
2903 {
2904 	struct lio *lio = GET_LIO(netdev);
2905 	struct octeon_device *oct = lio->oct_dev;
2906 
2907 	if (OCTEON_CN23XX_VF(oct))
2908 		netdev->ethtool_ops = &lio_vf_ethtool_ops;
2909 	else
2910 		netdev->ethtool_ops = &lio_ethtool_ops;
2911 }
2912