1 /*******************************************************************************
3 Intel 82599 Virtual Function driver
4 Copyright(c) 1999 - 2009 Intel Corporation.
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.
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
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.
19 The full GNU General Public License is included in this distribution in
20 the file called "COPYING".
24 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26 *******************************************************************************/
28 /* ethtool support for ixgbevf */
30 #include <linux/types.h>
31 #include <linux/module.h>
32 #include <linux/slab.h>
33 #include <linux/pci.h>
34 #include <linux/netdevice.h>
35 #include <linux/ethtool.h>
36 #include <linux/vmalloc.h>
37 #include <linux/if_vlan.h>
38 #include <linux/uaccess.h>
42 #define IXGBE_ALL_RAR_ENTRIES 16
46 char stat_string[ETH_GSTRING_LEN];
50 int saved_reset_offset;
53 #define IXGBEVF_STAT(m, b, r) sizeof(((struct ixgbevf_adapter *)0)->m), \
54 offsetof(struct ixgbevf_adapter, m), \
55 offsetof(struct ixgbevf_adapter, b), \
56 offsetof(struct ixgbevf_adapter, r)
57 static struct ixgbe_stats ixgbe_gstrings_stats[] = {
58 {"rx_packets", IXGBEVF_STAT(stats.vfgprc, stats.base_vfgprc,
59 stats.saved_reset_vfgprc)},
60 {"tx_packets", IXGBEVF_STAT(stats.vfgptc, stats.base_vfgptc,
61 stats.saved_reset_vfgptc)},
62 {"rx_bytes", IXGBEVF_STAT(stats.vfgorc, stats.base_vfgorc,
63 stats.saved_reset_vfgorc)},
64 {"tx_bytes", IXGBEVF_STAT(stats.vfgotc, stats.base_vfgotc,
65 stats.saved_reset_vfgotc)},
66 {"tx_busy", IXGBEVF_STAT(tx_busy, zero_base, zero_base)},
67 {"multicast", IXGBEVF_STAT(stats.vfmprc, stats.base_vfmprc,
68 stats.saved_reset_vfmprc)},
69 {"rx_csum_offload_good", IXGBEVF_STAT(hw_csum_rx_good, zero_base,
71 {"rx_csum_offload_errors", IXGBEVF_STAT(hw_csum_rx_error, zero_base,
73 {"tx_csum_offload_ctxt", IXGBEVF_STAT(hw_csum_tx_good, zero_base,
75 {"rx_header_split", IXGBEVF_STAT(rx_hdr_split, zero_base, zero_base)},
78 #define IXGBE_QUEUE_STATS_LEN 0
79 #define IXGBE_GLOBAL_STATS_LEN ARRAY_SIZE(ixgbe_gstrings_stats)
81 #define IXGBEVF_STATS_LEN (IXGBE_GLOBAL_STATS_LEN + IXGBE_QUEUE_STATS_LEN)
82 #endif /* ETHTOOL_GSTATS */
84 static const char ixgbe_gstrings_test[][ETH_GSTRING_LEN] = {
85 "Register test (offline)",
86 "Link test (on/offline)"
88 #define IXGBE_TEST_LEN (sizeof(ixgbe_gstrings_test) / ETH_GSTRING_LEN)
89 #endif /* ETHTOOL_TEST */
91 static int ixgbevf_get_settings(struct net_device *netdev,
92 struct ethtool_cmd *ecmd)
94 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
95 struct ixgbe_hw *hw = &adapter->hw;
99 ecmd->supported = SUPPORTED_10000baseT_Full;
100 ecmd->autoneg = AUTONEG_DISABLE;
101 ecmd->transceiver = XCVR_DUMMY1;
104 hw->mac.ops.check_link(hw, &link_speed, &link_up, false);
107 ecmd->speed = (link_speed == IXGBE_LINK_SPEED_10GB_FULL) ?
108 SPEED_10000 : SPEED_1000;
109 ecmd->duplex = DUPLEX_FULL;
118 static u32 ixgbevf_get_rx_csum(struct net_device *netdev)
120 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
121 return adapter->flags & IXGBE_FLAG_RX_CSUM_ENABLED;
124 static int ixgbevf_set_rx_csum(struct net_device *netdev, u32 data)
126 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
128 adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
130 adapter->flags &= ~IXGBE_FLAG_RX_CSUM_ENABLED;
132 if (netif_running(netdev)) {
133 if (!adapter->dev_closed)
134 ixgbevf_reinit_locked(adapter);
136 ixgbevf_reset(adapter);
142 static int ixgbevf_set_tso(struct net_device *netdev, u32 data)
145 netdev->features |= NETIF_F_TSO;
146 netdev->features |= NETIF_F_TSO6;
148 netif_tx_stop_all_queues(netdev);
149 netdev->features &= ~NETIF_F_TSO;
150 netdev->features &= ~NETIF_F_TSO6;
151 netif_tx_start_all_queues(netdev);
156 static u32 ixgbevf_get_msglevel(struct net_device *netdev)
158 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
159 return adapter->msg_enable;
162 static void ixgbevf_set_msglevel(struct net_device *netdev, u32 data)
164 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
165 adapter->msg_enable = data;
168 #define IXGBE_GET_STAT(_A_, _R_) (_A_->stats._R_)
170 static char *ixgbevf_reg_names[] = {
219 static int ixgbevf_get_regs_len(struct net_device *netdev)
221 return (ARRAY_SIZE(ixgbevf_reg_names)) * sizeof(u32);
224 static void ixgbevf_get_regs(struct net_device *netdev,
225 struct ethtool_regs *regs,
228 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
229 struct ixgbe_hw *hw = &adapter->hw;
231 u32 regs_len = ixgbevf_get_regs_len(netdev);
234 memset(p, 0, regs_len);
236 regs->version = (1 << 24) | hw->revision_id << 16 | hw->device_id;
238 /* General Registers */
239 regs_buff[0] = IXGBE_READ_REG(hw, IXGBE_VFCTRL);
240 regs_buff[1] = IXGBE_READ_REG(hw, IXGBE_VFSTATUS);
241 regs_buff[2] = IXGBE_READ_REG(hw, IXGBE_VFLINKS);
242 regs_buff[3] = IXGBE_READ_REG(hw, IXGBE_VFRXMEMWRAP);
243 regs_buff[4] = IXGBE_READ_REG(hw, IXGBE_VFRTIMER);
246 /* don't read EICR because it can clear interrupt causes, instead
247 * read EICS which is a shadow but doesn't clear EICR */
248 regs_buff[5] = IXGBE_READ_REG(hw, IXGBE_VTEICS);
249 regs_buff[6] = IXGBE_READ_REG(hw, IXGBE_VTEICS);
250 regs_buff[7] = IXGBE_READ_REG(hw, IXGBE_VTEIMS);
251 regs_buff[8] = IXGBE_READ_REG(hw, IXGBE_VTEIMC);
252 regs_buff[9] = IXGBE_READ_REG(hw, IXGBE_VTEIAC);
253 regs_buff[10] = IXGBE_READ_REG(hw, IXGBE_VTEIAM);
254 regs_buff[11] = IXGBE_READ_REG(hw, IXGBE_VTEITR(0));
255 regs_buff[12] = IXGBE_READ_REG(hw, IXGBE_VTIVAR(0));
256 regs_buff[13] = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
259 for (i = 0; i < 2; i++)
260 regs_buff[14 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDBAL(i));
261 for (i = 0; i < 2; i++)
262 regs_buff[16 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDBAH(i));
263 for (i = 0; i < 2; i++)
264 regs_buff[18 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDLEN(i));
265 for (i = 0; i < 2; i++)
266 regs_buff[20 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDH(i));
267 for (i = 0; i < 2; i++)
268 regs_buff[22 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDT(i));
269 for (i = 0; i < 2; i++)
270 regs_buff[24 + i] = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
271 for (i = 0; i < 2; i++)
272 regs_buff[26 + i] = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(i));
275 regs_buff[28] = IXGBE_READ_REG(hw, IXGBE_VFPSRTYPE);
278 for (i = 0; i < 2; i++)
279 regs_buff[29 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDBAL(i));
280 for (i = 0; i < 2; i++)
281 regs_buff[31 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDBAH(i));
282 for (i = 0; i < 2; i++)
283 regs_buff[33 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDLEN(i));
284 for (i = 0; i < 2; i++)
285 regs_buff[35 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDH(i));
286 for (i = 0; i < 2; i++)
287 regs_buff[37 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDT(i));
288 for (i = 0; i < 2; i++)
289 regs_buff[39 + i] = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
290 for (i = 0; i < 2; i++)
291 regs_buff[41 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDWBAL(i));
292 for (i = 0; i < 2; i++)
293 regs_buff[43 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDWBAH(i));
295 for (i = 0; i < ARRAY_SIZE(ixgbevf_reg_names); i++)
296 hw_dbg(hw, "%s\t%8.8x\n", ixgbevf_reg_names[i], regs_buff[i]);
299 static void ixgbevf_get_drvinfo(struct net_device *netdev,
300 struct ethtool_drvinfo *drvinfo)
302 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
304 strlcpy(drvinfo->driver, ixgbevf_driver_name, 32);
305 strlcpy(drvinfo->version, ixgbevf_driver_version, 32);
307 strlcpy(drvinfo->fw_version, "N/A", 4);
308 strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
311 static void ixgbevf_get_ringparam(struct net_device *netdev,
312 struct ethtool_ringparam *ring)
314 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
315 struct ixgbevf_ring *tx_ring = adapter->tx_ring;
316 struct ixgbevf_ring *rx_ring = adapter->rx_ring;
318 ring->rx_max_pending = IXGBEVF_MAX_RXD;
319 ring->tx_max_pending = IXGBEVF_MAX_TXD;
320 ring->rx_mini_max_pending = 0;
321 ring->rx_jumbo_max_pending = 0;
322 ring->rx_pending = rx_ring->count;
323 ring->tx_pending = tx_ring->count;
324 ring->rx_mini_pending = 0;
325 ring->rx_jumbo_pending = 0;
328 static int ixgbevf_set_ringparam(struct net_device *netdev,
329 struct ethtool_ringparam *ring)
331 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
332 struct ixgbevf_ring *tx_ring = NULL, *rx_ring = NULL;
334 u32 new_rx_count, new_tx_count;
336 if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
339 new_rx_count = max(ring->rx_pending, (u32)IXGBEVF_MIN_RXD);
340 new_rx_count = min(new_rx_count, (u32)IXGBEVF_MAX_RXD);
341 new_rx_count = ALIGN(new_rx_count, IXGBE_REQ_RX_DESCRIPTOR_MULTIPLE);
343 new_tx_count = max(ring->tx_pending, (u32)IXGBEVF_MIN_TXD);
344 new_tx_count = min(new_tx_count, (u32)IXGBEVF_MAX_TXD);
345 new_tx_count = ALIGN(new_tx_count, IXGBE_REQ_TX_DESCRIPTOR_MULTIPLE);
347 if ((new_tx_count == adapter->tx_ring->count) &&
348 (new_rx_count == adapter->rx_ring->count)) {
353 while (test_and_set_bit(__IXGBEVF_RESETTING, &adapter->state))
357 * If the adapter isn't up and running then just set the
358 * new parameters and scurry for the exits.
360 if (!netif_running(adapter->netdev)) {
361 for (i = 0; i < adapter->num_tx_queues; i++)
362 adapter->tx_ring[i].count = new_tx_count;
363 for (i = 0; i < adapter->num_rx_queues; i++)
364 adapter->rx_ring[i].count = new_rx_count;
365 adapter->tx_ring_count = new_tx_count;
366 adapter->rx_ring_count = new_rx_count;
370 tx_ring = kcalloc(adapter->num_tx_queues,
371 sizeof(struct ixgbevf_ring), GFP_KERNEL);
377 rx_ring = kcalloc(adapter->num_rx_queues,
378 sizeof(struct ixgbevf_ring), GFP_KERNEL);
384 ixgbevf_down(adapter);
386 memcpy(tx_ring, adapter->tx_ring,
387 adapter->num_tx_queues * sizeof(struct ixgbevf_ring));
388 for (i = 0; i < adapter->num_tx_queues; i++) {
389 tx_ring[i].count = new_tx_count;
390 err = ixgbevf_setup_tx_resources(adapter, &tx_ring[i]);
394 ixgbevf_free_tx_resources(adapter,
397 goto err_tx_ring_setup;
399 tx_ring[i].v_idx = adapter->tx_ring[i].v_idx;
402 memcpy(rx_ring, adapter->rx_ring,
403 adapter->num_rx_queues * sizeof(struct ixgbevf_ring));
404 for (i = 0; i < adapter->num_rx_queues; i++) {
405 rx_ring[i].count = new_rx_count;
406 err = ixgbevf_setup_rx_resources(adapter, &rx_ring[i]);
410 ixgbevf_free_rx_resources(adapter,
413 goto err_rx_ring_setup;
415 rx_ring[i].v_idx = adapter->rx_ring[i].v_idx;
419 * Only switch to new rings if all the prior allocations
420 * and ring setups have succeeded.
422 kfree(adapter->tx_ring);
423 adapter->tx_ring = tx_ring;
424 adapter->tx_ring_count = new_tx_count;
426 kfree(adapter->rx_ring);
427 adapter->rx_ring = rx_ring;
428 adapter->rx_ring_count = new_rx_count;
436 for(i = 0; i < adapter->num_tx_queues; i++)
437 ixgbevf_free_tx_resources(adapter, &tx_ring[i]);
446 clear_bit(__IXGBEVF_RESETTING, &adapter->state);
450 static int ixgbevf_get_sset_count(struct net_device *dev, int stringset)
454 return IXGBE_TEST_LEN;
456 return IXGBE_GLOBAL_STATS_LEN;
462 static void ixgbevf_get_ethtool_stats(struct net_device *netdev,
463 struct ethtool_stats *stats, u64 *data)
465 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
468 ixgbevf_update_stats(adapter);
469 for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) {
470 char *p = (char *)adapter +
471 ixgbe_gstrings_stats[i].stat_offset;
472 char *b = (char *)adapter +
473 ixgbe_gstrings_stats[i].base_stat_offset;
474 char *r = (char *)adapter +
475 ixgbe_gstrings_stats[i].saved_reset_offset;
476 data[i] = ((ixgbe_gstrings_stats[i].sizeof_stat ==
477 sizeof(u64)) ? *(u64 *)p : *(u32 *)p) -
478 ((ixgbe_gstrings_stats[i].sizeof_stat ==
479 sizeof(u64)) ? *(u64 *)b : *(u32 *)b) +
480 ((ixgbe_gstrings_stats[i].sizeof_stat ==
481 sizeof(u64)) ? *(u64 *)r : *(u32 *)r);
485 static void ixgbevf_get_strings(struct net_device *netdev, u32 stringset,
488 char *p = (char *)data;
493 memcpy(data, *ixgbe_gstrings_test,
494 IXGBE_TEST_LEN * ETH_GSTRING_LEN);
497 for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) {
498 memcpy(p, ixgbe_gstrings_stats[i].stat_string,
500 p += ETH_GSTRING_LEN;
506 static int ixgbevf_link_test(struct ixgbevf_adapter *adapter, u64 *data)
508 struct ixgbe_hw *hw = &adapter->hw;
513 hw->mac.ops.check_link(hw, &link_speed, &link_up, true);
520 /* ethtool register test data */
521 struct ixgbevf_reg_test {
529 /* In the hardware, registers are laid out either singly, in arrays
530 * spaced 0x40 bytes apart, or in contiguous tables. We assume
531 * most tests take place on arrays or single registers (handled
532 * as a single-element array) and special-case the tables.
533 * Table tests are always pattern tests.
535 * We also make provision for some required setup steps by specifying
536 * registers to be written without any read-back testing.
539 #define PATTERN_TEST 1
540 #define SET_READ_TEST 2
541 #define WRITE_NO_TEST 3
542 #define TABLE32_TEST 4
543 #define TABLE64_TEST_LO 5
544 #define TABLE64_TEST_HI 6
546 /* default VF register test */
547 static const struct ixgbevf_reg_test reg_test_vf[] = {
548 { IXGBE_VFRDBAL(0), 2, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFF80 },
549 { IXGBE_VFRDBAH(0), 2, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
550 { IXGBE_VFRDLEN(0), 2, PATTERN_TEST, 0x000FFF80, 0x000FFFFF },
551 { IXGBE_VFRXDCTL(0), 2, WRITE_NO_TEST, 0, IXGBE_RXDCTL_ENABLE },
552 { IXGBE_VFRDT(0), 2, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF },
553 { IXGBE_VFRXDCTL(0), 2, WRITE_NO_TEST, 0, 0 },
554 { IXGBE_VFTDBAL(0), 2, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF },
555 { IXGBE_VFTDBAH(0), 2, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
556 { IXGBE_VFTDLEN(0), 2, PATTERN_TEST, 0x000FFF80, 0x000FFF80 },
560 static const u32 register_test_patterns[] = {
561 0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF
564 #define REG_PATTERN_TEST(R, M, W) \
566 u32 pat, val, before; \
567 for (pat = 0; pat < ARRAY_SIZE(register_test_patterns); pat++) { \
568 before = readl(adapter->hw.hw_addr + R); \
569 writel((register_test_patterns[pat] & W), \
570 (adapter->hw.hw_addr + R)); \
571 val = readl(adapter->hw.hw_addr + R); \
572 if (val != (register_test_patterns[pat] & W & M)) { \
573 hw_dbg(&adapter->hw, \
574 "pattern test reg %04X failed: got " \
575 "0x%08X expected 0x%08X\n", \
576 R, val, (register_test_patterns[pat] & W & M)); \
578 writel(before, adapter->hw.hw_addr + R); \
581 writel(before, adapter->hw.hw_addr + R); \
585 #define REG_SET_AND_CHECK(R, M, W) \
588 before = readl(adapter->hw.hw_addr + R); \
589 writel((W & M), (adapter->hw.hw_addr + R)); \
590 val = readl(adapter->hw.hw_addr + R); \
591 if ((W & M) != (val & M)) { \
592 printk(KERN_ERR "set/check reg %04X test failed: got 0x%08X " \
593 "expected 0x%08X\n", R, (val & M), (W & M)); \
595 writel(before, (adapter->hw.hw_addr + R)); \
598 writel(before, (adapter->hw.hw_addr + R)); \
601 static int ixgbevf_reg_test(struct ixgbevf_adapter *adapter, u64 *data)
603 const struct ixgbevf_reg_test *test;
609 * Perform the register test, looping through the test table
610 * until we either fail or reach the null entry.
613 for (i = 0; i < test->array_len; i++) {
614 switch (test->test_type) {
616 REG_PATTERN_TEST(test->reg + (i * 0x40),
621 REG_SET_AND_CHECK(test->reg + (i * 0x40),
627 (adapter->hw.hw_addr + test->reg)
631 REG_PATTERN_TEST(test->reg + (i * 4),
635 case TABLE64_TEST_LO:
636 REG_PATTERN_TEST(test->reg + (i * 8),
640 case TABLE64_TEST_HI:
641 REG_PATTERN_TEST((test->reg + 4) + (i * 8),
654 static void ixgbevf_diag_test(struct net_device *netdev,
655 struct ethtool_test *eth_test, u64 *data)
657 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
658 bool if_running = netif_running(netdev);
660 set_bit(__IXGBEVF_TESTING, &adapter->state);
661 if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
664 hw_dbg(&adapter->hw, "offline testing starting\n");
666 /* Link test performed before hardware reset so autoneg doesn't
667 * interfere with test result */
668 if (ixgbevf_link_test(adapter, &data[1]))
669 eth_test->flags |= ETH_TEST_FL_FAILED;
672 /* indicate we're in test mode */
675 ixgbevf_reset(adapter);
677 hw_dbg(&adapter->hw, "register testing starting\n");
678 if (ixgbevf_reg_test(adapter, &data[0]))
679 eth_test->flags |= ETH_TEST_FL_FAILED;
681 ixgbevf_reset(adapter);
683 clear_bit(__IXGBEVF_TESTING, &adapter->state);
687 hw_dbg(&adapter->hw, "online testing starting\n");
689 if (ixgbevf_link_test(adapter, &data[1]))
690 eth_test->flags |= ETH_TEST_FL_FAILED;
692 /* Online tests aren't run; pass by default */
695 clear_bit(__IXGBEVF_TESTING, &adapter->state);
697 msleep_interruptible(4 * 1000);
700 static int ixgbevf_nway_reset(struct net_device *netdev)
702 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
704 if (netif_running(netdev)) {
705 if (!adapter->dev_closed)
706 ixgbevf_reinit_locked(adapter);
712 static struct ethtool_ops ixgbevf_ethtool_ops = {
713 .get_settings = ixgbevf_get_settings,
714 .get_drvinfo = ixgbevf_get_drvinfo,
715 .get_regs_len = ixgbevf_get_regs_len,
716 .get_regs = ixgbevf_get_regs,
717 .nway_reset = ixgbevf_nway_reset,
718 .get_link = ethtool_op_get_link,
719 .get_ringparam = ixgbevf_get_ringparam,
720 .set_ringparam = ixgbevf_set_ringparam,
721 .get_rx_csum = ixgbevf_get_rx_csum,
722 .set_rx_csum = ixgbevf_set_rx_csum,
723 .get_tx_csum = ethtool_op_get_tx_csum,
724 .set_tx_csum = ethtool_op_set_tx_ipv6_csum,
725 .get_sg = ethtool_op_get_sg,
726 .set_sg = ethtool_op_set_sg,
727 .get_msglevel = ixgbevf_get_msglevel,
728 .set_msglevel = ixgbevf_set_msglevel,
729 .get_tso = ethtool_op_get_tso,
730 .set_tso = ixgbevf_set_tso,
731 .self_test = ixgbevf_diag_test,
732 .get_sset_count = ixgbevf_get_sset_count,
733 .get_strings = ixgbevf_get_strings,
734 .get_ethtool_stats = ixgbevf_get_ethtool_stats,
737 void ixgbevf_set_ethtool_ops(struct net_device *netdev)
739 SET_ETHTOOL_OPS(netdev, &ixgbevf_ethtool_ops);