Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[cascardo/linux.git] / drivers / net / ethernet / cavium / liquidio / lio_ethtool.c
1 /**********************************************************************
2 * Author: Cavium, Inc.
3 *
4 * Contact: support@cavium.com
5 *          Please include "LiquidIO" in the subject.
6 *
7 * Copyright (c) 2003-2015 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
17 * details.
18 *
19 * This file may also be available under a different license from Cavium.
20 * Contact Cavium, Inc. for more information
21 **********************************************************************/
22 #include <linux/netdevice.h>
23 #include <linux/net_tstamp.h>
24 #include <linux/pci.h>
25 #include "liquidio_common.h"
26 #include "octeon_droq.h"
27 #include "octeon_iq.h"
28 #include "response_manager.h"
29 #include "octeon_device.h"
30 #include "octeon_nic.h"
31 #include "octeon_main.h"
32 #include "octeon_network.h"
33 #include "cn66xx_regs.h"
34 #include "cn66xx_device.h"
35
36 static int octnet_get_link_stats(struct net_device *netdev);
37
38 struct oct_mdio_cmd_context {
39         int octeon_id;
40         wait_queue_head_t wc;
41         int cond;
42 };
43
44 struct oct_mdio_cmd_resp {
45         u64 rh;
46         struct oct_mdio_cmd resp;
47         u64 status;
48 };
49
50 #define OCT_MDIO45_RESP_SIZE   (sizeof(struct oct_mdio_cmd_resp))
51
52 /* Octeon's interface mode of operation */
53 enum {
54         INTERFACE_MODE_DISABLED,
55         INTERFACE_MODE_RGMII,
56         INTERFACE_MODE_GMII,
57         INTERFACE_MODE_SPI,
58         INTERFACE_MODE_PCIE,
59         INTERFACE_MODE_XAUI,
60         INTERFACE_MODE_SGMII,
61         INTERFACE_MODE_PICMG,
62         INTERFACE_MODE_NPI,
63         INTERFACE_MODE_LOOP,
64         INTERFACE_MODE_SRIO,
65         INTERFACE_MODE_ILK,
66         INTERFACE_MODE_RXAUI,
67         INTERFACE_MODE_QSGMII,
68         INTERFACE_MODE_AGL,
69         INTERFACE_MODE_XLAUI,
70         INTERFACE_MODE_XFI,
71         INTERFACE_MODE_10G_KR,
72         INTERFACE_MODE_40G_KR4,
73         INTERFACE_MODE_MIXED,
74 };
75
76 #define ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0]))
77 #define OCT_ETHTOOL_REGDUMP_LEN  4096
78 #define OCT_ETHTOOL_REGSVER  1
79
80 /* statistics of PF */
81 static const char oct_stats_strings[][ETH_GSTRING_LEN] = {
82         "rx_packets",
83         "tx_packets",
84         "rx_bytes",
85         "tx_bytes",
86         "rx_errors",    /*jabber_err+l2_err+frame_err */
87         "tx_errors",    /*fw_err_pko+fw_err_link+fw_err_drop */
88         "rx_dropped",   /*st->fromwire.total_rcvd - st->fromwire.fw_total_rcvd
89                         *+st->fromwire.dmac_drop + st->fromwire.fw_err_drop
90                         */
91         "tx_dropped",
92
93         "tx_total_sent",
94         "tx_total_fwd",
95         "tx_err_pko",
96         "tx_err_link",
97         "tx_err_drop",
98
99         "tx_tso",
100         "tx_tso_packets",
101         "tx_tso_err",
102         "tx_vxlan",
103
104         "mac_tx_total_pkts",
105         "mac_tx_total_bytes",
106         "mac_tx_mcast_pkts",
107         "mac_tx_bcast_pkts",
108         "mac_tx_ctl_packets",   /*oct->link_stats.fromhost.ctl_sent */
109         "mac_tx_total_collisions",
110         "mac_tx_one_collision",
111         "mac_tx_multi_collison",
112         "mac_tx_max_collision_fail",
113         "mac_tx_max_deferal_fail",
114         "mac_tx_fifo_err",
115         "mac_tx_runts",
116
117         "rx_total_rcvd",
118         "rx_total_fwd",
119         "rx_jabber_err",
120         "rx_l2_err",
121         "rx_frame_err",
122         "rx_err_pko",
123         "rx_err_link",
124         "rx_err_drop",
125
126         "rx_vxlan",
127         "rx_vxlan_err",
128
129         "rx_lro_pkts",
130         "rx_lro_bytes",
131         "rx_total_lro",
132
133         "rx_lro_aborts",
134         "rx_lro_aborts_port",
135         "rx_lro_aborts_seq",
136         "rx_lro_aborts_tsval",
137         "rx_lro_aborts_timer",
138         "rx_fwd_rate",
139
140         "mac_rx_total_rcvd",
141         "mac_rx_bytes",
142         "mac_rx_total_bcst",
143         "mac_rx_total_mcst",
144         "mac_rx_runts",
145         "mac_rx_ctl_packets",
146         "mac_rx_fifo_err",
147         "mac_rx_dma_drop",
148         "mac_rx_fcs_err",
149
150         "link_state_changes",
151 };
152
153 /* statistics of host tx queue */
154 static const char oct_iq_stats_strings[][ETH_GSTRING_LEN] = {
155         "packets",              /*oct->instr_queue[iq_no]->stats.tx_done*/
156         "bytes",                /*oct->instr_queue[iq_no]->stats.tx_tot_bytes*/
157         "dropped",
158         "iq_busy",
159         "sgentry_sent",
160
161         "fw_instr_posted",
162         "fw_instr_processed",
163         "fw_instr_dropped",
164         "fw_bytes_sent",
165
166         "tso",
167         "vxlan",
168         "txq_restart",
169 };
170
171 /* statistics of host rx queue */
172 static const char oct_droq_stats_strings[][ETH_GSTRING_LEN] = {
173         "packets",              /*oct->droq[oq_no]->stats.rx_pkts_received */
174         "bytes",                /*oct->droq[oq_no]->stats.rx_bytes_received */
175         "dropped",              /*oct->droq[oq_no]->stats.rx_dropped+
176                                  *oct->droq[oq_no]->stats.dropped_nodispatch+
177                                  *oct->droq[oq_no]->stats.dropped_toomany+
178                                  *oct->droq[oq_no]->stats.dropped_nomem
179                                  */
180         "dropped_nomem",
181         "dropped_toomany",
182         "fw_dropped",
183         "fw_pkts_received",
184         "fw_bytes_received",
185         "fw_dropped_nodispatch",
186
187         "vxlan",
188         "buffer_alloc_failure",
189 };
190
191 #define OCTNIC_NCMD_AUTONEG_ON  0x1
192 #define OCTNIC_NCMD_PHY_ON      0x2
193
194 static int lio_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
195 {
196         struct lio *lio = GET_LIO(netdev);
197         struct octeon_device *oct = lio->oct_dev;
198         struct oct_link_info *linfo;
199
200         linfo = &lio->linfo;
201
202         if (linfo->link.s.if_mode == INTERFACE_MODE_XAUI ||
203             linfo->link.s.if_mode == INTERFACE_MODE_RXAUI ||
204             linfo->link.s.if_mode == INTERFACE_MODE_XFI) {
205                 ecmd->port = PORT_FIBRE;
206                 ecmd->supported =
207                         (SUPPORTED_10000baseT_Full | SUPPORTED_FIBRE |
208                          SUPPORTED_Pause);
209                 ecmd->advertising =
210                         (ADVERTISED_10000baseT_Full | ADVERTISED_Pause);
211                 ecmd->transceiver = XCVR_EXTERNAL;
212                 ecmd->autoneg = AUTONEG_DISABLE;
213
214         } else {
215                 dev_err(&oct->pci_dev->dev, "Unknown link interface reported %d\n",
216                         linfo->link.s.if_mode);
217         }
218
219         if (linfo->link.s.link_up) {
220                 ethtool_cmd_speed_set(ecmd, linfo->link.s.speed);
221                 ecmd->duplex = linfo->link.s.duplex;
222         } else {
223                 ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
224                 ecmd->duplex = DUPLEX_UNKNOWN;
225         }
226
227         return 0;
228 }
229
230 static void
231 lio_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
232 {
233         struct lio *lio;
234         struct octeon_device *oct;
235
236         lio = GET_LIO(netdev);
237         oct = lio->oct_dev;
238
239         memset(drvinfo, 0, sizeof(struct ethtool_drvinfo));
240         strcpy(drvinfo->driver, "liquidio");
241         strcpy(drvinfo->version, LIQUIDIO_VERSION);
242         strncpy(drvinfo->fw_version, oct->fw_info.liquidio_firmware_version,
243                 ETHTOOL_FWVERS_LEN);
244         strncpy(drvinfo->bus_info, pci_name(oct->pci_dev), 32);
245 }
246
247 static void
248 lio_ethtool_get_channels(struct net_device *dev,
249                          struct ethtool_channels *channel)
250 {
251         struct lio *lio = GET_LIO(dev);
252         struct octeon_device *oct = lio->oct_dev;
253         u32 max_rx = 0, max_tx = 0, tx_count = 0, rx_count = 0;
254
255         if (OCTEON_CN6XXX(oct)) {
256                 struct octeon_config *conf6x = CHIP_FIELD(oct, cn6xxx, conf);
257
258                 max_rx = CFG_GET_OQ_MAX_Q(conf6x);
259                 max_tx = CFG_GET_IQ_MAX_Q(conf6x);
260                 rx_count = CFG_GET_NUM_RXQS_NIC_IF(conf6x, lio->ifidx);
261                 tx_count = CFG_GET_NUM_TXQS_NIC_IF(conf6x, lio->ifidx);
262         }
263
264         channel->max_rx = max_rx;
265         channel->max_tx = max_tx;
266         channel->rx_count = rx_count;
267         channel->tx_count = tx_count;
268 }
269
270 static int lio_get_eeprom_len(struct net_device *netdev)
271 {
272         u8 buf[128];
273         struct lio *lio = GET_LIO(netdev);
274         struct octeon_device *oct_dev = lio->oct_dev;
275         struct octeon_board_info *board_info;
276         int len;
277
278         board_info = (struct octeon_board_info *)(&oct_dev->boardinfo);
279         len = sprintf(buf, "boardname:%s serialnum:%s maj:%lld min:%lld\n",
280                       board_info->name, board_info->serial_number,
281                       board_info->major, board_info->minor);
282
283         return len;
284 }
285
286 static int
287 lio_get_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom,
288                u8 *bytes)
289 {
290         struct lio *lio = GET_LIO(netdev);
291         struct octeon_device *oct_dev = lio->oct_dev;
292         struct octeon_board_info *board_info;
293         int len;
294
295         if (eeprom->offset != 0)
296                 return -EINVAL;
297
298         eeprom->magic = oct_dev->pci_dev->vendor;
299         board_info = (struct octeon_board_info *)(&oct_dev->boardinfo);
300         len =
301                 sprintf((char *)bytes,
302                         "boardname:%s serialnum:%s maj:%lld min:%lld\n",
303                         board_info->name, board_info->serial_number,
304                         board_info->major, board_info->minor);
305
306         return 0;
307 }
308
309 static int octnet_gpio_access(struct net_device *netdev, int addr, int val)
310 {
311         struct lio *lio = GET_LIO(netdev);
312         struct octeon_device *oct = lio->oct_dev;
313         struct octnic_ctrl_pkt nctrl;
314         int ret = 0;
315
316         memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt));
317
318         nctrl.ncmd.u64 = 0;
319         nctrl.ncmd.s.cmd = OCTNET_CMD_GPIO_ACCESS;
320         nctrl.ncmd.s.param1 = addr;
321         nctrl.ncmd.s.param2 = val;
322         nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
323         nctrl.wait_time = 100;
324         nctrl.netpndev = (u64)netdev;
325         nctrl.cb_fn = liquidio_link_ctrl_cmd_completion;
326
327         ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl);
328         if (ret < 0) {
329                 dev_err(&oct->pci_dev->dev, "Failed to configure gpio value\n");
330                 return -EINVAL;
331         }
332
333         return 0;
334 }
335
336 /* Callback for when mdio command response arrives
337  */
338 static void octnet_mdio_resp_callback(struct octeon_device *oct,
339                                       u32 status,
340                                       void *buf)
341 {
342         struct oct_mdio_cmd_context *mdio_cmd_ctx;
343         struct octeon_soft_command *sc = (struct octeon_soft_command *)buf;
344
345         mdio_cmd_ctx = (struct oct_mdio_cmd_context *)sc->ctxptr;
346
347         oct = lio_get_device(mdio_cmd_ctx->octeon_id);
348         if (status) {
349                 dev_err(&oct->pci_dev->dev, "MIDO instruction failed. Status: %llx\n",
350                         CVM_CAST64(status));
351                 WRITE_ONCE(mdio_cmd_ctx->cond, -1);
352         } else {
353                 WRITE_ONCE(mdio_cmd_ctx->cond, 1);
354         }
355         wake_up_interruptible(&mdio_cmd_ctx->wc);
356 }
357
358 /* This routine provides PHY access routines for
359  * mdio  clause45 .
360  */
361 static int
362 octnet_mdio45_access(struct lio *lio, int op, int loc, int *value)
363 {
364         struct octeon_device *oct_dev = lio->oct_dev;
365         struct octeon_soft_command *sc;
366         struct oct_mdio_cmd_resp *mdio_cmd_rsp;
367         struct oct_mdio_cmd_context *mdio_cmd_ctx;
368         struct oct_mdio_cmd *mdio_cmd;
369         int retval = 0;
370
371         sc = (struct octeon_soft_command *)
372                 octeon_alloc_soft_command(oct_dev,
373                                           sizeof(struct oct_mdio_cmd),
374                                           sizeof(struct oct_mdio_cmd_resp),
375                                           sizeof(struct oct_mdio_cmd_context));
376
377         if (!sc)
378                 return -ENOMEM;
379
380         mdio_cmd_ctx = (struct oct_mdio_cmd_context *)sc->ctxptr;
381         mdio_cmd_rsp = (struct oct_mdio_cmd_resp *)sc->virtrptr;
382         mdio_cmd = (struct oct_mdio_cmd *)sc->virtdptr;
383
384         WRITE_ONCE(mdio_cmd_ctx->cond, 0);
385         mdio_cmd_ctx->octeon_id = lio_get_device_id(oct_dev);
386         mdio_cmd->op = op;
387         mdio_cmd->mdio_addr = loc;
388         if (op)
389                 mdio_cmd->value1 = *value;
390         octeon_swap_8B_data((u64 *)mdio_cmd, sizeof(struct oct_mdio_cmd) / 8);
391
392         sc->iq_no = lio->linfo.txpciq[0].s.q_no;
393
394         octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC, OPCODE_NIC_MDIO45,
395                                     0, 0, 0);
396
397         sc->wait_time = 1000;
398         sc->callback = octnet_mdio_resp_callback;
399         sc->callback_arg = sc;
400
401         init_waitqueue_head(&mdio_cmd_ctx->wc);
402
403         retval = octeon_send_soft_command(oct_dev, sc);
404
405         if (retval == IQ_SEND_FAILED) {
406                 dev_err(&oct_dev->pci_dev->dev,
407                         "octnet_mdio45_access instruction failed status: %x\n",
408                         retval);
409                 retval =  -EBUSY;
410         } else {
411                 /* Sleep on a wait queue till the cond flag indicates that the
412                  * response arrived
413                  */
414                 sleep_cond(&mdio_cmd_ctx->wc, &mdio_cmd_ctx->cond);
415                 retval = mdio_cmd_rsp->status;
416                 if (retval) {
417                         dev_err(&oct_dev->pci_dev->dev, "octnet mdio45 access failed\n");
418                         retval = -EBUSY;
419                 } else {
420                         octeon_swap_8B_data((u64 *)(&mdio_cmd_rsp->resp),
421                                             sizeof(struct oct_mdio_cmd) / 8);
422
423                         if (READ_ONCE(mdio_cmd_ctx->cond) == 1) {
424                                 if (!op)
425                                         *value = mdio_cmd_rsp->resp.value1;
426                         } else {
427                                 retval = -EINVAL;
428                         }
429                 }
430         }
431
432         octeon_free_soft_command(oct_dev, sc);
433
434         return retval;
435 }
436
437 static int lio_set_phys_id(struct net_device *netdev,
438                            enum ethtool_phys_id_state state)
439 {
440         struct lio *lio = GET_LIO(netdev);
441         struct octeon_device *oct = lio->oct_dev;
442         int value, ret;
443
444         switch (state) {
445         case ETHTOOL_ID_ACTIVE:
446                 if (oct->chip_id == OCTEON_CN66XX) {
447                         octnet_gpio_access(netdev, VITESSE_PHY_GPIO_CFG,
448                                            VITESSE_PHY_GPIO_DRIVEON);
449                         return 2;
450
451                 } else if (oct->chip_id == OCTEON_CN68XX) {
452                         /* Save the current LED settings */
453                         ret = octnet_mdio45_access(lio, 0,
454                                                    LIO68XX_LED_BEACON_ADDR,
455                                                    &lio->phy_beacon_val);
456                         if (ret)
457                                 return ret;
458
459                         ret = octnet_mdio45_access(lio, 0,
460                                                    LIO68XX_LED_CTRL_ADDR,
461                                                    &lio->led_ctrl_val);
462                         if (ret)
463                                 return ret;
464
465                         /* Configure Beacon values */
466                         value = LIO68XX_LED_BEACON_CFGON;
467                         ret = octnet_mdio45_access(lio, 1,
468                                                    LIO68XX_LED_BEACON_ADDR,
469                                                    &value);
470                         if (ret)
471                                 return ret;
472
473                         value = LIO68XX_LED_CTRL_CFGON;
474                         ret = octnet_mdio45_access(lio, 1,
475                                                    LIO68XX_LED_CTRL_ADDR,
476                                                    &value);
477                         if (ret)
478                                 return ret;
479                 } else {
480                         return -EINVAL;
481                 }
482                 break;
483
484         case ETHTOOL_ID_ON:
485                 if (oct->chip_id == OCTEON_CN66XX) {
486                         octnet_gpio_access(netdev, VITESSE_PHY_GPIO_CFG,
487                                            VITESSE_PHY_GPIO_HIGH);
488
489                 } else if (oct->chip_id == OCTEON_CN68XX) {
490                         return -EINVAL;
491                 } else {
492                         return -EINVAL;
493                 }
494                 break;
495
496         case ETHTOOL_ID_OFF:
497                 if (oct->chip_id == OCTEON_CN66XX)
498                         octnet_gpio_access(netdev, VITESSE_PHY_GPIO_CFG,
499                                            VITESSE_PHY_GPIO_LOW);
500                 else if (oct->chip_id == OCTEON_CN68XX)
501                         return -EINVAL;
502                 else
503                         return -EINVAL;
504
505                 break;
506
507         case ETHTOOL_ID_INACTIVE:
508                 if (oct->chip_id == OCTEON_CN66XX) {
509                         octnet_gpio_access(netdev, VITESSE_PHY_GPIO_CFG,
510                                            VITESSE_PHY_GPIO_DRIVEOFF);
511                 } else if (oct->chip_id == OCTEON_CN68XX) {
512                         /* Restore LED settings */
513                         ret = octnet_mdio45_access(lio, 1,
514                                                    LIO68XX_LED_CTRL_ADDR,
515                                                    &lio->led_ctrl_val);
516                         if (ret)
517                                 return ret;
518
519                         ret = octnet_mdio45_access(lio, 1,
520                                                    LIO68XX_LED_BEACON_ADDR,
521                                                    &lio->phy_beacon_val);
522                         if (ret)
523                                 return ret;
524
525                 } else {
526                         return -EINVAL;
527                 }
528                 break;
529
530         default:
531                 return -EINVAL;
532         }
533
534         return 0;
535 }
536
537 static void
538 lio_ethtool_get_ringparam(struct net_device *netdev,
539                           struct ethtool_ringparam *ering)
540 {
541         struct lio *lio = GET_LIO(netdev);
542         struct octeon_device *oct = lio->oct_dev;
543         u32 tx_max_pending = 0, rx_max_pending = 0, tx_pending = 0,
544             rx_pending = 0;
545
546         if (OCTEON_CN6XXX(oct)) {
547                 struct octeon_config *conf6x = CHIP_FIELD(oct, cn6xxx, conf);
548
549                 tx_max_pending = CN6XXX_MAX_IQ_DESCRIPTORS;
550                 rx_max_pending = CN6XXX_MAX_OQ_DESCRIPTORS;
551                 rx_pending = CFG_GET_NUM_RX_DESCS_NIC_IF(conf6x, lio->ifidx);
552                 tx_pending = CFG_GET_NUM_TX_DESCS_NIC_IF(conf6x, lio->ifidx);
553         }
554
555         if (lio->mtu > OCTNET_DEFAULT_FRM_SIZE - OCTNET_FRM_HEADER_SIZE) {
556                 ering->rx_pending = 0;
557                 ering->rx_max_pending = 0;
558                 ering->rx_mini_pending = 0;
559                 ering->rx_jumbo_pending = rx_pending;
560                 ering->rx_mini_max_pending = 0;
561                 ering->rx_jumbo_max_pending = rx_max_pending;
562         } else {
563                 ering->rx_pending = rx_pending;
564                 ering->rx_max_pending = rx_max_pending;
565                 ering->rx_mini_pending = 0;
566                 ering->rx_jumbo_pending = 0;
567                 ering->rx_mini_max_pending = 0;
568                 ering->rx_jumbo_max_pending = 0;
569         }
570
571         ering->tx_pending = tx_pending;
572         ering->tx_max_pending = tx_max_pending;
573 }
574
575 static u32 lio_get_msglevel(struct net_device *netdev)
576 {
577         struct lio *lio = GET_LIO(netdev);
578
579         return lio->msg_enable;
580 }
581
582 static void lio_set_msglevel(struct net_device *netdev, u32 msglvl)
583 {
584         struct lio *lio = GET_LIO(netdev);
585
586         if ((msglvl ^ lio->msg_enable) & NETIF_MSG_HW) {
587                 if (msglvl & NETIF_MSG_HW)
588                         liquidio_set_feature(netdev,
589                                              OCTNET_CMD_VERBOSE_ENABLE, 0);
590                 else
591                         liquidio_set_feature(netdev,
592                                              OCTNET_CMD_VERBOSE_DISABLE, 0);
593         }
594
595         lio->msg_enable = msglvl;
596 }
597
598 static void
599 lio_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
600 {
601         /* Notes: Not supporting any auto negotiation in these
602          * drivers. Just report pause frame support.
603          */
604         struct lio *lio = GET_LIO(netdev);
605         struct octeon_device *oct = lio->oct_dev;
606
607         pause->autoneg = 0;
608
609         pause->tx_pause = oct->tx_pause;
610         pause->rx_pause = oct->rx_pause;
611 }
612
613 static void
614 lio_get_ethtool_stats(struct net_device *netdev,
615                       struct ethtool_stats *stats  __attribute__((unused)),
616                       u64 *data)
617 {
618         struct lio *lio = GET_LIO(netdev);
619         struct octeon_device *oct_dev = lio->oct_dev;
620         struct net_device_stats *netstats = &netdev->stats;
621         int i = 0, j;
622
623         netdev->netdev_ops->ndo_get_stats(netdev);
624         octnet_get_link_stats(netdev);
625
626         /*sum of oct->droq[oq_no]->stats->rx_pkts_received */
627         data[i++] = CVM_CAST64(netstats->rx_packets);
628         /*sum of oct->instr_queue[iq_no]->stats.tx_done */
629         data[i++] = CVM_CAST64(netstats->tx_packets);
630         /*sum of oct->droq[oq_no]->stats->rx_bytes_received */
631         data[i++] = CVM_CAST64(netstats->rx_bytes);
632         /*sum of oct->instr_queue[iq_no]->stats.tx_tot_bytes */
633         data[i++] = CVM_CAST64(netstats->tx_bytes);
634         data[i++] = CVM_CAST64(netstats->rx_errors);
635         data[i++] = CVM_CAST64(netstats->tx_errors);
636         /*sum of oct->droq[oq_no]->stats->rx_dropped +
637          *oct->droq[oq_no]->stats->dropped_nodispatch +
638          *oct->droq[oq_no]->stats->dropped_toomany +
639          *oct->droq[oq_no]->stats->dropped_nomem
640          */
641         data[i++] = CVM_CAST64(netstats->rx_dropped);
642         /*sum of oct->instr_queue[iq_no]->stats.tx_dropped */
643         data[i++] = CVM_CAST64(netstats->tx_dropped);
644
645         /*data[i++] = CVM_CAST64(stats->multicast); */
646         /*data[i++] = CVM_CAST64(stats->collisions); */
647
648         /* firmware tx stats */
649         /*per_core_stats[cvmx_get_core_num()].link_stats[mdata->from_ifidx].
650          *fromhost.fw_total_sent
651          */
652         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_total_sent);
653         /*per_core_stats[i].link_stats[port].fromwire.fw_total_fwd */
654         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_total_fwd);
655         /*per_core_stats[j].link_stats[i].fromhost.fw_err_pko */
656         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_err_pko);
657         /*per_core_stats[j].link_stats[i].fromhost.fw_err_link */
658         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_err_link);
659         /*per_core_stats[cvmx_get_core_num()].link_stats[idx].fromhost.
660          *fw_err_drop
661          */
662         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_err_drop);
663
664         /*per_core_stats[cvmx_get_core_num()].link_stats[idx].fromhost.fw_tso */
665         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_tso);
666         /*per_core_stats[cvmx_get_core_num()].link_stats[idx].fromhost.
667          *fw_tso_fwd
668          */
669         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_tso_fwd);
670         /*per_core_stats[cvmx_get_core_num()].link_stats[idx].fromhost.
671          *fw_err_tso
672          */
673         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_err_tso);
674         /*per_core_stats[cvmx_get_core_num()].link_stats[idx].fromhost.
675          *fw_tx_vxlan
676          */
677         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fw_tx_vxlan);
678
679         /* mac tx statistics */
680         /*CVMX_BGXX_CMRX_TX_STAT5 */
681         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.total_pkts_sent);
682         /*CVMX_BGXX_CMRX_TX_STAT4 */
683         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.total_bytes_sent);
684         /*CVMX_BGXX_CMRX_TX_STAT15 */
685         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.mcast_pkts_sent);
686         /*CVMX_BGXX_CMRX_TX_STAT14 */
687         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.bcast_pkts_sent);
688         /*CVMX_BGXX_CMRX_TX_STAT17 */
689         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.ctl_sent);
690         /*CVMX_BGXX_CMRX_TX_STAT0 */
691         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.total_collisions);
692         /*CVMX_BGXX_CMRX_TX_STAT3 */
693         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.one_collision_sent);
694         /*CVMX_BGXX_CMRX_TX_STAT2 */
695         data[i++] =
696                 CVM_CAST64(oct_dev->link_stats.fromhost.multi_collision_sent);
697         /*CVMX_BGXX_CMRX_TX_STAT0 */
698         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.max_collision_fail);
699         /*CVMX_BGXX_CMRX_TX_STAT1 */
700         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.max_deferral_fail);
701         /*CVMX_BGXX_CMRX_TX_STAT16 */
702         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.fifo_err);
703         /*CVMX_BGXX_CMRX_TX_STAT6 */
704         data[i++] = CVM_CAST64(oct_dev->link_stats.fromhost.runts);
705
706         /* RX firmware stats */
707         /*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
708          *fw_total_rcvd
709          */
710         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_total_rcvd);
711         /*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
712          *fw_total_fwd
713          */
714         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_total_fwd);
715         /*per_core_stats[core_id].link_stats[ifidx].fromwire.jabber_err */
716         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.jabber_err);
717         /*per_core_stats[core_id].link_stats[ifidx].fromwire.l2_err */
718         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.l2_err);
719         /*per_core_stats[core_id].link_stats[ifidx].fromwire.frame_err */
720         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.frame_err);
721         /*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
722          *fw_err_pko
723          */
724         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_err_pko);
725         /*per_core_stats[j].link_stats[i].fromwire.fw_err_link */
726         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_err_link);
727         /*per_core_stats[cvmx_get_core_num()].link_stats[lro_ctx->ifidx].
728          *fromwire.fw_err_drop
729          */
730         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_err_drop);
731
732         /*per_core_stats[cvmx_get_core_num()].link_stats[lro_ctx->ifidx].
733          *fromwire.fw_rx_vxlan
734          */
735         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_rx_vxlan);
736         /*per_core_stats[cvmx_get_core_num()].link_stats[lro_ctx->ifidx].
737          *fromwire.fw_rx_vxlan_err
738          */
739         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_rx_vxlan_err);
740
741         /* LRO */
742         /*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
743          *fw_lro_pkts
744          */
745         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_pkts);
746         /*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
747          *fw_lro_octs
748          */
749         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_octs);
750         /*per_core_stats[j].link_stats[i].fromwire.fw_total_lro */
751         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_total_lro);
752         /*per_core_stats[j].link_stats[i].fromwire.fw_lro_aborts */
753         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_aborts);
754         /*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
755          *fw_lro_aborts_port
756          */
757         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_aborts_port);
758         /*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
759          *fw_lro_aborts_seq
760          */
761         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_aborts_seq);
762         /*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
763          *fw_lro_aborts_tsval
764          */
765         data[i++] =
766                 CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_aborts_tsval);
767         /*per_core_stats[cvmx_get_core_num()].link_stats[ifidx].fromwire.
768          *fw_lro_aborts_timer
769          */
770         /* intrmod: packet forward rate */
771         data[i++] =
772                 CVM_CAST64(oct_dev->link_stats.fromwire.fw_lro_aborts_timer);
773         /*per_core_stats[j].link_stats[i].fromwire.fw_lro_aborts */
774         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fwd_rate);
775
776         /* mac: link-level stats */
777         /*CVMX_BGXX_CMRX_RX_STAT0 */
778         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.total_rcvd);
779         /*CVMX_BGXX_CMRX_RX_STAT1 */
780         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.bytes_rcvd);
781         /*CVMX_PKI_STATX_STAT5 */
782         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.total_bcst);
783         /*CVMX_PKI_STATX_STAT5 */
784         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.total_mcst);
785         /*wqe->word2.err_code or wqe->word2.err_level */
786         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.runts);
787         /*CVMX_BGXX_CMRX_RX_STAT2 */
788         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.ctl_rcvd);
789         /*CVMX_BGXX_CMRX_RX_STAT6 */
790         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fifo_err);
791         /*CVMX_BGXX_CMRX_RX_STAT4 */
792         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.dmac_drop);
793         /*wqe->word2.err_code or wqe->word2.err_level */
794         data[i++] = CVM_CAST64(oct_dev->link_stats.fromwire.fcs_err);
795         /*lio->link_changes*/
796         data[i++] = CVM_CAST64(lio->link_changes);
797
798         /* TX  -- lio_update_stats(lio); */
799         for (j = 0; j < MAX_OCTEON_INSTR_QUEUES(oct_dev); j++) {
800                 if (!(oct_dev->io_qmask.iq & (1ULL << j)))
801                         continue;
802                 /*packets to network port*/
803                 /*# of packets tx to network */
804                 data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_done);
805                 /*# of bytes tx to network */
806                 data[i++] =
807                         CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_tot_bytes);
808                 /*# of packets dropped */
809                 data[i++] =
810                         CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_dropped);
811                 /*# of tx fails due to queue full */
812                 data[i++] =
813                         CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_iq_busy);
814                 /*XXX gather entries sent */
815                 data[i++] =
816                         CVM_CAST64(oct_dev->instr_queue[j]->stats.sgentry_sent);
817
818                 /*instruction to firmware: data and control */
819                 /*# of instructions to the queue */
820                 data[i++] =
821                         CVM_CAST64(oct_dev->instr_queue[j]->stats.instr_posted);
822                 /*# of instructions processed */
823                 data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->
824                                        stats.instr_processed);
825                 /*# of instructions could not be processed */
826                 data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->
827                                        stats.instr_dropped);
828                 /*bytes sent through the queue */
829                 data[i++] =
830                         CVM_CAST64(oct_dev->instr_queue[j]->stats.bytes_sent);
831
832                 /*tso request*/
833                 data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_gso);
834                 /*vxlan request*/
835                 data[i++] = CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_vxlan);
836                 /*txq restart*/
837                 data[i++] =
838                         CVM_CAST64(oct_dev->instr_queue[j]->stats.tx_restart);
839         }
840
841         /* RX */
842         /* for (j = 0; j < oct_dev->num_oqs; j++) { */
843         for (j = 0; j < MAX_OCTEON_OUTPUT_QUEUES(oct_dev); j++) {
844                 if (!(oct_dev->io_qmask.oq & (1ULL << j)))
845                         continue;
846
847                 /*packets send to TCP/IP network stack */
848                 /*# of packets to network stack */
849                 data[i++] =
850                         CVM_CAST64(oct_dev->droq[j]->stats.rx_pkts_received);
851                 /*# of bytes to network stack */
852                 data[i++] =
853                         CVM_CAST64(oct_dev->droq[j]->stats.rx_bytes_received);
854                 /*# of packets dropped */
855                 data[i++] = CVM_CAST64(oct_dev->droq[j]->stats.dropped_nomem +
856                                        oct_dev->droq[j]->stats.dropped_toomany +
857                                        oct_dev->droq[j]->stats.rx_dropped);
858                 data[i++] =
859                         CVM_CAST64(oct_dev->droq[j]->stats.dropped_nomem);
860                 data[i++] =
861                         CVM_CAST64(oct_dev->droq[j]->stats.dropped_toomany);
862                 data[i++] =
863                         CVM_CAST64(oct_dev->droq[j]->stats.rx_dropped);
864
865                 /*control and data path*/
866                 data[i++] =
867                         CVM_CAST64(oct_dev->droq[j]->stats.pkts_received);
868                 data[i++] =
869                         CVM_CAST64(oct_dev->droq[j]->stats.bytes_received);
870                 data[i++] =
871                         CVM_CAST64(oct_dev->droq[j]->stats.dropped_nodispatch);
872
873                 data[i++] =
874                         CVM_CAST64(oct_dev->droq[j]->stats.rx_vxlan);
875                 data[i++] =
876                         CVM_CAST64(oct_dev->droq[j]->stats.rx_alloc_failure);
877         }
878 }
879
880 static void lio_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
881 {
882         struct lio *lio = GET_LIO(netdev);
883         struct octeon_device *oct_dev = lio->oct_dev;
884         int num_iq_stats, num_oq_stats, i, j;
885         int num_stats;
886
887         switch (stringset) {
888         case ETH_SS_STATS:
889                 num_stats = ARRAY_SIZE(oct_stats_strings);
890                 for (j = 0; j < num_stats; j++) {
891                         sprintf(data, "%s", oct_stats_strings[j]);
892                         data += ETH_GSTRING_LEN;
893                 }
894
895                 num_iq_stats = ARRAY_SIZE(oct_iq_stats_strings);
896                 for (i = 0; i < MAX_OCTEON_INSTR_QUEUES(oct_dev); i++) {
897                         if (!(oct_dev->io_qmask.iq & (1ULL << i)))
898                                 continue;
899                         for (j = 0; j < num_iq_stats; j++) {
900                                 sprintf(data, "tx-%d-%s", i,
901                                         oct_iq_stats_strings[j]);
902                                 data += ETH_GSTRING_LEN;
903                         }
904                 }
905
906                 num_oq_stats = ARRAY_SIZE(oct_droq_stats_strings);
907                 /* for (i = 0; i < oct_dev->num_oqs; i++) { */
908                 for (i = 0; i < MAX_OCTEON_OUTPUT_QUEUES(oct_dev); i++) {
909                         if (!(oct_dev->io_qmask.oq & (1ULL << i)))
910                                 continue;
911                         for (j = 0; j < num_oq_stats; j++) {
912                                 sprintf(data, "rx-%d-%s", i,
913                                         oct_droq_stats_strings[j]);
914                                 data += ETH_GSTRING_LEN;
915                         }
916                 }
917                 break;
918
919         default:
920                 netif_info(lio, drv, lio->netdev, "Unknown Stringset !!\n");
921                 break;
922         }
923 }
924
925 static int lio_get_sset_count(struct net_device *netdev, int sset)
926 {
927         struct lio *lio = GET_LIO(netdev);
928         struct octeon_device *oct_dev = lio->oct_dev;
929
930         switch (sset) {
931         case ETH_SS_STATS:
932                 return (ARRAY_SIZE(oct_stats_strings) +
933                         ARRAY_SIZE(oct_iq_stats_strings) * oct_dev->num_iqs +
934                         ARRAY_SIZE(oct_droq_stats_strings) * oct_dev->num_oqs);
935         default:
936                 return -EOPNOTSUPP;
937         }
938 }
939
940 static int lio_get_intr_coalesce(struct net_device *netdev,
941                                  struct ethtool_coalesce *intr_coal)
942 {
943         struct lio *lio = GET_LIO(netdev);
944         struct octeon_device *oct = lio->oct_dev;
945         struct octeon_instr_queue *iq;
946         struct oct_intrmod_cfg *intrmod_cfg;
947
948         intrmod_cfg = &oct->intrmod;
949
950         switch (oct->chip_id) {
951         case OCTEON_CN68XX:
952         case OCTEON_CN66XX: {
953                 struct octeon_cn6xxx *cn6xxx =
954                         (struct octeon_cn6xxx *)oct->chip;
955
956                 if (!intrmod_cfg->rx_enable) {
957                         intr_coal->rx_coalesce_usecs =
958                                 CFG_GET_OQ_INTR_TIME(cn6xxx->conf);
959                         intr_coal->rx_max_coalesced_frames =
960                                 CFG_GET_OQ_INTR_PKT(cn6xxx->conf);
961                 }
962                 iq = oct->instr_queue[lio->linfo.txpciq[0].s.q_no];
963                 intr_coal->tx_max_coalesced_frames = iq->fill_threshold;
964                 break;
965         }
966         default:
967                 netif_info(lio, drv, lio->netdev, "Unknown Chip !!\n");
968                 return -EINVAL;
969         }
970         if (intrmod_cfg->rx_enable) {
971                 intr_coal->use_adaptive_rx_coalesce =
972                         intrmod_cfg->rx_enable;
973                 intr_coal->rate_sample_interval =
974                         intrmod_cfg->check_intrvl;
975                 intr_coal->pkt_rate_high =
976                         intrmod_cfg->maxpkt_ratethr;
977                 intr_coal->pkt_rate_low =
978                         intrmod_cfg->minpkt_ratethr;
979                 intr_coal->rx_max_coalesced_frames_high =
980                         intrmod_cfg->rx_maxcnt_trigger;
981                 intr_coal->rx_coalesce_usecs_high =
982                         intrmod_cfg->rx_maxtmr_trigger;
983                 intr_coal->rx_coalesce_usecs_low =
984                         intrmod_cfg->rx_mintmr_trigger;
985                 intr_coal->rx_max_coalesced_frames_low =
986                         intrmod_cfg->rx_mincnt_trigger;
987         }
988         return 0;
989 }
990
991 /* Callback function for intrmod */
992 static void octnet_intrmod_callback(struct octeon_device *oct_dev,
993                                     u32 status,
994                                     void *ptr)
995 {
996         struct oct_intrmod_cmd *cmd = ptr;
997         struct octeon_soft_command *sc = cmd->sc;
998
999         oct_dev = cmd->oct_dev;
1000
1001         if (status)
1002                 dev_err(&oct_dev->pci_dev->dev, "intrmod config failed. Status: %llx\n",
1003                         CVM_CAST64(status));
1004         else
1005                 dev_info(&oct_dev->pci_dev->dev,
1006                          "Rx-Adaptive Interrupt moderation enabled:%llx\n",
1007                          oct_dev->intrmod.rx_enable);
1008
1009         octeon_free_soft_command(oct_dev, sc);
1010 }
1011
1012 /*  Configure interrupt moderation parameters */
1013 static int octnet_set_intrmod_cfg(struct lio *lio,
1014                                   struct oct_intrmod_cfg *intr_cfg)
1015 {
1016         struct octeon_soft_command *sc;
1017         struct oct_intrmod_cmd *cmd;
1018         struct oct_intrmod_cfg *cfg;
1019         int retval;
1020         struct octeon_device *oct_dev = lio->oct_dev;
1021
1022         /* Alloc soft command */
1023         sc = (struct octeon_soft_command *)
1024                 octeon_alloc_soft_command(oct_dev,
1025                                           sizeof(struct oct_intrmod_cfg),
1026                                           0,
1027                                           sizeof(struct oct_intrmod_cmd));
1028
1029         if (!sc)
1030                 return -ENOMEM;
1031
1032         cmd = (struct oct_intrmod_cmd *)sc->ctxptr;
1033         cfg = (struct oct_intrmod_cfg *)sc->virtdptr;
1034
1035         memcpy(cfg, intr_cfg, sizeof(struct oct_intrmod_cfg));
1036         octeon_swap_8B_data((u64 *)cfg, (sizeof(struct oct_intrmod_cfg)) / 8);
1037         cmd->sc = sc;
1038         cmd->cfg = cfg;
1039         cmd->oct_dev = oct_dev;
1040
1041         sc->iq_no = lio->linfo.txpciq[0].s.q_no;
1042
1043         octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC,
1044                                     OPCODE_NIC_INTRMOD_CFG, 0, 0, 0);
1045
1046         sc->callback = octnet_intrmod_callback;
1047         sc->callback_arg = cmd;
1048         sc->wait_time = 1000;
1049
1050         retval = octeon_send_soft_command(oct_dev, sc);
1051         if (retval == IQ_SEND_FAILED) {
1052                 octeon_free_soft_command(oct_dev, sc);
1053                 return -EINVAL;
1054         }
1055
1056         return 0;
1057 }
1058
1059 static void
1060 octnet_nic_stats_callback(struct octeon_device *oct_dev,
1061                           u32 status, void *ptr)
1062 {
1063         struct octeon_soft_command  *sc = (struct octeon_soft_command  *)ptr;
1064         struct oct_nic_stats_resp *resp = (struct oct_nic_stats_resp *)
1065                 sc->virtrptr;
1066         struct oct_nic_stats_ctrl *ctrl = (struct oct_nic_stats_ctrl *)
1067                 sc->ctxptr;
1068         struct nic_rx_stats *rsp_rstats = &resp->stats.fromwire;
1069         struct nic_tx_stats *rsp_tstats = &resp->stats.fromhost;
1070
1071         struct nic_rx_stats *rstats = &oct_dev->link_stats.fromwire;
1072         struct nic_tx_stats *tstats = &oct_dev->link_stats.fromhost;
1073
1074         if ((status != OCTEON_REQUEST_TIMEOUT) && !resp->status) {
1075                 octeon_swap_8B_data((u64 *)&resp->stats,
1076                                     (sizeof(struct oct_link_stats)) >> 3);
1077
1078                 /* RX link-level stats */
1079                 rstats->total_rcvd = rsp_rstats->total_rcvd;
1080                 rstats->bytes_rcvd = rsp_rstats->bytes_rcvd;
1081                 rstats->total_bcst = rsp_rstats->total_bcst;
1082                 rstats->total_mcst = rsp_rstats->total_mcst;
1083                 rstats->runts      = rsp_rstats->runts;
1084                 rstats->ctl_rcvd   = rsp_rstats->ctl_rcvd;
1085                 /* Accounts for over/under-run of buffers */
1086                 rstats->fifo_err  = rsp_rstats->fifo_err;
1087                 rstats->dmac_drop = rsp_rstats->dmac_drop;
1088                 rstats->fcs_err   = rsp_rstats->fcs_err;
1089                 rstats->jabber_err = rsp_rstats->jabber_err;
1090                 rstats->l2_err    = rsp_rstats->l2_err;
1091                 rstats->frame_err = rsp_rstats->frame_err;
1092
1093                 /* RX firmware stats */
1094                 rstats->fw_total_rcvd = rsp_rstats->fw_total_rcvd;
1095                 rstats->fw_total_fwd = rsp_rstats->fw_total_fwd;
1096                 rstats->fw_err_pko = rsp_rstats->fw_err_pko;
1097                 rstats->fw_err_link = rsp_rstats->fw_err_link;
1098                 rstats->fw_err_drop = rsp_rstats->fw_err_drop;
1099                 rstats->fw_rx_vxlan = rsp_rstats->fw_rx_vxlan;
1100                 rstats->fw_rx_vxlan_err = rsp_rstats->fw_rx_vxlan_err;
1101
1102                 /* Number of packets that are LROed      */
1103                 rstats->fw_lro_pkts = rsp_rstats->fw_lro_pkts;
1104                 /* Number of octets that are LROed       */
1105                 rstats->fw_lro_octs = rsp_rstats->fw_lro_octs;
1106                 /* Number of LRO packets formed          */
1107                 rstats->fw_total_lro = rsp_rstats->fw_total_lro;
1108                 /* Number of times lRO of packet aborted */
1109                 rstats->fw_lro_aborts = rsp_rstats->fw_lro_aborts;
1110                 rstats->fw_lro_aborts_port = rsp_rstats->fw_lro_aborts_port;
1111                 rstats->fw_lro_aborts_seq = rsp_rstats->fw_lro_aborts_seq;
1112                 rstats->fw_lro_aborts_tsval = rsp_rstats->fw_lro_aborts_tsval;
1113                 rstats->fw_lro_aborts_timer = rsp_rstats->fw_lro_aborts_timer;
1114                 /* intrmod: packet forward rate */
1115                 rstats->fwd_rate = rsp_rstats->fwd_rate;
1116
1117                 /* TX link-level stats */
1118                 tstats->total_pkts_sent = rsp_tstats->total_pkts_sent;
1119                 tstats->total_bytes_sent = rsp_tstats->total_bytes_sent;
1120                 tstats->mcast_pkts_sent = rsp_tstats->mcast_pkts_sent;
1121                 tstats->bcast_pkts_sent = rsp_tstats->bcast_pkts_sent;
1122                 tstats->ctl_sent = rsp_tstats->ctl_sent;
1123                 /* Packets sent after one collision*/
1124                 tstats->one_collision_sent = rsp_tstats->one_collision_sent;
1125                 /* Packets sent after multiple collision*/
1126                 tstats->multi_collision_sent = rsp_tstats->multi_collision_sent;
1127                 /* Packets not sent due to max collisions */
1128                 tstats->max_collision_fail = rsp_tstats->max_collision_fail;
1129                 /* Packets not sent due to max deferrals */
1130                 tstats->max_deferral_fail = rsp_tstats->max_deferral_fail;
1131                 /* Accounts for over/under-run of buffers */
1132                 tstats->fifo_err = rsp_tstats->fifo_err;
1133                 tstats->runts = rsp_tstats->runts;
1134                 /* Total number of collisions detected */
1135                 tstats->total_collisions = rsp_tstats->total_collisions;
1136
1137                 /* firmware stats */
1138                 tstats->fw_total_sent = rsp_tstats->fw_total_sent;
1139                 tstats->fw_total_fwd = rsp_tstats->fw_total_fwd;
1140                 tstats->fw_err_pko = rsp_tstats->fw_err_pko;
1141                 tstats->fw_err_link = rsp_tstats->fw_err_link;
1142                 tstats->fw_err_drop = rsp_tstats->fw_err_drop;
1143                 tstats->fw_tso = rsp_tstats->fw_tso;
1144                 tstats->fw_tso_fwd = rsp_tstats->fw_tso_fwd;
1145                 tstats->fw_err_tso = rsp_tstats->fw_err_tso;
1146                 tstats->fw_tx_vxlan = rsp_tstats->fw_tx_vxlan;
1147
1148                 resp->status = 1;
1149         } else {
1150                 resp->status = -1;
1151         }
1152         complete(&ctrl->complete);
1153 }
1154
1155 /*  Configure interrupt moderation parameters */
1156 static int octnet_get_link_stats(struct net_device *netdev)
1157 {
1158         struct lio *lio = GET_LIO(netdev);
1159         struct octeon_device *oct_dev = lio->oct_dev;
1160
1161         struct octeon_soft_command *sc;
1162         struct oct_nic_stats_ctrl *ctrl;
1163         struct oct_nic_stats_resp *resp;
1164
1165         int retval;
1166
1167         /* Alloc soft command */
1168         sc = (struct octeon_soft_command *)
1169                 octeon_alloc_soft_command(oct_dev,
1170                                           0,
1171                                           sizeof(struct oct_nic_stats_resp),
1172                                           sizeof(struct octnic_ctrl_pkt));
1173
1174         if (!sc)
1175                 return -ENOMEM;
1176
1177         resp = (struct oct_nic_stats_resp *)sc->virtrptr;
1178         memset(resp, 0, sizeof(struct oct_nic_stats_resp));
1179
1180         ctrl = (struct oct_nic_stats_ctrl *)sc->ctxptr;
1181         memset(ctrl, 0, sizeof(struct oct_nic_stats_ctrl));
1182         ctrl->netdev = netdev;
1183         init_completion(&ctrl->complete);
1184
1185         sc->iq_no = lio->linfo.txpciq[0].s.q_no;
1186
1187         octeon_prepare_soft_command(oct_dev, sc, OPCODE_NIC,
1188                                     OPCODE_NIC_PORT_STATS, 0, 0, 0);
1189
1190         sc->callback = octnet_nic_stats_callback;
1191         sc->callback_arg = sc;
1192         sc->wait_time = 500;    /*in milli seconds*/
1193
1194         retval = octeon_send_soft_command(oct_dev, sc);
1195         if (retval == IQ_SEND_FAILED) {
1196                 octeon_free_soft_command(oct_dev, sc);
1197                 return -EINVAL;
1198         }
1199
1200         wait_for_completion_timeout(&ctrl->complete, msecs_to_jiffies(1000));
1201
1202         if (resp->status != 1) {
1203                 octeon_free_soft_command(oct_dev, sc);
1204
1205                 return -EINVAL;
1206         }
1207
1208         octeon_free_soft_command(oct_dev, sc);
1209
1210         return 0;
1211 }
1212
1213 /* Enable/Disable auto interrupt Moderation */
1214 static int oct_cfg_adaptive_intr(struct lio *lio, struct ethtool_coalesce
1215                                  *intr_coal)
1216 {
1217         int ret = 0;
1218         struct octeon_device *oct = lio->oct_dev;
1219         struct oct_intrmod_cfg *intrmod_cfg;
1220
1221         intrmod_cfg = &oct->intrmod;
1222
1223         if (oct->intrmod.rx_enable || oct->intrmod.tx_enable) {
1224                 if (intr_coal->rate_sample_interval)
1225                         intrmod_cfg->check_intrvl =
1226                                 intr_coal->rate_sample_interval;
1227                 else
1228                         intrmod_cfg->check_intrvl =
1229                                 LIO_INTRMOD_CHECK_INTERVAL;
1230
1231                 if (intr_coal->pkt_rate_high)
1232                         intrmod_cfg->maxpkt_ratethr =
1233                                 intr_coal->pkt_rate_high;
1234                 else
1235                         intrmod_cfg->maxpkt_ratethr =
1236                                 LIO_INTRMOD_MAXPKT_RATETHR;
1237
1238                 if (intr_coal->pkt_rate_low)
1239                         intrmod_cfg->minpkt_ratethr =
1240                                 intr_coal->pkt_rate_low;
1241                 else
1242                         intrmod_cfg->minpkt_ratethr =
1243                                 LIO_INTRMOD_MINPKT_RATETHR;
1244         }
1245         if (oct->intrmod.rx_enable) {
1246                 if (intr_coal->rx_max_coalesced_frames_high)
1247                         intrmod_cfg->rx_maxcnt_trigger =
1248                                 intr_coal->rx_max_coalesced_frames_high;
1249                 else
1250                         intrmod_cfg->rx_maxcnt_trigger =
1251                                 LIO_INTRMOD_RXMAXCNT_TRIGGER;
1252
1253                 if (intr_coal->rx_coalesce_usecs_high)
1254                         intrmod_cfg->rx_maxtmr_trigger =
1255                                 intr_coal->rx_coalesce_usecs_high;
1256                 else
1257                         intrmod_cfg->rx_maxtmr_trigger =
1258                                 LIO_INTRMOD_RXMAXTMR_TRIGGER;
1259
1260                 if (intr_coal->rx_coalesce_usecs_low)
1261                         intrmod_cfg->rx_mintmr_trigger =
1262                                 intr_coal->rx_coalesce_usecs_low;
1263                 else
1264                         intrmod_cfg->rx_mintmr_trigger =
1265                                 LIO_INTRMOD_RXMINTMR_TRIGGER;
1266
1267                 if (intr_coal->rx_max_coalesced_frames_low)
1268                         intrmod_cfg->rx_mincnt_trigger =
1269                                 intr_coal->rx_max_coalesced_frames_low;
1270                 else
1271                         intrmod_cfg->rx_mincnt_trigger =
1272                                 LIO_INTRMOD_RXMINCNT_TRIGGER;
1273         }
1274         if (oct->intrmod.tx_enable) {
1275                 if (intr_coal->tx_max_coalesced_frames_high)
1276                         intrmod_cfg->tx_maxcnt_trigger =
1277                                 intr_coal->tx_max_coalesced_frames_high;
1278                 else
1279                         intrmod_cfg->tx_maxcnt_trigger =
1280                                 LIO_INTRMOD_TXMAXCNT_TRIGGER;
1281                 if (intr_coal->tx_max_coalesced_frames_low)
1282                         intrmod_cfg->tx_mincnt_trigger =
1283                                 intr_coal->tx_max_coalesced_frames_low;
1284                 else
1285                         intrmod_cfg->tx_mincnt_trigger =
1286                                 LIO_INTRMOD_TXMINCNT_TRIGGER;
1287         }
1288
1289         ret = octnet_set_intrmod_cfg(lio, intrmod_cfg);
1290
1291         return ret;
1292 }
1293
1294 static int
1295 oct_cfg_rx_intrcnt(struct lio *lio, struct ethtool_coalesce *intr_coal)
1296 {
1297         struct octeon_device *oct = lio->oct_dev;
1298         u32 rx_max_coalesced_frames;
1299
1300         /* Config Cnt based interrupt values */
1301         switch (oct->chip_id) {
1302         case OCTEON_CN68XX:
1303         case OCTEON_CN66XX: {
1304                 struct octeon_cn6xxx *cn6xxx =
1305                         (struct octeon_cn6xxx *)oct->chip;
1306
1307                 if (!intr_coal->rx_max_coalesced_frames)
1308                         rx_max_coalesced_frames = CN6XXX_OQ_INTR_PKT;
1309                 else
1310                         rx_max_coalesced_frames =
1311                                 intr_coal->rx_max_coalesced_frames;
1312                 octeon_write_csr(oct, CN6XXX_SLI_OQ_INT_LEVEL_PKTS,
1313                                  rx_max_coalesced_frames);
1314                 CFG_SET_OQ_INTR_PKT(cn6xxx->conf, rx_max_coalesced_frames);
1315                 break;
1316         }
1317         default:
1318                 return -EINVAL;
1319         }
1320         return 0;
1321 }
1322
1323 static int oct_cfg_rx_intrtime(struct lio *lio, struct ethtool_coalesce
1324                                *intr_coal)
1325 {
1326         struct octeon_device *oct = lio->oct_dev;
1327         u32 time_threshold, rx_coalesce_usecs;
1328
1329         /* Config Time based interrupt values */
1330         switch (oct->chip_id) {
1331         case OCTEON_CN68XX:
1332         case OCTEON_CN66XX: {
1333                 struct octeon_cn6xxx *cn6xxx =
1334                         (struct octeon_cn6xxx *)oct->chip;
1335                 if (!intr_coal->rx_coalesce_usecs)
1336                         rx_coalesce_usecs = CN6XXX_OQ_INTR_TIME;
1337                 else
1338                         rx_coalesce_usecs = intr_coal->rx_coalesce_usecs;
1339
1340                 time_threshold = lio_cn6xxx_get_oq_ticks(oct,
1341                                                          rx_coalesce_usecs);
1342                 octeon_write_csr(oct,
1343                                  CN6XXX_SLI_OQ_INT_LEVEL_TIME,
1344                                  time_threshold);
1345
1346                 CFG_SET_OQ_INTR_TIME(cn6xxx->conf, rx_coalesce_usecs);
1347                 break;
1348         }
1349         default:
1350                 return -EINVAL;
1351         }
1352
1353         return 0;
1354 }
1355
1356 static int
1357 oct_cfg_tx_intrcnt(struct lio *lio, struct ethtool_coalesce *intr_coal
1358                    __attribute__((unused)))
1359 {
1360         struct octeon_device *oct = lio->oct_dev;
1361
1362         /* Config Cnt based interrupt values */
1363         switch (oct->chip_id) {
1364         case OCTEON_CN68XX:
1365         case OCTEON_CN66XX:
1366                 break;
1367         default:
1368                 return -EINVAL;
1369         }
1370         return 0;
1371 }
1372
1373 static int lio_set_intr_coalesce(struct net_device *netdev,
1374                                  struct ethtool_coalesce *intr_coal)
1375 {
1376         struct lio *lio = GET_LIO(netdev);
1377         int ret;
1378         struct octeon_device *oct = lio->oct_dev;
1379         u32 j, q_no;
1380         int db_max, db_min;
1381
1382         switch (oct->chip_id) {
1383         case OCTEON_CN68XX:
1384         case OCTEON_CN66XX:
1385                 db_min = CN6XXX_DB_MIN;
1386                 db_max = CN6XXX_DB_MAX;
1387                 if ((intr_coal->tx_max_coalesced_frames >= db_min) &&
1388                     (intr_coal->tx_max_coalesced_frames <= db_max)) {
1389                         for (j = 0; j < lio->linfo.num_txpciq; j++) {
1390                                 q_no = lio->linfo.txpciq[j].s.q_no;
1391                                 oct->instr_queue[q_no]->fill_threshold =
1392                                         intr_coal->tx_max_coalesced_frames;
1393                         }
1394                 } else {
1395                         dev_err(&oct->pci_dev->dev,
1396                                 "LIQUIDIO: Invalid tx-frames:%d. Range is min:%d max:%d\n",
1397                                 intr_coal->tx_max_coalesced_frames, db_min,
1398                                 db_max);
1399                         return -EINVAL;
1400                 }
1401                 break;
1402         default:
1403                 return -EINVAL;
1404         }
1405
1406         oct->intrmod.rx_enable = intr_coal->use_adaptive_rx_coalesce ? 1 : 0;
1407         oct->intrmod.tx_enable = intr_coal->use_adaptive_tx_coalesce ? 1 : 0;
1408
1409         ret = oct_cfg_adaptive_intr(lio, intr_coal);
1410
1411         if (!intr_coal->use_adaptive_rx_coalesce) {
1412                 ret = oct_cfg_rx_intrtime(lio, intr_coal);
1413                 if (ret)
1414                         goto ret_intrmod;
1415
1416                 ret = oct_cfg_rx_intrcnt(lio, intr_coal);
1417                 if (ret)
1418                         goto ret_intrmod;
1419         }
1420         if (!intr_coal->use_adaptive_tx_coalesce) {
1421                 ret = oct_cfg_tx_intrcnt(lio, intr_coal);
1422                 if (ret)
1423                         goto ret_intrmod;
1424         }
1425
1426         return 0;
1427 ret_intrmod:
1428         return ret;
1429 }
1430
1431 static int lio_get_ts_info(struct net_device *netdev,
1432                            struct ethtool_ts_info *info)
1433 {
1434         struct lio *lio = GET_LIO(netdev);
1435
1436         info->so_timestamping =
1437 #ifdef PTP_HARDWARE_TIMESTAMPING
1438                 SOF_TIMESTAMPING_TX_HARDWARE |
1439                 SOF_TIMESTAMPING_RX_HARDWARE |
1440                 SOF_TIMESTAMPING_RAW_HARDWARE |
1441                 SOF_TIMESTAMPING_TX_SOFTWARE |
1442 #endif
1443                 SOF_TIMESTAMPING_RX_SOFTWARE |
1444                 SOF_TIMESTAMPING_SOFTWARE;
1445
1446         if (lio->ptp_clock)
1447                 info->phc_index = ptp_clock_index(lio->ptp_clock);
1448         else
1449                 info->phc_index = -1;
1450
1451 #ifdef PTP_HARDWARE_TIMESTAMPING
1452         info->tx_types = (1 << HWTSTAMP_TX_OFF) | (1 << HWTSTAMP_TX_ON);
1453
1454         info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) |
1455                            (1 << HWTSTAMP_FILTER_PTP_V1_L4_EVENT) |
1456                            (1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
1457                            (1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT);
1458 #endif
1459
1460         return 0;
1461 }
1462
1463 static int lio_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
1464 {
1465         struct lio *lio = GET_LIO(netdev);
1466         struct octeon_device *oct = lio->oct_dev;
1467         struct oct_link_info *linfo;
1468         struct octnic_ctrl_pkt nctrl;
1469         int ret = 0;
1470
1471         /* get the link info */
1472         linfo = &lio->linfo;
1473
1474         if (ecmd->autoneg != AUTONEG_ENABLE && ecmd->autoneg != AUTONEG_DISABLE)
1475                 return -EINVAL;
1476
1477         if (ecmd->autoneg == AUTONEG_DISABLE && ((ecmd->speed != SPEED_100 &&
1478                                                   ecmd->speed != SPEED_10) ||
1479                                                  (ecmd->duplex != DUPLEX_HALF &&
1480                                                   ecmd->duplex != DUPLEX_FULL)))
1481                 return -EINVAL;
1482
1483         /* Ethtool Support is not provided for XAUI, RXAUI, and XFI Interfaces
1484          * as they operate at fixed Speed and Duplex settings
1485          */
1486         if (linfo->link.s.if_mode == INTERFACE_MODE_XAUI ||
1487             linfo->link.s.if_mode == INTERFACE_MODE_RXAUI ||
1488             linfo->link.s.if_mode == INTERFACE_MODE_XFI) {
1489                 dev_info(&oct->pci_dev->dev,
1490                          "Autonegotiation, duplex and speed settings cannot be modified.\n");
1491                 return -EINVAL;
1492         }
1493
1494         memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt));
1495
1496         nctrl.ncmd.u64 = 0;
1497         nctrl.ncmd.s.cmd = OCTNET_CMD_SET_SETTINGS;
1498         nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
1499         nctrl.wait_time = 1000;
1500         nctrl.netpndev = (u64)netdev;
1501         nctrl.cb_fn = liquidio_link_ctrl_cmd_completion;
1502
1503         /* Passing the parameters sent by ethtool like Speed, Autoneg & Duplex
1504          * to SE core application using ncmd.s.more & ncmd.s.param
1505          */
1506         if (ecmd->autoneg == AUTONEG_ENABLE) {
1507                 /* Autoneg ON */
1508                 nctrl.ncmd.s.more = OCTNIC_NCMD_PHY_ON |
1509                                      OCTNIC_NCMD_AUTONEG_ON;
1510                 nctrl.ncmd.s.param1 = ecmd->advertising;
1511         } else {
1512                 /* Autoneg OFF */
1513                 nctrl.ncmd.s.more = OCTNIC_NCMD_PHY_ON;
1514
1515                 nctrl.ncmd.s.param2 = ecmd->duplex;
1516
1517                 nctrl.ncmd.s.param1 = ecmd->speed;
1518         }
1519
1520         ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl);
1521         if (ret < 0) {
1522                 dev_err(&oct->pci_dev->dev, "Failed to set settings\n");
1523                 return -1;
1524         }
1525
1526         return 0;
1527 }
1528
1529 static int lio_nway_reset(struct net_device *netdev)
1530 {
1531         if (netif_running(netdev)) {
1532                 struct ethtool_cmd ecmd;
1533
1534                 memset(&ecmd, 0, sizeof(struct ethtool_cmd));
1535                 ecmd.autoneg = 0;
1536                 ecmd.speed = 0;
1537                 ecmd.duplex = 0;
1538                 lio_set_settings(netdev, &ecmd);
1539         }
1540         return 0;
1541 }
1542
1543 /* Return register dump len. */
1544 static int lio_get_regs_len(struct net_device *dev __attribute__((unused)))
1545 {
1546         return OCT_ETHTOOL_REGDUMP_LEN;
1547 }
1548
1549 static int cn6xxx_read_csr_reg(char *s, struct octeon_device *oct)
1550 {
1551         u32 reg;
1552         int i, len = 0;
1553
1554         /* PCI  Window Registers */
1555
1556         len += sprintf(s + len, "\n\t Octeon CSR Registers\n\n");
1557         reg = CN6XXX_WIN_WR_ADDR_LO;
1558         len += sprintf(s + len, "\n[%02x] (WIN_WR_ADDR_LO): %08x\n",
1559                        CN6XXX_WIN_WR_ADDR_LO, octeon_read_csr(oct, reg));
1560         reg = CN6XXX_WIN_WR_ADDR_HI;
1561         len += sprintf(s + len, "[%02x] (WIN_WR_ADDR_HI): %08x\n",
1562                        CN6XXX_WIN_WR_ADDR_HI, octeon_read_csr(oct, reg));
1563         reg = CN6XXX_WIN_RD_ADDR_LO;
1564         len += sprintf(s + len, "[%02x] (WIN_RD_ADDR_LO): %08x\n",
1565                        CN6XXX_WIN_RD_ADDR_LO, octeon_read_csr(oct, reg));
1566         reg = CN6XXX_WIN_RD_ADDR_HI;
1567         len += sprintf(s + len, "[%02x] (WIN_RD_ADDR_HI): %08x\n",
1568                        CN6XXX_WIN_RD_ADDR_HI, octeon_read_csr(oct, reg));
1569         reg = CN6XXX_WIN_WR_DATA_LO;
1570         len += sprintf(s + len, "[%02x] (WIN_WR_DATA_LO): %08x\n",
1571                        CN6XXX_WIN_WR_DATA_LO, octeon_read_csr(oct, reg));
1572         reg = CN6XXX_WIN_WR_DATA_HI;
1573         len += sprintf(s + len, "[%02x] (WIN_WR_DATA_HI): %08x\n",
1574                        CN6XXX_WIN_WR_DATA_HI, octeon_read_csr(oct, reg));
1575         len += sprintf(s + len, "[%02x] (WIN_WR_MASK_REG): %08x\n",
1576                        CN6XXX_WIN_WR_MASK_REG,
1577                        octeon_read_csr(oct, CN6XXX_WIN_WR_MASK_REG));
1578
1579         /* PCI  Interrupt Register */
1580         len += sprintf(s + len, "\n[%x] (INT_ENABLE PORT 0): %08x\n",
1581                        CN6XXX_SLI_INT_ENB64_PORT0, octeon_read_csr(oct,
1582                                                 CN6XXX_SLI_INT_ENB64_PORT0));
1583         len += sprintf(s + len, "\n[%x] (INT_ENABLE PORT 1): %08x\n",
1584                        CN6XXX_SLI_INT_ENB64_PORT1,
1585                        octeon_read_csr(oct, CN6XXX_SLI_INT_ENB64_PORT1));
1586         len += sprintf(s + len, "[%x] (INT_SUM): %08x\n", CN6XXX_SLI_INT_SUM64,
1587                        octeon_read_csr(oct, CN6XXX_SLI_INT_SUM64));
1588
1589         /* PCI  Output queue registers */
1590         for (i = 0; i < oct->num_oqs; i++) {
1591                 reg = CN6XXX_SLI_OQ_PKTS_SENT(i);
1592                 len += sprintf(s + len, "\n[%x] (PKTS_SENT_%d): %08x\n",
1593                                reg, i, octeon_read_csr(oct, reg));
1594                 reg = CN6XXX_SLI_OQ_PKTS_CREDIT(i);
1595                 len += sprintf(s + len, "[%x] (PKT_CREDITS_%d): %08x\n",
1596                                reg, i, octeon_read_csr(oct, reg));
1597         }
1598         reg = CN6XXX_SLI_OQ_INT_LEVEL_PKTS;
1599         len += sprintf(s + len, "\n[%x] (PKTS_SENT_INT_LEVEL): %08x\n",
1600                        reg, octeon_read_csr(oct, reg));
1601         reg = CN6XXX_SLI_OQ_INT_LEVEL_TIME;
1602         len += sprintf(s + len, "[%x] (PKTS_SENT_TIME): %08x\n",
1603                        reg, octeon_read_csr(oct, reg));
1604
1605         /* PCI  Input queue registers */
1606         for (i = 0; i <= 3; i++) {
1607                 u32 reg;
1608
1609                 reg = CN6XXX_SLI_IQ_DOORBELL(i);
1610                 len += sprintf(s + len, "\n[%x] (INSTR_DOORBELL_%d): %08x\n",
1611                                reg, i, octeon_read_csr(oct, reg));
1612                 reg = CN6XXX_SLI_IQ_INSTR_COUNT(i);
1613                 len += sprintf(s + len, "[%x] (INSTR_COUNT_%d): %08x\n",
1614                                reg, i, octeon_read_csr(oct, reg));
1615         }
1616
1617         /* PCI  DMA registers */
1618
1619         len += sprintf(s + len, "\n[%x] (DMA_CNT_0): %08x\n",
1620                        CN6XXX_DMA_CNT(0),
1621                        octeon_read_csr(oct, CN6XXX_DMA_CNT(0)));
1622         reg = CN6XXX_DMA_PKT_INT_LEVEL(0);
1623         len += sprintf(s + len, "[%x] (DMA_INT_LEV_0): %08x\n",
1624                        CN6XXX_DMA_PKT_INT_LEVEL(0), octeon_read_csr(oct, reg));
1625         reg = CN6XXX_DMA_TIME_INT_LEVEL(0);
1626         len += sprintf(s + len, "[%x] (DMA_TIME_0): %08x\n",
1627                        CN6XXX_DMA_TIME_INT_LEVEL(0),
1628                        octeon_read_csr(oct, reg));
1629
1630         len += sprintf(s + len, "\n[%x] (DMA_CNT_1): %08x\n",
1631                        CN6XXX_DMA_CNT(1),
1632                        octeon_read_csr(oct, CN6XXX_DMA_CNT(1)));
1633         reg = CN6XXX_DMA_PKT_INT_LEVEL(1);
1634         len += sprintf(s + len, "[%x] (DMA_INT_LEV_1): %08x\n",
1635                        CN6XXX_DMA_PKT_INT_LEVEL(1),
1636                        octeon_read_csr(oct, reg));
1637         reg = CN6XXX_DMA_PKT_INT_LEVEL(1);
1638         len += sprintf(s + len, "[%x] (DMA_TIME_1): %08x\n",
1639                        CN6XXX_DMA_TIME_INT_LEVEL(1),
1640                        octeon_read_csr(oct, reg));
1641
1642         /* PCI  Index registers */
1643
1644         len += sprintf(s + len, "\n");
1645
1646         for (i = 0; i < 16; i++) {
1647                 reg = lio_pci_readq(oct, CN6XXX_BAR1_REG(i, oct->pcie_port));
1648                 len += sprintf(s + len, "[%llx] (BAR1_INDEX_%02d): %08x\n",
1649                                CN6XXX_BAR1_REG(i, oct->pcie_port), i, reg);
1650         }
1651
1652         return len;
1653 }
1654
1655 static int cn6xxx_read_config_reg(char *s, struct octeon_device *oct)
1656 {
1657         u32 val;
1658         int i, len = 0;
1659
1660         /* PCI CONFIG Registers */
1661
1662         len += sprintf(s + len,
1663                        "\n\t Octeon Config space Registers\n\n");
1664
1665         for (i = 0; i <= 13; i++) {
1666                 pci_read_config_dword(oct->pci_dev, (i * 4), &val);
1667                 len += sprintf(s + len, "[0x%x] (Config[%d]): 0x%08x\n",
1668                                (i * 4), i, val);
1669         }
1670
1671         for (i = 30; i <= 34; i++) {
1672                 pci_read_config_dword(oct->pci_dev, (i * 4), &val);
1673                 len += sprintf(s + len, "[0x%x] (Config[%d]): 0x%08x\n",
1674                                (i * 4), i, val);
1675         }
1676
1677         return len;
1678 }
1679
1680 /*  Return register dump user app.  */
1681 static void lio_get_regs(struct net_device *dev,
1682                          struct ethtool_regs *regs, void *regbuf)
1683 {
1684         struct lio *lio = GET_LIO(dev);
1685         int len = 0;
1686         struct octeon_device *oct = lio->oct_dev;
1687
1688         regs->version = OCT_ETHTOOL_REGSVER;
1689
1690         switch (oct->chip_id) {
1691         case OCTEON_CN68XX:
1692         case OCTEON_CN66XX:
1693                 memset(regbuf, 0, OCT_ETHTOOL_REGDUMP_LEN);
1694                 len += cn6xxx_read_csr_reg(regbuf + len, oct);
1695                 len += cn6xxx_read_config_reg(regbuf + len, oct);
1696                 break;
1697         default:
1698                 dev_err(&oct->pci_dev->dev, "%s Unknown chipid: %d\n",
1699                         __func__, oct->chip_id);
1700         }
1701 }
1702
1703 static u32 lio_get_priv_flags(struct net_device *netdev)
1704 {
1705         struct lio *lio = GET_LIO(netdev);
1706
1707         return lio->oct_dev->priv_flags;
1708 }
1709
1710 static int lio_set_priv_flags(struct net_device *netdev, u32 flags)
1711 {
1712         struct lio *lio = GET_LIO(netdev);
1713         bool intr_by_tx_bytes = !!(flags & (0x1 << OCT_PRIV_FLAG_TX_BYTES));
1714
1715         lio_set_priv_flag(lio->oct_dev, OCT_PRIV_FLAG_TX_BYTES,
1716                           intr_by_tx_bytes);
1717         return 0;
1718 }
1719
1720 static const struct ethtool_ops lio_ethtool_ops = {
1721         .get_settings           = lio_get_settings,
1722         .get_link               = ethtool_op_get_link,
1723         .get_drvinfo            = lio_get_drvinfo,
1724         .get_ringparam          = lio_ethtool_get_ringparam,
1725         .get_channels           = lio_ethtool_get_channels,
1726         .set_phys_id            = lio_set_phys_id,
1727         .get_eeprom_len         = lio_get_eeprom_len,
1728         .get_eeprom             = lio_get_eeprom,
1729         .get_strings            = lio_get_strings,
1730         .get_ethtool_stats      = lio_get_ethtool_stats,
1731         .get_pauseparam         = lio_get_pauseparam,
1732         .get_regs_len           = lio_get_regs_len,
1733         .get_regs               = lio_get_regs,
1734         .get_msglevel           = lio_get_msglevel,
1735         .set_msglevel           = lio_set_msglevel,
1736         .get_sset_count         = lio_get_sset_count,
1737         .nway_reset             = lio_nway_reset,
1738         .set_settings           = lio_set_settings,
1739         .get_coalesce           = lio_get_intr_coalesce,
1740         .set_coalesce           = lio_set_intr_coalesce,
1741         .get_priv_flags         = lio_get_priv_flags,
1742         .set_priv_flags         = lio_set_priv_flags,
1743         .get_ts_info            = lio_get_ts_info,
1744 };
1745
1746 void liquidio_set_ethtool_ops(struct net_device *netdev)
1747 {
1748         netdev->ethtool_ops = &lio_ethtool_ops;
1749 }