]> Git Repo - linux.git/blob - drivers/net/ethernet/sfc/ethtool_common.c
ASoC: simple-card: Use snd_soc_of_parse_aux_devs()
[linux.git] / drivers / net / ethernet / sfc / ethtool_common.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /****************************************************************************
3  * Driver for Solarflare network controllers and boards
4  * Copyright 2019 Solarflare Communications Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License version 2 as published
8  * by the Free Software Foundation, incorporated herein by reference.
9  */
10 #include <linux/module.h>
11 #include <linux/netdevice.h>
12 #include "net_driver.h"
13 #include "mcdi.h"
14 #include "nic.h"
15 #include "selftest.h"
16 #include "rx_common.h"
17 #include "ethtool_common.h"
18
19 struct efx_sw_stat_desc {
20         const char *name;
21         enum {
22                 EFX_ETHTOOL_STAT_SOURCE_nic,
23                 EFX_ETHTOOL_STAT_SOURCE_channel,
24                 EFX_ETHTOOL_STAT_SOURCE_tx_queue
25         } source;
26         unsigned int offset;
27         u64 (*get_stat)(void *field); /* Reader function */
28 };
29
30 /* Initialiser for a struct efx_sw_stat_desc with type-checking */
31 #define EFX_ETHTOOL_STAT(stat_name, source_name, field, field_type, \
32                                 get_stat_function) {                    \
33         .name = #stat_name,                                             \
34         .source = EFX_ETHTOOL_STAT_SOURCE_##source_name,                \
35         .offset = ((((field_type *) 0) ==                               \
36                       &((struct efx_##source_name *)0)->field) ?        \
37                     offsetof(struct efx_##source_name, field) :         \
38                     offsetof(struct efx_##source_name, field)),         \
39         .get_stat = get_stat_function,                                  \
40 }
41
42 static u64 efx_get_uint_stat(void *field)
43 {
44         return *(unsigned int *)field;
45 }
46
47 static u64 efx_get_atomic_stat(void *field)
48 {
49         return atomic_read((atomic_t *) field);
50 }
51
52 #define EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(field)                \
53         EFX_ETHTOOL_STAT(field, nic, field,                     \
54                          atomic_t, efx_get_atomic_stat)
55
56 #define EFX_ETHTOOL_UINT_CHANNEL_STAT(field)                    \
57         EFX_ETHTOOL_STAT(field, channel, n_##field,             \
58                          unsigned int, efx_get_uint_stat)
59 #define EFX_ETHTOOL_UINT_CHANNEL_STAT_NO_N(field)               \
60         EFX_ETHTOOL_STAT(field, channel, field,                 \
61                          unsigned int, efx_get_uint_stat)
62
63 #define EFX_ETHTOOL_UINT_TXQ_STAT(field)                        \
64         EFX_ETHTOOL_STAT(tx_##field, tx_queue, field,           \
65                          unsigned int, efx_get_uint_stat)
66
67 static const struct efx_sw_stat_desc efx_sw_stat_desc[] = {
68         EFX_ETHTOOL_UINT_TXQ_STAT(merge_events),
69         EFX_ETHTOOL_UINT_TXQ_STAT(tso_bursts),
70         EFX_ETHTOOL_UINT_TXQ_STAT(tso_long_headers),
71         EFX_ETHTOOL_UINT_TXQ_STAT(tso_packets),
72         EFX_ETHTOOL_UINT_TXQ_STAT(tso_fallbacks),
73         EFX_ETHTOOL_UINT_TXQ_STAT(pushes),
74         EFX_ETHTOOL_UINT_TXQ_STAT(pio_packets),
75         EFX_ETHTOOL_UINT_TXQ_STAT(cb_packets),
76         EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(rx_reset),
77         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tobe_disc),
78         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_ip_hdr_chksum_err),
79         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tcp_udp_chksum_err),
80         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_inner_ip_hdr_chksum_err),
81         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_inner_tcp_udp_chksum_err),
82         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_outer_ip_hdr_chksum_err),
83         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_outer_tcp_udp_chksum_err),
84         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_eth_crc_err),
85         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_mcast_mismatch),
86         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_frm_trunc),
87         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_merge_events),
88         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_merge_packets),
89         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_xdp_drops),
90         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_xdp_bad_drops),
91         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_xdp_tx),
92         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_xdp_redirect),
93 #ifdef CONFIG_RFS_ACCEL
94         EFX_ETHTOOL_UINT_CHANNEL_STAT_NO_N(rfs_filter_count),
95         EFX_ETHTOOL_UINT_CHANNEL_STAT(rfs_succeeded),
96         EFX_ETHTOOL_UINT_CHANNEL_STAT(rfs_failed),
97 #endif
98 };
99
100 #define EFX_ETHTOOL_SW_STAT_COUNT ARRAY_SIZE(efx_sw_stat_desc)
101
102 void efx_ethtool_get_drvinfo(struct net_device *net_dev,
103                              struct ethtool_drvinfo *info)
104 {
105         struct efx_nic *efx = netdev_priv(net_dev);
106
107         strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
108         strlcpy(info->version, EFX_DRIVER_VERSION, sizeof(info->version));
109         efx_mcdi_print_fwver(efx, info->fw_version,
110                              sizeof(info->fw_version));
111         strlcpy(info->bus_info, pci_name(efx->pci_dev), sizeof(info->bus_info));
112 }
113
114 u32 efx_ethtool_get_msglevel(struct net_device *net_dev)
115 {
116         struct efx_nic *efx = netdev_priv(net_dev);
117
118         return efx->msg_enable;
119 }
120
121 void efx_ethtool_set_msglevel(struct net_device *net_dev, u32 msg_enable)
122 {
123         struct efx_nic *efx = netdev_priv(net_dev);
124
125         efx->msg_enable = msg_enable;
126 }
127
128 void efx_ethtool_self_test(struct net_device *net_dev,
129                            struct ethtool_test *test, u64 *data)
130 {
131         struct efx_nic *efx = netdev_priv(net_dev);
132         struct efx_self_tests *efx_tests;
133         bool already_up;
134         int rc = -ENOMEM;
135
136         efx_tests = kzalloc(sizeof(*efx_tests), GFP_KERNEL);
137         if (!efx_tests)
138                 goto fail;
139
140         if (efx->state != STATE_READY) {
141                 rc = -EBUSY;
142                 goto out;
143         }
144
145         netif_info(efx, drv, efx->net_dev, "starting %sline testing\n",
146                    (test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on");
147
148         /* We need rx buffers and interrupts. */
149         already_up = (efx->net_dev->flags & IFF_UP);
150         if (!already_up) {
151                 rc = dev_open(efx->net_dev, NULL);
152                 if (rc) {
153                         netif_err(efx, drv, efx->net_dev,
154                                   "failed opening device.\n");
155                         goto out;
156                 }
157         }
158
159         rc = efx_selftest(efx, efx_tests, test->flags);
160
161         if (!already_up)
162                 dev_close(efx->net_dev);
163
164         netif_info(efx, drv, efx->net_dev, "%s %sline self-tests\n",
165                    rc == 0 ? "passed" : "failed",
166                    (test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on");
167
168 out:
169         efx_ethtool_fill_self_tests(efx, efx_tests, NULL, data);
170         kfree(efx_tests);
171 fail:
172         if (rc)
173                 test->flags |= ETH_TEST_FL_FAILED;
174 }
175
176 void efx_ethtool_get_pauseparam(struct net_device *net_dev,
177                                 struct ethtool_pauseparam *pause)
178 {
179         struct efx_nic *efx = netdev_priv(net_dev);
180
181         pause->rx_pause = !!(efx->wanted_fc & EFX_FC_RX);
182         pause->tx_pause = !!(efx->wanted_fc & EFX_FC_TX);
183         pause->autoneg = !!(efx->wanted_fc & EFX_FC_AUTO);
184 }
185
186 int efx_ethtool_set_pauseparam(struct net_device *net_dev,
187                                struct ethtool_pauseparam *pause)
188 {
189         struct efx_nic *efx = netdev_priv(net_dev);
190         u8 wanted_fc, old_fc;
191         u32 old_adv;
192         int rc = 0;
193
194         mutex_lock(&efx->mac_lock);
195
196         wanted_fc = ((pause->rx_pause ? EFX_FC_RX : 0) |
197                      (pause->tx_pause ? EFX_FC_TX : 0) |
198                      (pause->autoneg ? EFX_FC_AUTO : 0));
199
200         if ((wanted_fc & EFX_FC_TX) && !(wanted_fc & EFX_FC_RX)) {
201                 netif_dbg(efx, drv, efx->net_dev,
202                           "Flow control unsupported: tx ON rx OFF\n");
203                 rc = -EINVAL;
204                 goto out;
205         }
206
207         if ((wanted_fc & EFX_FC_AUTO) && !efx->link_advertising[0]) {
208                 netif_dbg(efx, drv, efx->net_dev,
209                           "Autonegotiation is disabled\n");
210                 rc = -EINVAL;
211                 goto out;
212         }
213
214         /* Hook for Falcon bug 11482 workaround */
215         if (efx->type->prepare_enable_fc_tx &&
216             (wanted_fc & EFX_FC_TX) && !(efx->wanted_fc & EFX_FC_TX))
217                 efx->type->prepare_enable_fc_tx(efx);
218
219         old_adv = efx->link_advertising[0];
220         old_fc = efx->wanted_fc;
221         efx_link_set_wanted_fc(efx, wanted_fc);
222         if (efx->link_advertising[0] != old_adv ||
223             (efx->wanted_fc ^ old_fc) & EFX_FC_AUTO) {
224                 rc = efx->phy_op->reconfigure(efx);
225                 if (rc) {
226                         netif_err(efx, drv, efx->net_dev,
227                                   "Unable to advertise requested flow "
228                                   "control setting\n");
229                         goto out;
230                 }
231         }
232
233         /* Reconfigure the MAC. The PHY *may* generate a link state change event
234          * if the user just changed the advertised capabilities, but there's no
235          * harm doing this twice */
236         efx_mac_reconfigure(efx, false);
237
238 out:
239         mutex_unlock(&efx->mac_lock);
240
241         return rc;
242 }
243
244 /**
245  * efx_fill_test - fill in an individual self-test entry
246  * @test_index:         Index of the test
247  * @strings:            Ethtool strings, or %NULL
248  * @data:               Ethtool test results, or %NULL
249  * @test:               Pointer to test result (used only if data != %NULL)
250  * @unit_format:        Unit name format (e.g. "chan\%d")
251  * @unit_id:            Unit id (e.g. 0 for "chan0")
252  * @test_format:        Test name format (e.g. "loopback.\%s.tx.sent")
253  * @test_id:            Test id (e.g. "PHYXS" for "loopback.PHYXS.tx_sent")
254  *
255  * Fill in an individual self-test entry.
256  */
257 static void efx_fill_test(unsigned int test_index, u8 *strings, u64 *data,
258                           int *test, const char *unit_format, int unit_id,
259                           const char *test_format, const char *test_id)
260 {
261         char unit_str[ETH_GSTRING_LEN], test_str[ETH_GSTRING_LEN];
262
263         /* Fill data value, if applicable */
264         if (data)
265                 data[test_index] = *test;
266
267         /* Fill string, if applicable */
268         if (strings) {
269                 if (strchr(unit_format, '%'))
270                         snprintf(unit_str, sizeof(unit_str),
271                                  unit_format, unit_id);
272                 else
273                         strcpy(unit_str, unit_format);
274                 snprintf(test_str, sizeof(test_str), test_format, test_id);
275                 snprintf(strings + test_index * ETH_GSTRING_LEN,
276                          ETH_GSTRING_LEN,
277                          "%-6s %-24s", unit_str, test_str);
278         }
279 }
280
281 #define EFX_CHANNEL_NAME(_channel) "chan%d", _channel->channel
282 #define EFX_TX_QUEUE_NAME(_tx_queue) "txq%d", _tx_queue->label
283 #define EFX_LOOPBACK_NAME(_mode, _counter)                      \
284         "loopback.%s." _counter, STRING_TABLE_LOOKUP(_mode, efx_loopback_mode)
285
286 /**
287  * efx_fill_loopback_test - fill in a block of loopback self-test entries
288  * @efx:                Efx NIC
289  * @lb_tests:           Efx loopback self-test results structure
290  * @mode:               Loopback test mode
291  * @test_index:         Starting index of the test
292  * @strings:            Ethtool strings, or %NULL
293  * @data:               Ethtool test results, or %NULL
294  *
295  * Fill in a block of loopback self-test entries.  Return new test
296  * index.
297  */
298 static int efx_fill_loopback_test(struct efx_nic *efx,
299                                   struct efx_loopback_self_tests *lb_tests,
300                                   enum efx_loopback_mode mode,
301                                   unsigned int test_index,
302                                   u8 *strings, u64 *data)
303 {
304         struct efx_channel *channel =
305                 efx_get_channel(efx, efx->tx_channel_offset);
306         struct efx_tx_queue *tx_queue;
307
308         efx_for_each_channel_tx_queue(tx_queue, channel) {
309                 efx_fill_test(test_index++, strings, data,
310                               &lb_tests->tx_sent[tx_queue->label],
311                               EFX_TX_QUEUE_NAME(tx_queue),
312                               EFX_LOOPBACK_NAME(mode, "tx_sent"));
313                 efx_fill_test(test_index++, strings, data,
314                               &lb_tests->tx_done[tx_queue->label],
315                               EFX_TX_QUEUE_NAME(tx_queue),
316                               EFX_LOOPBACK_NAME(mode, "tx_done"));
317         }
318         efx_fill_test(test_index++, strings, data,
319                       &lb_tests->rx_good,
320                       "rx", 0,
321                       EFX_LOOPBACK_NAME(mode, "rx_good"));
322         efx_fill_test(test_index++, strings, data,
323                       &lb_tests->rx_bad,
324                       "rx", 0,
325                       EFX_LOOPBACK_NAME(mode, "rx_bad"));
326
327         return test_index;
328 }
329
330 /**
331  * efx_ethtool_fill_self_tests - get self-test details
332  * @efx:                Efx NIC
333  * @tests:              Efx self-test results structure, or %NULL
334  * @strings:            Ethtool strings, or %NULL
335  * @data:               Ethtool test results, or %NULL
336  *
337  * Get self-test number of strings, strings, and/or test results.
338  * Return number of strings (== number of test results).
339  *
340  * The reason for merging these three functions is to make sure that
341  * they can never be inconsistent.
342  */
343 int efx_ethtool_fill_self_tests(struct efx_nic *efx,
344                                 struct efx_self_tests *tests,
345                                 u8 *strings, u64 *data)
346 {
347         struct efx_channel *channel;
348         unsigned int n = 0, i;
349         enum efx_loopback_mode mode;
350
351         efx_fill_test(n++, strings, data, &tests->phy_alive,
352                       "phy", 0, "alive", NULL);
353         efx_fill_test(n++, strings, data, &tests->nvram,
354                       "core", 0, "nvram", NULL);
355         efx_fill_test(n++, strings, data, &tests->interrupt,
356                       "core", 0, "interrupt", NULL);
357
358         /* Event queues */
359         efx_for_each_channel(channel, efx) {
360                 efx_fill_test(n++, strings, data,
361                               &tests->eventq_dma[channel->channel],
362                               EFX_CHANNEL_NAME(channel),
363                               "eventq.dma", NULL);
364                 efx_fill_test(n++, strings, data,
365                               &tests->eventq_int[channel->channel],
366                               EFX_CHANNEL_NAME(channel),
367                               "eventq.int", NULL);
368         }
369
370         efx_fill_test(n++, strings, data, &tests->memory,
371                       "core", 0, "memory", NULL);
372         efx_fill_test(n++, strings, data, &tests->registers,
373                       "core", 0, "registers", NULL);
374
375         if (efx->phy_op->run_tests != NULL) {
376                 EFX_WARN_ON_PARANOID(efx->phy_op->test_name == NULL);
377
378                 for (i = 0; true; ++i) {
379                         const char *name;
380
381                         EFX_WARN_ON_PARANOID(i >= EFX_MAX_PHY_TESTS);
382                         name = efx->phy_op->test_name(efx, i);
383                         if (name == NULL)
384                                 break;
385
386                         efx_fill_test(n++, strings, data, &tests->phy_ext[i],
387                                       "phy", 0, name, NULL);
388                 }
389         }
390
391         /* Loopback tests */
392         for (mode = LOOPBACK_NONE; mode <= LOOPBACK_TEST_MAX; mode++) {
393                 if (!(efx->loopback_modes & (1 << mode)))
394                         continue;
395                 n = efx_fill_loopback_test(efx,
396                                            &tests->loopback[mode], mode, n,
397                                            strings, data);
398         }
399
400         return n;
401 }
402
403 static size_t efx_describe_per_queue_stats(struct efx_nic *efx, u8 *strings)
404 {
405         size_t n_stats = 0;
406         struct efx_channel *channel;
407
408         efx_for_each_channel(channel, efx) {
409                 if (efx_channel_has_tx_queues(channel)) {
410                         n_stats++;
411                         if (strings != NULL) {
412                                 snprintf(strings, ETH_GSTRING_LEN,
413                                          "tx-%u.tx_packets",
414                                          channel->tx_queue[0].queue /
415                                          EFX_TXQ_TYPES);
416
417                                 strings += ETH_GSTRING_LEN;
418                         }
419                 }
420         }
421         efx_for_each_channel(channel, efx) {
422                 if (efx_channel_has_rx_queue(channel)) {
423                         n_stats++;
424                         if (strings != NULL) {
425                                 snprintf(strings, ETH_GSTRING_LEN,
426                                          "rx-%d.rx_packets", channel->channel);
427                                 strings += ETH_GSTRING_LEN;
428                         }
429                 }
430         }
431         if (efx->xdp_tx_queue_count && efx->xdp_tx_queues) {
432                 unsigned short xdp;
433
434                 for (xdp = 0; xdp < efx->xdp_tx_queue_count; xdp++) {
435                         n_stats++;
436                         if (strings) {
437                                 snprintf(strings, ETH_GSTRING_LEN,
438                                          "tx-xdp-cpu-%hu.tx_packets", xdp);
439                                 strings += ETH_GSTRING_LEN;
440                         }
441                 }
442         }
443
444         return n_stats;
445 }
446
447 int efx_ethtool_get_sset_count(struct net_device *net_dev, int string_set)
448 {
449         struct efx_nic *efx = netdev_priv(net_dev);
450
451         switch (string_set) {
452         case ETH_SS_STATS:
453                 return efx->type->describe_stats(efx, NULL) +
454                        EFX_ETHTOOL_SW_STAT_COUNT +
455                        efx_describe_per_queue_stats(efx, NULL) +
456                        efx_ptp_describe_stats(efx, NULL);
457         case ETH_SS_TEST:
458                 return efx_ethtool_fill_self_tests(efx, NULL, NULL, NULL);
459         default:
460                 return -EINVAL;
461         }
462 }
463
464 void efx_ethtool_get_strings(struct net_device *net_dev,
465                              u32 string_set, u8 *strings)
466 {
467         struct efx_nic *efx = netdev_priv(net_dev);
468         int i;
469
470         switch (string_set) {
471         case ETH_SS_STATS:
472                 strings += (efx->type->describe_stats(efx, strings) *
473                             ETH_GSTRING_LEN);
474                 for (i = 0; i < EFX_ETHTOOL_SW_STAT_COUNT; i++)
475                         strlcpy(strings + i * ETH_GSTRING_LEN,
476                                 efx_sw_stat_desc[i].name, ETH_GSTRING_LEN);
477                 strings += EFX_ETHTOOL_SW_STAT_COUNT * ETH_GSTRING_LEN;
478                 strings += (efx_describe_per_queue_stats(efx, strings) *
479                             ETH_GSTRING_LEN);
480                 efx_ptp_describe_stats(efx, strings);
481                 break;
482         case ETH_SS_TEST:
483                 efx_ethtool_fill_self_tests(efx, NULL, strings, NULL);
484                 break;
485         default:
486                 /* No other string sets */
487                 break;
488         }
489 }
490
491 void efx_ethtool_get_stats(struct net_device *net_dev,
492                            struct ethtool_stats *stats,
493                            u64 *data)
494 {
495         struct efx_nic *efx = netdev_priv(net_dev);
496         const struct efx_sw_stat_desc *stat;
497         struct efx_channel *channel;
498         struct efx_tx_queue *tx_queue;
499         struct efx_rx_queue *rx_queue;
500         int i;
501
502         spin_lock_bh(&efx->stats_lock);
503
504         /* Get NIC statistics */
505         data += efx->type->update_stats(efx, data, NULL);
506
507         /* Get software statistics */
508         for (i = 0; i < EFX_ETHTOOL_SW_STAT_COUNT; i++) {
509                 stat = &efx_sw_stat_desc[i];
510                 switch (stat->source) {
511                 case EFX_ETHTOOL_STAT_SOURCE_nic:
512                         data[i] = stat->get_stat((void *)efx + stat->offset);
513                         break;
514                 case EFX_ETHTOOL_STAT_SOURCE_channel:
515                         data[i] = 0;
516                         efx_for_each_channel(channel, efx)
517                                 data[i] += stat->get_stat((void *)channel +
518                                                           stat->offset);
519                         break;
520                 case EFX_ETHTOOL_STAT_SOURCE_tx_queue:
521                         data[i] = 0;
522                         efx_for_each_channel(channel, efx) {
523                                 efx_for_each_channel_tx_queue(tx_queue, channel)
524                                         data[i] +=
525                                                 stat->get_stat((void *)tx_queue
526                                                                + stat->offset);
527                         }
528                         break;
529                 }
530         }
531         data += EFX_ETHTOOL_SW_STAT_COUNT;
532
533         spin_unlock_bh(&efx->stats_lock);
534
535         efx_for_each_channel(channel, efx) {
536                 if (efx_channel_has_tx_queues(channel)) {
537                         *data = 0;
538                         efx_for_each_channel_tx_queue(tx_queue, channel) {
539                                 *data += tx_queue->tx_packets;
540                         }
541                         data++;
542                 }
543         }
544         efx_for_each_channel(channel, efx) {
545                 if (efx_channel_has_rx_queue(channel)) {
546                         *data = 0;
547                         efx_for_each_channel_rx_queue(rx_queue, channel) {
548                                 *data += rx_queue->rx_packets;
549                         }
550                         data++;
551                 }
552         }
553         if (efx->xdp_tx_queue_count && efx->xdp_tx_queues) {
554                 int xdp;
555
556                 for (xdp = 0; xdp < efx->xdp_tx_queue_count; xdp++) {
557                         data[0] = efx->xdp_tx_queues[xdp]->tx_packets;
558                         data++;
559                 }
560         }
561
562         efx_ptp_update_stats(efx, data);
563 }
564
565 /* This must be called with rtnl_lock held. */
566 int efx_ethtool_get_link_ksettings(struct net_device *net_dev,
567                                    struct ethtool_link_ksettings *cmd)
568 {
569         struct efx_nic *efx = netdev_priv(net_dev);
570         struct efx_link_state *link_state = &efx->link_state;
571         u32 supported;
572
573         mutex_lock(&efx->mac_lock);
574         efx->phy_op->get_link_ksettings(efx, cmd);
575         mutex_unlock(&efx->mac_lock);
576
577         /* Both MACs support pause frames (bidirectional and respond-only) */
578         ethtool_convert_link_mode_to_legacy_u32(&supported,
579                                                 cmd->link_modes.supported);
580
581         supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
582
583         ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
584                                                 supported);
585
586         if (LOOPBACK_INTERNAL(efx)) {
587                 cmd->base.speed = link_state->speed;
588                 cmd->base.duplex = link_state->fd ? DUPLEX_FULL : DUPLEX_HALF;
589         }
590
591         return 0;
592 }
593
594 /* This must be called with rtnl_lock held. */
595 int efx_ethtool_set_link_ksettings(struct net_device *net_dev,
596                                    const struct ethtool_link_ksettings *cmd)
597 {
598         struct efx_nic *efx = netdev_priv(net_dev);
599         int rc;
600
601         /* GMAC does not support 1000Mbps HD */
602         if ((cmd->base.speed == SPEED_1000) &&
603             (cmd->base.duplex != DUPLEX_FULL)) {
604                 netif_dbg(efx, drv, efx->net_dev,
605                           "rejecting unsupported 1000Mbps HD setting\n");
606                 return -EINVAL;
607         }
608
609         mutex_lock(&efx->mac_lock);
610         rc = efx->phy_op->set_link_ksettings(efx, cmd);
611         mutex_unlock(&efx->mac_lock);
612         return rc;
613 }
614
615 int efx_ethtool_get_fecparam(struct net_device *net_dev,
616                              struct ethtool_fecparam *fecparam)
617 {
618         struct efx_nic *efx = netdev_priv(net_dev);
619         int rc;
620
621         if (!efx->phy_op || !efx->phy_op->get_fecparam)
622                 return -EOPNOTSUPP;
623         mutex_lock(&efx->mac_lock);
624         rc = efx->phy_op->get_fecparam(efx, fecparam);
625         mutex_unlock(&efx->mac_lock);
626
627         return rc;
628 }
629
630 int efx_ethtool_set_fecparam(struct net_device *net_dev,
631                              struct ethtool_fecparam *fecparam)
632 {
633         struct efx_nic *efx = netdev_priv(net_dev);
634         int rc;
635
636         if (!efx->phy_op || !efx->phy_op->get_fecparam)
637                 return -EOPNOTSUPP;
638         mutex_lock(&efx->mac_lock);
639         rc = efx->phy_op->set_fecparam(efx, fecparam);
640         mutex_unlock(&efx->mac_lock);
641
642         return rc;
643 }
644
645 /* MAC address mask including only I/G bit */
646 static const u8 mac_addr_ig_mask[ETH_ALEN] __aligned(2) = {0x01, 0, 0, 0, 0, 0};
647
648 #define IP4_ADDR_FULL_MASK      ((__force __be32)~0)
649 #define IP_PROTO_FULL_MASK      0xFF
650 #define PORT_FULL_MASK          ((__force __be16)~0)
651 #define ETHER_TYPE_FULL_MASK    ((__force __be16)~0)
652
653 static inline void ip6_fill_mask(__be32 *mask)
654 {
655         mask[0] = mask[1] = mask[2] = mask[3] = ~(__be32)0;
656 }
657
658 static int efx_ethtool_get_class_rule(struct efx_nic *efx,
659                                       struct ethtool_rx_flow_spec *rule,
660                                       u32 *rss_context)
661 {
662         struct ethtool_tcpip4_spec *ip_entry = &rule->h_u.tcp_ip4_spec;
663         struct ethtool_tcpip4_spec *ip_mask = &rule->m_u.tcp_ip4_spec;
664         struct ethtool_usrip4_spec *uip_entry = &rule->h_u.usr_ip4_spec;
665         struct ethtool_usrip4_spec *uip_mask = &rule->m_u.usr_ip4_spec;
666         struct ethtool_tcpip6_spec *ip6_entry = &rule->h_u.tcp_ip6_spec;
667         struct ethtool_tcpip6_spec *ip6_mask = &rule->m_u.tcp_ip6_spec;
668         struct ethtool_usrip6_spec *uip6_entry = &rule->h_u.usr_ip6_spec;
669         struct ethtool_usrip6_spec *uip6_mask = &rule->m_u.usr_ip6_spec;
670         struct ethhdr *mac_entry = &rule->h_u.ether_spec;
671         struct ethhdr *mac_mask = &rule->m_u.ether_spec;
672         struct efx_filter_spec spec;
673         int rc;
674
675         rc = efx_filter_get_filter_safe(efx, EFX_FILTER_PRI_MANUAL,
676                                         rule->location, &spec);
677         if (rc)
678                 return rc;
679
680         if (spec.dmaq_id == EFX_FILTER_RX_DMAQ_ID_DROP)
681                 rule->ring_cookie = RX_CLS_FLOW_DISC;
682         else
683                 rule->ring_cookie = spec.dmaq_id;
684
685         if ((spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE) &&
686             spec.ether_type == htons(ETH_P_IP) &&
687             (spec.match_flags & EFX_FILTER_MATCH_IP_PROTO) &&
688             (spec.ip_proto == IPPROTO_TCP || spec.ip_proto == IPPROTO_UDP) &&
689             !(spec.match_flags &
690               ~(EFX_FILTER_MATCH_ETHER_TYPE | EFX_FILTER_MATCH_OUTER_VID |
691                 EFX_FILTER_MATCH_LOC_HOST | EFX_FILTER_MATCH_REM_HOST |
692                 EFX_FILTER_MATCH_IP_PROTO |
693                 EFX_FILTER_MATCH_LOC_PORT | EFX_FILTER_MATCH_REM_PORT))) {
694                 rule->flow_type = ((spec.ip_proto == IPPROTO_TCP) ?
695                                    TCP_V4_FLOW : UDP_V4_FLOW);
696                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_HOST) {
697                         ip_entry->ip4dst = spec.loc_host[0];
698                         ip_mask->ip4dst = IP4_ADDR_FULL_MASK;
699                 }
700                 if (spec.match_flags & EFX_FILTER_MATCH_REM_HOST) {
701                         ip_entry->ip4src = spec.rem_host[0];
702                         ip_mask->ip4src = IP4_ADDR_FULL_MASK;
703                 }
704                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_PORT) {
705                         ip_entry->pdst = spec.loc_port;
706                         ip_mask->pdst = PORT_FULL_MASK;
707                 }
708                 if (spec.match_flags & EFX_FILTER_MATCH_REM_PORT) {
709                         ip_entry->psrc = spec.rem_port;
710                         ip_mask->psrc = PORT_FULL_MASK;
711                 }
712         } else if ((spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE) &&
713             spec.ether_type == htons(ETH_P_IPV6) &&
714             (spec.match_flags & EFX_FILTER_MATCH_IP_PROTO) &&
715             (spec.ip_proto == IPPROTO_TCP || spec.ip_proto == IPPROTO_UDP) &&
716             !(spec.match_flags &
717               ~(EFX_FILTER_MATCH_ETHER_TYPE | EFX_FILTER_MATCH_OUTER_VID |
718                 EFX_FILTER_MATCH_LOC_HOST | EFX_FILTER_MATCH_REM_HOST |
719                 EFX_FILTER_MATCH_IP_PROTO |
720                 EFX_FILTER_MATCH_LOC_PORT | EFX_FILTER_MATCH_REM_PORT))) {
721                 rule->flow_type = ((spec.ip_proto == IPPROTO_TCP) ?
722                                    TCP_V6_FLOW : UDP_V6_FLOW);
723                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_HOST) {
724                         memcpy(ip6_entry->ip6dst, spec.loc_host,
725                                sizeof(ip6_entry->ip6dst));
726                         ip6_fill_mask(ip6_mask->ip6dst);
727                 }
728                 if (spec.match_flags & EFX_FILTER_MATCH_REM_HOST) {
729                         memcpy(ip6_entry->ip6src, spec.rem_host,
730                                sizeof(ip6_entry->ip6src));
731                         ip6_fill_mask(ip6_mask->ip6src);
732                 }
733                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_PORT) {
734                         ip6_entry->pdst = spec.loc_port;
735                         ip6_mask->pdst = PORT_FULL_MASK;
736                 }
737                 if (spec.match_flags & EFX_FILTER_MATCH_REM_PORT) {
738                         ip6_entry->psrc = spec.rem_port;
739                         ip6_mask->psrc = PORT_FULL_MASK;
740                 }
741         } else if (!(spec.match_flags &
742                      ~(EFX_FILTER_MATCH_LOC_MAC | EFX_FILTER_MATCH_LOC_MAC_IG |
743                        EFX_FILTER_MATCH_REM_MAC | EFX_FILTER_MATCH_ETHER_TYPE |
744                        EFX_FILTER_MATCH_OUTER_VID))) {
745                 rule->flow_type = ETHER_FLOW;
746                 if (spec.match_flags &
747                     (EFX_FILTER_MATCH_LOC_MAC | EFX_FILTER_MATCH_LOC_MAC_IG)) {
748                         ether_addr_copy(mac_entry->h_dest, spec.loc_mac);
749                         if (spec.match_flags & EFX_FILTER_MATCH_LOC_MAC)
750                                 eth_broadcast_addr(mac_mask->h_dest);
751                         else
752                                 ether_addr_copy(mac_mask->h_dest,
753                                                 mac_addr_ig_mask);
754                 }
755                 if (spec.match_flags & EFX_FILTER_MATCH_REM_MAC) {
756                         ether_addr_copy(mac_entry->h_source, spec.rem_mac);
757                         eth_broadcast_addr(mac_mask->h_source);
758                 }
759                 if (spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE) {
760                         mac_entry->h_proto = spec.ether_type;
761                         mac_mask->h_proto = ETHER_TYPE_FULL_MASK;
762                 }
763         } else if (spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE &&
764                    spec.ether_type == htons(ETH_P_IP) &&
765                    !(spec.match_flags &
766                      ~(EFX_FILTER_MATCH_ETHER_TYPE | EFX_FILTER_MATCH_OUTER_VID |
767                        EFX_FILTER_MATCH_LOC_HOST | EFX_FILTER_MATCH_REM_HOST |
768                        EFX_FILTER_MATCH_IP_PROTO))) {
769                 rule->flow_type = IPV4_USER_FLOW;
770                 uip_entry->ip_ver = ETH_RX_NFC_IP4;
771                 if (spec.match_flags & EFX_FILTER_MATCH_IP_PROTO) {
772                         uip_mask->proto = IP_PROTO_FULL_MASK;
773                         uip_entry->proto = spec.ip_proto;
774                 }
775                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_HOST) {
776                         uip_entry->ip4dst = spec.loc_host[0];
777                         uip_mask->ip4dst = IP4_ADDR_FULL_MASK;
778                 }
779                 if (spec.match_flags & EFX_FILTER_MATCH_REM_HOST) {
780                         uip_entry->ip4src = spec.rem_host[0];
781                         uip_mask->ip4src = IP4_ADDR_FULL_MASK;
782                 }
783         } else if (spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE &&
784                    spec.ether_type == htons(ETH_P_IPV6) &&
785                    !(spec.match_flags &
786                      ~(EFX_FILTER_MATCH_ETHER_TYPE | EFX_FILTER_MATCH_OUTER_VID |
787                        EFX_FILTER_MATCH_LOC_HOST | EFX_FILTER_MATCH_REM_HOST |
788                        EFX_FILTER_MATCH_IP_PROTO))) {
789                 rule->flow_type = IPV6_USER_FLOW;
790                 if (spec.match_flags & EFX_FILTER_MATCH_IP_PROTO) {
791                         uip6_mask->l4_proto = IP_PROTO_FULL_MASK;
792                         uip6_entry->l4_proto = spec.ip_proto;
793                 }
794                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_HOST) {
795                         memcpy(uip6_entry->ip6dst, spec.loc_host,
796                                sizeof(uip6_entry->ip6dst));
797                         ip6_fill_mask(uip6_mask->ip6dst);
798                 }
799                 if (spec.match_flags & EFX_FILTER_MATCH_REM_HOST) {
800                         memcpy(uip6_entry->ip6src, spec.rem_host,
801                                sizeof(uip6_entry->ip6src));
802                         ip6_fill_mask(uip6_mask->ip6src);
803                 }
804         } else {
805                 /* The above should handle all filters that we insert */
806                 WARN_ON(1);
807                 return -EINVAL;
808         }
809
810         if (spec.match_flags & EFX_FILTER_MATCH_OUTER_VID) {
811                 rule->flow_type |= FLOW_EXT;
812                 rule->h_ext.vlan_tci = spec.outer_vid;
813                 rule->m_ext.vlan_tci = htons(0xfff);
814         }
815
816         if (spec.flags & EFX_FILTER_FLAG_RX_RSS) {
817                 rule->flow_type |= FLOW_RSS;
818                 *rss_context = spec.rss_context;
819         }
820
821         return rc;
822 }
823
824 int efx_ethtool_get_rxnfc(struct net_device *net_dev,
825                           struct ethtool_rxnfc *info, u32 *rule_locs)
826 {
827         struct efx_nic *efx = netdev_priv(net_dev);
828         u32 rss_context = 0;
829         s32 rc = 0;
830
831         switch (info->cmd) {
832         case ETHTOOL_GRXRINGS:
833                 info->data = efx->n_rx_channels;
834                 return 0;
835
836         case ETHTOOL_GRXFH: {
837                 struct efx_rss_context *ctx = &efx->rss_context;
838                 __u64 data;
839
840                 mutex_lock(&efx->rss_lock);
841                 if (info->flow_type & FLOW_RSS && info->rss_context) {
842                         ctx = efx_find_rss_context_entry(efx, info->rss_context);
843                         if (!ctx) {
844                                 rc = -ENOENT;
845                                 goto out_unlock;
846                         }
847                 }
848
849                 data = 0;
850                 if (!efx_rss_active(ctx)) /* No RSS */
851                         goto out_setdata_unlock;
852
853                 switch (info->flow_type & ~FLOW_RSS) {
854                 case UDP_V4_FLOW:
855                 case UDP_V6_FLOW:
856                         if (ctx->rx_hash_udp_4tuple)
857                                 data = (RXH_L4_B_0_1 | RXH_L4_B_2_3 |
858                                         RXH_IP_SRC | RXH_IP_DST);
859                         else
860                                 data = RXH_IP_SRC | RXH_IP_DST;
861                         break;
862                 case TCP_V4_FLOW:
863                 case TCP_V6_FLOW:
864                         data = (RXH_L4_B_0_1 | RXH_L4_B_2_3 |
865                                 RXH_IP_SRC | RXH_IP_DST);
866                         break;
867                 case SCTP_V4_FLOW:
868                 case SCTP_V6_FLOW:
869                 case AH_ESP_V4_FLOW:
870                 case AH_ESP_V6_FLOW:
871                 case IPV4_FLOW:
872                 case IPV6_FLOW:
873                         data = RXH_IP_SRC | RXH_IP_DST;
874                         break;
875                 default:
876                         break;
877                 }
878 out_setdata_unlock:
879                 info->data = data;
880 out_unlock:
881                 mutex_unlock(&efx->rss_lock);
882                 return rc;
883         }
884
885         case ETHTOOL_GRXCLSRLCNT:
886                 info->data = efx_filter_get_rx_id_limit(efx);
887                 if (info->data == 0)
888                         return -EOPNOTSUPP;
889                 info->data |= RX_CLS_LOC_SPECIAL;
890                 info->rule_cnt =
891                         efx_filter_count_rx_used(efx, EFX_FILTER_PRI_MANUAL);
892                 return 0;
893
894         case ETHTOOL_GRXCLSRULE:
895                 if (efx_filter_get_rx_id_limit(efx) == 0)
896                         return -EOPNOTSUPP;
897                 rc = efx_ethtool_get_class_rule(efx, &info->fs, &rss_context);
898                 if (rc < 0)
899                         return rc;
900                 if (info->fs.flow_type & FLOW_RSS)
901                         info->rss_context = rss_context;
902                 return 0;
903
904         case ETHTOOL_GRXCLSRLALL:
905                 info->data = efx_filter_get_rx_id_limit(efx);
906                 if (info->data == 0)
907                         return -EOPNOTSUPP;
908                 rc = efx_filter_get_rx_ids(efx, EFX_FILTER_PRI_MANUAL,
909                                            rule_locs, info->rule_cnt);
910                 if (rc < 0)
911                         return rc;
912                 info->rule_cnt = rc;
913                 return 0;
914
915         default:
916                 return -EOPNOTSUPP;
917         }
918 }
919
920 static inline bool ip6_mask_is_full(__be32 mask[4])
921 {
922         return !~(mask[0] & mask[1] & mask[2] & mask[3]);
923 }
924
925 static inline bool ip6_mask_is_empty(__be32 mask[4])
926 {
927         return !(mask[0] | mask[1] | mask[2] | mask[3]);
928 }
929
930 static int efx_ethtool_set_class_rule(struct efx_nic *efx,
931                                       struct ethtool_rx_flow_spec *rule,
932                                       u32 rss_context)
933 {
934         struct ethtool_tcpip4_spec *ip_entry = &rule->h_u.tcp_ip4_spec;
935         struct ethtool_tcpip4_spec *ip_mask = &rule->m_u.tcp_ip4_spec;
936         struct ethtool_usrip4_spec *uip_entry = &rule->h_u.usr_ip4_spec;
937         struct ethtool_usrip4_spec *uip_mask = &rule->m_u.usr_ip4_spec;
938         struct ethtool_tcpip6_spec *ip6_entry = &rule->h_u.tcp_ip6_spec;
939         struct ethtool_tcpip6_spec *ip6_mask = &rule->m_u.tcp_ip6_spec;
940         struct ethtool_usrip6_spec *uip6_entry = &rule->h_u.usr_ip6_spec;
941         struct ethtool_usrip6_spec *uip6_mask = &rule->m_u.usr_ip6_spec;
942         u32 flow_type = rule->flow_type & ~(FLOW_EXT | FLOW_RSS);
943         struct ethhdr *mac_entry = &rule->h_u.ether_spec;
944         struct ethhdr *mac_mask = &rule->m_u.ether_spec;
945         enum efx_filter_flags flags = 0;
946         struct efx_filter_spec spec;
947         int rc;
948
949         /* Check that user wants us to choose the location */
950         if (rule->location != RX_CLS_LOC_ANY)
951                 return -EINVAL;
952
953         /* Range-check ring_cookie */
954         if (rule->ring_cookie >= efx->n_rx_channels &&
955             rule->ring_cookie != RX_CLS_FLOW_DISC)
956                 return -EINVAL;
957
958         /* Check for unsupported extensions */
959         if ((rule->flow_type & FLOW_EXT) &&
960             (rule->m_ext.vlan_etype || rule->m_ext.data[0] ||
961              rule->m_ext.data[1]))
962                 return -EINVAL;
963
964         if (efx->rx_scatter)
965                 flags |= EFX_FILTER_FLAG_RX_SCATTER;
966         if (rule->flow_type & FLOW_RSS)
967                 flags |= EFX_FILTER_FLAG_RX_RSS;
968
969         efx_filter_init_rx(&spec, EFX_FILTER_PRI_MANUAL, flags,
970                            (rule->ring_cookie == RX_CLS_FLOW_DISC) ?
971                            EFX_FILTER_RX_DMAQ_ID_DROP : rule->ring_cookie);
972
973         if (rule->flow_type & FLOW_RSS)
974                 spec.rss_context = rss_context;
975
976         switch (flow_type) {
977         case TCP_V4_FLOW:
978         case UDP_V4_FLOW:
979                 spec.match_flags = (EFX_FILTER_MATCH_ETHER_TYPE |
980                                     EFX_FILTER_MATCH_IP_PROTO);
981                 spec.ether_type = htons(ETH_P_IP);
982                 spec.ip_proto = flow_type == TCP_V4_FLOW ? IPPROTO_TCP
983                                                          : IPPROTO_UDP;
984                 if (ip_mask->ip4dst) {
985                         if (ip_mask->ip4dst != IP4_ADDR_FULL_MASK)
986                                 return -EINVAL;
987                         spec.match_flags |= EFX_FILTER_MATCH_LOC_HOST;
988                         spec.loc_host[0] = ip_entry->ip4dst;
989                 }
990                 if (ip_mask->ip4src) {
991                         if (ip_mask->ip4src != IP4_ADDR_FULL_MASK)
992                                 return -EINVAL;
993                         spec.match_flags |= EFX_FILTER_MATCH_REM_HOST;
994                         spec.rem_host[0] = ip_entry->ip4src;
995                 }
996                 if (ip_mask->pdst) {
997                         if (ip_mask->pdst != PORT_FULL_MASK)
998                                 return -EINVAL;
999                         spec.match_flags |= EFX_FILTER_MATCH_LOC_PORT;
1000                         spec.loc_port = ip_entry->pdst;
1001                 }
1002                 if (ip_mask->psrc) {
1003                         if (ip_mask->psrc != PORT_FULL_MASK)
1004                                 return -EINVAL;
1005                         spec.match_flags |= EFX_FILTER_MATCH_REM_PORT;
1006                         spec.rem_port = ip_entry->psrc;
1007                 }
1008                 if (ip_mask->tos)
1009                         return -EINVAL;
1010                 break;
1011
1012         case TCP_V6_FLOW:
1013         case UDP_V6_FLOW:
1014                 spec.match_flags = (EFX_FILTER_MATCH_ETHER_TYPE |
1015                                     EFX_FILTER_MATCH_IP_PROTO);
1016                 spec.ether_type = htons(ETH_P_IPV6);
1017                 spec.ip_proto = flow_type == TCP_V6_FLOW ? IPPROTO_TCP
1018                                                          : IPPROTO_UDP;
1019                 if (!ip6_mask_is_empty(ip6_mask->ip6dst)) {
1020                         if (!ip6_mask_is_full(ip6_mask->ip6dst))
1021                                 return -EINVAL;
1022                         spec.match_flags |= EFX_FILTER_MATCH_LOC_HOST;
1023                         memcpy(spec.loc_host, ip6_entry->ip6dst, sizeof(spec.loc_host));
1024                 }
1025                 if (!ip6_mask_is_empty(ip6_mask->ip6src)) {
1026                         if (!ip6_mask_is_full(ip6_mask->ip6src))
1027                                 return -EINVAL;
1028                         spec.match_flags |= EFX_FILTER_MATCH_REM_HOST;
1029                         memcpy(spec.rem_host, ip6_entry->ip6src, sizeof(spec.rem_host));
1030                 }
1031                 if (ip6_mask->pdst) {
1032                         if (ip6_mask->pdst != PORT_FULL_MASK)
1033                                 return -EINVAL;
1034                         spec.match_flags |= EFX_FILTER_MATCH_LOC_PORT;
1035                         spec.loc_port = ip6_entry->pdst;
1036                 }
1037                 if (ip6_mask->psrc) {
1038                         if (ip6_mask->psrc != PORT_FULL_MASK)
1039                                 return -EINVAL;
1040                         spec.match_flags |= EFX_FILTER_MATCH_REM_PORT;
1041                         spec.rem_port = ip6_entry->psrc;
1042                 }
1043                 if (ip6_mask->tclass)
1044                         return -EINVAL;
1045                 break;
1046
1047         case IPV4_USER_FLOW:
1048                 if (uip_mask->l4_4_bytes || uip_mask->tos || uip_mask->ip_ver ||
1049                     uip_entry->ip_ver != ETH_RX_NFC_IP4)
1050                         return -EINVAL;
1051                 spec.match_flags = EFX_FILTER_MATCH_ETHER_TYPE;
1052                 spec.ether_type = htons(ETH_P_IP);
1053                 if (uip_mask->ip4dst) {
1054                         if (uip_mask->ip4dst != IP4_ADDR_FULL_MASK)
1055                                 return -EINVAL;
1056                         spec.match_flags |= EFX_FILTER_MATCH_LOC_HOST;
1057                         spec.loc_host[0] = uip_entry->ip4dst;
1058                 }
1059                 if (uip_mask->ip4src) {
1060                         if (uip_mask->ip4src != IP4_ADDR_FULL_MASK)
1061                                 return -EINVAL;
1062                         spec.match_flags |= EFX_FILTER_MATCH_REM_HOST;
1063                         spec.rem_host[0] = uip_entry->ip4src;
1064                 }
1065                 if (uip_mask->proto) {
1066                         if (uip_mask->proto != IP_PROTO_FULL_MASK)
1067                                 return -EINVAL;
1068                         spec.match_flags |= EFX_FILTER_MATCH_IP_PROTO;
1069                         spec.ip_proto = uip_entry->proto;
1070                 }
1071                 break;
1072
1073         case IPV6_USER_FLOW:
1074                 if (uip6_mask->l4_4_bytes || uip6_mask->tclass)
1075                         return -EINVAL;
1076                 spec.match_flags = EFX_FILTER_MATCH_ETHER_TYPE;
1077                 spec.ether_type = htons(ETH_P_IPV6);
1078                 if (!ip6_mask_is_empty(uip6_mask->ip6dst)) {
1079                         if (!ip6_mask_is_full(uip6_mask->ip6dst))
1080                                 return -EINVAL;
1081                         spec.match_flags |= EFX_FILTER_MATCH_LOC_HOST;
1082                         memcpy(spec.loc_host, uip6_entry->ip6dst, sizeof(spec.loc_host));
1083                 }
1084                 if (!ip6_mask_is_empty(uip6_mask->ip6src)) {
1085                         if (!ip6_mask_is_full(uip6_mask->ip6src))
1086                                 return -EINVAL;
1087                         spec.match_flags |= EFX_FILTER_MATCH_REM_HOST;
1088                         memcpy(spec.rem_host, uip6_entry->ip6src, sizeof(spec.rem_host));
1089                 }
1090                 if (uip6_mask->l4_proto) {
1091                         if (uip6_mask->l4_proto != IP_PROTO_FULL_MASK)
1092                                 return -EINVAL;
1093                         spec.match_flags |= EFX_FILTER_MATCH_IP_PROTO;
1094                         spec.ip_proto = uip6_entry->l4_proto;
1095                 }
1096                 break;
1097
1098         case ETHER_FLOW:
1099                 if (!is_zero_ether_addr(mac_mask->h_dest)) {
1100                         if (ether_addr_equal(mac_mask->h_dest,
1101                                              mac_addr_ig_mask))
1102                                 spec.match_flags |= EFX_FILTER_MATCH_LOC_MAC_IG;
1103                         else if (is_broadcast_ether_addr(mac_mask->h_dest))
1104                                 spec.match_flags |= EFX_FILTER_MATCH_LOC_MAC;
1105                         else
1106                                 return -EINVAL;
1107                         ether_addr_copy(spec.loc_mac, mac_entry->h_dest);
1108                 }
1109                 if (!is_zero_ether_addr(mac_mask->h_source)) {
1110                         if (!is_broadcast_ether_addr(mac_mask->h_source))
1111                                 return -EINVAL;
1112                         spec.match_flags |= EFX_FILTER_MATCH_REM_MAC;
1113                         ether_addr_copy(spec.rem_mac, mac_entry->h_source);
1114                 }
1115                 if (mac_mask->h_proto) {
1116                         if (mac_mask->h_proto != ETHER_TYPE_FULL_MASK)
1117                                 return -EINVAL;
1118                         spec.match_flags |= EFX_FILTER_MATCH_ETHER_TYPE;
1119                         spec.ether_type = mac_entry->h_proto;
1120                 }
1121                 break;
1122
1123         default:
1124                 return -EINVAL;
1125         }
1126
1127         if ((rule->flow_type & FLOW_EXT) && rule->m_ext.vlan_tci) {
1128                 if (rule->m_ext.vlan_tci != htons(0xfff))
1129                         return -EINVAL;
1130                 spec.match_flags |= EFX_FILTER_MATCH_OUTER_VID;
1131                 spec.outer_vid = rule->h_ext.vlan_tci;
1132         }
1133
1134         rc = efx_filter_insert_filter(efx, &spec, true);
1135         if (rc < 0)
1136                 return rc;
1137
1138         rule->location = rc;
1139         return 0;
1140 }
1141
1142 int efx_ethtool_set_rxnfc(struct net_device *net_dev,
1143                           struct ethtool_rxnfc *info)
1144 {
1145         struct efx_nic *efx = netdev_priv(net_dev);
1146
1147         if (efx_filter_get_rx_id_limit(efx) == 0)
1148                 return -EOPNOTSUPP;
1149
1150         switch (info->cmd) {
1151         case ETHTOOL_SRXCLSRLINS:
1152                 return efx_ethtool_set_class_rule(efx, &info->fs,
1153                                                   info->rss_context);
1154
1155         case ETHTOOL_SRXCLSRLDEL:
1156                 return efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_MANUAL,
1157                                                  info->fs.location);
1158
1159         default:
1160                 return -EOPNOTSUPP;
1161         }
1162 }
1163
1164 u32 efx_ethtool_get_rxfh_indir_size(struct net_device *net_dev)
1165 {
1166         struct efx_nic *efx = netdev_priv(net_dev);
1167
1168         if (efx->n_rx_channels == 1)
1169                 return 0;
1170         return ARRAY_SIZE(efx->rss_context.rx_indir_table);
1171 }
1172
1173 u32 efx_ethtool_get_rxfh_key_size(struct net_device *net_dev)
1174 {
1175         struct efx_nic *efx = netdev_priv(net_dev);
1176
1177         return efx->type->rx_hash_key_size;
1178 }
1179
1180 int efx_ethtool_get_rxfh(struct net_device *net_dev, u32 *indir, u8 *key,
1181                          u8 *hfunc)
1182 {
1183         struct efx_nic *efx = netdev_priv(net_dev);
1184         int rc;
1185
1186         rc = efx->type->rx_pull_rss_config(efx);
1187         if (rc)
1188                 return rc;
1189
1190         if (hfunc)
1191                 *hfunc = ETH_RSS_HASH_TOP;
1192         if (indir)
1193                 memcpy(indir, efx->rss_context.rx_indir_table,
1194                        sizeof(efx->rss_context.rx_indir_table));
1195         if (key)
1196                 memcpy(key, efx->rss_context.rx_hash_key,
1197                        efx->type->rx_hash_key_size);
1198         return 0;
1199 }
1200
1201 int efx_ethtool_set_rxfh(struct net_device *net_dev, const u32 *indir,
1202                          const u8 *key, const u8 hfunc)
1203 {
1204         struct efx_nic *efx = netdev_priv(net_dev);
1205
1206         /* Hash function is Toeplitz, cannot be changed */
1207         if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)
1208                 return -EOPNOTSUPP;
1209         if (!indir && !key)
1210                 return 0;
1211
1212         if (!key)
1213                 key = efx->rss_context.rx_hash_key;
1214         if (!indir)
1215                 indir = efx->rss_context.rx_indir_table;
1216
1217         return efx->type->rx_push_rss_config(efx, true, indir, key);
1218 }
1219
1220 int efx_ethtool_get_rxfh_context(struct net_device *net_dev, u32 *indir,
1221                                  u8 *key, u8 *hfunc, u32 rss_context)
1222 {
1223         struct efx_nic *efx = netdev_priv(net_dev);
1224         struct efx_rss_context *ctx;
1225         int rc = 0;
1226
1227         if (!efx->type->rx_pull_rss_context_config)
1228                 return -EOPNOTSUPP;
1229
1230         mutex_lock(&efx->rss_lock);
1231         ctx = efx_find_rss_context_entry(efx, rss_context);
1232         if (!ctx) {
1233                 rc = -ENOENT;
1234                 goto out_unlock;
1235         }
1236         rc = efx->type->rx_pull_rss_context_config(efx, ctx);
1237         if (rc)
1238                 goto out_unlock;
1239
1240         if (hfunc)
1241                 *hfunc = ETH_RSS_HASH_TOP;
1242         if (indir)
1243                 memcpy(indir, ctx->rx_indir_table, sizeof(ctx->rx_indir_table));
1244         if (key)
1245                 memcpy(key, ctx->rx_hash_key, efx->type->rx_hash_key_size);
1246 out_unlock:
1247         mutex_unlock(&efx->rss_lock);
1248         return rc;
1249 }
1250
1251 int efx_ethtool_set_rxfh_context(struct net_device *net_dev,
1252                                  const u32 *indir, const u8 *key,
1253                                  const u8 hfunc, u32 *rss_context,
1254                                  bool delete)
1255 {
1256         struct efx_nic *efx = netdev_priv(net_dev);
1257         struct efx_rss_context *ctx;
1258         bool allocated = false;
1259         int rc;
1260
1261         if (!efx->type->rx_push_rss_context_config)
1262                 return -EOPNOTSUPP;
1263         /* Hash function is Toeplitz, cannot be changed */
1264         if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)
1265                 return -EOPNOTSUPP;
1266
1267         mutex_lock(&efx->rss_lock);
1268
1269         if (*rss_context == ETH_RXFH_CONTEXT_ALLOC) {
1270                 if (delete) {
1271                         /* alloc + delete == Nothing to do */
1272                         rc = -EINVAL;
1273                         goto out_unlock;
1274                 }
1275                 ctx = efx_alloc_rss_context_entry(efx);
1276                 if (!ctx) {
1277                         rc = -ENOMEM;
1278                         goto out_unlock;
1279                 }
1280                 ctx->context_id = EFX_MCDI_RSS_CONTEXT_INVALID;
1281                 /* Initialise indir table and key to defaults */
1282                 efx_set_default_rx_indir_table(efx, ctx);
1283                 netdev_rss_key_fill(ctx->rx_hash_key, sizeof(ctx->rx_hash_key));
1284                 allocated = true;
1285         } else {
1286                 ctx = efx_find_rss_context_entry(efx, *rss_context);
1287                 if (!ctx) {
1288                         rc = -ENOENT;
1289                         goto out_unlock;
1290                 }
1291         }
1292
1293         if (delete) {
1294                 /* delete this context */
1295                 rc = efx->type->rx_push_rss_context_config(efx, ctx, NULL, NULL);
1296                 if (!rc)
1297                         efx_free_rss_context_entry(ctx);
1298                 goto out_unlock;
1299         }
1300
1301         if (!key)
1302                 key = ctx->rx_hash_key;
1303         if (!indir)
1304                 indir = ctx->rx_indir_table;
1305
1306         rc = efx->type->rx_push_rss_context_config(efx, ctx, indir, key);
1307         if (rc && allocated)
1308                 efx_free_rss_context_entry(ctx);
1309         else
1310                 *rss_context = ctx->user_id;
1311 out_unlock:
1312         mutex_unlock(&efx->rss_lock);
1313         return rc;
1314 }
1315
1316 int efx_ethtool_reset(struct net_device *net_dev, u32 *flags)
1317 {
1318         struct efx_nic *efx = netdev_priv(net_dev);
1319         int rc;
1320
1321         rc = efx->type->map_reset_flags(flags);
1322         if (rc < 0)
1323                 return rc;
1324
1325         return efx_reset(efx, rc);
1326 }
1327
1328 int efx_ethtool_get_module_eeprom(struct net_device *net_dev,
1329                                   struct ethtool_eeprom *ee,
1330                                   u8 *data)
1331 {
1332         struct efx_nic *efx = netdev_priv(net_dev);
1333         int ret;
1334
1335         if (!efx->phy_op || !efx->phy_op->get_module_eeprom)
1336                 return -EOPNOTSUPP;
1337
1338         mutex_lock(&efx->mac_lock);
1339         ret = efx->phy_op->get_module_eeprom(efx, ee, data);
1340         mutex_unlock(&efx->mac_lock);
1341
1342         return ret;
1343 }
1344
1345 int efx_ethtool_get_module_info(struct net_device *net_dev,
1346                                 struct ethtool_modinfo *modinfo)
1347 {
1348         struct efx_nic *efx = netdev_priv(net_dev);
1349         int ret;
1350
1351         if (!efx->phy_op || !efx->phy_op->get_module_info)
1352                 return -EOPNOTSUPP;
1353
1354         mutex_lock(&efx->mac_lock);
1355         ret = efx->phy_op->get_module_info(efx, modinfo);
1356         mutex_unlock(&efx->mac_lock);
1357
1358         return ret;
1359 }
This page took 0.117337 seconds and 4 git commands to generate.