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