ixgbevf: implement ethtool get/set coalesce
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / intel / ixgbevf / ethtool.c
1 /*******************************************************************************
2
3   Intel 82599 Virtual Function driver
4   Copyright(c) 1999 - 2012 Intel Corporation.
5
6   This program is free software; you can redistribute it and/or modify it
7   under the terms and conditions of the GNU General Public License,
8   version 2, as published by the Free Software Foundation.
9
10   This program is distributed in the hope it will be useful, but WITHOUT
11   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13   more details.
14
15   You should have received a copy of the GNU General Public License along with
16   this program; if not, write to the Free Software Foundation, Inc.,
17   51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18
19   The full GNU General Public License is included in this distribution in
20   the file called "COPYING".
21
22   Contact Information:
23   e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
24   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
25
26 *******************************************************************************/
27
28 /* ethtool support for ixgbevf */
29
30 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31
32 #include <linux/types.h>
33 #include <linux/module.h>
34 #include <linux/slab.h>
35 #include <linux/pci.h>
36 #include <linux/netdevice.h>
37 #include <linux/ethtool.h>
38 #include <linux/vmalloc.h>
39 #include <linux/if_vlan.h>
40 #include <linux/uaccess.h>
41
42 #include "ixgbevf.h"
43
44 #define IXGBE_ALL_RAR_ENTRIES 16
45
46 struct ixgbe_stats {
47         char stat_string[ETH_GSTRING_LEN];
48         int sizeof_stat;
49         int stat_offset;
50         int base_stat_offset;
51         int saved_reset_offset;
52 };
53
54 #define IXGBEVF_STAT(m, b, r)  sizeof(((struct ixgbevf_adapter *)0)->m), \
55                             offsetof(struct ixgbevf_adapter, m),         \
56                             offsetof(struct ixgbevf_adapter, b),         \
57                             offsetof(struct ixgbevf_adapter, r)
58
59 static const struct ixgbe_stats ixgbe_gstrings_stats[] = {
60         {"rx_packets", IXGBEVF_STAT(stats.vfgprc, stats.base_vfgprc,
61                                     stats.saved_reset_vfgprc)},
62         {"tx_packets", IXGBEVF_STAT(stats.vfgptc, stats.base_vfgptc,
63                                     stats.saved_reset_vfgptc)},
64         {"rx_bytes", IXGBEVF_STAT(stats.vfgorc, stats.base_vfgorc,
65                                   stats.saved_reset_vfgorc)},
66         {"tx_bytes", IXGBEVF_STAT(stats.vfgotc, stats.base_vfgotc,
67                                   stats.saved_reset_vfgotc)},
68         {"tx_busy", IXGBEVF_STAT(tx_busy, zero_base, zero_base)},
69         {"multicast", IXGBEVF_STAT(stats.vfmprc, stats.base_vfmprc,
70                                    stats.saved_reset_vfmprc)},
71         {"rx_csum_offload_good", IXGBEVF_STAT(hw_csum_rx_good, zero_base,
72                                               zero_base)},
73         {"rx_csum_offload_errors", IXGBEVF_STAT(hw_csum_rx_error, zero_base,
74                                                 zero_base)},
75         {"tx_csum_offload_ctxt", IXGBEVF_STAT(hw_csum_tx_good, zero_base,
76                                               zero_base)},
77 };
78
79 #define IXGBE_QUEUE_STATS_LEN 0
80 #define IXGBE_GLOBAL_STATS_LEN  ARRAY_SIZE(ixgbe_gstrings_stats)
81
82 #define IXGBEVF_STATS_LEN (IXGBE_GLOBAL_STATS_LEN + IXGBE_QUEUE_STATS_LEN)
83 static const char ixgbe_gstrings_test[][ETH_GSTRING_LEN] = {
84         "Register test  (offline)",
85         "Link test   (on/offline)"
86 };
87 #define IXGBE_TEST_LEN (sizeof(ixgbe_gstrings_test) / ETH_GSTRING_LEN)
88
89 static int ixgbevf_get_settings(struct net_device *netdev,
90                                 struct ethtool_cmd *ecmd)
91 {
92         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
93         struct ixgbe_hw *hw = &adapter->hw;
94         u32 link_speed = 0;
95         bool link_up;
96
97         ecmd->supported = SUPPORTED_10000baseT_Full;
98         ecmd->autoneg = AUTONEG_DISABLE;
99         ecmd->transceiver = XCVR_DUMMY1;
100         ecmd->port = -1;
101
102         hw->mac.get_link_status = 1;
103         hw->mac.ops.check_link(hw, &link_speed, &link_up, false);
104
105         if (link_up) {
106                 __u32 speed = SPEED_10000;
107                 switch (link_speed) {
108                 case IXGBE_LINK_SPEED_10GB_FULL:
109                         speed = SPEED_10000;
110                         break;
111                 case IXGBE_LINK_SPEED_1GB_FULL:
112                         speed = SPEED_1000;
113                         break;
114                 case IXGBE_LINK_SPEED_100_FULL:
115                         speed = SPEED_100;
116                         break;
117                 }
118
119                 ethtool_cmd_speed_set(ecmd, speed);
120                 ecmd->duplex = DUPLEX_FULL;
121         } else {
122                 ethtool_cmd_speed_set(ecmd, -1);
123                 ecmd->duplex = -1;
124         }
125
126         return 0;
127 }
128
129 static u32 ixgbevf_get_msglevel(struct net_device *netdev)
130 {
131         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
132         return adapter->msg_enable;
133 }
134
135 static void ixgbevf_set_msglevel(struct net_device *netdev, u32 data)
136 {
137         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
138         adapter->msg_enable = data;
139 }
140
141 #define IXGBE_GET_STAT(_A_, _R_) (_A_->stats._R_)
142
143 static int ixgbevf_get_regs_len(struct net_device *netdev)
144 {
145 #define IXGBE_REGS_LEN 45
146         return IXGBE_REGS_LEN * sizeof(u32);
147 }
148
149 static void ixgbevf_get_regs(struct net_device *netdev,
150                              struct ethtool_regs *regs,
151                              void *p)
152 {
153         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
154         struct ixgbe_hw *hw = &adapter->hw;
155         u32 *regs_buff = p;
156         u32 regs_len = ixgbevf_get_regs_len(netdev);
157         u8 i;
158
159         memset(p, 0, regs_len);
160
161         regs->version = (1 << 24) | hw->revision_id << 16 | hw->device_id;
162
163         /* General Registers */
164         regs_buff[0] = IXGBE_READ_REG(hw, IXGBE_VFCTRL);
165         regs_buff[1] = IXGBE_READ_REG(hw, IXGBE_VFSTATUS);
166         regs_buff[2] = IXGBE_READ_REG(hw, IXGBE_VFLINKS);
167         regs_buff[3] = IXGBE_READ_REG(hw, IXGBE_VFRXMEMWRAP);
168         regs_buff[4] = IXGBE_READ_REG(hw, IXGBE_VFFRTIMER);
169
170         /* Interrupt */
171         /* don't read EICR because it can clear interrupt causes, instead
172          * read EICS which is a shadow but doesn't clear EICR */
173         regs_buff[5] = IXGBE_READ_REG(hw, IXGBE_VTEICS);
174         regs_buff[6] = IXGBE_READ_REG(hw, IXGBE_VTEICS);
175         regs_buff[7] = IXGBE_READ_REG(hw, IXGBE_VTEIMS);
176         regs_buff[8] = IXGBE_READ_REG(hw, IXGBE_VTEIMC);
177         regs_buff[9] = IXGBE_READ_REG(hw, IXGBE_VTEIAC);
178         regs_buff[10] = IXGBE_READ_REG(hw, IXGBE_VTEIAM);
179         regs_buff[11] = IXGBE_READ_REG(hw, IXGBE_VTEITR(0));
180         regs_buff[12] = IXGBE_READ_REG(hw, IXGBE_VTIVAR(0));
181         regs_buff[13] = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
182
183         /* Receive DMA */
184         for (i = 0; i < 2; i++)
185                 regs_buff[14 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDBAL(i));
186         for (i = 0; i < 2; i++)
187                 regs_buff[16 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDBAH(i));
188         for (i = 0; i < 2; i++)
189                 regs_buff[18 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDLEN(i));
190         for (i = 0; i < 2; i++)
191                 regs_buff[20 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDH(i));
192         for (i = 0; i < 2; i++)
193                 regs_buff[22 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDT(i));
194         for (i = 0; i < 2; i++)
195                 regs_buff[24 + i] = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
196         for (i = 0; i < 2; i++)
197                 regs_buff[26 + i] = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(i));
198
199         /* Receive */
200         regs_buff[28] = IXGBE_READ_REG(hw, IXGBE_VFPSRTYPE);
201
202         /* Transmit */
203         for (i = 0; i < 2; i++)
204                 regs_buff[29 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDBAL(i));
205         for (i = 0; i < 2; i++)
206                 regs_buff[31 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDBAH(i));
207         for (i = 0; i < 2; i++)
208                 regs_buff[33 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDLEN(i));
209         for (i = 0; i < 2; i++)
210                 regs_buff[35 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDH(i));
211         for (i = 0; i < 2; i++)
212                 regs_buff[37 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDT(i));
213         for (i = 0; i < 2; i++)
214                 regs_buff[39 + i] = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
215         for (i = 0; i < 2; i++)
216                 regs_buff[41 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDWBAL(i));
217         for (i = 0; i < 2; i++)
218                 regs_buff[43 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDWBAH(i));
219 }
220
221 static void ixgbevf_get_drvinfo(struct net_device *netdev,
222                                 struct ethtool_drvinfo *drvinfo)
223 {
224         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
225
226         strlcpy(drvinfo->driver, ixgbevf_driver_name, sizeof(drvinfo->driver));
227         strlcpy(drvinfo->version, ixgbevf_driver_version,
228                 sizeof(drvinfo->version));
229         strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
230                 sizeof(drvinfo->bus_info));
231 }
232
233 static void ixgbevf_get_ringparam(struct net_device *netdev,
234                                   struct ethtool_ringparam *ring)
235 {
236         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
237
238         ring->rx_max_pending = IXGBEVF_MAX_RXD;
239         ring->tx_max_pending = IXGBEVF_MAX_TXD;
240         ring->rx_pending = adapter->rx_ring_count;
241         ring->tx_pending = adapter->tx_ring_count;
242 }
243
244 static int ixgbevf_set_ringparam(struct net_device *netdev,
245                                  struct ethtool_ringparam *ring)
246 {
247         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
248         struct ixgbevf_ring *tx_ring = NULL, *rx_ring = NULL;
249         u32 new_rx_count, new_tx_count;
250         int i, err = 0;
251
252         if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
253                 return -EINVAL;
254
255         new_tx_count = max_t(u32, ring->tx_pending, IXGBEVF_MIN_TXD);
256         new_tx_count = min_t(u32, new_tx_count, IXGBEVF_MAX_TXD);
257         new_tx_count = ALIGN(new_tx_count, IXGBE_REQ_TX_DESCRIPTOR_MULTIPLE);
258
259         new_rx_count = max_t(u32, ring->rx_pending, IXGBEVF_MIN_RXD);
260         new_rx_count = min_t(u32, new_rx_count, IXGBEVF_MAX_RXD);
261         new_rx_count = ALIGN(new_rx_count, IXGBE_REQ_RX_DESCRIPTOR_MULTIPLE);
262
263         /* if nothing to do return success */
264         if ((new_tx_count == adapter->tx_ring_count) &&
265             (new_rx_count == adapter->rx_ring_count))
266                 return 0;
267
268         while (test_and_set_bit(__IXGBEVF_RESETTING, &adapter->state))
269                 usleep_range(1000, 2000);
270
271         if (!netif_running(adapter->netdev)) {
272                 for (i = 0; i < adapter->num_tx_queues; i++)
273                         adapter->tx_ring[i].count = new_tx_count;
274                 for (i = 0; i < adapter->num_rx_queues; i++)
275                         adapter->rx_ring[i].count = new_rx_count;
276                 adapter->tx_ring_count = new_tx_count;
277                 adapter->rx_ring_count = new_rx_count;
278                 goto clear_reset;
279         }
280
281         if (new_tx_count != adapter->tx_ring_count) {
282                 tx_ring = vmalloc(adapter->num_tx_queues * sizeof(*tx_ring));
283                 if (!tx_ring) {
284                         err = -ENOMEM;
285                         goto clear_reset;
286                 }
287
288                 for (i = 0; i < adapter->num_tx_queues; i++) {
289                         /* clone ring and setup updated count */
290                         tx_ring[i] = adapter->tx_ring[i];
291                         tx_ring[i].count = new_tx_count;
292                         err = ixgbevf_setup_tx_resources(adapter, &tx_ring[i]);
293                         if (!err)
294                                 continue;
295                         while (i) {
296                                 i--;
297                                 ixgbevf_free_tx_resources(adapter, &tx_ring[i]);
298                         }
299
300                         vfree(tx_ring);
301                         tx_ring = NULL;
302
303                         goto clear_reset;
304                 }
305         }
306
307         if (new_rx_count != adapter->rx_ring_count) {
308                 rx_ring = vmalloc(adapter->num_rx_queues * sizeof(*rx_ring));
309                 if (!rx_ring) {
310                         err = -ENOMEM;
311                         goto clear_reset;
312                 }
313
314                 for (i = 0; i < adapter->num_rx_queues; i++) {
315                         /* clone ring and setup updated count */
316                         rx_ring[i] = adapter->rx_ring[i];
317                         rx_ring[i].count = new_rx_count;
318                         err = ixgbevf_setup_rx_resources(adapter, &rx_ring[i]);
319                         if (!err)
320                                 continue;
321                         while (i) {
322                                 i--;
323                                 ixgbevf_free_rx_resources(adapter, &rx_ring[i]);
324                         }
325
326                         vfree(rx_ring);
327                         rx_ring = NULL;
328
329                         goto clear_reset;
330                 }
331         }
332
333         /* bring interface down to prepare for update */
334         ixgbevf_down(adapter);
335
336         /* Tx */
337         if (tx_ring) {
338                 for (i = 0; i < adapter->num_tx_queues; i++) {
339                         ixgbevf_free_tx_resources(adapter,
340                                                   &adapter->tx_ring[i]);
341                         adapter->tx_ring[i] = tx_ring[i];
342                 }
343                 adapter->tx_ring_count = new_tx_count;
344
345                 vfree(tx_ring);
346                 tx_ring = NULL;
347         }
348
349         /* Rx */
350         if (rx_ring) {
351                 for (i = 0; i < adapter->num_rx_queues; i++) {
352                         ixgbevf_free_rx_resources(adapter,
353                                                   &adapter->rx_ring[i]);
354                         adapter->rx_ring[i] = rx_ring[i];
355                 }
356                 adapter->rx_ring_count = new_rx_count;
357
358                 vfree(rx_ring);
359                 rx_ring = NULL;
360         }
361
362         /* restore interface using new values */
363         ixgbevf_up(adapter);
364
365 clear_reset:
366         /* free Tx resources if Rx error is encountered */
367         if (tx_ring) {
368                 for (i = 0; i < adapter->num_tx_queues; i++)
369                         ixgbevf_free_tx_resources(adapter, &tx_ring[i]);
370                 vfree(tx_ring);
371         }
372
373         clear_bit(__IXGBEVF_RESETTING, &adapter->state);
374         return err;
375 }
376
377 static int ixgbevf_get_sset_count(struct net_device *dev, int stringset)
378 {
379        switch (stringset) {
380        case ETH_SS_TEST:
381                return IXGBE_TEST_LEN;
382        case ETH_SS_STATS:
383                return IXGBE_GLOBAL_STATS_LEN;
384        default:
385                return -EINVAL;
386        }
387 }
388
389 static void ixgbevf_get_ethtool_stats(struct net_device *netdev,
390                                       struct ethtool_stats *stats, u64 *data)
391 {
392         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
393         int i;
394
395         ixgbevf_update_stats(adapter);
396         for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) {
397                 char *p = (char *)adapter +
398                         ixgbe_gstrings_stats[i].stat_offset;
399                 char *b = (char *)adapter +
400                         ixgbe_gstrings_stats[i].base_stat_offset;
401                 char *r = (char *)adapter +
402                         ixgbe_gstrings_stats[i].saved_reset_offset;
403                 data[i] = ((ixgbe_gstrings_stats[i].sizeof_stat ==
404                             sizeof(u64)) ? *(u64 *)p : *(u32 *)p) -
405                           ((ixgbe_gstrings_stats[i].sizeof_stat ==
406                             sizeof(u64)) ? *(u64 *)b : *(u32 *)b) +
407                           ((ixgbe_gstrings_stats[i].sizeof_stat ==
408                             sizeof(u64)) ? *(u64 *)r : *(u32 *)r);
409         }
410 }
411
412 static void ixgbevf_get_strings(struct net_device *netdev, u32 stringset,
413                                 u8 *data)
414 {
415         char *p = (char *)data;
416         int i;
417
418         switch (stringset) {
419         case ETH_SS_TEST:
420                 memcpy(data, *ixgbe_gstrings_test,
421                        IXGBE_TEST_LEN * ETH_GSTRING_LEN);
422                 break;
423         case ETH_SS_STATS:
424                 for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) {
425                         memcpy(p, ixgbe_gstrings_stats[i].stat_string,
426                                ETH_GSTRING_LEN);
427                         p += ETH_GSTRING_LEN;
428                 }
429                 break;
430         }
431 }
432
433 static int ixgbevf_link_test(struct ixgbevf_adapter *adapter, u64 *data)
434 {
435         struct ixgbe_hw *hw = &adapter->hw;
436         bool link_up;
437         u32 link_speed = 0;
438         *data = 0;
439
440         hw->mac.ops.check_link(hw, &link_speed, &link_up, true);
441         if (!link_up)
442                 *data = 1;
443
444         return *data;
445 }
446
447 /* ethtool register test data */
448 struct ixgbevf_reg_test {
449         u16 reg;
450         u8  array_len;
451         u8  test_type;
452         u32 mask;
453         u32 write;
454 };
455
456 /* In the hardware, registers are laid out either singly, in arrays
457  * spaced 0x40 bytes apart, or in contiguous tables.  We assume
458  * most tests take place on arrays or single registers (handled
459  * as a single-element array) and special-case the tables.
460  * Table tests are always pattern tests.
461  *
462  * We also make provision for some required setup steps by specifying
463  * registers to be written without any read-back testing.
464  */
465
466 #define PATTERN_TEST    1
467 #define SET_READ_TEST   2
468 #define WRITE_NO_TEST   3
469 #define TABLE32_TEST    4
470 #define TABLE64_TEST_LO 5
471 #define TABLE64_TEST_HI 6
472
473 /* default VF register test */
474 static const struct ixgbevf_reg_test reg_test_vf[] = {
475         { IXGBE_VFRDBAL(0), 2, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFF80 },
476         { IXGBE_VFRDBAH(0), 2, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
477         { IXGBE_VFRDLEN(0), 2, PATTERN_TEST, 0x000FFF80, 0x000FFFFF },
478         { IXGBE_VFRXDCTL(0), 2, WRITE_NO_TEST, 0, IXGBE_RXDCTL_ENABLE },
479         { IXGBE_VFRDT(0), 2, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF },
480         { IXGBE_VFRXDCTL(0), 2, WRITE_NO_TEST, 0, 0 },
481         { IXGBE_VFTDBAL(0), 2, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF },
482         { IXGBE_VFTDBAH(0), 2, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
483         { IXGBE_VFTDLEN(0), 2, PATTERN_TEST, 0x000FFF80, 0x000FFF80 },
484         { 0, 0, 0, 0 }
485 };
486
487 static const u32 register_test_patterns[] = {
488         0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF
489 };
490
491 #define REG_PATTERN_TEST(R, M, W)                                             \
492 {                                                                             \
493         u32 pat, val, before;                                                 \
494         for (pat = 0; pat < ARRAY_SIZE(register_test_patterns); pat++) {      \
495                 before = readl(adapter->hw.hw_addr + R);                      \
496                 writel((register_test_patterns[pat] & W),                     \
497                        (adapter->hw.hw_addr + R));                            \
498                 val = readl(adapter->hw.hw_addr + R);                         \
499                 if (val != (register_test_patterns[pat] & W & M)) {           \
500                         hw_dbg(&adapter->hw,                                  \
501                         "pattern test reg %04X failed: got "                  \
502                         "0x%08X expected 0x%08X\n",                           \
503                         R, val, (register_test_patterns[pat] & W & M));       \
504                         *data = R;                                            \
505                         writel(before, adapter->hw.hw_addr + R);              \
506                         return 1;                                             \
507                 }                                                             \
508                 writel(before, adapter->hw.hw_addr + R);                      \
509         }                                                                     \
510 }
511
512 #define REG_SET_AND_CHECK(R, M, W)                                            \
513 {                                                                             \
514         u32 val, before;                                                      \
515         before = readl(adapter->hw.hw_addr + R);                              \
516         writel((W & M), (adapter->hw.hw_addr + R));                           \
517         val = readl(adapter->hw.hw_addr + R);                                 \
518         if ((W & M) != (val & M)) {                                           \
519                 pr_err("set/check reg %04X test failed: got 0x%08X expected " \
520                        "0x%08X\n", R, (val & M), (W & M));                    \
521                 *data = R;                                                    \
522                 writel(before, (adapter->hw.hw_addr + R));                    \
523                 return 1;                                                     \
524         }                                                                     \
525         writel(before, (adapter->hw.hw_addr + R));                            \
526 }
527
528 static int ixgbevf_reg_test(struct ixgbevf_adapter *adapter, u64 *data)
529 {
530         const struct ixgbevf_reg_test *test;
531         u32 i;
532
533         test = reg_test_vf;
534
535         /*
536          * Perform the register test, looping through the test table
537          * until we either fail or reach the null entry.
538          */
539         while (test->reg) {
540                 for (i = 0; i < test->array_len; i++) {
541                         switch (test->test_type) {
542                         case PATTERN_TEST:
543                                 REG_PATTERN_TEST(test->reg + (i * 0x40),
544                                                 test->mask,
545                                                 test->write);
546                                 break;
547                         case SET_READ_TEST:
548                                 REG_SET_AND_CHECK(test->reg + (i * 0x40),
549                                                 test->mask,
550                                                 test->write);
551                                 break;
552                         case WRITE_NO_TEST:
553                                 writel(test->write,
554                                        (adapter->hw.hw_addr + test->reg)
555                                        + (i * 0x40));
556                                 break;
557                         case TABLE32_TEST:
558                                 REG_PATTERN_TEST(test->reg + (i * 4),
559                                                 test->mask,
560                                                 test->write);
561                                 break;
562                         case TABLE64_TEST_LO:
563                                 REG_PATTERN_TEST(test->reg + (i * 8),
564                                                 test->mask,
565                                                 test->write);
566                                 break;
567                         case TABLE64_TEST_HI:
568                                 REG_PATTERN_TEST((test->reg + 4) + (i * 8),
569                                                 test->mask,
570                                                 test->write);
571                                 break;
572                         }
573                 }
574                 test++;
575         }
576
577         *data = 0;
578         return *data;
579 }
580
581 static void ixgbevf_diag_test(struct net_device *netdev,
582                               struct ethtool_test *eth_test, u64 *data)
583 {
584         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
585         bool if_running = netif_running(netdev);
586
587         set_bit(__IXGBEVF_TESTING, &adapter->state);
588         if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
589                 /* Offline tests */
590
591                 hw_dbg(&adapter->hw, "offline testing starting\n");
592
593                 /* Link test performed before hardware reset so autoneg doesn't
594                  * interfere with test result */
595                 if (ixgbevf_link_test(adapter, &data[1]))
596                         eth_test->flags |= ETH_TEST_FL_FAILED;
597
598                 if (if_running)
599                         /* indicate we're in test mode */
600                         dev_close(netdev);
601                 else
602                         ixgbevf_reset(adapter);
603
604                 hw_dbg(&adapter->hw, "register testing starting\n");
605                 if (ixgbevf_reg_test(adapter, &data[0]))
606                         eth_test->flags |= ETH_TEST_FL_FAILED;
607
608                 ixgbevf_reset(adapter);
609
610                 clear_bit(__IXGBEVF_TESTING, &adapter->state);
611                 if (if_running)
612                         dev_open(netdev);
613         } else {
614                 hw_dbg(&adapter->hw, "online testing starting\n");
615                 /* Online tests */
616                 if (ixgbevf_link_test(adapter, &data[1]))
617                         eth_test->flags |= ETH_TEST_FL_FAILED;
618
619                 /* Online tests aren't run; pass by default */
620                 data[0] = 0;
621
622                 clear_bit(__IXGBEVF_TESTING, &adapter->state);
623         }
624         msleep_interruptible(4 * 1000);
625 }
626
627 static int ixgbevf_nway_reset(struct net_device *netdev)
628 {
629         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
630
631         if (netif_running(netdev))
632                 ixgbevf_reinit_locked(adapter);
633
634         return 0;
635 }
636
637 static int ixgbevf_get_coalesce(struct net_device *netdev,
638                                 struct ethtool_coalesce *ec)
639 {
640         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
641
642         /* only valid if in constant ITR mode */
643         if (adapter->rx_itr_setting <= 1)
644                 ec->rx_coalesce_usecs = adapter->rx_itr_setting;
645         else
646                 ec->rx_coalesce_usecs = adapter->rx_itr_setting >> 2;
647
648         /* if in mixed tx/rx queues per vector mode, report only rx settings */
649         if (adapter->q_vector[0]->tx.count && adapter->q_vector[0]->rx.count)
650                 return 0;
651
652         /* only valid if in constant ITR mode */
653         if (adapter->tx_itr_setting <= 1)
654                 ec->tx_coalesce_usecs = adapter->tx_itr_setting;
655         else
656                 ec->tx_coalesce_usecs = adapter->tx_itr_setting >> 2;
657
658         return 0;
659 }
660
661 static int ixgbevf_set_coalesce(struct net_device *netdev,
662                                 struct ethtool_coalesce *ec)
663 {
664         struct ixgbevf_adapter *adapter = netdev_priv(netdev);
665         struct ixgbevf_q_vector *q_vector;
666         int num_vectors, i;
667         u16 tx_itr_param, rx_itr_param;
668
669         /* don't accept tx specific changes if we've got mixed RxTx vectors */
670         if (adapter->q_vector[0]->tx.count && adapter->q_vector[0]->rx.count
671             && ec->tx_coalesce_usecs)
672                 return -EINVAL;
673
674
675         if ((ec->rx_coalesce_usecs > (IXGBE_MAX_EITR >> 2)) ||
676             (ec->tx_coalesce_usecs > (IXGBE_MAX_EITR >> 2)))
677                 return -EINVAL;
678
679         if (ec->rx_coalesce_usecs > 1)
680                 adapter->rx_itr_setting = ec->rx_coalesce_usecs << 2;
681         else
682                 adapter->rx_itr_setting = ec->rx_coalesce_usecs;
683
684         if (adapter->rx_itr_setting == 1)
685                 rx_itr_param = IXGBE_20K_ITR;
686         else
687                 rx_itr_param = adapter->rx_itr_setting;
688
689
690         if (ec->tx_coalesce_usecs > 1)
691                 adapter->tx_itr_setting = ec->tx_coalesce_usecs << 2;
692         else
693                 adapter->tx_itr_setting = ec->tx_coalesce_usecs;
694
695         if (adapter->tx_itr_setting == 1)
696                 tx_itr_param = IXGBE_10K_ITR;
697         else
698                 tx_itr_param = adapter->tx_itr_setting;
699
700         num_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
701
702         for (i = 0; i < num_vectors; i++) {
703                 q_vector = adapter->q_vector[i];
704                 if (q_vector->tx.count && !q_vector->rx.count)
705                         /* tx only */
706                         q_vector->itr = tx_itr_param;
707                 else
708                         /* rx only or mixed */
709                         q_vector->itr = rx_itr_param;
710                 ixgbevf_write_eitr(q_vector);
711         }
712
713         return 0;
714 }
715
716 static const struct ethtool_ops ixgbevf_ethtool_ops = {
717         .get_settings           = ixgbevf_get_settings,
718         .get_drvinfo            = ixgbevf_get_drvinfo,
719         .get_regs_len           = ixgbevf_get_regs_len,
720         .get_regs               = ixgbevf_get_regs,
721         .nway_reset             = ixgbevf_nway_reset,
722         .get_link               = ethtool_op_get_link,
723         .get_ringparam          = ixgbevf_get_ringparam,
724         .set_ringparam          = ixgbevf_set_ringparam,
725         .get_msglevel           = ixgbevf_get_msglevel,
726         .set_msglevel           = ixgbevf_set_msglevel,
727         .self_test              = ixgbevf_diag_test,
728         .get_sset_count         = ixgbevf_get_sset_count,
729         .get_strings            = ixgbevf_get_strings,
730         .get_ethtool_stats      = ixgbevf_get_ethtool_stats,
731         .get_coalesce           = ixgbevf_get_coalesce,
732         .set_coalesce           = ixgbevf_set_coalesce,
733 };
734
735 void ixgbevf_set_ethtool_ops(struct net_device *netdev)
736 {
737         SET_ETHTOOL_OPS(netdev, &ixgbevf_ethtool_ops);
738 }