qlcnic: add interrupt diagnostic test
[firefly-linux-kernel-4.4.55.git] / drivers / net / qlcnic / qlcnic_ethtool.c
1 /*
2  * Copyright (C) 2009 - QLogic Corporation.
3  * All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18  * MA  02111-1307, USA.
19  *
20  * The full GNU General Public License is included in this distribution
21  * in the file called "COPYING".
22  *
23  */
24
25 #include <linux/types.h>
26 #include <linux/delay.h>
27 #include <linux/pci.h>
28 #include <linux/io.h>
29 #include <linux/netdevice.h>
30 #include <linux/ethtool.h>
31
32 #include "qlcnic.h"
33
34 struct qlcnic_stats {
35         char stat_string[ETH_GSTRING_LEN];
36         int sizeof_stat;
37         int stat_offset;
38 };
39
40 #define QLC_SIZEOF(m) FIELD_SIZEOF(struct qlcnic_adapter, m)
41 #define QLC_OFF(m) offsetof(struct qlcnic_adapter, m)
42
43 static const struct qlcnic_stats qlcnic_gstrings_stats[] = {
44         {"xmit_called",
45                 QLC_SIZEOF(stats.xmitcalled), QLC_OFF(stats.xmitcalled)},
46         {"xmit_finished",
47                 QLC_SIZEOF(stats.xmitfinished), QLC_OFF(stats.xmitfinished)},
48         {"rx_dropped",
49                 QLC_SIZEOF(stats.rxdropped), QLC_OFF(stats.rxdropped)},
50         {"tx_dropped",
51                 QLC_SIZEOF(stats.txdropped), QLC_OFF(stats.txdropped)},
52         {"csummed",
53                 QLC_SIZEOF(stats.csummed), QLC_OFF(stats.csummed)},
54         {"rx_pkts",
55                 QLC_SIZEOF(stats.rx_pkts), QLC_OFF(stats.rx_pkts)},
56         {"lro_pkts",
57                 QLC_SIZEOF(stats.lro_pkts), QLC_OFF(stats.lro_pkts)},
58         {"rx_bytes",
59                 QLC_SIZEOF(stats.rxbytes), QLC_OFF(stats.rxbytes)},
60         {"tx_bytes",
61                 QLC_SIZEOF(stats.txbytes), QLC_OFF(stats.txbytes)},
62 };
63
64 #define QLCNIC_STATS_LEN        ARRAY_SIZE(qlcnic_gstrings_stats)
65
66 static const char qlcnic_gstrings_test[][ETH_GSTRING_LEN] = {
67         "Register_Test_on_offline",
68         "Link_Test_on_offline",
69         "Interrupt_Test_offline"
70 };
71
72 #define QLCNIC_TEST_LEN ARRAY_SIZE(qlcnic_gstrings_test)
73
74 #define QLCNIC_RING_REGS_COUNT  20
75 #define QLCNIC_RING_REGS_LEN    (QLCNIC_RING_REGS_COUNT * sizeof(u32))
76 #define QLCNIC_MAX_EEPROM_LEN   1024
77
78 static const u32 diag_registers[] = {
79         CRB_CMDPEG_STATE,
80         CRB_RCVPEG_STATE,
81         CRB_XG_STATE_P3,
82         CRB_FW_CAPABILITIES_1,
83         ISR_INT_STATE_REG,
84         QLCNIC_CRB_DEV_REF_COUNT,
85         QLCNIC_CRB_DEV_STATE,
86         QLCNIC_CRB_DRV_STATE,
87         QLCNIC_CRB_DRV_SCRATCH,
88         QLCNIC_CRB_DEV_PARTITION_INFO,
89         QLCNIC_CRB_DRV_IDC_VER,
90         QLCNIC_PEG_ALIVE_COUNTER,
91         QLCNIC_PEG_HALT_STATUS1,
92         QLCNIC_PEG_HALT_STATUS2,
93         QLCNIC_CRB_PEG_NET_0+0x3c,
94         QLCNIC_CRB_PEG_NET_1+0x3c,
95         QLCNIC_CRB_PEG_NET_2+0x3c,
96         QLCNIC_CRB_PEG_NET_4+0x3c,
97         -1
98 };
99
100 static int qlcnic_get_regs_len(struct net_device *dev)
101 {
102         return sizeof(diag_registers) + QLCNIC_RING_REGS_LEN;
103 }
104
105 static int qlcnic_get_eeprom_len(struct net_device *dev)
106 {
107         return QLCNIC_FLASH_TOTAL_SIZE;
108 }
109
110 static void
111 qlcnic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo)
112 {
113         struct qlcnic_adapter *adapter = netdev_priv(dev);
114         u32 fw_major, fw_minor, fw_build;
115
116         fw_major = QLCRD32(adapter, QLCNIC_FW_VERSION_MAJOR);
117         fw_minor = QLCRD32(adapter, QLCNIC_FW_VERSION_MINOR);
118         fw_build = QLCRD32(adapter, QLCNIC_FW_VERSION_SUB);
119         sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build);
120
121         strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
122         strlcpy(drvinfo->driver, qlcnic_driver_name, 32);
123         strlcpy(drvinfo->version, QLCNIC_LINUX_VERSIONID, 32);
124 }
125
126 static int
127 qlcnic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
128 {
129         struct qlcnic_adapter *adapter = netdev_priv(dev);
130         int check_sfp_module = 0;
131         u16 pcifn = adapter->ahw.pci_func;
132
133         /* read which mode */
134         if (adapter->ahw.port_type == QLCNIC_GBE) {
135                 ecmd->supported = (SUPPORTED_10baseT_Half |
136                                    SUPPORTED_10baseT_Full |
137                                    SUPPORTED_100baseT_Half |
138                                    SUPPORTED_100baseT_Full |
139                                    SUPPORTED_1000baseT_Half |
140                                    SUPPORTED_1000baseT_Full);
141
142                 ecmd->advertising = (ADVERTISED_100baseT_Half |
143                                      ADVERTISED_100baseT_Full |
144                                      ADVERTISED_1000baseT_Half |
145                                      ADVERTISED_1000baseT_Full);
146
147                 ecmd->speed = adapter->link_speed;
148                 ecmd->duplex = adapter->link_duplex;
149                 ecmd->autoneg = adapter->link_autoneg;
150
151         } else if (adapter->ahw.port_type == QLCNIC_XGBE) {
152                 u32 val;
153
154                 val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR);
155                 if (val == QLCNIC_PORT_MODE_802_3_AP) {
156                         ecmd->supported = SUPPORTED_1000baseT_Full;
157                         ecmd->advertising = ADVERTISED_1000baseT_Full;
158                 } else {
159                         ecmd->supported = SUPPORTED_10000baseT_Full;
160                         ecmd->advertising = ADVERTISED_10000baseT_Full;
161                 }
162
163                 if (netif_running(dev) && adapter->has_link_events) {
164                         ecmd->speed = adapter->link_speed;
165                         ecmd->autoneg = adapter->link_autoneg;
166                         ecmd->duplex = adapter->link_duplex;
167                         goto skip;
168                 }
169
170                 val = QLCRD32(adapter, P3_LINK_SPEED_REG(pcifn));
171                 ecmd->speed = P3_LINK_SPEED_MHZ *
172                         P3_LINK_SPEED_VAL(pcifn, val);
173                 ecmd->duplex = DUPLEX_FULL;
174                 ecmd->autoneg = AUTONEG_DISABLE;
175         } else
176                 return -EIO;
177
178 skip:
179         ecmd->phy_address = adapter->physical_port;
180         ecmd->transceiver = XCVR_EXTERNAL;
181
182         switch (adapter->ahw.board_type) {
183         case QLCNIC_BRDTYPE_P3_REF_QG:
184         case QLCNIC_BRDTYPE_P3_4_GB:
185         case QLCNIC_BRDTYPE_P3_4_GB_MM:
186
187                 ecmd->supported |= SUPPORTED_Autoneg;
188                 ecmd->advertising |= ADVERTISED_Autoneg;
189         case QLCNIC_BRDTYPE_P3_10G_CX4:
190         case QLCNIC_BRDTYPE_P3_10G_CX4_LP:
191         case QLCNIC_BRDTYPE_P3_10000_BASE_T:
192                 ecmd->supported |= SUPPORTED_TP;
193                 ecmd->advertising |= ADVERTISED_TP;
194                 ecmd->port = PORT_TP;
195                 ecmd->autoneg =  adapter->link_autoneg;
196                 break;
197         case QLCNIC_BRDTYPE_P3_IMEZ:
198         case QLCNIC_BRDTYPE_P3_XG_LOM:
199         case QLCNIC_BRDTYPE_P3_HMEZ:
200                 ecmd->supported |= SUPPORTED_MII;
201                 ecmd->advertising |= ADVERTISED_MII;
202                 ecmd->port = PORT_MII;
203                 ecmd->autoneg = AUTONEG_DISABLE;
204                 break;
205         case QLCNIC_BRDTYPE_P3_10G_SFP_PLUS:
206         case QLCNIC_BRDTYPE_P3_10G_SFP_CT:
207         case QLCNIC_BRDTYPE_P3_10G_SFP_QT:
208                 ecmd->advertising |= ADVERTISED_TP;
209                 ecmd->supported |= SUPPORTED_TP;
210                 check_sfp_module = netif_running(dev) &&
211                         adapter->has_link_events;
212         case QLCNIC_BRDTYPE_P3_10G_XFP:
213                 ecmd->supported |= SUPPORTED_FIBRE;
214                 ecmd->advertising |= ADVERTISED_FIBRE;
215                 ecmd->port = PORT_FIBRE;
216                 ecmd->autoneg = AUTONEG_DISABLE;
217                 break;
218         case QLCNIC_BRDTYPE_P3_10G_TP:
219                 if (adapter->ahw.port_type == QLCNIC_XGBE) {
220                         ecmd->autoneg = AUTONEG_DISABLE;
221                         ecmd->supported |= (SUPPORTED_FIBRE | SUPPORTED_TP);
222                         ecmd->advertising |=
223                                 (ADVERTISED_FIBRE | ADVERTISED_TP);
224                         ecmd->port = PORT_FIBRE;
225                         check_sfp_module = netif_running(dev) &&
226                                 adapter->has_link_events;
227                 } else {
228                         ecmd->autoneg = AUTONEG_ENABLE;
229                         ecmd->supported |= (SUPPORTED_TP | SUPPORTED_Autoneg);
230                         ecmd->advertising |=
231                                 (ADVERTISED_TP | ADVERTISED_Autoneg);
232                         ecmd->port = PORT_TP;
233                 }
234                 break;
235         default:
236                 dev_err(&adapter->pdev->dev, "Unsupported board model %d\n",
237                         adapter->ahw.board_type);
238                 return -EIO;
239         }
240
241         if (check_sfp_module) {
242                 switch (adapter->module_type) {
243                 case LINKEVENT_MODULE_OPTICAL_UNKNOWN:
244                 case LINKEVENT_MODULE_OPTICAL_SRLR:
245                 case LINKEVENT_MODULE_OPTICAL_LRM:
246                 case LINKEVENT_MODULE_OPTICAL_SFP_1G:
247                         ecmd->port = PORT_FIBRE;
248                         break;
249                 case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE:
250                 case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN:
251                 case LINKEVENT_MODULE_TWINAX:
252                         ecmd->port = PORT_TP;
253                         break;
254                 default:
255                         ecmd->port = PORT_OTHER;
256                 }
257         }
258
259         return 0;
260 }
261
262 static int
263 qlcnic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
264 {
265         struct qlcnic_adapter *adapter = netdev_priv(dev);
266         __u32 status;
267
268         /* read which mode */
269         if (adapter->ahw.port_type == QLCNIC_GBE) {
270                 /* autonegotiation */
271                 if (qlcnic_fw_cmd_set_phy(adapter,
272                                QLCNIC_NIU_GB_MII_MGMT_ADDR_AUTONEG,
273                                ecmd->autoneg) != 0)
274                         return -EIO;
275                 else
276                         adapter->link_autoneg = ecmd->autoneg;
277
278                 if (qlcnic_fw_cmd_query_phy(adapter,
279                               QLCNIC_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
280                               &status) != 0)
281                         return -EIO;
282
283                 switch (ecmd->speed) {
284                 case SPEED_10:
285                         qlcnic_set_phy_speed(status, 0);
286                         break;
287                 case SPEED_100:
288                         qlcnic_set_phy_speed(status, 1);
289                         break;
290                 case SPEED_1000:
291                         qlcnic_set_phy_speed(status, 2);
292                         break;
293                 }
294
295                 if (ecmd->duplex == DUPLEX_HALF)
296                         qlcnic_clear_phy_duplex(status);
297                 if (ecmd->duplex == DUPLEX_FULL)
298                         qlcnic_set_phy_duplex(status);
299                 if (qlcnic_fw_cmd_set_phy(adapter,
300                                QLCNIC_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
301                                *((int *)&status)) != 0)
302                         return -EIO;
303                 else {
304                         adapter->link_speed = ecmd->speed;
305                         adapter->link_duplex = ecmd->duplex;
306                 }
307         } else
308                 return -EOPNOTSUPP;
309
310         if (!netif_running(dev))
311                 return 0;
312
313         dev->netdev_ops->ndo_stop(dev);
314         return dev->netdev_ops->ndo_open(dev);
315 }
316
317 static void
318 qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
319 {
320         struct qlcnic_adapter *adapter = netdev_priv(dev);
321         struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx;
322         struct qlcnic_host_sds_ring *sds_ring;
323         u32 *regs_buff = p;
324         int ring, i = 0;
325
326         memset(p, 0, qlcnic_get_regs_len(dev));
327         regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) |
328             (adapter->pdev)->device;
329
330         for (i = 0; diag_registers[i] != -1; i++)
331                 regs_buff[i] = QLCRD32(adapter, diag_registers[i]);
332
333         if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
334                 return;
335
336         regs_buff[i++] = 0xFFEFCDAB; /* Marker btw regs and ring count*/
337
338         regs_buff[i++] = 1; /* No. of tx ring */
339         regs_buff[i++] = le32_to_cpu(*(adapter->tx_ring->hw_consumer));
340         regs_buff[i++] = readl(adapter->tx_ring->crb_cmd_producer);
341
342         regs_buff[i++] = 2; /* No. of rx ring */
343         regs_buff[i++] = readl(recv_ctx->rds_rings[0].crb_rcv_producer);
344         regs_buff[i++] = readl(recv_ctx->rds_rings[1].crb_rcv_producer);
345
346         regs_buff[i++] = adapter->max_sds_rings;
347
348         for (ring = 0; ring < adapter->max_sds_rings; ring++) {
349                 sds_ring = &(recv_ctx->sds_rings[ring]);
350                 regs_buff[i++] = readl(sds_ring->crb_sts_consumer);
351         }
352 }
353
354 static u32 qlcnic_test_link(struct net_device *dev)
355 {
356         struct qlcnic_adapter *adapter = netdev_priv(dev);
357         u32 val;
358
359         val = QLCRD32(adapter, CRB_XG_STATE_P3);
360         val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
361         return (val == XG_LINK_UP_P3) ? 0 : 1;
362 }
363
364 static int
365 qlcnic_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
366                       u8 *bytes)
367 {
368         struct qlcnic_adapter *adapter = netdev_priv(dev);
369         int offset;
370         int ret;
371
372         if (eeprom->len == 0)
373                 return -EINVAL;
374
375         eeprom->magic = (adapter->pdev)->vendor |
376                         ((adapter->pdev)->device << 16);
377         offset = eeprom->offset;
378
379         ret = qlcnic_rom_fast_read_words(adapter, offset, bytes,
380                                                 eeprom->len);
381         if (ret < 0)
382                 return ret;
383
384         return 0;
385 }
386
387 static void
388 qlcnic_get_ringparam(struct net_device *dev,
389                 struct ethtool_ringparam *ring)
390 {
391         struct qlcnic_adapter *adapter = netdev_priv(dev);
392
393         ring->rx_pending = adapter->num_rxd;
394         ring->rx_jumbo_pending = adapter->num_jumbo_rxd;
395         ring->rx_jumbo_pending += adapter->num_lro_rxd;
396         ring->tx_pending = adapter->num_txd;
397
398         if (adapter->ahw.port_type == QLCNIC_GBE) {
399                 ring->rx_max_pending = MAX_RCV_DESCRIPTORS_1G;
400                 ring->rx_jumbo_max_pending = MAX_JUMBO_RCV_DESCRIPTORS_1G;
401         } else {
402                 ring->rx_max_pending = MAX_RCV_DESCRIPTORS_10G;
403                 ring->rx_jumbo_max_pending = MAX_JUMBO_RCV_DESCRIPTORS_10G;
404         }
405
406         ring->tx_max_pending = MAX_CMD_DESCRIPTORS;
407
408         ring->rx_mini_max_pending = 0;
409         ring->rx_mini_pending = 0;
410 }
411
412 static u32
413 qlcnic_validate_ringparam(u32 val, u32 min, u32 max, char *r_name)
414 {
415         u32 num_desc;
416         num_desc = max(val, min);
417         num_desc = min(num_desc, max);
418         num_desc = roundup_pow_of_two(num_desc);
419
420         if (val != num_desc) {
421                 printk(KERN_INFO "%s: setting %s ring size %d instead of %d\n",
422                        qlcnic_driver_name, r_name, num_desc, val);
423         }
424
425         return num_desc;
426 }
427
428 static int
429 qlcnic_set_ringparam(struct net_device *dev,
430                 struct ethtool_ringparam *ring)
431 {
432         struct qlcnic_adapter *adapter = netdev_priv(dev);
433         u16 max_rcv_desc = MAX_RCV_DESCRIPTORS_10G;
434         u16 max_jumbo_desc = MAX_JUMBO_RCV_DESCRIPTORS_10G;
435         u16 num_rxd, num_jumbo_rxd, num_txd;
436
437
438         if (ring->rx_mini_pending)
439                 return -EOPNOTSUPP;
440
441         if (adapter->ahw.port_type == QLCNIC_GBE) {
442                 max_rcv_desc = MAX_RCV_DESCRIPTORS_1G;
443                 max_jumbo_desc = MAX_JUMBO_RCV_DESCRIPTORS_10G;
444         }
445
446         num_rxd = qlcnic_validate_ringparam(ring->rx_pending,
447                         MIN_RCV_DESCRIPTORS, max_rcv_desc, "rx");
448
449         num_jumbo_rxd = qlcnic_validate_ringparam(ring->rx_jumbo_pending,
450                         MIN_JUMBO_DESCRIPTORS, max_jumbo_desc, "rx jumbo");
451
452         num_txd = qlcnic_validate_ringparam(ring->tx_pending,
453                         MIN_CMD_DESCRIPTORS, MAX_CMD_DESCRIPTORS, "tx");
454
455         if (num_rxd == adapter->num_rxd && num_txd == adapter->num_txd &&
456                         num_jumbo_rxd == adapter->num_jumbo_rxd)
457                 return 0;
458
459         adapter->num_rxd = num_rxd;
460         adapter->num_jumbo_rxd = num_jumbo_rxd;
461         adapter->num_txd = num_txd;
462
463         return qlcnic_reset_context(adapter);
464 }
465
466 static void
467 qlcnic_get_pauseparam(struct net_device *netdev,
468                           struct ethtool_pauseparam *pause)
469 {
470         struct qlcnic_adapter *adapter = netdev_priv(netdev);
471         int port = adapter->physical_port;
472         __u32 val;
473
474         if (adapter->ahw.port_type == QLCNIC_GBE) {
475                 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
476                         return;
477                 /* get flow control settings */
478                 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port));
479                 pause->rx_pause = qlcnic_gb_get_rx_flowctl(val);
480                 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL);
481                 switch (port) {
482                 case 0:
483                         pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val));
484                         break;
485                 case 1:
486                         pause->tx_pause = !(qlcnic_gb_get_gb1_mask(val));
487                         break;
488                 case 2:
489                         pause->tx_pause = !(qlcnic_gb_get_gb2_mask(val));
490                         break;
491                 case 3:
492                 default:
493                         pause->tx_pause = !(qlcnic_gb_get_gb3_mask(val));
494                         break;
495                 }
496         } else if (adapter->ahw.port_type == QLCNIC_XGBE) {
497                 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
498                         return;
499                 pause->rx_pause = 1;
500                 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL);
501                 if (port == 0)
502                         pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val));
503                 else
504                         pause->tx_pause = !(qlcnic_xg_get_xg1_mask(val));
505         } else {
506                 dev_err(&netdev->dev, "Unknown board type: %x\n",
507                                         adapter->ahw.port_type);
508         }
509 }
510
511 static int
512 qlcnic_set_pauseparam(struct net_device *netdev,
513                           struct ethtool_pauseparam *pause)
514 {
515         struct qlcnic_adapter *adapter = netdev_priv(netdev);
516         int port = adapter->physical_port;
517         __u32 val;
518
519         /* read mode */
520         if (adapter->ahw.port_type == QLCNIC_GBE) {
521                 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
522                         return -EIO;
523                 /* set flow control */
524                 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port));
525
526                 if (pause->rx_pause)
527                         qlcnic_gb_rx_flowctl(val);
528                 else
529                         qlcnic_gb_unset_rx_flowctl(val);
530
531                 QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port),
532                                 val);
533                 /* set autoneg */
534                 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL);
535                 switch (port) {
536                 case 0:
537                         if (pause->tx_pause)
538                                 qlcnic_gb_unset_gb0_mask(val);
539                         else
540                                 qlcnic_gb_set_gb0_mask(val);
541                         break;
542                 case 1:
543                         if (pause->tx_pause)
544                                 qlcnic_gb_unset_gb1_mask(val);
545                         else
546                                 qlcnic_gb_set_gb1_mask(val);
547                         break;
548                 case 2:
549                         if (pause->tx_pause)
550                                 qlcnic_gb_unset_gb2_mask(val);
551                         else
552                                 qlcnic_gb_set_gb2_mask(val);
553                         break;
554                 case 3:
555                 default:
556                         if (pause->tx_pause)
557                                 qlcnic_gb_unset_gb3_mask(val);
558                         else
559                                 qlcnic_gb_set_gb3_mask(val);
560                         break;
561                 }
562                 QLCWR32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, val);
563         } else if (adapter->ahw.port_type == QLCNIC_XGBE) {
564                 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
565                         return -EIO;
566                 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL);
567                 if (port == 0) {
568                         if (pause->tx_pause)
569                                 qlcnic_xg_unset_xg0_mask(val);
570                         else
571                                 qlcnic_xg_set_xg0_mask(val);
572                 } else {
573                         if (pause->tx_pause)
574                                 qlcnic_xg_unset_xg1_mask(val);
575                         else
576                                 qlcnic_xg_set_xg1_mask(val);
577                 }
578                 QLCWR32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, val);
579         } else {
580                 dev_err(&netdev->dev, "Unknown board type: %x\n",
581                                 adapter->ahw.port_type);
582         }
583         return 0;
584 }
585
586 static int qlcnic_reg_test(struct net_device *dev)
587 {
588         struct qlcnic_adapter *adapter = netdev_priv(dev);
589         u32 data_read, data_written;
590
591         data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0));
592         if ((data_read & 0xffff) != adapter->pdev->vendor)
593                 return 1;
594
595         data_written = (u32)0xa5a5a5a5;
596
597         QLCWR32(adapter, CRB_SCRATCHPAD_TEST, data_written);
598         data_read = QLCRD32(adapter, CRB_SCRATCHPAD_TEST);
599         if (data_written != data_read)
600                 return 1;
601
602         return 0;
603 }
604
605 static int qlcnic_get_sset_count(struct net_device *dev, int sset)
606 {
607         switch (sset) {
608         case ETH_SS_TEST:
609                 return QLCNIC_TEST_LEN;
610         case ETH_SS_STATS:
611                 return QLCNIC_STATS_LEN;
612         default:
613                 return -EOPNOTSUPP;
614         }
615 }
616
617 static int qlcnic_irq_test(struct net_device *netdev)
618 {
619         struct qlcnic_adapter *adapter = netdev_priv(netdev);
620         int max_sds_rings = adapter->max_sds_rings;
621         int ret;
622
623         if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
624                 return -EIO;
625
626         ret = qlcnic_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST);
627         if (ret)
628                 goto clear_it;
629
630         adapter->diag_cnt = 0;
631         ret = qlcnic_issue_cmd(adapter, adapter->ahw.pci_func,
632                         QLCHAL_VERSION, adapter->portnum, 0, 0, 0x00000011);
633         if (ret)
634                 goto done;
635
636         msleep(10);
637
638         ret = !adapter->diag_cnt;
639
640 done:
641         qlcnic_diag_free_res(netdev, max_sds_rings);
642
643 clear_it:
644         adapter->max_sds_rings = max_sds_rings;
645         clear_bit(__QLCNIC_RESETTING, &adapter->state);
646         return ret;
647 }
648
649 static void
650 qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test,
651                      u64 *data)
652 {
653         memset(data, 0, sizeof(u64) * QLCNIC_TEST_LEN);
654
655         if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
656                 data[2] = qlcnic_irq_test(dev);
657                 if (data[2])
658                         eth_test->flags |= ETH_TEST_FL_FAILED;
659         }
660
661         data[0] = qlcnic_reg_test(dev);
662         if (data[0])
663                 eth_test->flags |= ETH_TEST_FL_FAILED;
664
665         /* link test */
666         data[1] = (u64) qlcnic_test_link(dev);
667         if (data[1])
668                 eth_test->flags |= ETH_TEST_FL_FAILED;
669 }
670
671 static void
672 qlcnic_get_strings(struct net_device *dev, u32 stringset, u8 * data)
673 {
674         int index;
675
676         switch (stringset) {
677         case ETH_SS_TEST:
678                 memcpy(data, *qlcnic_gstrings_test,
679                        QLCNIC_TEST_LEN * ETH_GSTRING_LEN);
680                 break;
681         case ETH_SS_STATS:
682                 for (index = 0; index < QLCNIC_STATS_LEN; index++) {
683                         memcpy(data + index * ETH_GSTRING_LEN,
684                                qlcnic_gstrings_stats[index].stat_string,
685                                ETH_GSTRING_LEN);
686                 }
687                 break;
688         }
689 }
690
691 static void
692 qlcnic_get_ethtool_stats(struct net_device *dev,
693                              struct ethtool_stats *stats, u64 * data)
694 {
695         struct qlcnic_adapter *adapter = netdev_priv(dev);
696         int index;
697
698         for (index = 0; index < QLCNIC_STATS_LEN; index++) {
699                 char *p =
700                     (char *)adapter +
701                     qlcnic_gstrings_stats[index].stat_offset;
702                 data[index] =
703                     (qlcnic_gstrings_stats[index].sizeof_stat ==
704                      sizeof(u64)) ? *(u64 *)p:(*(u32 *)p);
705         }
706 }
707
708 static u32 qlcnic_get_rx_csum(struct net_device *dev)
709 {
710         struct qlcnic_adapter *adapter = netdev_priv(dev);
711         return adapter->rx_csum;
712 }
713
714 static int qlcnic_set_rx_csum(struct net_device *dev, u32 data)
715 {
716         struct qlcnic_adapter *adapter = netdev_priv(dev);
717         adapter->rx_csum = !!data;
718         return 0;
719 }
720
721 static u32 qlcnic_get_tso(struct net_device *dev)
722 {
723         return (dev->features & (NETIF_F_TSO | NETIF_F_TSO6)) != 0;
724 }
725
726 static int qlcnic_set_tso(struct net_device *dev, u32 data)
727 {
728         if (data)
729                 dev->features |= (NETIF_F_TSO | NETIF_F_TSO6);
730         else
731                 dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6);
732
733         return 0;
734 }
735
736 static int qlcnic_blink_led(struct net_device *dev, u32 val)
737 {
738         struct qlcnic_adapter *adapter = netdev_priv(dev);
739         int ret;
740
741         ret = qlcnic_config_led(adapter, 1, 0xf);
742         if (ret) {
743                 dev_err(&adapter->pdev->dev,
744                         "Failed to set LED blink state.\n");
745                 return ret;
746         }
747
748         msleep_interruptible(val * 1000);
749
750         ret = qlcnic_config_led(adapter, 0, 0xf);
751         if (ret) {
752                 dev_err(&adapter->pdev->dev,
753                         "Failed to reset LED blink state.\n");
754                 return ret;
755         }
756
757         return 0;
758 }
759
760 static void
761 qlcnic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
762 {
763         struct qlcnic_adapter *adapter = netdev_priv(dev);
764         u32 wol_cfg;
765
766         wol->supported = 0;
767         wol->wolopts = 0;
768
769         wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV);
770         if (wol_cfg & (1UL << adapter->portnum))
771                 wol->supported |= WAKE_MAGIC;
772
773         wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG);
774         if (wol_cfg & (1UL << adapter->portnum))
775                 wol->wolopts |= WAKE_MAGIC;
776 }
777
778 static int
779 qlcnic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
780 {
781         struct qlcnic_adapter *adapter = netdev_priv(dev);
782         u32 wol_cfg;
783
784         if (wol->wolopts & ~WAKE_MAGIC)
785                 return -EOPNOTSUPP;
786
787         wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV);
788         if (!(wol_cfg & (1 << adapter->portnum)))
789                 return -EOPNOTSUPP;
790
791         wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG);
792         if (wol->wolopts & WAKE_MAGIC)
793                 wol_cfg |= 1UL << adapter->portnum;
794         else
795                 wol_cfg &= ~(1UL << adapter->portnum);
796
797         QLCWR32(adapter, QLCNIC_WOL_CONFIG, wol_cfg);
798
799         return 0;
800 }
801
802 /*
803  * Set the coalescing parameters. Currently only normal is supported.
804  * If rx_coalesce_usecs == 0 or rx_max_coalesced_frames == 0 then set the
805  * firmware coalescing to default.
806  */
807 static int qlcnic_set_intr_coalesce(struct net_device *netdev,
808                         struct ethtool_coalesce *ethcoal)
809 {
810         struct qlcnic_adapter *adapter = netdev_priv(netdev);
811
812         if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
813                 return -EINVAL;
814
815         /*
816         * Return Error if unsupported values or
817         * unsupported parameters are set.
818         */
819         if (ethcoal->rx_coalesce_usecs > 0xffff ||
820                 ethcoal->rx_max_coalesced_frames > 0xffff ||
821                 ethcoal->tx_coalesce_usecs > 0xffff ||
822                 ethcoal->tx_max_coalesced_frames > 0xffff ||
823                 ethcoal->rx_coalesce_usecs_irq ||
824                 ethcoal->rx_max_coalesced_frames_irq ||
825                 ethcoal->tx_coalesce_usecs_irq ||
826                 ethcoal->tx_max_coalesced_frames_irq ||
827                 ethcoal->stats_block_coalesce_usecs ||
828                 ethcoal->use_adaptive_rx_coalesce ||
829                 ethcoal->use_adaptive_tx_coalesce ||
830                 ethcoal->pkt_rate_low ||
831                 ethcoal->rx_coalesce_usecs_low ||
832                 ethcoal->rx_max_coalesced_frames_low ||
833                 ethcoal->tx_coalesce_usecs_low ||
834                 ethcoal->tx_max_coalesced_frames_low ||
835                 ethcoal->pkt_rate_high ||
836                 ethcoal->rx_coalesce_usecs_high ||
837                 ethcoal->rx_max_coalesced_frames_high ||
838                 ethcoal->tx_coalesce_usecs_high ||
839                 ethcoal->tx_max_coalesced_frames_high)
840                 return -EINVAL;
841
842         if (!ethcoal->rx_coalesce_usecs ||
843                 !ethcoal->rx_max_coalesced_frames) {
844                 adapter->coal.flags = QLCNIC_INTR_DEFAULT;
845                 adapter->coal.normal.data.rx_time_us =
846                         QLCNIC_DEFAULT_INTR_COALESCE_RX_TIME_US;
847                 adapter->coal.normal.data.rx_packets =
848                         QLCNIC_DEFAULT_INTR_COALESCE_RX_PACKETS;
849         } else {
850                 adapter->coal.flags = 0;
851                 adapter->coal.normal.data.rx_time_us =
852                 ethcoal->rx_coalesce_usecs;
853                 adapter->coal.normal.data.rx_packets =
854                 ethcoal->rx_max_coalesced_frames;
855         }
856         adapter->coal.normal.data.tx_time_us = ethcoal->tx_coalesce_usecs;
857         adapter->coal.normal.data.tx_packets =
858         ethcoal->tx_max_coalesced_frames;
859
860         qlcnic_config_intr_coalesce(adapter);
861
862         return 0;
863 }
864
865 static int qlcnic_get_intr_coalesce(struct net_device *netdev,
866                         struct ethtool_coalesce *ethcoal)
867 {
868         struct qlcnic_adapter *adapter = netdev_priv(netdev);
869
870         if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
871                 return -EINVAL;
872
873         ethcoal->rx_coalesce_usecs = adapter->coal.normal.data.rx_time_us;
874         ethcoal->tx_coalesce_usecs = adapter->coal.normal.data.tx_time_us;
875         ethcoal->rx_max_coalesced_frames =
876                 adapter->coal.normal.data.rx_packets;
877         ethcoal->tx_max_coalesced_frames =
878                 adapter->coal.normal.data.tx_packets;
879
880         return 0;
881 }
882
883 static int qlcnic_set_flags(struct net_device *netdev, u32 data)
884 {
885         struct qlcnic_adapter *adapter = netdev_priv(netdev);
886         int hw_lro;
887
888         if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO))
889                 return -EINVAL;
890
891         ethtool_op_set_flags(netdev, data);
892
893         hw_lro = (data & ETH_FLAG_LRO) ? QLCNIC_LRO_ENABLED : 0;
894
895         if (qlcnic_config_hw_lro(adapter, hw_lro))
896                 return -EIO;
897
898         if ((hw_lro == 0) && qlcnic_send_lro_cleanup(adapter))
899                 return -EIO;
900
901
902         return 0;
903 }
904
905 const struct ethtool_ops qlcnic_ethtool_ops = {
906         .get_settings = qlcnic_get_settings,
907         .set_settings = qlcnic_set_settings,
908         .get_drvinfo = qlcnic_get_drvinfo,
909         .get_regs_len = qlcnic_get_regs_len,
910         .get_regs = qlcnic_get_regs,
911         .get_link = ethtool_op_get_link,
912         .get_eeprom_len = qlcnic_get_eeprom_len,
913         .get_eeprom = qlcnic_get_eeprom,
914         .get_ringparam = qlcnic_get_ringparam,
915         .set_ringparam = qlcnic_set_ringparam,
916         .get_pauseparam = qlcnic_get_pauseparam,
917         .set_pauseparam = qlcnic_set_pauseparam,
918         .set_tx_csum = ethtool_op_set_tx_csum,
919         .set_sg = ethtool_op_set_sg,
920         .get_tso = qlcnic_get_tso,
921         .set_tso = qlcnic_set_tso,
922         .get_wol = qlcnic_get_wol,
923         .set_wol = qlcnic_set_wol,
924         .self_test = qlcnic_diag_test,
925         .get_strings = qlcnic_get_strings,
926         .get_ethtool_stats = qlcnic_get_ethtool_stats,
927         .get_sset_count = qlcnic_get_sset_count,
928         .get_rx_csum = qlcnic_get_rx_csum,
929         .set_rx_csum = qlcnic_set_rx_csum,
930         .get_coalesce = qlcnic_get_intr_coalesce,
931         .set_coalesce = qlcnic_set_intr_coalesce,
932         .get_flags = ethtool_op_get_flags,
933         .set_flags = qlcnic_set_flags,
934         .phys_id = qlcnic_blink_led,
935 };