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 ethtool_cmd_speed_set(
109 (link_speed == IXGBE_LINK_SPEED_10GB_FULL) ?
110 SPEED_10000 : SPEED_1000);
111 ecmd->duplex = DUPLEX_FULL;
113 ethtool_cmd_speed_set(ecmd, -1);
120 static u32 ixgbevf_get_rx_csum(struct net_device *netdev)
122 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
123 return adapter->flags & IXGBE_FLAG_RX_CSUM_ENABLED;
126 static int ixgbevf_set_rx_csum(struct net_device *netdev, u32 data)
128 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
130 adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
132 adapter->flags &= ~IXGBE_FLAG_RX_CSUM_ENABLED;
134 if (netif_running(netdev)) {
135 if (!adapter->dev_closed)
136 ixgbevf_reinit_locked(adapter);
138 ixgbevf_reset(adapter);
144 static int ixgbevf_set_tso(struct net_device *netdev, u32 data)
147 netdev->features |= NETIF_F_TSO;
148 netdev->features |= NETIF_F_TSO6;
150 netif_tx_stop_all_queues(netdev);
151 netdev->features &= ~NETIF_F_TSO;
152 netdev->features &= ~NETIF_F_TSO6;
153 netif_tx_start_all_queues(netdev);
158 static u32 ixgbevf_get_msglevel(struct net_device *netdev)
160 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
161 return adapter->msg_enable;
164 static void ixgbevf_set_msglevel(struct net_device *netdev, u32 data)
166 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
167 adapter->msg_enable = data;
170 #define IXGBE_GET_STAT(_A_, _R_) (_A_->stats._R_)
172 static char *ixgbevf_reg_names[] = {
221 static int ixgbevf_get_regs_len(struct net_device *netdev)
223 return (ARRAY_SIZE(ixgbevf_reg_names)) * sizeof(u32);
226 static void ixgbevf_get_regs(struct net_device *netdev,
227 struct ethtool_regs *regs,
230 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
231 struct ixgbe_hw *hw = &adapter->hw;
233 u32 regs_len = ixgbevf_get_regs_len(netdev);
236 memset(p, 0, regs_len);
238 regs->version = (1 << 24) | hw->revision_id << 16 | hw->device_id;
240 /* General Registers */
241 regs_buff[0] = IXGBE_READ_REG(hw, IXGBE_VFCTRL);
242 regs_buff[1] = IXGBE_READ_REG(hw, IXGBE_VFSTATUS);
243 regs_buff[2] = IXGBE_READ_REG(hw, IXGBE_VFLINKS);
244 regs_buff[3] = IXGBE_READ_REG(hw, IXGBE_VFRXMEMWRAP);
245 regs_buff[4] = IXGBE_READ_REG(hw, IXGBE_VFFRTIMER);
248 /* don't read EICR because it can clear interrupt causes, instead
249 * read EICS which is a shadow but doesn't clear EICR */
250 regs_buff[5] = IXGBE_READ_REG(hw, IXGBE_VTEICS);
251 regs_buff[6] = IXGBE_READ_REG(hw, IXGBE_VTEICS);
252 regs_buff[7] = IXGBE_READ_REG(hw, IXGBE_VTEIMS);
253 regs_buff[8] = IXGBE_READ_REG(hw, IXGBE_VTEIMC);
254 regs_buff[9] = IXGBE_READ_REG(hw, IXGBE_VTEIAC);
255 regs_buff[10] = IXGBE_READ_REG(hw, IXGBE_VTEIAM);
256 regs_buff[11] = IXGBE_READ_REG(hw, IXGBE_VTEITR(0));
257 regs_buff[12] = IXGBE_READ_REG(hw, IXGBE_VTIVAR(0));
258 regs_buff[13] = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
261 for (i = 0; i < 2; i++)
262 regs_buff[14 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDBAL(i));
263 for (i = 0; i < 2; i++)
264 regs_buff[16 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDBAH(i));
265 for (i = 0; i < 2; i++)
266 regs_buff[18 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDLEN(i));
267 for (i = 0; i < 2; i++)
268 regs_buff[20 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDH(i));
269 for (i = 0; i < 2; i++)
270 regs_buff[22 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDT(i));
271 for (i = 0; i < 2; i++)
272 regs_buff[24 + i] = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
273 for (i = 0; i < 2; i++)
274 regs_buff[26 + i] = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(i));
277 regs_buff[28] = IXGBE_READ_REG(hw, IXGBE_VFPSRTYPE);
280 for (i = 0; i < 2; i++)
281 regs_buff[29 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDBAL(i));
282 for (i = 0; i < 2; i++)
283 regs_buff[31 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDBAH(i));
284 for (i = 0; i < 2; i++)
285 regs_buff[33 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDLEN(i));
286 for (i = 0; i < 2; i++)
287 regs_buff[35 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDH(i));
288 for (i = 0; i < 2; i++)
289 regs_buff[37 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDT(i));
290 for (i = 0; i < 2; i++)
291 regs_buff[39 + i] = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
292 for (i = 0; i < 2; i++)
293 regs_buff[41 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDWBAL(i));
294 for (i = 0; i < 2; i++)
295 regs_buff[43 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDWBAH(i));
297 for (i = 0; i < ARRAY_SIZE(ixgbevf_reg_names); i++)
298 hw_dbg(hw, "%s\t%8.8x\n", ixgbevf_reg_names[i], regs_buff[i]);
301 static void ixgbevf_get_drvinfo(struct net_device *netdev,
302 struct ethtool_drvinfo *drvinfo)
304 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
306 strlcpy(drvinfo->driver, ixgbevf_driver_name, 32);
307 strlcpy(drvinfo->version, ixgbevf_driver_version, 32);
309 strlcpy(drvinfo->fw_version, "N/A", 4);
310 strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
313 static void ixgbevf_get_ringparam(struct net_device *netdev,
314 struct ethtool_ringparam *ring)
316 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
317 struct ixgbevf_ring *tx_ring = adapter->tx_ring;
318 struct ixgbevf_ring *rx_ring = adapter->rx_ring;
320 ring->rx_max_pending = IXGBEVF_MAX_RXD;
321 ring->tx_max_pending = IXGBEVF_MAX_TXD;
322 ring->rx_mini_max_pending = 0;
323 ring->rx_jumbo_max_pending = 0;
324 ring->rx_pending = rx_ring->count;
325 ring->tx_pending = tx_ring->count;
326 ring->rx_mini_pending = 0;
327 ring->rx_jumbo_pending = 0;
330 static int ixgbevf_set_ringparam(struct net_device *netdev,
331 struct ethtool_ringparam *ring)
333 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
334 struct ixgbevf_ring *tx_ring = NULL, *rx_ring = NULL;
336 u32 new_rx_count, new_tx_count;
338 if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
341 new_rx_count = max(ring->rx_pending, (u32)IXGBEVF_MIN_RXD);
342 new_rx_count = min(new_rx_count, (u32)IXGBEVF_MAX_RXD);
343 new_rx_count = ALIGN(new_rx_count, IXGBE_REQ_RX_DESCRIPTOR_MULTIPLE);
345 new_tx_count = max(ring->tx_pending, (u32)IXGBEVF_MIN_TXD);
346 new_tx_count = min(new_tx_count, (u32)IXGBEVF_MAX_TXD);
347 new_tx_count = ALIGN(new_tx_count, IXGBE_REQ_TX_DESCRIPTOR_MULTIPLE);
349 if ((new_tx_count == adapter->tx_ring->count) &&
350 (new_rx_count == adapter->rx_ring->count)) {
355 while (test_and_set_bit(__IXGBEVF_RESETTING, &adapter->state))
359 * If the adapter isn't up and running then just set the
360 * new parameters and scurry for the exits.
362 if (!netif_running(adapter->netdev)) {
363 for (i = 0; i < adapter->num_tx_queues; i++)
364 adapter->tx_ring[i].count = new_tx_count;
365 for (i = 0; i < adapter->num_rx_queues; i++)
366 adapter->rx_ring[i].count = new_rx_count;
367 adapter->tx_ring_count = new_tx_count;
368 adapter->rx_ring_count = new_rx_count;
372 tx_ring = kcalloc(adapter->num_tx_queues,
373 sizeof(struct ixgbevf_ring), GFP_KERNEL);
379 rx_ring = kcalloc(adapter->num_rx_queues,
380 sizeof(struct ixgbevf_ring), GFP_KERNEL);
386 ixgbevf_down(adapter);
388 memcpy(tx_ring, adapter->tx_ring,
389 adapter->num_tx_queues * sizeof(struct ixgbevf_ring));
390 for (i = 0; i < adapter->num_tx_queues; i++) {
391 tx_ring[i].count = new_tx_count;
392 err = ixgbevf_setup_tx_resources(adapter, &tx_ring[i]);
396 ixgbevf_free_tx_resources(adapter,
399 goto err_tx_ring_setup;
401 tx_ring[i].v_idx = adapter->tx_ring[i].v_idx;
404 memcpy(rx_ring, adapter->rx_ring,
405 adapter->num_rx_queues * sizeof(struct ixgbevf_ring));
406 for (i = 0; i < adapter->num_rx_queues; i++) {
407 rx_ring[i].count = new_rx_count;
408 err = ixgbevf_setup_rx_resources(adapter, &rx_ring[i]);
412 ixgbevf_free_rx_resources(adapter,
415 goto err_rx_ring_setup;
417 rx_ring[i].v_idx = adapter->rx_ring[i].v_idx;
421 * Only switch to new rings if all the prior allocations
422 * and ring setups have succeeded.
424 kfree(adapter->tx_ring);
425 adapter->tx_ring = tx_ring;
426 adapter->tx_ring_count = new_tx_count;
428 kfree(adapter->rx_ring);
429 adapter->rx_ring = rx_ring;
430 adapter->rx_ring_count = new_rx_count;
438 for(i = 0; i < adapter->num_tx_queues; i++)
439 ixgbevf_free_tx_resources(adapter, &tx_ring[i]);
448 clear_bit(__IXGBEVF_RESETTING, &adapter->state);
452 static int ixgbevf_get_sset_count(struct net_device *dev, int stringset)
456 return IXGBE_TEST_LEN;
458 return IXGBE_GLOBAL_STATS_LEN;
464 static void ixgbevf_get_ethtool_stats(struct net_device *netdev,
465 struct ethtool_stats *stats, u64 *data)
467 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
470 ixgbevf_update_stats(adapter);
471 for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) {
472 char *p = (char *)adapter +
473 ixgbe_gstrings_stats[i].stat_offset;
474 char *b = (char *)adapter +
475 ixgbe_gstrings_stats[i].base_stat_offset;
476 char *r = (char *)adapter +
477 ixgbe_gstrings_stats[i].saved_reset_offset;
478 data[i] = ((ixgbe_gstrings_stats[i].sizeof_stat ==
479 sizeof(u64)) ? *(u64 *)p : *(u32 *)p) -
480 ((ixgbe_gstrings_stats[i].sizeof_stat ==
481 sizeof(u64)) ? *(u64 *)b : *(u32 *)b) +
482 ((ixgbe_gstrings_stats[i].sizeof_stat ==
483 sizeof(u64)) ? *(u64 *)r : *(u32 *)r);
487 static void ixgbevf_get_strings(struct net_device *netdev, u32 stringset,
490 char *p = (char *)data;
495 memcpy(data, *ixgbe_gstrings_test,
496 IXGBE_TEST_LEN * ETH_GSTRING_LEN);
499 for (i = 0; i < IXGBE_GLOBAL_STATS_LEN; i++) {
500 memcpy(p, ixgbe_gstrings_stats[i].stat_string,
502 p += ETH_GSTRING_LEN;
508 static int ixgbevf_link_test(struct ixgbevf_adapter *adapter, u64 *data)
510 struct ixgbe_hw *hw = &adapter->hw;
515 hw->mac.ops.check_link(hw, &link_speed, &link_up, true);
522 /* ethtool register test data */
523 struct ixgbevf_reg_test {
531 /* In the hardware, registers are laid out either singly, in arrays
532 * spaced 0x40 bytes apart, or in contiguous tables. We assume
533 * most tests take place on arrays or single registers (handled
534 * as a single-element array) and special-case the tables.
535 * Table tests are always pattern tests.
537 * We also make provision for some required setup steps by specifying
538 * registers to be written without any read-back testing.
541 #define PATTERN_TEST 1
542 #define SET_READ_TEST 2
543 #define WRITE_NO_TEST 3
544 #define TABLE32_TEST 4
545 #define TABLE64_TEST_LO 5
546 #define TABLE64_TEST_HI 6
548 /* default VF register test */
549 static const struct ixgbevf_reg_test reg_test_vf[] = {
550 { IXGBE_VFRDBAL(0), 2, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFF80 },
551 { IXGBE_VFRDBAH(0), 2, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
552 { IXGBE_VFRDLEN(0), 2, PATTERN_TEST, 0x000FFF80, 0x000FFFFF },
553 { IXGBE_VFRXDCTL(0), 2, WRITE_NO_TEST, 0, IXGBE_RXDCTL_ENABLE },
554 { IXGBE_VFRDT(0), 2, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF },
555 { IXGBE_VFRXDCTL(0), 2, WRITE_NO_TEST, 0, 0 },
556 { IXGBE_VFTDBAL(0), 2, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF },
557 { IXGBE_VFTDBAH(0), 2, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
558 { IXGBE_VFTDLEN(0), 2, PATTERN_TEST, 0x000FFF80, 0x000FFF80 },
562 static const u32 register_test_patterns[] = {
563 0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF
566 #define REG_PATTERN_TEST(R, M, W) \
568 u32 pat, val, before; \
569 for (pat = 0; pat < ARRAY_SIZE(register_test_patterns); pat++) { \
570 before = readl(adapter->hw.hw_addr + R); \
571 writel((register_test_patterns[pat] & W), \
572 (adapter->hw.hw_addr + R)); \
573 val = readl(adapter->hw.hw_addr + R); \
574 if (val != (register_test_patterns[pat] & W & M)) { \
575 hw_dbg(&adapter->hw, \
576 "pattern test reg %04X failed: got " \
577 "0x%08X expected 0x%08X\n", \
578 R, val, (register_test_patterns[pat] & W & M)); \
580 writel(before, adapter->hw.hw_addr + R); \
583 writel(before, adapter->hw.hw_addr + R); \
587 #define REG_SET_AND_CHECK(R, M, W) \
590 before = readl(adapter->hw.hw_addr + R); \
591 writel((W & M), (adapter->hw.hw_addr + R)); \
592 val = readl(adapter->hw.hw_addr + R); \
593 if ((W & M) != (val & M)) { \
594 printk(KERN_ERR "set/check reg %04X test failed: got 0x%08X " \
595 "expected 0x%08X\n", R, (val & M), (W & M)); \
597 writel(before, (adapter->hw.hw_addr + R)); \
600 writel(before, (adapter->hw.hw_addr + R)); \
603 static int ixgbevf_reg_test(struct ixgbevf_adapter *adapter, u64 *data)
605 const struct ixgbevf_reg_test *test;
611 * Perform the register test, looping through the test table
612 * until we either fail or reach the null entry.
615 for (i = 0; i < test->array_len; i++) {
616 switch (test->test_type) {
618 REG_PATTERN_TEST(test->reg + (i * 0x40),
623 REG_SET_AND_CHECK(test->reg + (i * 0x40),
629 (adapter->hw.hw_addr + test->reg)
633 REG_PATTERN_TEST(test->reg + (i * 4),
637 case TABLE64_TEST_LO:
638 REG_PATTERN_TEST(test->reg + (i * 8),
642 case TABLE64_TEST_HI:
643 REG_PATTERN_TEST((test->reg + 4) + (i * 8),
656 static void ixgbevf_diag_test(struct net_device *netdev,
657 struct ethtool_test *eth_test, u64 *data)
659 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
660 bool if_running = netif_running(netdev);
662 set_bit(__IXGBEVF_TESTING, &adapter->state);
663 if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
666 hw_dbg(&adapter->hw, "offline testing starting\n");
668 /* Link test performed before hardware reset so autoneg doesn't
669 * interfere with test result */
670 if (ixgbevf_link_test(adapter, &data[1]))
671 eth_test->flags |= ETH_TEST_FL_FAILED;
674 /* indicate we're in test mode */
677 ixgbevf_reset(adapter);
679 hw_dbg(&adapter->hw, "register testing starting\n");
680 if (ixgbevf_reg_test(adapter, &data[0]))
681 eth_test->flags |= ETH_TEST_FL_FAILED;
683 ixgbevf_reset(adapter);
685 clear_bit(__IXGBEVF_TESTING, &adapter->state);
689 hw_dbg(&adapter->hw, "online testing starting\n");
691 if (ixgbevf_link_test(adapter, &data[1]))
692 eth_test->flags |= ETH_TEST_FL_FAILED;
694 /* Online tests aren't run; pass by default */
697 clear_bit(__IXGBEVF_TESTING, &adapter->state);
699 msleep_interruptible(4 * 1000);
702 static int ixgbevf_nway_reset(struct net_device *netdev)
704 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
706 if (netif_running(netdev)) {
707 if (!adapter->dev_closed)
708 ixgbevf_reinit_locked(adapter);
714 static struct ethtool_ops ixgbevf_ethtool_ops = {
715 .get_settings = ixgbevf_get_settings,
716 .get_drvinfo = ixgbevf_get_drvinfo,
717 .get_regs_len = ixgbevf_get_regs_len,
718 .get_regs = ixgbevf_get_regs,
719 .nway_reset = ixgbevf_nway_reset,
720 .get_link = ethtool_op_get_link,
721 .get_ringparam = ixgbevf_get_ringparam,
722 .set_ringparam = ixgbevf_set_ringparam,
723 .get_rx_csum = ixgbevf_get_rx_csum,
724 .set_rx_csum = ixgbevf_set_rx_csum,
725 .get_tx_csum = ethtool_op_get_tx_csum,
726 .set_tx_csum = ethtool_op_set_tx_ipv6_csum,
727 .get_sg = ethtool_op_get_sg,
728 .set_sg = ethtool_op_set_sg,
729 .get_msglevel = ixgbevf_get_msglevel,
730 .set_msglevel = ixgbevf_set_msglevel,
731 .get_tso = ethtool_op_get_tso,
732 .set_tso = ixgbevf_set_tso,
733 .self_test = ixgbevf_diag_test,
734 .get_sset_count = ixgbevf_get_sset_count,
735 .get_strings = ixgbevf_get_strings,
736 .get_ethtool_stats = ixgbevf_get_ethtool_stats,
739 void ixgbevf_set_ethtool_ops(struct net_device *netdev)
741 SET_ETHTOOL_OPS(netdev, &ixgbevf_ethtool_ops);