blob: cd4d311ea0b67ceb3ed0d1667b5613e1b60a26b9 [file] [log] [blame]
Greg Rose92915f72010-01-09 02:24:10 +00001/*******************************************************************************
2
3 Intel 82599 Virtual Function driver
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +00004 Copyright(c) 1999 - 2015 Intel Corporation.
Greg Rose92915f72010-01-09 02:24:10 +00005
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
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +000016 this program; if not, see <http://www.gnu.org/licenses/>.
Greg Rose92915f72010-01-09 02:24:10 +000017
18 The full GNU General Public License is included in this distribution in
19 the file called "COPYING".
20
21 Contact Information:
22 e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
23 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
24
25*******************************************************************************/
26
27/* ethtool support for ixgbevf */
28
Jeff Kirsherdbd96362011-10-21 19:38:18 +000029#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
30
Greg Rose92915f72010-01-09 02:24:10 +000031#include <linux/types.h>
32#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090033#include <linux/slab.h>
Greg Rose92915f72010-01-09 02:24:10 +000034#include <linux/pci.h>
35#include <linux/netdevice.h>
36#include <linux/ethtool.h>
37#include <linux/vmalloc.h>
38#include <linux/if_vlan.h>
39#include <linux/uaccess.h>
40
41#include "ixgbevf.h"
42
43#define IXGBE_ALL_RAR_ENTRIES 16
44
Emil Tantilovd72d6c12016-04-07 15:58:39 -070045enum {NETDEV_STATS, IXGBEVF_STATS};
46
Greg Rose92915f72010-01-09 02:24:10 +000047struct ixgbe_stats {
48 char stat_string[ETH_GSTRING_LEN];
Emil Tantilovd72d6c12016-04-07 15:58:39 -070049 int type;
50 int sizeof_stat;
51 int stat_offset;
Greg Rose92915f72010-01-09 02:24:10 +000052};
53
Emil Tantilovd72d6c12016-04-07 15:58:39 -070054#define IXGBEVF_STAT(_name, _stat) { \
55 .stat_string = _name, \
56 .type = IXGBEVF_STATS, \
57 .sizeof_stat = FIELD_SIZEOF(struct ixgbevf_adapter, _stat), \
58 .stat_offset = offsetof(struct ixgbevf_adapter, _stat) \
Don Skidmore44bd7412013-09-25 08:03:09 +000059}
60
Emil Tantilovd72d6c12016-04-07 15:58:39 -070061#define IXGBEVF_NETDEV_STAT(_net_stat) { \
62 .stat_string = #_net_stat, \
63 .type = NETDEV_STATS, \
64 .sizeof_stat = FIELD_SIZEOF(struct net_device_stats, _net_stat), \
65 .stat_offset = offsetof(struct net_device_stats, _net_stat) \
Don Skidmore44bd7412013-09-25 08:03:09 +000066}
Stephen Hemmingerb47aca132012-01-18 22:13:32 +000067
Emil Tantilovd72d6c12016-04-07 15:58:39 -070068static struct ixgbe_stats ixgbevf_gstrings_stats[] = {
69 IXGBEVF_NETDEV_STAT(rx_packets),
70 IXGBEVF_NETDEV_STAT(tx_packets),
71 IXGBEVF_NETDEV_STAT(rx_bytes),
72 IXGBEVF_NETDEV_STAT(tx_bytes),
73 IXGBEVF_STAT("tx_busy", tx_busy),
74 IXGBEVF_STAT("tx_restart_queue", restart_queue),
75 IXGBEVF_STAT("tx_timeout_count", tx_timeout_count),
76 IXGBEVF_NETDEV_STAT(multicast),
77 IXGBEVF_STAT("rx_csum_offload_errors", hw_csum_rx_error),
Jacob Keller3b5dca22013-09-21 06:24:25 +000078#ifdef BP_EXTENDED_STATS
Emil Tantilovd72d6c12016-04-07 15:58:39 -070079 IXGBEVF_STAT("rx_bp_poll_yield", bp_rx_yields),
80 IXGBEVF_STAT("rx_bp_cleaned", bp_rx_cleaned),
81 IXGBEVF_STAT("rx_bp_misses", bp_rx_missed),
82 IXGBEVF_STAT("tx_bp_napi_yield", bp_tx_yields),
83 IXGBEVF_STAT("tx_bp_cleaned", bp_tx_cleaned),
84 IXGBEVF_STAT("tx_bp_misses", bp_tx_missed),
Jacob Keller3b5dca22013-09-21 06:24:25 +000085#endif
Greg Rose92915f72010-01-09 02:24:10 +000086};
87
Emil Tantilovd72d6c12016-04-07 15:58:39 -070088#define IXGBEVF_QUEUE_STATS_LEN ( \
89 (((struct ixgbevf_adapter *)netdev_priv(netdev))->num_tx_queues + \
90 ((struct ixgbevf_adapter *)netdev_priv(netdev))->num_rx_queues) * \
91 (sizeof(struct ixgbe_stats) / sizeof(u64)))
92#define IXGBEVF_GLOBAL_STATS_LEN ARRAY_SIZE(ixgbevf_gstrings_stats)
Greg Rose92915f72010-01-09 02:24:10 +000093
Emil Tantilovd72d6c12016-04-07 15:58:39 -070094#define IXGBEVF_STATS_LEN (IXGBEVF_GLOBAL_STATS_LEN + IXGBEVF_QUEUE_STATS_LEN)
Greg Rose92915f72010-01-09 02:24:10 +000095static const char ixgbe_gstrings_test[][ETH_GSTRING_LEN] = {
96 "Register test (offline)",
97 "Link test (on/offline)"
98};
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +000099
Emil Tantilovd72d6c12016-04-07 15:58:39 -0700100#define IXGBEVF_TEST_LEN (sizeof(ixgbe_gstrings_test) / ETH_GSTRING_LEN)
Greg Rose92915f72010-01-09 02:24:10 +0000101
102static int ixgbevf_get_settings(struct net_device *netdev,
103 struct ethtool_cmd *ecmd)
104{
105 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
106 struct ixgbe_hw *hw = &adapter->hw;
107 u32 link_speed = 0;
108 bool link_up;
109
110 ecmd->supported = SUPPORTED_10000baseT_Full;
111 ecmd->autoneg = AUTONEG_DISABLE;
112 ecmd->transceiver = XCVR_DUMMY1;
113 ecmd->port = -1;
114
Greg Roseaa19c292013-01-24 04:54:48 +0000115 hw->mac.get_link_status = 1;
Greg Rose92915f72010-01-09 02:24:10 +0000116 hw->mac.ops.check_link(hw, &link_speed, &link_up, false);
117
118 if (link_up) {
Greg Rose31a1b372012-04-10 01:56:37 +0000119 __u32 speed = SPEED_10000;
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000120
Greg Rose31a1b372012-04-10 01:56:37 +0000121 switch (link_speed) {
122 case IXGBE_LINK_SPEED_10GB_FULL:
123 speed = SPEED_10000;
124 break;
125 case IXGBE_LINK_SPEED_1GB_FULL:
126 speed = SPEED_1000;
127 break;
128 case IXGBE_LINK_SPEED_100_FULL:
129 speed = SPEED_100;
130 break;
131 }
132
133 ethtool_cmd_speed_set(ecmd, speed);
Greg Rose92915f72010-01-09 02:24:10 +0000134 ecmd->duplex = DUPLEX_FULL;
135 } else {
Jiri Pirko537fae02014-06-06 14:17:00 +0200136 ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
137 ecmd->duplex = DUPLEX_UNKNOWN;
Greg Rose92915f72010-01-09 02:24:10 +0000138 }
139
140 return 0;
141}
142
Greg Rose92915f72010-01-09 02:24:10 +0000143static u32 ixgbevf_get_msglevel(struct net_device *netdev)
144{
145 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000146
Greg Rose92915f72010-01-09 02:24:10 +0000147 return adapter->msg_enable;
148}
149
150static void ixgbevf_set_msglevel(struct net_device *netdev, u32 data)
151{
152 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000153
Greg Rose92915f72010-01-09 02:24:10 +0000154 adapter->msg_enable = data;
155}
156
157#define IXGBE_GET_STAT(_A_, _R_) (_A_->stats._R_)
158
Greg Rose92915f72010-01-09 02:24:10 +0000159static int ixgbevf_get_regs_len(struct net_device *netdev)
160{
Jacob Kellerfa07f102013-10-01 04:33:48 -0700161#define IXGBE_REGS_LEN 45
162 return IXGBE_REGS_LEN * sizeof(u32);
Greg Rose92915f72010-01-09 02:24:10 +0000163}
164
165static void ixgbevf_get_regs(struct net_device *netdev,
166 struct ethtool_regs *regs,
167 void *p)
168{
169 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
170 struct ixgbe_hw *hw = &adapter->hw;
171 u32 *regs_buff = p;
172 u32 regs_len = ixgbevf_get_regs_len(netdev);
173 u8 i;
174
175 memset(p, 0, regs_len);
176
177 regs->version = (1 << 24) | hw->revision_id << 16 | hw->device_id;
178
179 /* General Registers */
180 regs_buff[0] = IXGBE_READ_REG(hw, IXGBE_VFCTRL);
181 regs_buff[1] = IXGBE_READ_REG(hw, IXGBE_VFSTATUS);
182 regs_buff[2] = IXGBE_READ_REG(hw, IXGBE_VFLINKS);
183 regs_buff[3] = IXGBE_READ_REG(hw, IXGBE_VFRXMEMWRAP);
Emil Tantilov6fb456a2011-03-05 08:02:18 +0000184 regs_buff[4] = IXGBE_READ_REG(hw, IXGBE_VFFRTIMER);
Greg Rose92915f72010-01-09 02:24:10 +0000185
186 /* Interrupt */
187 /* don't read EICR because it can clear interrupt causes, instead
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000188 * read EICS which is a shadow but doesn't clear EICR
189 */
Greg Rose92915f72010-01-09 02:24:10 +0000190 regs_buff[5] = IXGBE_READ_REG(hw, IXGBE_VTEICS);
191 regs_buff[6] = IXGBE_READ_REG(hw, IXGBE_VTEICS);
192 regs_buff[7] = IXGBE_READ_REG(hw, IXGBE_VTEIMS);
193 regs_buff[8] = IXGBE_READ_REG(hw, IXGBE_VTEIMC);
194 regs_buff[9] = IXGBE_READ_REG(hw, IXGBE_VTEIAC);
195 regs_buff[10] = IXGBE_READ_REG(hw, IXGBE_VTEIAM);
196 regs_buff[11] = IXGBE_READ_REG(hw, IXGBE_VTEITR(0));
197 regs_buff[12] = IXGBE_READ_REG(hw, IXGBE_VTIVAR(0));
198 regs_buff[13] = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
199
200 /* Receive DMA */
201 for (i = 0; i < 2; i++)
202 regs_buff[14 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDBAL(i));
203 for (i = 0; i < 2; i++)
204 regs_buff[16 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDBAH(i));
205 for (i = 0; i < 2; i++)
206 regs_buff[18 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDLEN(i));
207 for (i = 0; i < 2; i++)
208 regs_buff[20 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDH(i));
209 for (i = 0; i < 2; i++)
210 regs_buff[22 + i] = IXGBE_READ_REG(hw, IXGBE_VFRDT(i));
211 for (i = 0; i < 2; i++)
212 regs_buff[24 + i] = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
213 for (i = 0; i < 2; i++)
214 regs_buff[26 + i] = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(i));
215
216 /* Receive */
217 regs_buff[28] = IXGBE_READ_REG(hw, IXGBE_VFPSRTYPE);
218
219 /* Transmit */
220 for (i = 0; i < 2; i++)
221 regs_buff[29 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDBAL(i));
222 for (i = 0; i < 2; i++)
223 regs_buff[31 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDBAH(i));
224 for (i = 0; i < 2; i++)
225 regs_buff[33 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDLEN(i));
226 for (i = 0; i < 2; i++)
227 regs_buff[35 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDH(i));
228 for (i = 0; i < 2; i++)
229 regs_buff[37 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDT(i));
230 for (i = 0; i < 2; i++)
231 regs_buff[39 + i] = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
232 for (i = 0; i < 2; i++)
233 regs_buff[41 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDWBAL(i));
234 for (i = 0; i < 2; i++)
235 regs_buff[43 + i] = IXGBE_READ_REG(hw, IXGBE_VFTDWBAH(i));
Greg Rose92915f72010-01-09 02:24:10 +0000236}
237
238static void ixgbevf_get_drvinfo(struct net_device *netdev,
239 struct ethtool_drvinfo *drvinfo)
240{
241 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
242
Rick Jones84b40502011-11-21 10:54:05 +0000243 strlcpy(drvinfo->driver, ixgbevf_driver_name, sizeof(drvinfo->driver));
244 strlcpy(drvinfo->version, ixgbevf_driver_version,
245 sizeof(drvinfo->version));
246 strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
247 sizeof(drvinfo->bus_info));
Greg Rose92915f72010-01-09 02:24:10 +0000248}
249
250static void ixgbevf_get_ringparam(struct net_device *netdev,
251 struct ethtool_ringparam *ring)
252{
253 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
Greg Rose92915f72010-01-09 02:24:10 +0000254
255 ring->rx_max_pending = IXGBEVF_MAX_RXD;
256 ring->tx_max_pending = IXGBEVF_MAX_TXD;
Alexander Duyckeb022d02012-07-19 00:18:05 +0000257 ring->rx_pending = adapter->rx_ring_count;
258 ring->tx_pending = adapter->tx_ring_count;
Greg Rose92915f72010-01-09 02:24:10 +0000259}
260
261static int ixgbevf_set_ringparam(struct net_device *netdev,
262 struct ethtool_ringparam *ring)
263{
264 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
265 struct ixgbevf_ring *tx_ring = NULL, *rx_ring = NULL;
Greg Rose92915f72010-01-09 02:24:10 +0000266 u32 new_rx_count, new_tx_count;
Alexander Duyckeb022d02012-07-19 00:18:05 +0000267 int i, err = 0;
Greg Rose92915f72010-01-09 02:24:10 +0000268
269 if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
270 return -EINVAL;
271
Alexander Duyckeb022d02012-07-19 00:18:05 +0000272 new_tx_count = max_t(u32, ring->tx_pending, IXGBEVF_MIN_TXD);
273 new_tx_count = min_t(u32, new_tx_count, IXGBEVF_MAX_TXD);
Greg Rose92915f72010-01-09 02:24:10 +0000274 new_tx_count = ALIGN(new_tx_count, IXGBE_REQ_TX_DESCRIPTOR_MULTIPLE);
275
Alexander Duyckeb022d02012-07-19 00:18:05 +0000276 new_rx_count = max_t(u32, ring->rx_pending, IXGBEVF_MIN_RXD);
277 new_rx_count = min_t(u32, new_rx_count, IXGBEVF_MAX_RXD);
278 new_rx_count = ALIGN(new_rx_count, IXGBE_REQ_RX_DESCRIPTOR_MULTIPLE);
279
280 /* if nothing to do return success */
281 if ((new_tx_count == adapter->tx_ring_count) &&
282 (new_rx_count == adapter->rx_ring_count))
Greg Rose92915f72010-01-09 02:24:10 +0000283 return 0;
Greg Rose92915f72010-01-09 02:24:10 +0000284
285 while (test_and_set_bit(__IXGBEVF_RESETTING, &adapter->state))
Alexander Duyckeb022d02012-07-19 00:18:05 +0000286 usleep_range(1000, 2000);
Greg Rose92915f72010-01-09 02:24:10 +0000287
Greg Rosebba50b92010-09-23 12:46:25 +0000288 if (!netif_running(adapter->netdev)) {
289 for (i = 0; i < adapter->num_tx_queues; i++)
Don Skidmore87e70ab2014-01-16 02:30:08 -0800290 adapter->tx_ring[i]->count = new_tx_count;
Greg Rosebba50b92010-09-23 12:46:25 +0000291 for (i = 0; i < adapter->num_rx_queues; i++)
Don Skidmore87e70ab2014-01-16 02:30:08 -0800292 adapter->rx_ring[i]->count = new_rx_count;
Greg Rose92915f72010-01-09 02:24:10 +0000293 adapter->tx_ring_count = new_tx_count;
Greg Rosebba50b92010-09-23 12:46:25 +0000294 adapter->rx_ring_count = new_rx_count;
295 goto clear_reset;
Greg Rose92915f72010-01-09 02:24:10 +0000296 }
297
Alexander Duyckeb022d02012-07-19 00:18:05 +0000298 if (new_tx_count != adapter->tx_ring_count) {
299 tx_ring = vmalloc(adapter->num_tx_queues * sizeof(*tx_ring));
300 if (!tx_ring) {
301 err = -ENOMEM;
302 goto clear_reset;
303 }
Greg Rose92915f72010-01-09 02:24:10 +0000304
Alexander Duyckeb022d02012-07-19 00:18:05 +0000305 for (i = 0; i < adapter->num_tx_queues; i++) {
306 /* clone ring and setup updated count */
Don Skidmore87e70ab2014-01-16 02:30:08 -0800307 tx_ring[i] = *adapter->tx_ring[i];
Alexander Duyckeb022d02012-07-19 00:18:05 +0000308 tx_ring[i].count = new_tx_count;
Emil Tantilov05d063a2014-01-17 18:29:59 -0800309 err = ixgbevf_setup_tx_resources(&tx_ring[i]);
310 if (err) {
311 while (i) {
312 i--;
313 ixgbevf_free_tx_resources(&tx_ring[i]);
314 }
315
316 vfree(tx_ring);
317 tx_ring = NULL;
318
319 goto clear_reset;
Greg Rosebba50b92010-09-23 12:46:25 +0000320 }
Greg Rosebba50b92010-09-23 12:46:25 +0000321 }
Greg Rosebba50b92010-09-23 12:46:25 +0000322 }
323
Alexander Duyckeb022d02012-07-19 00:18:05 +0000324 if (new_rx_count != adapter->rx_ring_count) {
325 rx_ring = vmalloc(adapter->num_rx_queues * sizeof(*rx_ring));
326 if (!rx_ring) {
327 err = -ENOMEM;
328 goto clear_reset;
329 }
330
331 for (i = 0; i < adapter->num_rx_queues; i++) {
332 /* clone ring and setup updated count */
Don Skidmore87e70ab2014-01-16 02:30:08 -0800333 rx_ring[i] = *adapter->rx_ring[i];
Alexander Duyckeb022d02012-07-19 00:18:05 +0000334 rx_ring[i].count = new_rx_count;
Emil Tantilov05d063a2014-01-17 18:29:59 -0800335 err = ixgbevf_setup_rx_resources(&rx_ring[i]);
336 if (err) {
337 while (i) {
338 i--;
339 ixgbevf_free_rx_resources(&rx_ring[i]);
340 }
341
342 vfree(rx_ring);
343 rx_ring = NULL;
344
345 goto clear_reset;
Greg Rosebba50b92010-09-23 12:46:25 +0000346 }
Greg Rosebba50b92010-09-23 12:46:25 +0000347 }
Greg Rosebba50b92010-09-23 12:46:25 +0000348 }
349
Alexander Duyckeb022d02012-07-19 00:18:05 +0000350 /* bring interface down to prepare for update */
351 ixgbevf_down(adapter);
Greg Rosebba50b92010-09-23 12:46:25 +0000352
Alexander Duyckeb022d02012-07-19 00:18:05 +0000353 /* Tx */
354 if (tx_ring) {
355 for (i = 0; i < adapter->num_tx_queues; i++) {
Emil Tantilov05d063a2014-01-17 18:29:59 -0800356 ixgbevf_free_tx_resources(adapter->tx_ring[i]);
Don Skidmore87e70ab2014-01-16 02:30:08 -0800357 *adapter->tx_ring[i] = tx_ring[i];
Alexander Duyckeb022d02012-07-19 00:18:05 +0000358 }
359 adapter->tx_ring_count = new_tx_count;
Greg Rosebba50b92010-09-23 12:46:25 +0000360
Alexander Duyckeb022d02012-07-19 00:18:05 +0000361 vfree(tx_ring);
362 tx_ring = NULL;
363 }
364
365 /* Rx */
366 if (rx_ring) {
367 for (i = 0; i < adapter->num_rx_queues; i++) {
Emil Tantilov05d063a2014-01-17 18:29:59 -0800368 ixgbevf_free_rx_resources(adapter->rx_ring[i]);
Don Skidmore87e70ab2014-01-16 02:30:08 -0800369 *adapter->rx_ring[i] = rx_ring[i];
Alexander Duyckeb022d02012-07-19 00:18:05 +0000370 }
371 adapter->rx_ring_count = new_rx_count;
372
373 vfree(rx_ring);
374 rx_ring = NULL;
375 }
376
377 /* restore interface using new values */
Greg Rosebba50b92010-09-23 12:46:25 +0000378 ixgbevf_up(adapter);
Greg Rose92915f72010-01-09 02:24:10 +0000379
Greg Rosebba50b92010-09-23 12:46:25 +0000380clear_reset:
Alexander Duyckeb022d02012-07-19 00:18:05 +0000381 /* free Tx resources if Rx error is encountered */
382 if (tx_ring) {
383 for (i = 0; i < adapter->num_tx_queues; i++)
Emil Tantilov05d063a2014-01-17 18:29:59 -0800384 ixgbevf_free_tx_resources(&tx_ring[i]);
Alexander Duyckeb022d02012-07-19 00:18:05 +0000385 vfree(tx_ring);
386 }
387
Greg Rose92915f72010-01-09 02:24:10 +0000388 clear_bit(__IXGBEVF_RESETTING, &adapter->state);
389 return err;
390}
391
392static int ixgbevf_get_sset_count(struct net_device *dev, int stringset)
393{
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000394 switch (stringset) {
395 case ETH_SS_TEST:
Emil Tantilovd72d6c12016-04-07 15:58:39 -0700396 return IXGBEVF_TEST_LEN;
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000397 case ETH_SS_STATS:
Emil Tantilovd72d6c12016-04-07 15:58:39 -0700398 return IXGBEVF_GLOBAL_STATS_LEN;
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000399 default:
400 return -EINVAL;
401 }
Greg Rose92915f72010-01-09 02:24:10 +0000402}
403
404static void ixgbevf_get_ethtool_stats(struct net_device *netdev,
405 struct ethtool_stats *stats, u64 *data)
406{
407 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
Emil Tantilovd72d6c12016-04-07 15:58:39 -0700408 struct rtnl_link_stats64 temp;
409 const struct rtnl_link_stats64 *net_stats;
Greg Rose92915f72010-01-09 02:24:10 +0000410 int i;
Emil Tantilovd72d6c12016-04-07 15:58:39 -0700411 char *p;
412
Jacob Keller3b5dca22013-09-21 06:24:25 +0000413#ifdef BP_EXTENDED_STATS
414 u64 rx_yields = 0, rx_cleaned = 0, rx_missed = 0,
415 tx_yields = 0, tx_cleaned = 0, tx_missed = 0;
416
417 for (i = 0; i < adapter->num_rx_queues; i++) {
Emil Tantilov095e2612014-01-17 18:30:00 -0800418 rx_yields += adapter->rx_ring[i]->stats.yields;
419 rx_cleaned += adapter->rx_ring[i]->stats.cleaned;
420 rx_yields += adapter->rx_ring[i]->stats.yields;
Jacob Keller3b5dca22013-09-21 06:24:25 +0000421 }
422
423 for (i = 0; i < adapter->num_tx_queues; i++) {
Emil Tantilov095e2612014-01-17 18:30:00 -0800424 tx_yields += adapter->tx_ring[i]->stats.yields;
425 tx_cleaned += adapter->tx_ring[i]->stats.cleaned;
426 tx_yields += adapter->tx_ring[i]->stats.yields;
Jacob Keller3b5dca22013-09-21 06:24:25 +0000427 }
428
429 adapter->bp_rx_yields = rx_yields;
430 adapter->bp_rx_cleaned = rx_cleaned;
431 adapter->bp_rx_missed = rx_missed;
432
433 adapter->bp_tx_yields = tx_yields;
434 adapter->bp_tx_cleaned = tx_cleaned;
435 adapter->bp_tx_missed = tx_missed;
436#endif
Greg Rose92915f72010-01-09 02:24:10 +0000437
438 ixgbevf_update_stats(adapter);
Emil Tantilovd72d6c12016-04-07 15:58:39 -0700439 net_stats = dev_get_stats(netdev, &temp);
440 for (i = 0; i < IXGBEVF_GLOBAL_STATS_LEN; i++) {
441 switch (ixgbevf_gstrings_stats[i].type) {
442 case NETDEV_STATS:
443 p = (char *)net_stats +
444 ixgbevf_gstrings_stats[i].stat_offset;
445 break;
446 case IXGBEVF_STATS:
447 p = (char *)adapter +
448 ixgbevf_gstrings_stats[i].stat_offset;
449 break;
450 default:
451 data[i] = 0;
452 continue;
Don Skidmore44bd7412013-09-25 08:03:09 +0000453 }
Emil Tantilovd72d6c12016-04-07 15:58:39 -0700454
455 data[i] = (ixgbevf_gstrings_stats[i].sizeof_stat ==
456 sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
Greg Rose92915f72010-01-09 02:24:10 +0000457 }
458}
459
460static void ixgbevf_get_strings(struct net_device *netdev, u32 stringset,
461 u8 *data)
462{
463 char *p = (char *)data;
464 int i;
465
466 switch (stringset) {
467 case ETH_SS_TEST:
468 memcpy(data, *ixgbe_gstrings_test,
Emil Tantilovd72d6c12016-04-07 15:58:39 -0700469 IXGBEVF_TEST_LEN * ETH_GSTRING_LEN);
Greg Rose92915f72010-01-09 02:24:10 +0000470 break;
471 case ETH_SS_STATS:
Emil Tantilovd72d6c12016-04-07 15:58:39 -0700472 for (i = 0; i < IXGBEVF_GLOBAL_STATS_LEN; i++) {
473 memcpy(p, ixgbevf_gstrings_stats[i].stat_string,
Greg Rose92915f72010-01-09 02:24:10 +0000474 ETH_GSTRING_LEN);
475 p += ETH_GSTRING_LEN;
476 }
477 break;
478 }
479}
480
481static int ixgbevf_link_test(struct ixgbevf_adapter *adapter, u64 *data)
482{
483 struct ixgbe_hw *hw = &adapter->hw;
484 bool link_up;
485 u32 link_speed = 0;
486 *data = 0;
487
488 hw->mac.ops.check_link(hw, &link_speed, &link_up, true);
489 if (!link_up)
490 *data = 1;
491
492 return *data;
493}
494
495/* ethtool register test data */
496struct ixgbevf_reg_test {
497 u16 reg;
498 u8 array_len;
499 u8 test_type;
500 u32 mask;
501 u32 write;
502};
503
504/* In the hardware, registers are laid out either singly, in arrays
505 * spaced 0x40 bytes apart, or in contiguous tables. We assume
506 * most tests take place on arrays or single registers (handled
507 * as a single-element array) and special-case the tables.
508 * Table tests are always pattern tests.
509 *
510 * We also make provision for some required setup steps by specifying
511 * registers to be written without any read-back testing.
512 */
513
514#define PATTERN_TEST 1
515#define SET_READ_TEST 2
516#define WRITE_NO_TEST 3
517#define TABLE32_TEST 4
518#define TABLE64_TEST_LO 5
519#define TABLE64_TEST_HI 6
520
521/* default VF register test */
Jeff Kirsher66744502010-12-01 19:59:50 +0000522static const struct ixgbevf_reg_test reg_test_vf[] = {
Greg Rose92915f72010-01-09 02:24:10 +0000523 { IXGBE_VFRDBAL(0), 2, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFF80 },
524 { IXGBE_VFRDBAH(0), 2, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
525 { IXGBE_VFRDLEN(0), 2, PATTERN_TEST, 0x000FFF80, 0x000FFFFF },
526 { IXGBE_VFRXDCTL(0), 2, WRITE_NO_TEST, 0, IXGBE_RXDCTL_ENABLE },
527 { IXGBE_VFRDT(0), 2, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF },
528 { IXGBE_VFRXDCTL(0), 2, WRITE_NO_TEST, 0, 0 },
529 { IXGBE_VFTDBAL(0), 2, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF },
530 { IXGBE_VFTDBAH(0), 2, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
531 { IXGBE_VFTDLEN(0), 2, PATTERN_TEST, 0x000FFF80, 0x000FFF80 },
Mark Rustaddb99d952014-07-24 06:19:29 +0000532 { .reg = 0 }
Greg Rose92915f72010-01-09 02:24:10 +0000533};
534
Jeff Kirsher66744502010-12-01 19:59:50 +0000535static const u32 register_test_patterns[] = {
536 0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF
537};
538
Mark Rustad388b2e42014-03-04 03:02:29 +0000539static bool reg_pattern_test(struct ixgbevf_adapter *adapter, u64 *data,
540 int reg, u32 mask, u32 write)
541{
542 u32 pat, val, before;
543
Mark Rustad26597802014-03-04 03:02:45 +0000544 if (IXGBE_REMOVED(adapter->hw.hw_addr)) {
545 *data = 1;
546 return true;
547 }
Mark Rustad388b2e42014-03-04 03:02:29 +0000548 for (pat = 0; pat < ARRAY_SIZE(register_test_patterns); pat++) {
Mark Rustad32c74942014-03-18 07:03:35 +0000549 before = ixgbevf_read_reg(&adapter->hw, reg);
Mark Rustad388b2e42014-03-04 03:02:29 +0000550 ixgbe_write_reg(&adapter->hw, reg,
551 register_test_patterns[pat] & write);
Mark Rustad32c74942014-03-18 07:03:35 +0000552 val = ixgbevf_read_reg(&adapter->hw, reg);
Mark Rustad388b2e42014-03-04 03:02:29 +0000553 if (val != (register_test_patterns[pat] & write & mask)) {
554 hw_dbg(&adapter->hw,
555 "pattern test reg %04X failed: got 0x%08X expected 0x%08X\n",
556 reg, val,
557 register_test_patterns[pat] & write & mask);
558 *data = reg;
559 ixgbe_write_reg(&adapter->hw, reg, before);
560 return true;
561 }
562 ixgbe_write_reg(&adapter->hw, reg, before);
563 }
564 return false;
Greg Rose92915f72010-01-09 02:24:10 +0000565}
566
Mark Rustad388b2e42014-03-04 03:02:29 +0000567static bool reg_set_and_check(struct ixgbevf_adapter *adapter, u64 *data,
568 int reg, u32 mask, u32 write)
569{
570 u32 val, before;
571
Mark Rustad26597802014-03-04 03:02:45 +0000572 if (IXGBE_REMOVED(adapter->hw.hw_addr)) {
573 *data = 1;
574 return true;
575 }
Mark Rustad32c74942014-03-18 07:03:35 +0000576 before = ixgbevf_read_reg(&adapter->hw, reg);
Mark Rustad388b2e42014-03-04 03:02:29 +0000577 ixgbe_write_reg(&adapter->hw, reg, write & mask);
Mark Rustad32c74942014-03-18 07:03:35 +0000578 val = ixgbevf_read_reg(&adapter->hw, reg);
Mark Rustad388b2e42014-03-04 03:02:29 +0000579 if ((write & mask) != (val & mask)) {
580 pr_err("set/check reg %04X test failed: got 0x%08X expected 0x%08X\n",
581 reg, (val & mask), write & mask);
582 *data = reg;
583 ixgbe_write_reg(&adapter->hw, reg, before);
584 return true;
585 }
586 ixgbe_write_reg(&adapter->hw, reg, before);
587 return false;
Greg Rose92915f72010-01-09 02:24:10 +0000588}
589
590static int ixgbevf_reg_test(struct ixgbevf_adapter *adapter, u64 *data)
591{
Jeff Kirsher66744502010-12-01 19:59:50 +0000592 const struct ixgbevf_reg_test *test;
Greg Rose92915f72010-01-09 02:24:10 +0000593 u32 i;
594
Mark Rustad26597802014-03-04 03:02:45 +0000595 if (IXGBE_REMOVED(adapter->hw.hw_addr)) {
596 dev_err(&adapter->pdev->dev,
597 "Adapter removed - register test blocked\n");
598 *data = 1;
599 return 1;
600 }
Greg Rose92915f72010-01-09 02:24:10 +0000601 test = reg_test_vf;
602
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000603 /* Perform the register test, looping through the test table
Greg Rose92915f72010-01-09 02:24:10 +0000604 * until we either fail or reach the null entry.
605 */
606 while (test->reg) {
607 for (i = 0; i < test->array_len; i++) {
Mark Rustad388b2e42014-03-04 03:02:29 +0000608 bool b = false;
609
Greg Rose92915f72010-01-09 02:24:10 +0000610 switch (test->test_type) {
611 case PATTERN_TEST:
Mark Rustad388b2e42014-03-04 03:02:29 +0000612 b = reg_pattern_test(adapter, data,
613 test->reg + (i * 0x40),
614 test->mask,
615 test->write);
Greg Rose92915f72010-01-09 02:24:10 +0000616 break;
617 case SET_READ_TEST:
Mark Rustad388b2e42014-03-04 03:02:29 +0000618 b = reg_set_and_check(adapter, data,
619 test->reg + (i * 0x40),
620 test->mask,
621 test->write);
Greg Rose92915f72010-01-09 02:24:10 +0000622 break;
623 case WRITE_NO_TEST:
Mark Rustad388b2e42014-03-04 03:02:29 +0000624 ixgbe_write_reg(&adapter->hw,
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000625 test->reg + (i * 0x40),
626 test->write);
Greg Rose92915f72010-01-09 02:24:10 +0000627 break;
628 case TABLE32_TEST:
Mark Rustad388b2e42014-03-04 03:02:29 +0000629 b = reg_pattern_test(adapter, data,
630 test->reg + (i * 4),
631 test->mask,
632 test->write);
Greg Rose92915f72010-01-09 02:24:10 +0000633 break;
634 case TABLE64_TEST_LO:
Mark Rustad388b2e42014-03-04 03:02:29 +0000635 b = reg_pattern_test(adapter, data,
636 test->reg + (i * 8),
637 test->mask,
638 test->write);
Greg Rose92915f72010-01-09 02:24:10 +0000639 break;
640 case TABLE64_TEST_HI:
Mark Rustad388b2e42014-03-04 03:02:29 +0000641 b = reg_pattern_test(adapter, data,
642 test->reg + 4 + (i * 8),
643 test->mask,
644 test->write);
Greg Rose92915f72010-01-09 02:24:10 +0000645 break;
646 }
Mark Rustad388b2e42014-03-04 03:02:29 +0000647 if (b)
648 return 1;
Greg Rose92915f72010-01-09 02:24:10 +0000649 }
650 test++;
651 }
652
653 *data = 0;
654 return *data;
655}
656
657static void ixgbevf_diag_test(struct net_device *netdev,
658 struct ethtool_test *eth_test, u64 *data)
659{
660 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
661 bool if_running = netif_running(netdev);
662
Mark Rustad26597802014-03-04 03:02:45 +0000663 if (IXGBE_REMOVED(adapter->hw.hw_addr)) {
664 dev_err(&adapter->pdev->dev,
665 "Adapter removed - test blocked\n");
666 data[0] = 1;
667 data[1] = 1;
668 eth_test->flags |= ETH_TEST_FL_FAILED;
669 return;
670 }
Greg Rose92915f72010-01-09 02:24:10 +0000671 set_bit(__IXGBEVF_TESTING, &adapter->state);
672 if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
673 /* Offline tests */
674
675 hw_dbg(&adapter->hw, "offline testing starting\n");
676
677 /* Link test performed before hardware reset so autoneg doesn't
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000678 * interfere with test result
679 */
Greg Rose92915f72010-01-09 02:24:10 +0000680 if (ixgbevf_link_test(adapter, &data[1]))
681 eth_test->flags |= ETH_TEST_FL_FAILED;
682
683 if (if_running)
684 /* indicate we're in test mode */
Stefan Assmann324d0862016-02-03 09:20:49 +0100685 ixgbevf_close(netdev);
Greg Rose92915f72010-01-09 02:24:10 +0000686 else
687 ixgbevf_reset(adapter);
688
689 hw_dbg(&adapter->hw, "register testing starting\n");
690 if (ixgbevf_reg_test(adapter, &data[0]))
691 eth_test->flags |= ETH_TEST_FL_FAILED;
692
693 ixgbevf_reset(adapter);
694
695 clear_bit(__IXGBEVF_TESTING, &adapter->state);
696 if (if_running)
Stefan Assmann324d0862016-02-03 09:20:49 +0100697 ixgbevf_open(netdev);
Greg Rose92915f72010-01-09 02:24:10 +0000698 } else {
699 hw_dbg(&adapter->hw, "online testing starting\n");
700 /* Online tests */
701 if (ixgbevf_link_test(adapter, &data[1]))
702 eth_test->flags |= ETH_TEST_FL_FAILED;
703
704 /* Online tests aren't run; pass by default */
705 data[0] = 0;
706
707 clear_bit(__IXGBEVF_TESTING, &adapter->state);
708 }
709 msleep_interruptible(4 * 1000);
710}
711
712static int ixgbevf_nway_reset(struct net_device *netdev)
713{
714 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
715
Alexander Duyck77d5dfc2012-05-11 08:32:19 +0000716 if (netif_running(netdev))
717 ixgbevf_reinit_locked(adapter);
Greg Rose92915f72010-01-09 02:24:10 +0000718
719 return 0;
720}
721
Jacob Keller38496232013-10-22 06:19:18 +0000722static int ixgbevf_get_coalesce(struct net_device *netdev,
723 struct ethtool_coalesce *ec)
724{
725 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
726
727 /* only valid if in constant ITR mode */
728 if (adapter->rx_itr_setting <= 1)
729 ec->rx_coalesce_usecs = adapter->rx_itr_setting;
730 else
731 ec->rx_coalesce_usecs = adapter->rx_itr_setting >> 2;
732
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000733 /* if in mixed Tx/Rx queues per vector mode, report only Rx settings */
Jacob Keller38496232013-10-22 06:19:18 +0000734 if (adapter->q_vector[0]->tx.count && adapter->q_vector[0]->rx.count)
735 return 0;
736
737 /* only valid if in constant ITR mode */
738 if (adapter->tx_itr_setting <= 1)
739 ec->tx_coalesce_usecs = adapter->tx_itr_setting;
740 else
741 ec->tx_coalesce_usecs = adapter->tx_itr_setting >> 2;
742
743 return 0;
744}
745
746static int ixgbevf_set_coalesce(struct net_device *netdev,
747 struct ethtool_coalesce *ec)
748{
749 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
750 struct ixgbevf_q_vector *q_vector;
751 int num_vectors, i;
752 u16 tx_itr_param, rx_itr_param;
753
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000754 /* don't accept Tx specific changes if we've got mixed RxTx vectors */
755 if (adapter->q_vector[0]->tx.count &&
756 adapter->q_vector[0]->rx.count && ec->tx_coalesce_usecs)
Jacob Keller38496232013-10-22 06:19:18 +0000757 return -EINVAL;
758
Jacob Keller38496232013-10-22 06:19:18 +0000759 if ((ec->rx_coalesce_usecs > (IXGBE_MAX_EITR >> 2)) ||
760 (ec->tx_coalesce_usecs > (IXGBE_MAX_EITR >> 2)))
761 return -EINVAL;
762
763 if (ec->rx_coalesce_usecs > 1)
764 adapter->rx_itr_setting = ec->rx_coalesce_usecs << 2;
765 else
766 adapter->rx_itr_setting = ec->rx_coalesce_usecs;
767
768 if (adapter->rx_itr_setting == 1)
769 rx_itr_param = IXGBE_20K_ITR;
770 else
771 rx_itr_param = adapter->rx_itr_setting;
772
Jacob Keller38496232013-10-22 06:19:18 +0000773 if (ec->tx_coalesce_usecs > 1)
774 adapter->tx_itr_setting = ec->tx_coalesce_usecs << 2;
775 else
776 adapter->tx_itr_setting = ec->tx_coalesce_usecs;
777
778 if (adapter->tx_itr_setting == 1)
Alexander Duyck8a9ca112015-09-29 13:11:15 -0700779 tx_itr_param = IXGBE_12K_ITR;
Jacob Keller38496232013-10-22 06:19:18 +0000780 else
781 tx_itr_param = adapter->tx_itr_setting;
782
783 num_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
784
785 for (i = 0; i < num_vectors; i++) {
786 q_vector = adapter->q_vector[i];
787 if (q_vector->tx.count && !q_vector->rx.count)
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000788 /* Tx only */
Jacob Keller38496232013-10-22 06:19:18 +0000789 q_vector->itr = tx_itr_param;
790 else
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000791 /* Rx only or mixed */
Jacob Keller38496232013-10-22 06:19:18 +0000792 q_vector->itr = rx_itr_param;
793 ixgbevf_write_eitr(q_vector);
794 }
795
796 return 0;
797}
798
Vlad Zolotarovb6411732015-03-30 21:35:29 +0300799static int ixgbevf_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
800 u32 *rules __always_unused)
801{
802 struct ixgbevf_adapter *adapter = netdev_priv(dev);
803
804 switch (info->cmd) {
805 case ETHTOOL_GRXRINGS:
806 info->data = adapter->num_rx_queues;
807 return 0;
808 default:
809 hw_dbg(&adapter->hw, "Command parameters not supported\n");
810 return -EOPNOTSUPP;
811 }
812}
813
814static u32 ixgbevf_get_rxfh_indir_size(struct net_device *netdev)
815{
816 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
817
Emil Tantilov9cba4342015-04-30 11:50:55 -0700818 if (adapter->hw.mac.type >= ixgbe_mac_X550_vf)
819 return IXGBEVF_X550_VFRETA_SIZE;
Vlad Zolotarovb6411732015-03-30 21:35:29 +0300820
Emil Tantilov9cba4342015-04-30 11:50:55 -0700821 return IXGBEVF_82599_RETA_SIZE;
Vlad Zolotarovb6411732015-03-30 21:35:29 +0300822}
823
824static u32 ixgbevf_get_rxfh_key_size(struct net_device *netdev)
825{
Emil Tantilov9cba4342015-04-30 11:50:55 -0700826 return IXGBEVF_RSS_HASH_KEY_SIZE;
Vlad Zolotarovb6411732015-03-30 21:35:29 +0300827}
828
829static int ixgbevf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
830 u8 *hfunc)
831{
832 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
833 int err = 0;
834
835 if (hfunc)
836 *hfunc = ETH_RSS_HASH_TOP;
837
Emil Tantilov9cba4342015-04-30 11:50:55 -0700838 if (adapter->hw.mac.type >= ixgbe_mac_X550_vf) {
839 if (key)
840 memcpy(key, adapter->rss_key, sizeof(adapter->rss_key));
Vlad Zolotarovb6411732015-03-30 21:35:29 +0300841
Emil Tantilov9cba4342015-04-30 11:50:55 -0700842 if (indir) {
843 int i;
Vlad Zolotarovb6411732015-03-30 21:35:29 +0300844
Emil Tantilov9cba4342015-04-30 11:50:55 -0700845 for (i = 0; i < IXGBEVF_X550_VFRETA_SIZE; i++)
846 indir[i] = adapter->rss_indir_tbl[i];
847 }
848 } else {
849 /* If neither indirection table nor hash key was requested
850 * - just return a success avoiding taking any locks.
851 */
852 if (!indir && !key)
853 return 0;
Vlad Zolotarovb6411732015-03-30 21:35:29 +0300854
Emil Tantilov9cba4342015-04-30 11:50:55 -0700855 spin_lock_bh(&adapter->mbx_lock);
856 if (indir)
857 err = ixgbevf_get_reta_locked(&adapter->hw, indir,
858 adapter->num_rx_queues);
859
860 if (!err && key)
861 err = ixgbevf_get_rss_key_locked(&adapter->hw, key);
862
863 spin_unlock_bh(&adapter->mbx_lock);
864 }
Vlad Zolotarovb6411732015-03-30 21:35:29 +0300865
866 return err;
867}
868
Stephen Hemmingerb47aca132012-01-18 22:13:32 +0000869static const struct ethtool_ops ixgbevf_ethtool_ops = {
Jeff Kirsherdec0d8e2015-02-10 11:42:33 +0000870 .get_settings = ixgbevf_get_settings,
871 .get_drvinfo = ixgbevf_get_drvinfo,
872 .get_regs_len = ixgbevf_get_regs_len,
873 .get_regs = ixgbevf_get_regs,
874 .nway_reset = ixgbevf_nway_reset,
875 .get_link = ethtool_op_get_link,
876 .get_ringparam = ixgbevf_get_ringparam,
877 .set_ringparam = ixgbevf_set_ringparam,
878 .get_msglevel = ixgbevf_get_msglevel,
879 .set_msglevel = ixgbevf_set_msglevel,
880 .self_test = ixgbevf_diag_test,
881 .get_sset_count = ixgbevf_get_sset_count,
882 .get_strings = ixgbevf_get_strings,
883 .get_ethtool_stats = ixgbevf_get_ethtool_stats,
884 .get_coalesce = ixgbevf_get_coalesce,
885 .set_coalesce = ixgbevf_set_coalesce,
Vlad Zolotarovb6411732015-03-30 21:35:29 +0300886 .get_rxnfc = ixgbevf_get_rxnfc,
887 .get_rxfh_indir_size = ixgbevf_get_rxfh_indir_size,
888 .get_rxfh_key_size = ixgbevf_get_rxfh_key_size,
889 .get_rxfh = ixgbevf_get_rxfh,
Greg Rose92915f72010-01-09 02:24:10 +0000890};
891
892void ixgbevf_set_ethtool_ops(struct net_device *netdev)
893{
Wilfried Klaebe7ad24ea2014-05-11 00:12:32 +0000894 netdev->ethtool_ops = &ixgbevf_ethtool_ops;
Greg Rose92915f72010-01-09 02:24:10 +0000895}