Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / 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_tx_queue_stats tx_stats;
1294         struct qlcnic_host_tx_ring *tx_ring;
1295         int ring;
1296
1297         memset(&tx_stats, 0, sizeof(tx_stats));
1298         for (ring = 0; ring < adapter->drv_tx_rings; ring++) {
1299                 tx_ring = &adapter->tx_ring[ring];
1300                 tx_stats.xmit_on += tx_ring->tx_stats.xmit_on;
1301                 tx_stats.xmit_off += tx_ring->tx_stats.xmit_off;
1302                 tx_stats.xmit_called += tx_ring->tx_stats.xmit_called;
1303                 tx_stats.xmit_finished += tx_ring->tx_stats.xmit_finished;
1304                 tx_stats.tx_bytes += tx_ring->tx_stats.tx_bytes;
1305         }
1306
1307         adapter->stats.xmit_on = tx_stats.xmit_on;
1308         adapter->stats.xmit_off = tx_stats.xmit_off;
1309         adapter->stats.xmitcalled = tx_stats.xmit_called;
1310         adapter->stats.xmitfinished = tx_stats.xmit_finished;
1311         adapter->stats.txbytes = tx_stats.tx_bytes;
1312 }
1313
1314 static u64 *qlcnic_fill_tx_queue_stats(u64 *data, void *stats)
1315 {
1316         struct qlcnic_host_tx_ring *tx_ring;
1317
1318         tx_ring = (struct qlcnic_host_tx_ring *)stats;
1319
1320         *data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_on);
1321         *data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_off);
1322         *data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_called);
1323         *data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_finished);
1324         *data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.tx_bytes);
1325
1326         return data;
1327 }
1328
1329 static void qlcnic_get_ethtool_stats(struct net_device *dev,
1330                                      struct ethtool_stats *stats, u64 *data)
1331 {
1332         struct qlcnic_adapter *adapter = netdev_priv(dev);
1333         struct qlcnic_host_tx_ring *tx_ring;
1334         struct qlcnic_esw_statistics port_stats;
1335         struct qlcnic_mac_statistics mac_stats;
1336         int index, ret, length, size, ring;
1337         char *p;
1338
1339         memset(data, 0, stats->n_stats * sizeof(u64));
1340
1341         for (ring = 0, index = 0; ring < adapter->drv_tx_rings; ring++) {
1342                 if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) {
1343                         tx_ring = &adapter->tx_ring[ring];
1344                         data = qlcnic_fill_tx_queue_stats(data, tx_ring);
1345                         qlcnic_update_stats(adapter);
1346                 } else {
1347                         data += QLCNIC_TX_STATS_LEN;
1348                 }
1349         }
1350
1351         length = QLCNIC_STATS_LEN;
1352         for (index = 0; index < length; index++) {
1353                 p = (char *)adapter + qlcnic_gstrings_stats[index].stat_offset;
1354                 size = qlcnic_gstrings_stats[index].sizeof_stat;
1355                 *data++ = (size == sizeof(u64)) ? (*(u64 *)p) : ((*(u32 *)p));
1356         }
1357
1358         if (qlcnic_83xx_check(adapter)) {
1359                 if (adapter->ahw->linkup)
1360                         qlcnic_83xx_get_stats(adapter, data);
1361                 return;
1362         } else {
1363                 /* Retrieve MAC statistics from firmware */
1364                 memset(&mac_stats, 0, sizeof(struct qlcnic_mac_statistics));
1365                 qlcnic_get_mac_stats(adapter, &mac_stats);
1366                 data = qlcnic_fill_stats(data, &mac_stats, QLCNIC_MAC_STATS);
1367         }
1368
1369         if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
1370                 return;
1371
1372         memset(&port_stats, 0, sizeof(struct qlcnic_esw_statistics));
1373         ret = qlcnic_get_port_stats(adapter, adapter->ahw->pci_func,
1374                         QLCNIC_QUERY_RX_COUNTER, &port_stats.rx);
1375         if (ret)
1376                 return;
1377
1378         data = qlcnic_fill_stats(data, &port_stats.rx, QLCNIC_ESW_STATS);
1379         ret = qlcnic_get_port_stats(adapter, adapter->ahw->pci_func,
1380                         QLCNIC_QUERY_TX_COUNTER, &port_stats.tx);
1381         if (ret)
1382                 return;
1383
1384         qlcnic_fill_stats(data, &port_stats.tx, QLCNIC_ESW_STATS);
1385 }
1386
1387 static int qlcnic_set_led(struct net_device *dev,
1388                           enum ethtool_phys_id_state state)
1389 {
1390         struct qlcnic_adapter *adapter = netdev_priv(dev);
1391         int drv_sds_rings = adapter->drv_sds_rings;
1392         int err = -EIO, active = 1;
1393
1394         if (qlcnic_83xx_check(adapter))
1395                 return qlcnic_83xx_set_led(dev, state);
1396
1397         if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
1398                 netdev_warn(dev, "LED test not supported for non "
1399                                 "privilege function\n");
1400                 return -EOPNOTSUPP;
1401         }
1402
1403         switch (state) {
1404         case ETHTOOL_ID_ACTIVE:
1405                 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state))
1406                         return -EBUSY;
1407
1408                 if (test_bit(__QLCNIC_RESETTING, &adapter->state))
1409                         break;
1410
1411                 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
1412                         if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST))
1413                                 break;
1414                         set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
1415                 }
1416
1417                 if (adapter->nic_ops->config_led(adapter, 1, 0xf) == 0) {
1418                         err = 0;
1419                         break;
1420                 }
1421
1422                 dev_err(&adapter->pdev->dev,
1423                         "Failed to set LED blink state.\n");
1424                 break;
1425
1426         case ETHTOOL_ID_INACTIVE:
1427                 active = 0;
1428
1429                 if (test_bit(__QLCNIC_RESETTING, &adapter->state))
1430                         break;
1431
1432                 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
1433                         if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST))
1434                                 break;
1435                         set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
1436                 }
1437
1438                 if (adapter->nic_ops->config_led(adapter, 0, 0xf))
1439                         dev_err(&adapter->pdev->dev,
1440                                 "Failed to reset LED blink state.\n");
1441
1442                 break;
1443
1444         default:
1445                 return -EINVAL;
1446         }
1447
1448         if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state))
1449                 qlcnic_diag_free_res(dev, drv_sds_rings);
1450
1451         if (!active || err)
1452                 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
1453
1454         return err;
1455 }
1456
1457 static void
1458 qlcnic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1459 {
1460         struct qlcnic_adapter *adapter = netdev_priv(dev);
1461         u32 wol_cfg;
1462         int err = 0;
1463
1464         if (qlcnic_83xx_check(adapter))
1465                 return;
1466         wol->supported = 0;
1467         wol->wolopts = 0;
1468
1469         wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1470         if (err == -EIO)
1471                 return;
1472         if (wol_cfg & (1UL << adapter->portnum))
1473                 wol->supported |= WAKE_MAGIC;
1474
1475         wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1476         if (wol_cfg & (1UL << adapter->portnum))
1477                 wol->wolopts |= WAKE_MAGIC;
1478 }
1479
1480 static int
1481 qlcnic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1482 {
1483         struct qlcnic_adapter *adapter = netdev_priv(dev);
1484         u32 wol_cfg;
1485         int err = 0;
1486
1487         if (qlcnic_83xx_check(adapter))
1488                 return -EOPNOTSUPP;
1489         if (wol->wolopts & ~WAKE_MAGIC)
1490                 return -EINVAL;
1491
1492         wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1493         if (err == -EIO)
1494                 return err;
1495         if (!(wol_cfg & (1 << adapter->portnum)))
1496                 return -EOPNOTSUPP;
1497
1498         wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1499         if (err == -EIO)
1500                 return err;
1501         if (wol->wolopts & WAKE_MAGIC)
1502                 wol_cfg |= 1UL << adapter->portnum;
1503         else
1504                 wol_cfg &= ~(1UL << adapter->portnum);
1505
1506         QLCWR32(adapter, QLCNIC_WOL_CONFIG, wol_cfg);
1507
1508         return 0;
1509 }
1510
1511 /*
1512  * Set the coalescing parameters. Currently only normal is supported.
1513  * If rx_coalesce_usecs == 0 or rx_max_coalesced_frames == 0 then set the
1514  * firmware coalescing to default.
1515  */
1516 static int qlcnic_set_intr_coalesce(struct net_device *netdev,
1517                         struct ethtool_coalesce *ethcoal)
1518 {
1519         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1520         int err;
1521
1522         if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
1523                 return -EINVAL;
1524
1525         /*
1526         * Return Error if unsupported values or
1527         * unsupported parameters are set.
1528         */
1529         if (ethcoal->rx_coalesce_usecs > 0xffff ||
1530             ethcoal->rx_max_coalesced_frames > 0xffff ||
1531             ethcoal->tx_coalesce_usecs > 0xffff ||
1532             ethcoal->tx_max_coalesced_frames > 0xffff ||
1533             ethcoal->rx_coalesce_usecs_irq ||
1534             ethcoal->rx_max_coalesced_frames_irq ||
1535             ethcoal->tx_coalesce_usecs_irq ||
1536             ethcoal->tx_max_coalesced_frames_irq ||
1537             ethcoal->stats_block_coalesce_usecs ||
1538             ethcoal->use_adaptive_rx_coalesce ||
1539             ethcoal->use_adaptive_tx_coalesce ||
1540             ethcoal->pkt_rate_low ||
1541             ethcoal->rx_coalesce_usecs_low ||
1542             ethcoal->rx_max_coalesced_frames_low ||
1543             ethcoal->tx_coalesce_usecs_low ||
1544             ethcoal->tx_max_coalesced_frames_low ||
1545             ethcoal->pkt_rate_high ||
1546             ethcoal->rx_coalesce_usecs_high ||
1547             ethcoal->rx_max_coalesced_frames_high ||
1548             ethcoal->tx_coalesce_usecs_high ||
1549             ethcoal->tx_max_coalesced_frames_high)
1550                 return -EINVAL;
1551
1552         err = qlcnic_config_intr_coalesce(adapter, ethcoal);
1553
1554         return err;
1555 }
1556
1557 static int qlcnic_get_intr_coalesce(struct net_device *netdev,
1558                         struct ethtool_coalesce *ethcoal)
1559 {
1560         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1561
1562         if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
1563                 return -EINVAL;
1564
1565         ethcoal->rx_coalesce_usecs = adapter->ahw->coal.rx_time_us;
1566         ethcoal->rx_max_coalesced_frames = adapter->ahw->coal.rx_packets;
1567         ethcoal->tx_coalesce_usecs = adapter->ahw->coal.tx_time_us;
1568         ethcoal->tx_max_coalesced_frames = adapter->ahw->coal.tx_packets;
1569
1570         return 0;
1571 }
1572
1573 static u32 qlcnic_get_msglevel(struct net_device *netdev)
1574 {
1575         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1576
1577         return adapter->ahw->msg_enable;
1578 }
1579
1580 static void qlcnic_set_msglevel(struct net_device *netdev, u32 msglvl)
1581 {
1582         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1583
1584         adapter->ahw->msg_enable = msglvl;
1585 }
1586
1587 int qlcnic_enable_fw_dump_state(struct qlcnic_adapter *adapter)
1588 {
1589         struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1590         u32 val;
1591
1592         if (qlcnic_84xx_check(adapter)) {
1593                 if (qlcnic_83xx_lock_driver(adapter))
1594                         return -EBUSY;
1595
1596                 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
1597                 val &= ~QLC_83XX_IDC_DISABLE_FW_DUMP;
1598                 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
1599
1600                 qlcnic_83xx_unlock_driver(adapter);
1601         } else {
1602                 fw_dump->enable = true;
1603         }
1604
1605         dev_info(&adapter->pdev->dev, "FW dump enabled\n");
1606
1607         return 0;
1608 }
1609
1610 static int qlcnic_disable_fw_dump_state(struct qlcnic_adapter *adapter)
1611 {
1612         struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1613         u32 val;
1614
1615         if (qlcnic_84xx_check(adapter)) {
1616                 if (qlcnic_83xx_lock_driver(adapter))
1617                         return -EBUSY;
1618
1619                 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
1620                 val |= QLC_83XX_IDC_DISABLE_FW_DUMP;
1621                 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
1622
1623                 qlcnic_83xx_unlock_driver(adapter);
1624         } else {
1625                 fw_dump->enable = false;
1626         }
1627
1628         dev_info(&adapter->pdev->dev, "FW dump disabled\n");
1629
1630         return 0;
1631 }
1632
1633 bool qlcnic_check_fw_dump_state(struct qlcnic_adapter *adapter)
1634 {
1635         struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1636         bool state;
1637         u32 val;
1638
1639         if (qlcnic_84xx_check(adapter)) {
1640                 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
1641                 state = (val & QLC_83XX_IDC_DISABLE_FW_DUMP) ? false : true;
1642         } else {
1643                 state = fw_dump->enable;
1644         }
1645
1646         return state;
1647 }
1648
1649 static int
1650 qlcnic_get_dump_flag(struct net_device *netdev, struct ethtool_dump *dump)
1651 {
1652         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1653         struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1654
1655         if (!fw_dump->tmpl_hdr) {
1656                 netdev_err(adapter->netdev, "FW Dump not supported\n");
1657                 return -ENOTSUPP;
1658         }
1659
1660         if (fw_dump->clr)
1661                 dump->len = fw_dump->tmpl_hdr_size + fw_dump->size;
1662         else
1663                 dump->len = 0;
1664
1665         if (!qlcnic_check_fw_dump_state(adapter))
1666                 dump->flag = ETH_FW_DUMP_DISABLE;
1667         else
1668                 dump->flag = fw_dump->cap_mask;
1669
1670         dump->version = adapter->fw_version;
1671         return 0;
1672 }
1673
1674 static int
1675 qlcnic_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump,
1676                         void *buffer)
1677 {
1678         int i, copy_sz;
1679         u32 *hdr_ptr;
1680         __le32 *data;
1681         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1682         struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1683
1684         if (!fw_dump->tmpl_hdr) {
1685                 netdev_err(netdev, "FW Dump not supported\n");
1686                 return -ENOTSUPP;
1687         }
1688
1689         if (!fw_dump->clr) {
1690                 netdev_info(netdev, "Dump not available\n");
1691                 return -EINVAL;
1692         }
1693
1694         /* Copy template header first */
1695         copy_sz = fw_dump->tmpl_hdr_size;
1696         hdr_ptr = (u32 *)fw_dump->tmpl_hdr;
1697         data = buffer;
1698         for (i = 0; i < copy_sz/sizeof(u32); i++)
1699                 *data++ = cpu_to_le32(*hdr_ptr++);
1700
1701         /* Copy captured dump data */
1702         memcpy(buffer + copy_sz, fw_dump->data, fw_dump->size);
1703         dump->len = copy_sz + fw_dump->size;
1704         dump->flag = fw_dump->cap_mask;
1705
1706         /* Free dump area once data has been captured */
1707         vfree(fw_dump->data);
1708         fw_dump->data = NULL;
1709         fw_dump->clr = 0;
1710         netdev_info(netdev, "extracted the FW dump Successfully\n");
1711         return 0;
1712 }
1713
1714 static int qlcnic_set_dump_mask(struct qlcnic_adapter *adapter, u32 mask)
1715 {
1716         struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1717         struct net_device *netdev = adapter->netdev;
1718
1719         if (!qlcnic_check_fw_dump_state(adapter)) {
1720                 netdev_info(netdev,
1721                             "Can not change driver mask to 0x%x. FW dump not enabled\n",
1722                             mask);
1723                 return -EOPNOTSUPP;
1724         }
1725
1726         fw_dump->cap_mask = mask;
1727
1728         /* Store new capture mask in template header as well*/
1729         qlcnic_store_cap_mask(adapter, fw_dump->tmpl_hdr, mask);
1730
1731         netdev_info(netdev, "Driver mask changed to: 0x%x\n", mask);
1732         return 0;
1733 }
1734
1735 static int
1736 qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
1737 {
1738         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1739         struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
1740         bool valid_mask = false;
1741         int i, ret = 0;
1742
1743         switch (val->flag) {
1744         case QLCNIC_FORCE_FW_DUMP_KEY:
1745                 if (!fw_dump->tmpl_hdr) {
1746                         netdev_err(netdev, "FW dump not supported\n");
1747                         ret = -EOPNOTSUPP;
1748                         break;
1749                 }
1750
1751                 if (!qlcnic_check_fw_dump_state(adapter)) {
1752                         netdev_info(netdev, "FW dump not enabled\n");
1753                         ret = -EOPNOTSUPP;
1754                         break;
1755                 }
1756
1757                 if (fw_dump->clr) {
1758                         netdev_info(netdev,
1759                                     "Previous dump not cleared, not forcing dump\n");
1760                         break;
1761                 }
1762
1763                 netdev_info(netdev, "Forcing a FW dump\n");
1764                 qlcnic_dev_request_reset(adapter, val->flag);
1765                 break;
1766         case QLCNIC_DISABLE_FW_DUMP:
1767                 if (!fw_dump->tmpl_hdr) {
1768                         netdev_err(netdev, "FW dump not supported\n");
1769                         ret = -EOPNOTSUPP;
1770                         break;
1771                 }
1772
1773                 ret = qlcnic_disable_fw_dump_state(adapter);
1774                 break;
1775
1776         case QLCNIC_ENABLE_FW_DUMP:
1777                 if (!fw_dump->tmpl_hdr) {
1778                         netdev_err(netdev, "FW dump not supported\n");
1779                         ret = -EOPNOTSUPP;
1780                         break;
1781                 }
1782
1783                 ret = qlcnic_enable_fw_dump_state(adapter);
1784                 break;
1785
1786         case QLCNIC_FORCE_FW_RESET:
1787                 netdev_info(netdev, "Forcing a FW reset\n");
1788                 qlcnic_dev_request_reset(adapter, val->flag);
1789                 adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
1790                 break;
1791
1792         case QLCNIC_SET_QUIESCENT:
1793         case QLCNIC_RESET_QUIESCENT:
1794                 if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state))
1795                         netdev_info(netdev, "Device is in non-operational state\n");
1796                 break;
1797
1798         default:
1799                 if (!fw_dump->tmpl_hdr) {
1800                         netdev_err(netdev, "FW dump not supported\n");
1801                         ret = -EOPNOTSUPP;
1802                         break;
1803                 }
1804
1805                 for (i = 0; i < ARRAY_SIZE(qlcnic_fw_dump_level); i++) {
1806                         if (val->flag == qlcnic_fw_dump_level[i]) {
1807                                 valid_mask = true;
1808                                 break;
1809                         }
1810                 }
1811
1812                 if (valid_mask) {
1813                         ret = qlcnic_set_dump_mask(adapter, val->flag);
1814                 } else {
1815                         netdev_info(netdev, "Invalid dump level: 0x%x\n",
1816                                     val->flag);
1817                         ret = -EINVAL;
1818                 }
1819         }
1820         return ret;
1821 }
1822
1823 const struct ethtool_ops qlcnic_ethtool_ops = {
1824         .get_settings = qlcnic_get_settings,
1825         .set_settings = qlcnic_set_settings,
1826         .get_drvinfo = qlcnic_get_drvinfo,
1827         .get_regs_len = qlcnic_get_regs_len,
1828         .get_regs = qlcnic_get_regs,
1829         .get_link = ethtool_op_get_link,
1830         .get_eeprom_len = qlcnic_get_eeprom_len,
1831         .get_eeprom = qlcnic_get_eeprom,
1832         .get_ringparam = qlcnic_get_ringparam,
1833         .set_ringparam = qlcnic_set_ringparam,
1834         .get_channels = qlcnic_get_channels,
1835         .set_channels = qlcnic_set_channels,
1836         .get_pauseparam = qlcnic_get_pauseparam,
1837         .set_pauseparam = qlcnic_set_pauseparam,
1838         .get_wol = qlcnic_get_wol,
1839         .set_wol = qlcnic_set_wol,
1840         .self_test = qlcnic_diag_test,
1841         .get_strings = qlcnic_get_strings,
1842         .get_ethtool_stats = qlcnic_get_ethtool_stats,
1843         .get_sset_count = qlcnic_get_sset_count,
1844         .get_coalesce = qlcnic_get_intr_coalesce,
1845         .set_coalesce = qlcnic_set_intr_coalesce,
1846         .set_phys_id = qlcnic_set_led,
1847         .set_msglevel = qlcnic_set_msglevel,
1848         .get_msglevel = qlcnic_get_msglevel,
1849         .get_dump_flag = qlcnic_get_dump_flag,
1850         .get_dump_data = qlcnic_get_dump_data,
1851         .set_dump = qlcnic_set_dump,
1852 };
1853
1854 const struct ethtool_ops qlcnic_sriov_vf_ethtool_ops = {
1855         .get_settings           = qlcnic_get_settings,
1856         .get_drvinfo            = qlcnic_get_drvinfo,
1857         .get_regs_len           = qlcnic_get_regs_len,
1858         .get_regs               = qlcnic_get_regs,
1859         .get_link               = ethtool_op_get_link,
1860         .get_eeprom_len         = qlcnic_get_eeprom_len,
1861         .get_eeprom             = qlcnic_get_eeprom,
1862         .get_ringparam          = qlcnic_get_ringparam,
1863         .set_ringparam          = qlcnic_set_ringparam,
1864         .get_channels           = qlcnic_get_channels,
1865         .get_pauseparam         = qlcnic_get_pauseparam,
1866         .get_wol                = qlcnic_get_wol,
1867         .get_strings            = qlcnic_get_strings,
1868         .get_ethtool_stats      = qlcnic_get_ethtool_stats,
1869         .get_sset_count         = qlcnic_get_sset_count,
1870         .get_coalesce           = qlcnic_get_intr_coalesce,
1871         .set_coalesce           = qlcnic_set_intr_coalesce,
1872         .set_msglevel           = qlcnic_set_msglevel,
1873         .get_msglevel           = qlcnic_get_msglevel,
1874 };
1875
1876 const struct ethtool_ops qlcnic_ethtool_failed_ops = {
1877         .get_settings           = qlcnic_get_settings,
1878         .get_drvinfo            = qlcnic_get_drvinfo,
1879         .set_msglevel           = qlcnic_set_msglevel,
1880         .get_msglevel           = qlcnic_get_msglevel,
1881         .set_dump               = qlcnic_set_dump,
1882 };