]> Git Repo - J-linux.git/blob - drivers/net/ethernet/sfc/ethtool_common.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-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 #include "mcdi_port_common.h"
19
20 struct efx_sw_stat_desc {
21         const char *name;
22         enum {
23                 EFX_ETHTOOL_STAT_SOURCE_nic,
24                 EFX_ETHTOOL_STAT_SOURCE_channel,
25                 EFX_ETHTOOL_STAT_SOURCE_tx_queue
26         } source;
27         unsigned int offset;
28         u64 (*get_stat)(void *field); /* Reader function */
29 };
30
31 /* Initialiser for a struct efx_sw_stat_desc with type-checking */
32 #define EFX_ETHTOOL_STAT(stat_name, source_name, field, field_type, \
33                                 get_stat_function) {                    \
34         .name = #stat_name,                                             \
35         .source = EFX_ETHTOOL_STAT_SOURCE_##source_name,                \
36         .offset = ((((field_type *) 0) ==                               \
37                       &((struct efx_##source_name *)0)->field) ?        \
38                     offsetof(struct efx_##source_name, field) :         \
39                     offsetof(struct efx_##source_name, field)),         \
40         .get_stat = get_stat_function,                                  \
41 }
42
43 static u64 efx_get_uint_stat(void *field)
44 {
45         return *(unsigned int *)field;
46 }
47
48 static u64 efx_get_atomic_stat(void *field)
49 {
50         return atomic_read((atomic_t *) field);
51 }
52
53 #define EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(field)                \
54         EFX_ETHTOOL_STAT(field, nic, field,                     \
55                          atomic_t, efx_get_atomic_stat)
56
57 #define EFX_ETHTOOL_UINT_CHANNEL_STAT(field)                    \
58         EFX_ETHTOOL_STAT(field, channel, n_##field,             \
59                          unsigned int, efx_get_uint_stat)
60 #define EFX_ETHTOOL_UINT_CHANNEL_STAT_NO_N(field)               \
61         EFX_ETHTOOL_STAT(field, channel, field,                 \
62                          unsigned int, efx_get_uint_stat)
63
64 #define EFX_ETHTOOL_UINT_TXQ_STAT(field)                        \
65         EFX_ETHTOOL_STAT(tx_##field, tx_queue, field,           \
66                          unsigned int, efx_get_uint_stat)
67
68 static const struct efx_sw_stat_desc efx_sw_stat_desc[] = {
69         EFX_ETHTOOL_UINT_TXQ_STAT(merge_events),
70         EFX_ETHTOOL_UINT_TXQ_STAT(tso_bursts),
71         EFX_ETHTOOL_UINT_TXQ_STAT(tso_long_headers),
72         EFX_ETHTOOL_UINT_TXQ_STAT(tso_packets),
73         EFX_ETHTOOL_UINT_TXQ_STAT(tso_fallbacks),
74         EFX_ETHTOOL_UINT_TXQ_STAT(pushes),
75         EFX_ETHTOOL_UINT_TXQ_STAT(pio_packets),
76         EFX_ETHTOOL_UINT_TXQ_STAT(cb_packets),
77         EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(rx_reset),
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_frm_trunc),
86         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_overlength),
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         EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_mport_bad),
94 #ifdef CONFIG_RFS_ACCEL
95         EFX_ETHTOOL_UINT_CHANNEL_STAT_NO_N(rfs_filter_count),
96         EFX_ETHTOOL_UINT_CHANNEL_STAT(rfs_succeeded),
97         EFX_ETHTOOL_UINT_CHANNEL_STAT(rfs_failed),
98 #endif
99 };
100
101 #define EFX_ETHTOOL_SW_STAT_COUNT ARRAY_SIZE(efx_sw_stat_desc)
102
103 void efx_ethtool_get_drvinfo(struct net_device *net_dev,
104                              struct ethtool_drvinfo *info)
105 {
106         struct efx_nic *efx = efx_netdev_priv(net_dev);
107
108         strscpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
109         efx_mcdi_print_fwver(efx, info->fw_version,
110                              sizeof(info->fw_version));
111         strscpy(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 = 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 = 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 = 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_net_active(efx->state)) {
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 = 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 = 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_mcdi_port_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         for (i = 0; true; ++i) {
376                 const char *name;
377
378                 EFX_WARN_ON_PARANOID(i >= EFX_MAX_PHY_TESTS);
379                 name = efx_mcdi_phy_test_name(efx, i);
380                 if (name == NULL)
381                         break;
382
383                 efx_fill_test(n++, strings, data, &tests->phy_ext[i], "phy", 0, name, NULL);
384         }
385
386         /* Loopback tests */
387         for (mode = LOOPBACK_NONE; mode <= LOOPBACK_TEST_MAX; mode++) {
388                 if (!(efx->loopback_modes & (1 << mode)))
389                         continue;
390                 n = efx_fill_loopback_test(efx,
391                                            &tests->loopback[mode], mode, n,
392                                            strings, data);
393         }
394
395         return n;
396 }
397
398 static size_t efx_describe_per_queue_stats(struct efx_nic *efx, u8 **strings)
399 {
400         size_t n_stats = 0;
401         struct efx_channel *channel;
402
403         efx_for_each_channel(channel, efx) {
404                 if (efx_channel_has_tx_queues(channel)) {
405                         n_stats++;
406                         if (!strings)
407                                 continue;
408
409                         ethtool_sprintf(strings, "tx-%u.tx_packets",
410                                         channel->tx_queue[0].queue /
411                                                 EFX_MAX_TXQ_PER_CHANNEL);
412                 }
413         }
414         efx_for_each_channel(channel, efx) {
415                 if (efx_channel_has_rx_queue(channel)) {
416                         n_stats++;
417                         if (!strings)
418                                 continue;
419
420                         ethtool_sprintf(strings, "rx-%d.rx_packets",
421                                         channel->channel);
422                 }
423         }
424         if (efx->xdp_tx_queue_count && efx->xdp_tx_queues) {
425                 unsigned short xdp;
426
427                 for (xdp = 0; xdp < efx->xdp_tx_queue_count; xdp++) {
428                         n_stats++;
429                         if (!strings)
430                                 continue;
431
432                         ethtool_sprintf(strings, "tx-xdp-cpu-%hu.tx_packets",
433                                         xdp);
434                 }
435         }
436
437         return n_stats;
438 }
439
440 int efx_ethtool_get_sset_count(struct net_device *net_dev, int string_set)
441 {
442         struct efx_nic *efx = efx_netdev_priv(net_dev);
443
444         switch (string_set) {
445         case ETH_SS_STATS:
446                 return efx->type->describe_stats(efx, NULL) +
447                        EFX_ETHTOOL_SW_STAT_COUNT +
448                        efx_describe_per_queue_stats(efx, NULL) +
449                        efx_ptp_describe_stats(efx, NULL);
450         case ETH_SS_TEST:
451                 return efx_ethtool_fill_self_tests(efx, NULL, NULL, NULL);
452         default:
453                 return -EINVAL;
454         }
455 }
456
457 void efx_ethtool_get_strings(struct net_device *net_dev,
458                              u32 string_set, u8 *strings)
459 {
460         struct efx_nic *efx = efx_netdev_priv(net_dev);
461         int i;
462
463         switch (string_set) {
464         case ETH_SS_STATS:
465                 efx->type->describe_stats(efx, &strings);
466                 for (i = 0; i < EFX_ETHTOOL_SW_STAT_COUNT; i++)
467                         ethtool_puts(&strings, efx_sw_stat_desc[i].name);
468                 efx_describe_per_queue_stats(efx, &strings);
469                 efx_ptp_describe_stats(efx, &strings);
470                 break;
471         case ETH_SS_TEST:
472                 efx_ethtool_fill_self_tests(efx, NULL, strings, NULL);
473                 break;
474         default:
475                 /* No other string sets */
476                 break;
477         }
478 }
479
480 void efx_ethtool_get_stats(struct net_device *net_dev,
481                            struct ethtool_stats *stats,
482                            u64 *data)
483 {
484         struct efx_nic *efx = efx_netdev_priv(net_dev);
485         const struct efx_sw_stat_desc *stat;
486         struct efx_channel *channel;
487         struct efx_tx_queue *tx_queue;
488         struct efx_rx_queue *rx_queue;
489         int i;
490
491         spin_lock_bh(&efx->stats_lock);
492
493         /* Get NIC statistics */
494         data += efx->type->update_stats(efx, data, NULL);
495
496         /* Get software statistics */
497         for (i = 0; i < EFX_ETHTOOL_SW_STAT_COUNT; i++) {
498                 stat = &efx_sw_stat_desc[i];
499                 switch (stat->source) {
500                 case EFX_ETHTOOL_STAT_SOURCE_nic:
501                         data[i] = stat->get_stat((void *)efx + stat->offset);
502                         break;
503                 case EFX_ETHTOOL_STAT_SOURCE_channel:
504                         data[i] = 0;
505                         efx_for_each_channel(channel, efx)
506                                 data[i] += stat->get_stat((void *)channel +
507                                                           stat->offset);
508                         break;
509                 case EFX_ETHTOOL_STAT_SOURCE_tx_queue:
510                         data[i] = 0;
511                         efx_for_each_channel(channel, efx) {
512                                 efx_for_each_channel_tx_queue(tx_queue, channel)
513                                         data[i] +=
514                                                 stat->get_stat((void *)tx_queue
515                                                                + stat->offset);
516                         }
517                         break;
518                 }
519         }
520         data += EFX_ETHTOOL_SW_STAT_COUNT;
521
522         spin_unlock_bh(&efx->stats_lock);
523
524         efx_for_each_channel(channel, efx) {
525                 if (efx_channel_has_tx_queues(channel)) {
526                         *data = 0;
527                         efx_for_each_channel_tx_queue(tx_queue, channel) {
528                                 *data += tx_queue->tx_packets;
529                         }
530                         data++;
531                 }
532         }
533         efx_for_each_channel(channel, efx) {
534                 if (efx_channel_has_rx_queue(channel)) {
535                         *data = 0;
536                         efx_for_each_channel_rx_queue(rx_queue, channel) {
537                                 *data += rx_queue->rx_packets;
538                         }
539                         data++;
540                 }
541         }
542         if (efx->xdp_tx_queue_count && efx->xdp_tx_queues) {
543                 int xdp;
544
545                 for (xdp = 0; xdp < efx->xdp_tx_queue_count; xdp++) {
546                         data[0] = efx->xdp_tx_queues[xdp]->tx_packets;
547                         data++;
548                 }
549         }
550
551         efx_ptp_update_stats(efx, data);
552 }
553
554 /* This must be called with rtnl_lock held. */
555 int efx_ethtool_get_link_ksettings(struct net_device *net_dev,
556                                    struct ethtool_link_ksettings *cmd)
557 {
558         struct efx_nic *efx = efx_netdev_priv(net_dev);
559         struct efx_link_state *link_state = &efx->link_state;
560
561         mutex_lock(&efx->mac_lock);
562         efx_mcdi_phy_get_link_ksettings(efx, cmd);
563         mutex_unlock(&efx->mac_lock);
564
565         /* Both MACs support pause frames (bidirectional and respond-only) */
566         ethtool_link_ksettings_add_link_mode(cmd, supported, Pause);
567         ethtool_link_ksettings_add_link_mode(cmd, supported, Asym_Pause);
568
569         if (LOOPBACK_INTERNAL(efx)) {
570                 cmd->base.speed = link_state->speed;
571                 cmd->base.duplex = link_state->fd ? DUPLEX_FULL : DUPLEX_HALF;
572         }
573
574         return 0;
575 }
576
577 /* This must be called with rtnl_lock held. */
578 int efx_ethtool_set_link_ksettings(struct net_device *net_dev,
579                                    const struct ethtool_link_ksettings *cmd)
580 {
581         struct efx_nic *efx = efx_netdev_priv(net_dev);
582         int rc;
583
584         /* GMAC does not support 1000Mbps HD */
585         if ((cmd->base.speed == SPEED_1000) &&
586             (cmd->base.duplex != DUPLEX_FULL)) {
587                 netif_dbg(efx, drv, efx->net_dev,
588                           "rejecting unsupported 1000Mbps HD setting\n");
589                 return -EINVAL;
590         }
591
592         mutex_lock(&efx->mac_lock);
593         rc = efx_mcdi_phy_set_link_ksettings(efx, cmd);
594         mutex_unlock(&efx->mac_lock);
595         return rc;
596 }
597
598 int efx_ethtool_get_fecparam(struct net_device *net_dev,
599                              struct ethtool_fecparam *fecparam)
600 {
601         struct efx_nic *efx = efx_netdev_priv(net_dev);
602         int rc;
603
604         mutex_lock(&efx->mac_lock);
605         rc = efx_mcdi_phy_get_fecparam(efx, fecparam);
606         mutex_unlock(&efx->mac_lock);
607
608         return rc;
609 }
610
611 int efx_ethtool_set_fecparam(struct net_device *net_dev,
612                              struct ethtool_fecparam *fecparam)
613 {
614         struct efx_nic *efx = efx_netdev_priv(net_dev);
615         int rc;
616
617         mutex_lock(&efx->mac_lock);
618         rc = efx_mcdi_phy_set_fecparam(efx, fecparam);
619         mutex_unlock(&efx->mac_lock);
620
621         return rc;
622 }
623
624 /* MAC address mask including only I/G bit */
625 static const u8 mac_addr_ig_mask[ETH_ALEN] __aligned(2) = {0x01, 0, 0, 0, 0, 0};
626
627 #define IP4_ADDR_FULL_MASK      ((__force __be32)~0)
628 #define IP_PROTO_FULL_MASK      0xFF
629 #define PORT_FULL_MASK          ((__force __be16)~0)
630 #define ETHER_TYPE_FULL_MASK    ((__force __be16)~0)
631
632 static inline void ip6_fill_mask(__be32 *mask)
633 {
634         mask[0] = mask[1] = mask[2] = mask[3] = ~(__be32)0;
635 }
636
637 static int efx_ethtool_get_class_rule(struct efx_nic *efx,
638                                       struct ethtool_rx_flow_spec *rule,
639                                       u32 *rss_context)
640 {
641         struct ethtool_tcpip4_spec *ip_entry = &rule->h_u.tcp_ip4_spec;
642         struct ethtool_tcpip4_spec *ip_mask = &rule->m_u.tcp_ip4_spec;
643         struct ethtool_usrip4_spec *uip_entry = &rule->h_u.usr_ip4_spec;
644         struct ethtool_usrip4_spec *uip_mask = &rule->m_u.usr_ip4_spec;
645         struct ethtool_tcpip6_spec *ip6_entry = &rule->h_u.tcp_ip6_spec;
646         struct ethtool_tcpip6_spec *ip6_mask = &rule->m_u.tcp_ip6_spec;
647         struct ethtool_usrip6_spec *uip6_entry = &rule->h_u.usr_ip6_spec;
648         struct ethtool_usrip6_spec *uip6_mask = &rule->m_u.usr_ip6_spec;
649         struct ethhdr *mac_entry = &rule->h_u.ether_spec;
650         struct ethhdr *mac_mask = &rule->m_u.ether_spec;
651         struct efx_filter_spec spec;
652         int rc;
653
654         rc = efx_filter_get_filter_safe(efx, EFX_FILTER_PRI_MANUAL,
655                                         rule->location, &spec);
656         if (rc)
657                 return rc;
658
659         if (spec.dmaq_id == EFX_FILTER_RX_DMAQ_ID_DROP)
660                 rule->ring_cookie = RX_CLS_FLOW_DISC;
661         else
662                 rule->ring_cookie = spec.dmaq_id;
663
664         if ((spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE) &&
665             spec.ether_type == htons(ETH_P_IP) &&
666             (spec.match_flags & EFX_FILTER_MATCH_IP_PROTO) &&
667             (spec.ip_proto == IPPROTO_TCP || spec.ip_proto == IPPROTO_UDP) &&
668             !(spec.match_flags &
669               ~(EFX_FILTER_MATCH_ETHER_TYPE | EFX_FILTER_MATCH_OUTER_VID |
670                 EFX_FILTER_MATCH_LOC_HOST | EFX_FILTER_MATCH_REM_HOST |
671                 EFX_FILTER_MATCH_IP_PROTO |
672                 EFX_FILTER_MATCH_LOC_PORT | EFX_FILTER_MATCH_REM_PORT))) {
673                 rule->flow_type = ((spec.ip_proto == IPPROTO_TCP) ?
674                                    TCP_V4_FLOW : UDP_V4_FLOW);
675                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_HOST) {
676                         ip_entry->ip4dst = spec.loc_host[0];
677                         ip_mask->ip4dst = IP4_ADDR_FULL_MASK;
678                 }
679                 if (spec.match_flags & EFX_FILTER_MATCH_REM_HOST) {
680                         ip_entry->ip4src = spec.rem_host[0];
681                         ip_mask->ip4src = IP4_ADDR_FULL_MASK;
682                 }
683                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_PORT) {
684                         ip_entry->pdst = spec.loc_port;
685                         ip_mask->pdst = PORT_FULL_MASK;
686                 }
687                 if (spec.match_flags & EFX_FILTER_MATCH_REM_PORT) {
688                         ip_entry->psrc = spec.rem_port;
689                         ip_mask->psrc = PORT_FULL_MASK;
690                 }
691         } else if ((spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE) &&
692             spec.ether_type == htons(ETH_P_IPV6) &&
693             (spec.match_flags & EFX_FILTER_MATCH_IP_PROTO) &&
694             (spec.ip_proto == IPPROTO_TCP || spec.ip_proto == IPPROTO_UDP) &&
695             !(spec.match_flags &
696               ~(EFX_FILTER_MATCH_ETHER_TYPE | EFX_FILTER_MATCH_OUTER_VID |
697                 EFX_FILTER_MATCH_LOC_HOST | EFX_FILTER_MATCH_REM_HOST |
698                 EFX_FILTER_MATCH_IP_PROTO |
699                 EFX_FILTER_MATCH_LOC_PORT | EFX_FILTER_MATCH_REM_PORT))) {
700                 rule->flow_type = ((spec.ip_proto == IPPROTO_TCP) ?
701                                    TCP_V6_FLOW : UDP_V6_FLOW);
702                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_HOST) {
703                         memcpy(ip6_entry->ip6dst, spec.loc_host,
704                                sizeof(ip6_entry->ip6dst));
705                         ip6_fill_mask(ip6_mask->ip6dst);
706                 }
707                 if (spec.match_flags & EFX_FILTER_MATCH_REM_HOST) {
708                         memcpy(ip6_entry->ip6src, spec.rem_host,
709                                sizeof(ip6_entry->ip6src));
710                         ip6_fill_mask(ip6_mask->ip6src);
711                 }
712                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_PORT) {
713                         ip6_entry->pdst = spec.loc_port;
714                         ip6_mask->pdst = PORT_FULL_MASK;
715                 }
716                 if (spec.match_flags & EFX_FILTER_MATCH_REM_PORT) {
717                         ip6_entry->psrc = spec.rem_port;
718                         ip6_mask->psrc = PORT_FULL_MASK;
719                 }
720         } else if (!(spec.match_flags &
721                      ~(EFX_FILTER_MATCH_LOC_MAC | EFX_FILTER_MATCH_LOC_MAC_IG |
722                        EFX_FILTER_MATCH_REM_MAC | EFX_FILTER_MATCH_ETHER_TYPE |
723                        EFX_FILTER_MATCH_OUTER_VID))) {
724                 rule->flow_type = ETHER_FLOW;
725                 if (spec.match_flags &
726                     (EFX_FILTER_MATCH_LOC_MAC | EFX_FILTER_MATCH_LOC_MAC_IG)) {
727                         ether_addr_copy(mac_entry->h_dest, spec.loc_mac);
728                         if (spec.match_flags & EFX_FILTER_MATCH_LOC_MAC)
729                                 eth_broadcast_addr(mac_mask->h_dest);
730                         else
731                                 ether_addr_copy(mac_mask->h_dest,
732                                                 mac_addr_ig_mask);
733                 }
734                 if (spec.match_flags & EFX_FILTER_MATCH_REM_MAC) {
735                         ether_addr_copy(mac_entry->h_source, spec.rem_mac);
736                         eth_broadcast_addr(mac_mask->h_source);
737                 }
738                 if (spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE) {
739                         mac_entry->h_proto = spec.ether_type;
740                         mac_mask->h_proto = ETHER_TYPE_FULL_MASK;
741                 }
742         } else if (spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE &&
743                    spec.ether_type == htons(ETH_P_IP) &&
744                    !(spec.match_flags &
745                      ~(EFX_FILTER_MATCH_ETHER_TYPE | EFX_FILTER_MATCH_OUTER_VID |
746                        EFX_FILTER_MATCH_LOC_HOST | EFX_FILTER_MATCH_REM_HOST |
747                        EFX_FILTER_MATCH_IP_PROTO))) {
748                 rule->flow_type = IPV4_USER_FLOW;
749                 uip_entry->ip_ver = ETH_RX_NFC_IP4;
750                 if (spec.match_flags & EFX_FILTER_MATCH_IP_PROTO) {
751                         uip_mask->proto = IP_PROTO_FULL_MASK;
752                         uip_entry->proto = spec.ip_proto;
753                 }
754                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_HOST) {
755                         uip_entry->ip4dst = spec.loc_host[0];
756                         uip_mask->ip4dst = IP4_ADDR_FULL_MASK;
757                 }
758                 if (spec.match_flags & EFX_FILTER_MATCH_REM_HOST) {
759                         uip_entry->ip4src = spec.rem_host[0];
760                         uip_mask->ip4src = IP4_ADDR_FULL_MASK;
761                 }
762         } else if (spec.match_flags & EFX_FILTER_MATCH_ETHER_TYPE &&
763                    spec.ether_type == htons(ETH_P_IPV6) &&
764                    !(spec.match_flags &
765                      ~(EFX_FILTER_MATCH_ETHER_TYPE | EFX_FILTER_MATCH_OUTER_VID |
766                        EFX_FILTER_MATCH_LOC_HOST | EFX_FILTER_MATCH_REM_HOST |
767                        EFX_FILTER_MATCH_IP_PROTO))) {
768                 rule->flow_type = IPV6_USER_FLOW;
769                 if (spec.match_flags & EFX_FILTER_MATCH_IP_PROTO) {
770                         uip6_mask->l4_proto = IP_PROTO_FULL_MASK;
771                         uip6_entry->l4_proto = spec.ip_proto;
772                 }
773                 if (spec.match_flags & EFX_FILTER_MATCH_LOC_HOST) {
774                         memcpy(uip6_entry->ip6dst, spec.loc_host,
775                                sizeof(uip6_entry->ip6dst));
776                         ip6_fill_mask(uip6_mask->ip6dst);
777                 }
778                 if (spec.match_flags & EFX_FILTER_MATCH_REM_HOST) {
779                         memcpy(uip6_entry->ip6src, spec.rem_host,
780                                sizeof(uip6_entry->ip6src));
781                         ip6_fill_mask(uip6_mask->ip6src);
782                 }
783         } else {
784                 /* The above should handle all filters that we insert */
785                 WARN_ON(1);
786                 return -EINVAL;
787         }
788
789         if (spec.match_flags & EFX_FILTER_MATCH_OUTER_VID) {
790                 rule->flow_type |= FLOW_EXT;
791                 rule->h_ext.vlan_tci = spec.outer_vid;
792                 rule->m_ext.vlan_tci = htons(0xfff);
793         }
794
795         if (spec.flags & EFX_FILTER_FLAG_RX_RSS) {
796                 rule->flow_type |= FLOW_RSS;
797                 *rss_context = spec.rss_context;
798         }
799
800         return rc;
801 }
802
803 int efx_ethtool_get_rxnfc(struct net_device *net_dev,
804                           struct ethtool_rxnfc *info, u32 *rule_locs)
805 {
806         struct efx_nic *efx = efx_netdev_priv(net_dev);
807         u32 rss_context = 0;
808         s32 rc = 0;
809
810         switch (info->cmd) {
811         case ETHTOOL_GRXRINGS:
812                 info->data = efx->n_rx_channels;
813                 return 0;
814
815         case ETHTOOL_GRXFH: {
816                 struct efx_rss_context_priv *ctx = &efx->rss_context.priv;
817                 __u64 data;
818
819                 mutex_lock(&net_dev->ethtool->rss_lock);
820                 if (info->flow_type & FLOW_RSS && info->rss_context) {
821                         ctx = efx_find_rss_context_entry(efx, info->rss_context);
822                         if (!ctx) {
823                                 rc = -ENOENT;
824                                 goto out_unlock;
825                         }
826                 }
827
828                 data = 0;
829                 if (!efx_rss_active(ctx)) /* No RSS */
830                         goto out_setdata_unlock;
831
832                 switch (info->flow_type & ~FLOW_RSS) {
833                 case UDP_V4_FLOW:
834                 case UDP_V6_FLOW:
835                         if (ctx->rx_hash_udp_4tuple)
836                                 data = (RXH_L4_B_0_1 | RXH_L4_B_2_3 |
837                                         RXH_IP_SRC | RXH_IP_DST);
838                         else
839                                 data = RXH_IP_SRC | RXH_IP_DST;
840                         break;
841                 case TCP_V4_FLOW:
842                 case TCP_V6_FLOW:
843                         data = (RXH_L4_B_0_1 | RXH_L4_B_2_3 |
844                                 RXH_IP_SRC | RXH_IP_DST);
845                         break;
846                 case SCTP_V4_FLOW:
847                 case SCTP_V6_FLOW:
848                 case AH_ESP_V4_FLOW:
849                 case AH_ESP_V6_FLOW:
850                 case IPV4_FLOW:
851                 case IPV6_FLOW:
852                         data = RXH_IP_SRC | RXH_IP_DST;
853                         break;
854                 default:
855                         break;
856                 }
857 out_setdata_unlock:
858                 info->data = data;
859 out_unlock:
860                 mutex_unlock(&net_dev->ethtool->rss_lock);
861                 return rc;
862         }
863
864         case ETHTOOL_GRXCLSRLCNT:
865                 info->data = efx_filter_get_rx_id_limit(efx);
866                 if (info->data == 0)
867                         return -EOPNOTSUPP;
868                 info->data |= RX_CLS_LOC_SPECIAL;
869                 info->rule_cnt =
870                         efx_filter_count_rx_used(efx, EFX_FILTER_PRI_MANUAL);
871                 return 0;
872
873         case ETHTOOL_GRXCLSRULE:
874                 if (efx_filter_get_rx_id_limit(efx) == 0)
875                         return -EOPNOTSUPP;
876                 rc = efx_ethtool_get_class_rule(efx, &info->fs, &rss_context);
877                 if (rc < 0)
878                         return rc;
879                 if (info->fs.flow_type & FLOW_RSS)
880                         info->rss_context = rss_context;
881                 return 0;
882
883         case ETHTOOL_GRXCLSRLALL:
884                 info->data = efx_filter_get_rx_id_limit(efx);
885                 if (info->data == 0)
886                         return -EOPNOTSUPP;
887                 rc = efx_filter_get_rx_ids(efx, EFX_FILTER_PRI_MANUAL,
888                                            rule_locs, info->rule_cnt);
889                 if (rc < 0)
890                         return rc;
891                 info->rule_cnt = rc;
892                 return 0;
893
894         default:
895                 return -EOPNOTSUPP;
896         }
897 }
898
899 static inline bool ip6_mask_is_full(__be32 mask[4])
900 {
901         return !~(mask[0] & mask[1] & mask[2] & mask[3]);
902 }
903
904 static inline bool ip6_mask_is_empty(__be32 mask[4])
905 {
906         return !(mask[0] | mask[1] | mask[2] | mask[3]);
907 }
908
909 static int efx_ethtool_set_class_rule(struct efx_nic *efx,
910                                       struct ethtool_rx_flow_spec *rule,
911                                       u32 rss_context)
912 {
913         struct ethtool_tcpip4_spec *ip_entry = &rule->h_u.tcp_ip4_spec;
914         struct ethtool_tcpip4_spec *ip_mask = &rule->m_u.tcp_ip4_spec;
915         struct ethtool_usrip4_spec *uip_entry = &rule->h_u.usr_ip4_spec;
916         struct ethtool_usrip4_spec *uip_mask = &rule->m_u.usr_ip4_spec;
917         struct ethtool_tcpip6_spec *ip6_entry = &rule->h_u.tcp_ip6_spec;
918         struct ethtool_tcpip6_spec *ip6_mask = &rule->m_u.tcp_ip6_spec;
919         struct ethtool_usrip6_spec *uip6_entry = &rule->h_u.usr_ip6_spec;
920         struct ethtool_usrip6_spec *uip6_mask = &rule->m_u.usr_ip6_spec;
921         u32 flow_type = rule->flow_type & ~(FLOW_EXT | FLOW_RSS);
922         struct ethhdr *mac_entry = &rule->h_u.ether_spec;
923         struct ethhdr *mac_mask = &rule->m_u.ether_spec;
924         enum efx_filter_flags flags = 0;
925         struct efx_filter_spec spec;
926         int rc;
927
928         /* Check that user wants us to choose the location */
929         if (rule->location != RX_CLS_LOC_ANY)
930                 return -EINVAL;
931
932         /* Range-check ring_cookie */
933         if (rule->ring_cookie >= efx->n_rx_channels &&
934             rule->ring_cookie != RX_CLS_FLOW_DISC)
935                 return -EINVAL;
936
937         /* Check for unsupported extensions */
938         if ((rule->flow_type & FLOW_EXT) &&
939             (rule->m_ext.vlan_etype || rule->m_ext.data[0] ||
940              rule->m_ext.data[1]))
941                 return -EINVAL;
942
943         if (efx->rx_scatter)
944                 flags |= EFX_FILTER_FLAG_RX_SCATTER;
945         if (rule->flow_type & FLOW_RSS)
946                 flags |= EFX_FILTER_FLAG_RX_RSS;
947
948         efx_filter_init_rx(&spec, EFX_FILTER_PRI_MANUAL, flags,
949                            (rule->ring_cookie == RX_CLS_FLOW_DISC) ?
950                            EFX_FILTER_RX_DMAQ_ID_DROP : rule->ring_cookie);
951
952         if (rule->flow_type & FLOW_RSS)
953                 spec.rss_context = rss_context;
954
955         switch (flow_type) {
956         case TCP_V4_FLOW:
957         case UDP_V4_FLOW:
958                 spec.match_flags = (EFX_FILTER_MATCH_ETHER_TYPE |
959                                     EFX_FILTER_MATCH_IP_PROTO);
960                 spec.ether_type = htons(ETH_P_IP);
961                 spec.ip_proto = flow_type == TCP_V4_FLOW ? IPPROTO_TCP
962                                                          : IPPROTO_UDP;
963                 if (ip_mask->ip4dst) {
964                         if (ip_mask->ip4dst != IP4_ADDR_FULL_MASK)
965                                 return -EINVAL;
966                         spec.match_flags |= EFX_FILTER_MATCH_LOC_HOST;
967                         spec.loc_host[0] = ip_entry->ip4dst;
968                 }
969                 if (ip_mask->ip4src) {
970                         if (ip_mask->ip4src != IP4_ADDR_FULL_MASK)
971                                 return -EINVAL;
972                         spec.match_flags |= EFX_FILTER_MATCH_REM_HOST;
973                         spec.rem_host[0] = ip_entry->ip4src;
974                 }
975                 if (ip_mask->pdst) {
976                         if (ip_mask->pdst != PORT_FULL_MASK)
977                                 return -EINVAL;
978                         spec.match_flags |= EFX_FILTER_MATCH_LOC_PORT;
979                         spec.loc_port = ip_entry->pdst;
980                 }
981                 if (ip_mask->psrc) {
982                         if (ip_mask->psrc != PORT_FULL_MASK)
983                                 return -EINVAL;
984                         spec.match_flags |= EFX_FILTER_MATCH_REM_PORT;
985                         spec.rem_port = ip_entry->psrc;
986                 }
987                 if (ip_mask->tos)
988                         return -EINVAL;
989                 break;
990
991         case TCP_V6_FLOW:
992         case UDP_V6_FLOW:
993                 spec.match_flags = (EFX_FILTER_MATCH_ETHER_TYPE |
994                                     EFX_FILTER_MATCH_IP_PROTO);
995                 spec.ether_type = htons(ETH_P_IPV6);
996                 spec.ip_proto = flow_type == TCP_V6_FLOW ? IPPROTO_TCP
997                                                          : IPPROTO_UDP;
998                 if (!ip6_mask_is_empty(ip6_mask->ip6dst)) {
999                         if (!ip6_mask_is_full(ip6_mask->ip6dst))
1000                                 return -EINVAL;
1001                         spec.match_flags |= EFX_FILTER_MATCH_LOC_HOST;
1002                         memcpy(spec.loc_host, ip6_entry->ip6dst, sizeof(spec.loc_host));
1003                 }
1004                 if (!ip6_mask_is_empty(ip6_mask->ip6src)) {
1005                         if (!ip6_mask_is_full(ip6_mask->ip6src))
1006                                 return -EINVAL;
1007                         spec.match_flags |= EFX_FILTER_MATCH_REM_HOST;
1008                         memcpy(spec.rem_host, ip6_entry->ip6src, sizeof(spec.rem_host));
1009                 }
1010                 if (ip6_mask->pdst) {
1011                         if (ip6_mask->pdst != PORT_FULL_MASK)
1012                                 return -EINVAL;
1013                         spec.match_flags |= EFX_FILTER_MATCH_LOC_PORT;
1014                         spec.loc_port = ip6_entry->pdst;
1015                 }
1016                 if (ip6_mask->psrc) {
1017                         if (ip6_mask->psrc != PORT_FULL_MASK)
1018                                 return -EINVAL;
1019                         spec.match_flags |= EFX_FILTER_MATCH_REM_PORT;
1020                         spec.rem_port = ip6_entry->psrc;
1021                 }
1022                 if (ip6_mask->tclass)
1023                         return -EINVAL;
1024                 break;
1025
1026         case IPV4_USER_FLOW:
1027                 if (uip_mask->l4_4_bytes || uip_mask->tos || uip_mask->ip_ver ||
1028                     uip_entry->ip_ver != ETH_RX_NFC_IP4)
1029                         return -EINVAL;
1030                 spec.match_flags = EFX_FILTER_MATCH_ETHER_TYPE;
1031                 spec.ether_type = htons(ETH_P_IP);
1032                 if (uip_mask->ip4dst) {
1033                         if (uip_mask->ip4dst != IP4_ADDR_FULL_MASK)
1034                                 return -EINVAL;
1035                         spec.match_flags |= EFX_FILTER_MATCH_LOC_HOST;
1036                         spec.loc_host[0] = uip_entry->ip4dst;
1037                 }
1038                 if (uip_mask->ip4src) {
1039                         if (uip_mask->ip4src != IP4_ADDR_FULL_MASK)
1040                                 return -EINVAL;
1041                         spec.match_flags |= EFX_FILTER_MATCH_REM_HOST;
1042                         spec.rem_host[0] = uip_entry->ip4src;
1043                 }
1044                 if (uip_mask->proto) {
1045                         if (uip_mask->proto != IP_PROTO_FULL_MASK)
1046                                 return -EINVAL;
1047                         spec.match_flags |= EFX_FILTER_MATCH_IP_PROTO;
1048                         spec.ip_proto = uip_entry->proto;
1049                 }
1050                 break;
1051
1052         case IPV6_USER_FLOW:
1053                 if (uip6_mask->l4_4_bytes || uip6_mask->tclass)
1054                         return -EINVAL;
1055                 spec.match_flags = EFX_FILTER_MATCH_ETHER_TYPE;
1056                 spec.ether_type = htons(ETH_P_IPV6);
1057                 if (!ip6_mask_is_empty(uip6_mask->ip6dst)) {
1058                         if (!ip6_mask_is_full(uip6_mask->ip6dst))
1059                                 return -EINVAL;
1060                         spec.match_flags |= EFX_FILTER_MATCH_LOC_HOST;
1061                         memcpy(spec.loc_host, uip6_entry->ip6dst, sizeof(spec.loc_host));
1062                 }
1063                 if (!ip6_mask_is_empty(uip6_mask->ip6src)) {
1064                         if (!ip6_mask_is_full(uip6_mask->ip6src))
1065                                 return -EINVAL;
1066                         spec.match_flags |= EFX_FILTER_MATCH_REM_HOST;
1067                         memcpy(spec.rem_host, uip6_entry->ip6src, sizeof(spec.rem_host));
1068                 }
1069                 if (uip6_mask->l4_proto) {
1070                         if (uip6_mask->l4_proto != IP_PROTO_FULL_MASK)
1071                                 return -EINVAL;
1072                         spec.match_flags |= EFX_FILTER_MATCH_IP_PROTO;
1073                         spec.ip_proto = uip6_entry->l4_proto;
1074                 }
1075                 break;
1076
1077         case ETHER_FLOW:
1078                 if (!is_zero_ether_addr(mac_mask->h_dest)) {
1079                         if (ether_addr_equal(mac_mask->h_dest,
1080                                              mac_addr_ig_mask))
1081                                 spec.match_flags |= EFX_FILTER_MATCH_LOC_MAC_IG;
1082                         else if (is_broadcast_ether_addr(mac_mask->h_dest))
1083                                 spec.match_flags |= EFX_FILTER_MATCH_LOC_MAC;
1084                         else
1085                                 return -EINVAL;
1086                         ether_addr_copy(spec.loc_mac, mac_entry->h_dest);
1087                 }
1088                 if (!is_zero_ether_addr(mac_mask->h_source)) {
1089                         if (!is_broadcast_ether_addr(mac_mask->h_source))
1090                                 return -EINVAL;
1091                         spec.match_flags |= EFX_FILTER_MATCH_REM_MAC;
1092                         ether_addr_copy(spec.rem_mac, mac_entry->h_source);
1093                 }
1094                 if (mac_mask->h_proto) {
1095                         if (mac_mask->h_proto != ETHER_TYPE_FULL_MASK)
1096                                 return -EINVAL;
1097                         spec.match_flags |= EFX_FILTER_MATCH_ETHER_TYPE;
1098                         spec.ether_type = mac_entry->h_proto;
1099                 }
1100                 break;
1101
1102         default:
1103                 return -EINVAL;
1104         }
1105
1106         if ((rule->flow_type & FLOW_EXT) && rule->m_ext.vlan_tci) {
1107                 if (rule->m_ext.vlan_tci != htons(0xfff))
1108                         return -EINVAL;
1109                 spec.match_flags |= EFX_FILTER_MATCH_OUTER_VID;
1110                 spec.outer_vid = rule->h_ext.vlan_tci;
1111         }
1112
1113         rc = efx_filter_insert_filter(efx, &spec, true);
1114         if (rc < 0)
1115                 return rc;
1116
1117         rule->location = rc;
1118         return 0;
1119 }
1120
1121 int efx_ethtool_set_rxnfc(struct net_device *net_dev,
1122                           struct ethtool_rxnfc *info)
1123 {
1124         struct efx_nic *efx = efx_netdev_priv(net_dev);
1125
1126         if (efx_filter_get_rx_id_limit(efx) == 0)
1127                 return -EOPNOTSUPP;
1128
1129         switch (info->cmd) {
1130         case ETHTOOL_SRXCLSRLINS:
1131                 return efx_ethtool_set_class_rule(efx, &info->fs,
1132                                                   info->rss_context);
1133
1134         case ETHTOOL_SRXCLSRLDEL:
1135                 return efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_MANUAL,
1136                                                  info->fs.location);
1137
1138         default:
1139                 return -EOPNOTSUPP;
1140         }
1141 }
1142
1143 u32 efx_ethtool_get_rxfh_indir_size(struct net_device *net_dev)
1144 {
1145         struct efx_nic *efx = efx_netdev_priv(net_dev);
1146
1147         if (efx->n_rx_channels == 1)
1148                 return 0;
1149         return ARRAY_SIZE(efx->rss_context.rx_indir_table);
1150 }
1151
1152 u32 efx_ethtool_get_rxfh_key_size(struct net_device *net_dev)
1153 {
1154         struct efx_nic *efx = efx_netdev_priv(net_dev);
1155
1156         return efx->type->rx_hash_key_size;
1157 }
1158
1159 int efx_ethtool_get_rxfh(struct net_device *net_dev,
1160                          struct ethtool_rxfh_param *rxfh)
1161 {
1162         struct efx_nic *efx = efx_netdev_priv(net_dev);
1163         int rc;
1164
1165         if (rxfh->rss_context) /* core should never call us for these */
1166                 return -EINVAL;
1167
1168         rc = efx->type->rx_pull_rss_config(efx);
1169         if (rc)
1170                 return rc;
1171
1172         rxfh->hfunc = ETH_RSS_HASH_TOP;
1173         if (rxfh->indir)
1174                 memcpy(rxfh->indir, efx->rss_context.rx_indir_table,
1175                        sizeof(efx->rss_context.rx_indir_table));
1176         if (rxfh->key)
1177                 memcpy(rxfh->key, efx->rss_context.rx_hash_key,
1178                        efx->type->rx_hash_key_size);
1179         return 0;
1180 }
1181
1182 int efx_ethtool_modify_rxfh_context(struct net_device *net_dev,
1183                                     struct ethtool_rxfh_context *ctx,
1184                                     const struct ethtool_rxfh_param *rxfh,
1185                                     struct netlink_ext_ack *extack)
1186 {
1187         struct efx_nic *efx = efx_netdev_priv(net_dev);
1188         struct efx_rss_context_priv *priv;
1189         const u32 *indir = rxfh->indir;
1190         const u8 *key = rxfh->key;
1191
1192         if (!efx->type->rx_push_rss_context_config) {
1193                 NL_SET_ERR_MSG_MOD(extack,
1194                                    "NIC type does not support custom contexts");
1195                 return -EOPNOTSUPP;
1196         }
1197         /* Hash function is Toeplitz, cannot be changed */
1198         if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
1199             rxfh->hfunc != ETH_RSS_HASH_TOP) {
1200                 NL_SET_ERR_MSG_MOD(extack, "Only Toeplitz hash is supported");
1201                 return -EOPNOTSUPP;
1202         }
1203
1204         priv = ethtool_rxfh_context_priv(ctx);
1205
1206         if (!key)
1207                 key = ethtool_rxfh_context_key(ctx);
1208         if (!indir)
1209                 indir = ethtool_rxfh_context_indir(ctx);
1210
1211         return efx->type->rx_push_rss_context_config(efx, priv, indir, key,
1212                                                      false);
1213 }
1214
1215 int efx_ethtool_create_rxfh_context(struct net_device *net_dev,
1216                                     struct ethtool_rxfh_context *ctx,
1217                                     const struct ethtool_rxfh_param *rxfh,
1218                                     struct netlink_ext_ack *extack)
1219 {
1220         struct efx_nic *efx = efx_netdev_priv(net_dev);
1221         struct efx_rss_context_priv *priv;
1222
1223         priv = ethtool_rxfh_context_priv(ctx);
1224
1225         priv->context_id = EFX_MCDI_RSS_CONTEXT_INVALID;
1226         priv->rx_hash_udp_4tuple = false;
1227         /* Generate default indir table and/or key if not specified.
1228          * We use ctx as a place to store these; this is fine because
1229          * we're doing a create, so if we fail then the ctx will just
1230          * be deleted.
1231          */
1232         if (!rxfh->indir)
1233                 efx_set_default_rx_indir_table(efx, ethtool_rxfh_context_indir(ctx));
1234         if (!rxfh->key)
1235                 netdev_rss_key_fill(ethtool_rxfh_context_key(ctx),
1236                                     ctx->key_size);
1237         if (rxfh->hfunc == ETH_RSS_HASH_NO_CHANGE)
1238                 ctx->hfunc = ETH_RSS_HASH_TOP;
1239         if (rxfh->input_xfrm == RXH_XFRM_NO_CHANGE)
1240                 ctx->input_xfrm = 0;
1241         return efx_ethtool_modify_rxfh_context(net_dev, ctx, rxfh, extack);
1242 }
1243
1244 int efx_ethtool_remove_rxfh_context(struct net_device *net_dev,
1245                                     struct ethtool_rxfh_context *ctx,
1246                                     u32 rss_context,
1247                                     struct netlink_ext_ack *extack)
1248 {
1249         struct efx_nic *efx = efx_netdev_priv(net_dev);
1250         struct efx_rss_context_priv *priv;
1251
1252         if (!efx->type->rx_push_rss_context_config) {
1253                 NL_SET_ERR_MSG_MOD(extack,
1254                                    "NIC type does not support custom contexts");
1255                 return -EOPNOTSUPP;
1256         }
1257
1258         priv = ethtool_rxfh_context_priv(ctx);
1259         return efx->type->rx_push_rss_context_config(efx, priv, NULL, NULL,
1260                                                      true);
1261 }
1262
1263 int efx_ethtool_set_rxfh(struct net_device *net_dev,
1264                          struct ethtool_rxfh_param *rxfh,
1265                          struct netlink_ext_ack *extack)
1266 {
1267         struct efx_nic *efx = efx_netdev_priv(net_dev);
1268         u32 *indir = rxfh->indir;
1269         u8 *key = rxfh->key;
1270
1271         /* Hash function is Toeplitz, cannot be changed */
1272         if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
1273             rxfh->hfunc != ETH_RSS_HASH_TOP)
1274                 return -EOPNOTSUPP;
1275
1276         /* Custom contexts should use new API */
1277         if (WARN_ON_ONCE(rxfh->rss_context))
1278                 return -EIO;
1279
1280         if (!indir && !key)
1281                 return 0;
1282
1283         if (!key)
1284                 key = efx->rss_context.rx_hash_key;
1285         if (!indir)
1286                 indir = efx->rss_context.rx_indir_table;
1287
1288         return efx->type->rx_push_rss_config(efx, true, indir, key);
1289 }
1290
1291 int efx_ethtool_reset(struct net_device *net_dev, u32 *flags)
1292 {
1293         struct efx_nic *efx = efx_netdev_priv(net_dev);
1294         int rc;
1295
1296         rc = efx->type->map_reset_flags(flags);
1297         if (rc < 0)
1298                 return rc;
1299
1300         return efx_reset(efx, rc);
1301 }
1302
1303 int efx_ethtool_get_module_eeprom(struct net_device *net_dev,
1304                                   struct ethtool_eeprom *ee,
1305                                   u8 *data)
1306 {
1307         struct efx_nic *efx = efx_netdev_priv(net_dev);
1308         int ret;
1309
1310         mutex_lock(&efx->mac_lock);
1311         ret = efx_mcdi_phy_get_module_eeprom(efx, ee, data);
1312         mutex_unlock(&efx->mac_lock);
1313
1314         return ret;
1315 }
1316
1317 int efx_ethtool_get_module_info(struct net_device *net_dev,
1318                                 struct ethtool_modinfo *modinfo)
1319 {
1320         struct efx_nic *efx = efx_netdev_priv(net_dev);
1321         int ret;
1322
1323         mutex_lock(&efx->mac_lock);
1324         ret = efx_mcdi_phy_get_module_info(efx, modinfo);
1325         mutex_unlock(&efx->mac_lock);
1326
1327         return ret;
1328 }
This page took 0.106616 seconds and 4 git commands to generate.