]> Git Repo - linux.git/blob - drivers/net/ethernet/freescale/gianfar_ethtool.c
Linux 6.14-rc3
[linux.git] / drivers / net / ethernet / freescale / gianfar_ethtool.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  drivers/net/ethernet/freescale/gianfar_ethtool.c
4  *
5  *  Gianfar Ethernet Driver
6  *  Ethtool support for Gianfar Enet
7  *  Based on e1000 ethtool support
8  *
9  *  Author: Andy Fleming
10  *  Maintainer: Kumar Gala
11  *  Modifier: Sandeep Gopalpet <[email protected]>
12  *
13  *  Copyright 2003-2006, 2008-2009, 2011 Freescale Semiconductor, Inc.
14  */
15
16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17
18 #include <linux/kernel.h>
19 #include <linux/string.h>
20 #include <linux/errno.h>
21 #include <linux/interrupt.h>
22 #include <linux/delay.h>
23 #include <linux/netdevice.h>
24 #include <linux/etherdevice.h>
25 #include <linux/net_tstamp.h>
26 #include <linux/skbuff.h>
27 #include <linux/spinlock.h>
28 #include <linux/mm.h>
29
30 #include <asm/io.h>
31 #include <asm/irq.h>
32 #include <linux/uaccess.h>
33 #include <linux/module.h>
34 #include <linux/crc32.h>
35 #include <asm/types.h>
36 #include <linux/ethtool.h>
37 #include <linux/mii.h>
38 #include <linux/phy.h>
39 #include <linux/sort.h>
40 #include <linux/if_vlan.h>
41 #include <linux/of.h>
42 #include <linux/of_platform.h>
43 #include <linux/platform_device.h>
44 #include <linux/fsl/ptp_qoriq.h>
45
46 #include "gianfar.h"
47
48 #define GFAR_MAX_COAL_USECS 0xffff
49 #define GFAR_MAX_COAL_FRAMES 0xff
50
51 static const char stat_gstrings[][ETH_GSTRING_LEN] = {
52         /* extra stats */
53         "rx-allocation-errors",
54         "rx-large-frame-errors",
55         "rx-short-frame-errors",
56         "rx-non-octet-errors",
57         "rx-crc-errors",
58         "rx-overrun-errors",
59         "rx-busy-errors",
60         "rx-babbling-errors",
61         "rx-truncated-frames",
62         "ethernet-bus-error",
63         "tx-babbling-errors",
64         "tx-underrun-errors",
65         "tx-timeout-errors",
66         /* rmon stats */
67         "tx-rx-64-frames",
68         "tx-rx-65-127-frames",
69         "tx-rx-128-255-frames",
70         "tx-rx-256-511-frames",
71         "tx-rx-512-1023-frames",
72         "tx-rx-1024-1518-frames",
73         "tx-rx-1519-1522-good-vlan",
74         "rx-bytes",
75         "rx-packets",
76         "rx-fcs-errors",
77         "receive-multicast-packet",
78         "receive-broadcast-packet",
79         "rx-control-frame-packets",
80         "rx-pause-frame-packets",
81         "rx-unknown-op-code",
82         "rx-alignment-error",
83         "rx-frame-length-error",
84         "rx-code-error",
85         "rx-carrier-sense-error",
86         "rx-undersize-packets",
87         "rx-oversize-packets",
88         "rx-fragmented-frames",
89         "rx-jabber-frames",
90         "rx-dropped-frames",
91         "tx-byte-counter",
92         "tx-packets",
93         "tx-multicast-packets",
94         "tx-broadcast-packets",
95         "tx-pause-control-frames",
96         "tx-deferral-packets",
97         "tx-excessive-deferral-packets",
98         "tx-single-collision-packets",
99         "tx-multiple-collision-packets",
100         "tx-late-collision-packets",
101         "tx-excessive-collision-packets",
102         "tx-total-collision",
103         "reserved",
104         "tx-dropped-frames",
105         "tx-jabber-frames",
106         "tx-fcs-errors",
107         "tx-control-frames",
108         "tx-oversize-frames",
109         "tx-undersize-frames",
110         "tx-fragmented-frames",
111 };
112
113 /* Fill in a buffer with the strings which correspond to the
114  * stats */
115 static void gfar_gstrings(struct net_device *dev, u32 stringset, u8 * buf)
116 {
117         struct gfar_private *priv = netdev_priv(dev);
118         int i;
119
120         if (priv->device_flags & FSL_GIANFAR_DEV_HAS_RMON)
121                 for (i = 0; i < GFAR_STATS_LEN; i++)
122                         ethtool_puts(&buf, stat_gstrings[i]);
123         else
124                 for (i = 0; i < GFAR_EXTRA_STATS_LEN; i++)
125                         ethtool_puts(&buf, stat_gstrings[i]);
126 }
127
128 /* Fill in an array of 64-bit statistics from various sources.
129  * This array will be appended to the end of the ethtool_stats
130  * structure, and returned to user space
131  */
132 static void gfar_fill_stats(struct net_device *dev, struct ethtool_stats *dummy,
133                             u64 *buf)
134 {
135         int i;
136         struct gfar_private *priv = netdev_priv(dev);
137         struct gfar __iomem *regs = priv->gfargrp[0].regs;
138         atomic64_t *extra = (atomic64_t *)&priv->extra_stats;
139
140         for (i = 0; i < GFAR_EXTRA_STATS_LEN; i++)
141                 buf[i] = atomic64_read(&extra[i]);
142
143         if (priv->device_flags & FSL_GIANFAR_DEV_HAS_RMON) {
144                 u32 __iomem *rmon = (u32 __iomem *) &regs->rmon;
145
146                 for (; i < GFAR_STATS_LEN; i++, rmon++)
147                         buf[i] = (u64) gfar_read(rmon);
148         }
149 }
150
151 static int gfar_sset_count(struct net_device *dev, int sset)
152 {
153         struct gfar_private *priv = netdev_priv(dev);
154
155         switch (sset) {
156         case ETH_SS_STATS:
157                 if (priv->device_flags & FSL_GIANFAR_DEV_HAS_RMON)
158                         return GFAR_STATS_LEN;
159                 else
160                         return GFAR_EXTRA_STATS_LEN;
161         default:
162                 return -EOPNOTSUPP;
163         }
164 }
165
166 /* Fills in the drvinfo structure with some basic info */
167 static void gfar_gdrvinfo(struct net_device *dev,
168                           struct ethtool_drvinfo *drvinfo)
169 {
170         strscpy(drvinfo->driver, DRV_NAME, sizeof(drvinfo->driver));
171 }
172
173 /* Return the length of the register structure */
174 static int gfar_reglen(struct net_device *dev)
175 {
176         return sizeof (struct gfar);
177 }
178
179 /* Return a dump of the GFAR register space */
180 static void gfar_get_regs(struct net_device *dev, struct ethtool_regs *regs,
181                           void *regbuf)
182 {
183         int i;
184         struct gfar_private *priv = netdev_priv(dev);
185         u32 __iomem *theregs = (u32 __iomem *) priv->gfargrp[0].regs;
186         u32 *buf = (u32 *) regbuf;
187
188         for (i = 0; i < sizeof (struct gfar) / sizeof (u32); i++)
189                 buf[i] = gfar_read(&theregs[i]);
190 }
191
192 /* Convert microseconds to ethernet clock ticks, which changes
193  * depending on what speed the controller is running at */
194 static unsigned int gfar_usecs2ticks(struct gfar_private *priv,
195                                      unsigned int usecs)
196 {
197         struct net_device *ndev = priv->ndev;
198         struct phy_device *phydev = ndev->phydev;
199         unsigned int count;
200
201         /* The timer is different, depending on the interface speed */
202         switch (phydev->speed) {
203         case SPEED_1000:
204                 count = GFAR_GBIT_TIME;
205                 break;
206         case SPEED_100:
207                 count = GFAR_100_TIME;
208                 break;
209         case SPEED_10:
210         default:
211                 count = GFAR_10_TIME;
212                 break;
213         }
214
215         /* Make sure we return a number greater than 0
216          * if usecs > 0 */
217         return DIV_ROUND_UP(usecs * 1000, count);
218 }
219
220 /* Convert ethernet clock ticks to microseconds */
221 static unsigned int gfar_ticks2usecs(struct gfar_private *priv,
222                                      unsigned int ticks)
223 {
224         struct net_device *ndev = priv->ndev;
225         struct phy_device *phydev = ndev->phydev;
226         unsigned int count;
227
228         /* The timer is different, depending on the interface speed */
229         switch (phydev->speed) {
230         case SPEED_1000:
231                 count = GFAR_GBIT_TIME;
232                 break;
233         case SPEED_100:
234                 count = GFAR_100_TIME;
235                 break;
236         case SPEED_10:
237         default:
238                 count = GFAR_10_TIME;
239                 break;
240         }
241
242         /* Make sure we return a number greater than 0 */
243         /* if ticks is > 0 */
244         return (ticks * count) / 1000;
245 }
246
247 /* Get the coalescing parameters, and put them in the cvals
248  * structure.  */
249 static int gfar_gcoalesce(struct net_device *dev,
250                           struct ethtool_coalesce *cvals,
251                           struct kernel_ethtool_coalesce *kernel_coal,
252                           struct netlink_ext_ack *extack)
253 {
254         struct gfar_private *priv = netdev_priv(dev);
255         struct gfar_priv_rx_q *rx_queue = NULL;
256         struct gfar_priv_tx_q *tx_queue = NULL;
257         unsigned long rxtime;
258         unsigned long rxcount;
259         unsigned long txtime;
260         unsigned long txcount;
261
262         if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_COALESCE))
263                 return -EOPNOTSUPP;
264
265         if (!dev->phydev)
266                 return -ENODEV;
267
268         rx_queue = priv->rx_queue[0];
269         tx_queue = priv->tx_queue[0];
270
271         rxtime  = get_ictt_value(rx_queue->rxic);
272         rxcount = get_icft_value(rx_queue->rxic);
273         txtime  = get_ictt_value(tx_queue->txic);
274         txcount = get_icft_value(tx_queue->txic);
275         cvals->rx_coalesce_usecs = gfar_ticks2usecs(priv, rxtime);
276         cvals->rx_max_coalesced_frames = rxcount;
277
278         cvals->tx_coalesce_usecs = gfar_ticks2usecs(priv, txtime);
279         cvals->tx_max_coalesced_frames = txcount;
280
281         return 0;
282 }
283
284 /* Change the coalescing values.
285  * Both cvals->*_usecs and cvals->*_frames have to be > 0
286  * in order for coalescing to be active
287  */
288 static int gfar_scoalesce(struct net_device *dev,
289                           struct ethtool_coalesce *cvals,
290                           struct kernel_ethtool_coalesce *kernel_coal,
291                           struct netlink_ext_ack *extack)
292 {
293         struct gfar_private *priv = netdev_priv(dev);
294         int i, err = 0;
295
296         if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_COALESCE))
297                 return -EOPNOTSUPP;
298
299         if (!dev->phydev)
300                 return -ENODEV;
301
302         /* Check the bounds of the values */
303         if (cvals->rx_coalesce_usecs > GFAR_MAX_COAL_USECS) {
304                 netdev_info(dev, "Coalescing is limited to %d microseconds\n",
305                             GFAR_MAX_COAL_USECS);
306                 return -EINVAL;
307         }
308
309         if (cvals->rx_max_coalesced_frames > GFAR_MAX_COAL_FRAMES) {
310                 netdev_info(dev, "Coalescing is limited to %d frames\n",
311                             GFAR_MAX_COAL_FRAMES);
312                 return -EINVAL;
313         }
314
315         /* Check the bounds of the values */
316         if (cvals->tx_coalesce_usecs > GFAR_MAX_COAL_USECS) {
317                 netdev_info(dev, "Coalescing is limited to %d microseconds\n",
318                             GFAR_MAX_COAL_USECS);
319                 return -EINVAL;
320         }
321
322         if (cvals->tx_max_coalesced_frames > GFAR_MAX_COAL_FRAMES) {
323                 netdev_info(dev, "Coalescing is limited to %d frames\n",
324                             GFAR_MAX_COAL_FRAMES);
325                 return -EINVAL;
326         }
327
328         while (test_and_set_bit_lock(GFAR_RESETTING, &priv->state))
329                 cpu_relax();
330
331         /* Set up rx coalescing */
332         if ((cvals->rx_coalesce_usecs == 0) ||
333             (cvals->rx_max_coalesced_frames == 0)) {
334                 for (i = 0; i < priv->num_rx_queues; i++)
335                         priv->rx_queue[i]->rxcoalescing = 0;
336         } else {
337                 for (i = 0; i < priv->num_rx_queues; i++)
338                         priv->rx_queue[i]->rxcoalescing = 1;
339         }
340
341         for (i = 0; i < priv->num_rx_queues; i++) {
342                 priv->rx_queue[i]->rxic = mk_ic_value(
343                         cvals->rx_max_coalesced_frames,
344                         gfar_usecs2ticks(priv, cvals->rx_coalesce_usecs));
345         }
346
347         /* Set up tx coalescing */
348         if ((cvals->tx_coalesce_usecs == 0) ||
349             (cvals->tx_max_coalesced_frames == 0)) {
350                 for (i = 0; i < priv->num_tx_queues; i++)
351                         priv->tx_queue[i]->txcoalescing = 0;
352         } else {
353                 for (i = 0; i < priv->num_tx_queues; i++)
354                         priv->tx_queue[i]->txcoalescing = 1;
355         }
356
357         for (i = 0; i < priv->num_tx_queues; i++) {
358                 priv->tx_queue[i]->txic = mk_ic_value(
359                         cvals->tx_max_coalesced_frames,
360                         gfar_usecs2ticks(priv, cvals->tx_coalesce_usecs));
361         }
362
363         if (dev->flags & IFF_UP) {
364                 stop_gfar(dev);
365                 err = startup_gfar(dev);
366         } else {
367                 gfar_mac_reset(priv);
368         }
369
370         clear_bit_unlock(GFAR_RESETTING, &priv->state);
371
372         return err;
373 }
374
375 /* Fills in rvals with the current ring parameters.  Currently,
376  * rx, rx_mini, and rx_jumbo rings are the same size, as mini and
377  * jumbo are ignored by the driver */
378 static void gfar_gringparam(struct net_device *dev,
379                             struct ethtool_ringparam *rvals,
380                             struct kernel_ethtool_ringparam *kernel_rvals,
381                             struct netlink_ext_ack *extack)
382 {
383         struct gfar_private *priv = netdev_priv(dev);
384         struct gfar_priv_tx_q *tx_queue = NULL;
385         struct gfar_priv_rx_q *rx_queue = NULL;
386
387         tx_queue = priv->tx_queue[0];
388         rx_queue = priv->rx_queue[0];
389
390         rvals->rx_max_pending = GFAR_RX_MAX_RING_SIZE;
391         rvals->rx_mini_max_pending = GFAR_RX_MAX_RING_SIZE;
392         rvals->rx_jumbo_max_pending = GFAR_RX_MAX_RING_SIZE;
393         rvals->tx_max_pending = GFAR_TX_MAX_RING_SIZE;
394
395         /* Values changeable by the user.  The valid values are
396          * in the range 1 to the "*_max_pending" counterpart above.
397          */
398         rvals->rx_pending = rx_queue->rx_ring_size;
399         rvals->rx_mini_pending = rx_queue->rx_ring_size;
400         rvals->rx_jumbo_pending = rx_queue->rx_ring_size;
401         rvals->tx_pending = tx_queue->tx_ring_size;
402 }
403
404 /* Change the current ring parameters, stopping the controller if
405  * necessary so that we don't mess things up while we're in motion.
406  */
407 static int gfar_sringparam(struct net_device *dev,
408                            struct ethtool_ringparam *rvals,
409                            struct kernel_ethtool_ringparam *kernel_rvals,
410                            struct netlink_ext_ack *extack)
411 {
412         struct gfar_private *priv = netdev_priv(dev);
413         int err = 0, i;
414
415         if (rvals->rx_pending > GFAR_RX_MAX_RING_SIZE)
416                 return -EINVAL;
417
418         if (!is_power_of_2(rvals->rx_pending)) {
419                 netdev_err(dev, "Ring sizes must be a power of 2\n");
420                 return -EINVAL;
421         }
422
423         if (rvals->tx_pending > GFAR_TX_MAX_RING_SIZE)
424                 return -EINVAL;
425
426         if (!is_power_of_2(rvals->tx_pending)) {
427                 netdev_err(dev, "Ring sizes must be a power of 2\n");
428                 return -EINVAL;
429         }
430
431         while (test_and_set_bit_lock(GFAR_RESETTING, &priv->state))
432                 cpu_relax();
433
434         if (dev->flags & IFF_UP)
435                 stop_gfar(dev);
436
437         /* Change the sizes */
438         for (i = 0; i < priv->num_rx_queues; i++)
439                 priv->rx_queue[i]->rx_ring_size = rvals->rx_pending;
440
441         for (i = 0; i < priv->num_tx_queues; i++)
442                 priv->tx_queue[i]->tx_ring_size = rvals->tx_pending;
443
444         /* Rebuild the rings with the new size */
445         if (dev->flags & IFF_UP)
446                 err = startup_gfar(dev);
447
448         clear_bit_unlock(GFAR_RESETTING, &priv->state);
449
450         return err;
451 }
452
453 static void gfar_gpauseparam(struct net_device *dev,
454                              struct ethtool_pauseparam *epause)
455 {
456         struct gfar_private *priv = netdev_priv(dev);
457
458         epause->autoneg = !!priv->pause_aneg_en;
459         epause->rx_pause = !!priv->rx_pause_en;
460         epause->tx_pause = !!priv->tx_pause_en;
461 }
462
463 static int gfar_spauseparam(struct net_device *dev,
464                             struct ethtool_pauseparam *epause)
465 {
466         struct gfar_private *priv = netdev_priv(dev);
467         struct phy_device *phydev = dev->phydev;
468         struct gfar __iomem *regs = priv->gfargrp[0].regs;
469
470         if (!phydev)
471                 return -ENODEV;
472
473         if (!phy_validate_pause(phydev, epause))
474                 return -EINVAL;
475
476         priv->rx_pause_en = priv->tx_pause_en = 0;
477         phy_set_asym_pause(phydev, epause->rx_pause, epause->tx_pause);
478         if (epause->rx_pause) {
479                 priv->rx_pause_en = 1;
480
481                 if (epause->tx_pause) {
482                         priv->tx_pause_en = 1;
483                 }
484         } else if (epause->tx_pause) {
485                 priv->tx_pause_en = 1;
486         }
487
488         if (epause->autoneg)
489                 priv->pause_aneg_en = 1;
490         else
491                 priv->pause_aneg_en = 0;
492
493         if (!epause->autoneg) {
494                 u32 tempval = gfar_read(&regs->maccfg1);
495
496                 tempval &= ~(MACCFG1_TX_FLOW | MACCFG1_RX_FLOW);
497
498                 priv->tx_actual_en = 0;
499                 if (priv->tx_pause_en) {
500                         priv->tx_actual_en = 1;
501                         tempval |= MACCFG1_TX_FLOW;
502                 }
503
504                 if (priv->rx_pause_en)
505                         tempval |= MACCFG1_RX_FLOW;
506                 gfar_write(&regs->maccfg1, tempval);
507         }
508
509         return 0;
510 }
511
512 int gfar_set_features(struct net_device *dev, netdev_features_t features)
513 {
514         netdev_features_t changed = dev->features ^ features;
515         struct gfar_private *priv = netdev_priv(dev);
516         int err = 0;
517
518         if (!(changed & (NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
519                          NETIF_F_RXCSUM)))
520                 return 0;
521
522         while (test_and_set_bit_lock(GFAR_RESETTING, &priv->state))
523                 cpu_relax();
524
525         dev->features = features;
526
527         if (dev->flags & IFF_UP) {
528                 /* Now we take down the rings to rebuild them */
529                 stop_gfar(dev);
530                 err = startup_gfar(dev);
531         } else {
532                 gfar_mac_reset(priv);
533         }
534
535         clear_bit_unlock(GFAR_RESETTING, &priv->state);
536
537         return err;
538 }
539
540 static uint32_t gfar_get_msglevel(struct net_device *dev)
541 {
542         struct gfar_private *priv = netdev_priv(dev);
543
544         return priv->msg_enable;
545 }
546
547 static void gfar_set_msglevel(struct net_device *dev, uint32_t data)
548 {
549         struct gfar_private *priv = netdev_priv(dev);
550
551         priv->msg_enable = data;
552 }
553
554 #ifdef CONFIG_PM
555 static void gfar_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
556 {
557         struct gfar_private *priv = netdev_priv(dev);
558
559         wol->supported = 0;
560         wol->wolopts = 0;
561
562         if (priv->wol_supported & GFAR_WOL_MAGIC)
563                 wol->supported |= WAKE_MAGIC;
564
565         if (priv->wol_supported & GFAR_WOL_FILER_UCAST)
566                 wol->supported |= WAKE_UCAST;
567
568         if (priv->wol_opts & GFAR_WOL_MAGIC)
569                 wol->wolopts |= WAKE_MAGIC;
570
571         if (priv->wol_opts & GFAR_WOL_FILER_UCAST)
572                 wol->wolopts |= WAKE_UCAST;
573 }
574
575 static int gfar_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
576 {
577         struct gfar_private *priv = netdev_priv(dev);
578         u16 wol_opts = 0;
579         int err;
580
581         if (!priv->wol_supported && wol->wolopts)
582                 return -EINVAL;
583
584         if (wol->wolopts & ~(WAKE_MAGIC | WAKE_UCAST))
585                 return -EINVAL;
586
587         if (wol->wolopts & WAKE_MAGIC) {
588                 wol_opts |= GFAR_WOL_MAGIC;
589         } else {
590                 if (wol->wolopts & WAKE_UCAST)
591                         wol_opts |= GFAR_WOL_FILER_UCAST;
592         }
593
594         wol_opts &= priv->wol_supported;
595         priv->wol_opts = 0;
596
597         err = device_set_wakeup_enable(priv->dev, wol_opts);
598         if (err)
599                 return err;
600
601         priv->wol_opts = wol_opts;
602
603         return 0;
604 }
605 #endif
606
607 static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow)
608 {
609         u32 fcr = 0x0, fpr = FPR_FILER_MASK;
610
611         if (ethflow & RXH_L2DA) {
612                 fcr = RQFCR_PID_DAH | RQFCR_CMP_NOMATCH |
613                       RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0;
614                 priv->ftp_rqfpr[priv->cur_filer_idx] = fpr;
615                 priv->ftp_rqfcr[priv->cur_filer_idx] = fcr;
616                 gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr);
617                 priv->cur_filer_idx = priv->cur_filer_idx - 1;
618
619                 fcr = RQFCR_PID_DAL | RQFCR_CMP_NOMATCH |
620                       RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0;
621                 priv->ftp_rqfpr[priv->cur_filer_idx] = fpr;
622                 priv->ftp_rqfcr[priv->cur_filer_idx] = fcr;
623                 gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr);
624                 priv->cur_filer_idx = priv->cur_filer_idx - 1;
625         }
626
627         if (ethflow & RXH_VLAN) {
628                 fcr = RQFCR_PID_VID | RQFCR_CMP_NOMATCH | RQFCR_HASH |
629                       RQFCR_AND | RQFCR_HASHTBL_0;
630                 gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr);
631                 priv->ftp_rqfpr[priv->cur_filer_idx] = fpr;
632                 priv->ftp_rqfcr[priv->cur_filer_idx] = fcr;
633                 priv->cur_filer_idx = priv->cur_filer_idx - 1;
634         }
635
636         if (ethflow & RXH_IP_SRC) {
637                 fcr = RQFCR_PID_SIA | RQFCR_CMP_NOMATCH | RQFCR_HASH |
638                       RQFCR_AND | RQFCR_HASHTBL_0;
639                 priv->ftp_rqfpr[priv->cur_filer_idx] = fpr;
640                 priv->ftp_rqfcr[priv->cur_filer_idx] = fcr;
641                 gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr);
642                 priv->cur_filer_idx = priv->cur_filer_idx - 1;
643         }
644
645         if (ethflow & (RXH_IP_DST)) {
646                 fcr = RQFCR_PID_DIA | RQFCR_CMP_NOMATCH | RQFCR_HASH |
647                       RQFCR_AND | RQFCR_HASHTBL_0;
648                 priv->ftp_rqfpr[priv->cur_filer_idx] = fpr;
649                 priv->ftp_rqfcr[priv->cur_filer_idx] = fcr;
650                 gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr);
651                 priv->cur_filer_idx = priv->cur_filer_idx - 1;
652         }
653
654         if (ethflow & RXH_L3_PROTO) {
655                 fcr = RQFCR_PID_L4P | RQFCR_CMP_NOMATCH | RQFCR_HASH |
656                       RQFCR_AND | RQFCR_HASHTBL_0;
657                 priv->ftp_rqfpr[priv->cur_filer_idx] = fpr;
658                 priv->ftp_rqfcr[priv->cur_filer_idx] = fcr;
659                 gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr);
660                 priv->cur_filer_idx = priv->cur_filer_idx - 1;
661         }
662
663         if (ethflow & RXH_L4_B_0_1) {
664                 fcr = RQFCR_PID_SPT | RQFCR_CMP_NOMATCH | RQFCR_HASH |
665                       RQFCR_AND | RQFCR_HASHTBL_0;
666                 priv->ftp_rqfpr[priv->cur_filer_idx] = fpr;
667                 priv->ftp_rqfcr[priv->cur_filer_idx] = fcr;
668                 gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr);
669                 priv->cur_filer_idx = priv->cur_filer_idx - 1;
670         }
671
672         if (ethflow & RXH_L4_B_2_3) {
673                 fcr = RQFCR_PID_DPT | RQFCR_CMP_NOMATCH | RQFCR_HASH |
674                       RQFCR_AND | RQFCR_HASHTBL_0;
675                 priv->ftp_rqfpr[priv->cur_filer_idx] = fpr;
676                 priv->ftp_rqfcr[priv->cur_filer_idx] = fcr;
677                 gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr);
678                 priv->cur_filer_idx = priv->cur_filer_idx - 1;
679         }
680 }
681
682 static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow,
683                                        u64 class)
684 {
685         unsigned int cmp_rqfpr;
686         unsigned int *local_rqfpr;
687         unsigned int *local_rqfcr;
688         int i = 0x0, k = 0x0;
689         int j = MAX_FILER_IDX, l = 0x0;
690         int ret = 1;
691
692         local_rqfpr = kmalloc_array(MAX_FILER_IDX + 1, sizeof(unsigned int),
693                                     GFP_KERNEL);
694         local_rqfcr = kmalloc_array(MAX_FILER_IDX + 1, sizeof(unsigned int),
695                                     GFP_KERNEL);
696         if (!local_rqfpr || !local_rqfcr) {
697                 ret = 0;
698                 goto err;
699         }
700
701         switch (class) {
702         case TCP_V4_FLOW:
703                 cmp_rqfpr = RQFPR_IPV4 |RQFPR_TCP;
704                 break;
705         case UDP_V4_FLOW:
706                 cmp_rqfpr = RQFPR_IPV4 |RQFPR_UDP;
707                 break;
708         case TCP_V6_FLOW:
709                 cmp_rqfpr = RQFPR_IPV6 |RQFPR_TCP;
710                 break;
711         case UDP_V6_FLOW:
712                 cmp_rqfpr = RQFPR_IPV6 |RQFPR_UDP;
713                 break;
714         default:
715                 netdev_err(priv->ndev,
716                            "Right now this class is not supported\n");
717                 ret = 0;
718                 goto err;
719         }
720
721         for (i = 0; i < MAX_FILER_IDX + 1; i++) {
722                 local_rqfpr[j] = priv->ftp_rqfpr[i];
723                 local_rqfcr[j] = priv->ftp_rqfcr[i];
724                 j--;
725                 if ((priv->ftp_rqfcr[i] ==
726                      (RQFCR_PID_PARSE | RQFCR_CLE | RQFCR_AND)) &&
727                     (priv->ftp_rqfpr[i] == cmp_rqfpr))
728                         break;
729         }
730
731         if (i == MAX_FILER_IDX + 1) {
732                 netdev_err(priv->ndev,
733                            "No parse rule found, can't create hash rules\n");
734                 ret = 0;
735                 goto err;
736         }
737
738         /* If a match was found, then it begins the starting of a cluster rule
739          * if it was already programmed, we need to overwrite these rules
740          */
741         for (l = i+1; l < MAX_FILER_IDX; l++) {
742                 if ((priv->ftp_rqfcr[l] & RQFCR_CLE) &&
743                     !(priv->ftp_rqfcr[l] & RQFCR_AND)) {
744                         priv->ftp_rqfcr[l] = RQFCR_CLE | RQFCR_CMP_EXACT |
745                                              RQFCR_HASHTBL_0 | RQFCR_PID_MASK;
746                         priv->ftp_rqfpr[l] = FPR_FILER_MASK;
747                         gfar_write_filer(priv, l, priv->ftp_rqfcr[l],
748                                          priv->ftp_rqfpr[l]);
749                         break;
750                 }
751
752                 if (!(priv->ftp_rqfcr[l] & RQFCR_CLE) &&
753                         (priv->ftp_rqfcr[l] & RQFCR_AND))
754                         continue;
755                 else {
756                         local_rqfpr[j] = priv->ftp_rqfpr[l];
757                         local_rqfcr[j] = priv->ftp_rqfcr[l];
758                         j--;
759                 }
760         }
761
762         priv->cur_filer_idx = l - 1;
763
764         /* hash rules */
765         ethflow_to_filer_rules(priv, ethflow);
766
767         /* Write back the popped out rules again */
768         for (k = j+1; k < MAX_FILER_IDX; k++) {
769                 priv->ftp_rqfpr[priv->cur_filer_idx] = local_rqfpr[k];
770                 priv->ftp_rqfcr[priv->cur_filer_idx] = local_rqfcr[k];
771                 gfar_write_filer(priv, priv->cur_filer_idx,
772                                  local_rqfcr[k], local_rqfpr[k]);
773                 if (!priv->cur_filer_idx)
774                         break;
775                 priv->cur_filer_idx = priv->cur_filer_idx - 1;
776         }
777
778 err:
779         kfree(local_rqfcr);
780         kfree(local_rqfpr);
781         return ret;
782 }
783
784 static int gfar_set_hash_opts(struct gfar_private *priv,
785                               struct ethtool_rxnfc *cmd)
786 {
787         /* write the filer rules here */
788         if (!gfar_ethflow_to_filer_table(priv, cmd->data, cmd->flow_type))
789                 return -EINVAL;
790
791         return 0;
792 }
793
794 static int gfar_check_filer_hardware(struct gfar_private *priv)
795 {
796         struct gfar __iomem *regs = priv->gfargrp[0].regs;
797         u32 i;
798
799         /* Check if we are in FIFO mode */
800         i = gfar_read(&regs->ecntrl);
801         i &= ECNTRL_FIFM;
802         if (i == ECNTRL_FIFM) {
803                 netdev_notice(priv->ndev, "Interface in FIFO mode\n");
804                 i = gfar_read(&regs->rctrl);
805                 i &= RCTRL_PRSDEP_MASK | RCTRL_PRSFM;
806                 if (i == (RCTRL_PRSDEP_MASK | RCTRL_PRSFM)) {
807                         netdev_info(priv->ndev,
808                                     "Receive Queue Filtering enabled\n");
809                 } else {
810                         netdev_warn(priv->ndev,
811                                     "Receive Queue Filtering disabled\n");
812                         return -EOPNOTSUPP;
813                 }
814         }
815         /* Or in standard mode */
816         else {
817                 i = gfar_read(&regs->rctrl);
818                 i &= RCTRL_PRSDEP_MASK;
819                 if (i == RCTRL_PRSDEP_MASK) {
820                         netdev_info(priv->ndev,
821                                     "Receive Queue Filtering enabled\n");
822                 } else {
823                         netdev_warn(priv->ndev,
824                                     "Receive Queue Filtering disabled\n");
825                         return -EOPNOTSUPP;
826                 }
827         }
828
829         /* Sets the properties for arbitrary filer rule
830          * to the first 4 Layer 4 Bytes
831          */
832         gfar_write(&regs->rbifx, 0xC0C1C2C3);
833         return 0;
834 }
835
836 /* Write a mask to filer cache */
837 static void gfar_set_mask(u32 mask, struct filer_table *tab)
838 {
839         tab->fe[tab->index].ctrl = RQFCR_AND | RQFCR_PID_MASK | RQFCR_CMP_EXACT;
840         tab->fe[tab->index].prop = mask;
841         tab->index++;
842 }
843
844 /* Sets parse bits (e.g. IP or TCP) */
845 static void gfar_set_parse_bits(u32 value, u32 mask, struct filer_table *tab)
846 {
847         gfar_set_mask(mask, tab);
848         tab->fe[tab->index].ctrl = RQFCR_CMP_EXACT | RQFCR_PID_PARSE |
849                                    RQFCR_AND;
850         tab->fe[tab->index].prop = value;
851         tab->index++;
852 }
853
854 static void gfar_set_general_attribute(u32 value, u32 mask, u32 flag,
855                                        struct filer_table *tab)
856 {
857         gfar_set_mask(mask, tab);
858         tab->fe[tab->index].ctrl = RQFCR_CMP_EXACT | RQFCR_AND | flag;
859         tab->fe[tab->index].prop = value;
860         tab->index++;
861 }
862
863 /* For setting a tuple of value and mask of type flag
864  * Example:
865  * IP-Src = 10.0.0.0/255.0.0.0
866  * value: 0x0A000000 mask: FF000000 flag: RQFPR_IPV4
867  *
868  * Ethtool gives us a value=0 and mask=~0 for don't care a tuple
869  * For a don't care mask it gives us a 0
870  *
871  * The check if don't care and the mask adjustment if mask=0 is done for VLAN
872  * and MAC stuff on an upper level (due to missing information on this level).
873  * For these guys we can discard them if they are value=0 and mask=0.
874  *
875  * Further the all masks are one-padded for better hardware efficiency.
876  */
877 static void gfar_set_attribute(u32 value, u32 mask, u32 flag,
878                                struct filer_table *tab)
879 {
880         switch (flag) {
881                 /* 3bit */
882         case RQFCR_PID_PRI:
883                 if (!(value | mask))
884                         return;
885                 mask |= RQFCR_PID_PRI_MASK;
886                 break;
887                 /* 8bit */
888         case RQFCR_PID_L4P:
889         case RQFCR_PID_TOS:
890                 if (!~(mask | RQFCR_PID_L4P_MASK))
891                         return;
892                 if (!mask)
893                         mask = ~0;
894                 else
895                         mask |= RQFCR_PID_L4P_MASK;
896                 break;
897                 /* 12bit */
898         case RQFCR_PID_VID:
899                 if (!(value | mask))
900                         return;
901                 mask |= RQFCR_PID_VID_MASK;
902                 break;
903                 /* 16bit */
904         case RQFCR_PID_DPT:
905         case RQFCR_PID_SPT:
906         case RQFCR_PID_ETY:
907                 if (!~(mask | RQFCR_PID_PORT_MASK))
908                         return;
909                 if (!mask)
910                         mask = ~0;
911                 else
912                         mask |= RQFCR_PID_PORT_MASK;
913                 break;
914                 /* 24bit */
915         case RQFCR_PID_DAH:
916         case RQFCR_PID_DAL:
917         case RQFCR_PID_SAH:
918         case RQFCR_PID_SAL:
919                 if (!(value | mask))
920                         return;
921                 mask |= RQFCR_PID_MAC_MASK;
922                 break;
923                 /* for all real 32bit masks */
924         default:
925                 if (!~mask)
926                         return;
927                 if (!mask)
928                         mask = ~0;
929                 break;
930         }
931         gfar_set_general_attribute(value, mask, flag, tab);
932 }
933
934 /* Translates value and mask for UDP, TCP or SCTP */
935 static void gfar_set_basic_ip(struct ethtool_tcpip4_spec *value,
936                               struct ethtool_tcpip4_spec *mask,
937                               struct filer_table *tab)
938 {
939         gfar_set_attribute(be32_to_cpu(value->ip4src),
940                            be32_to_cpu(mask->ip4src),
941                            RQFCR_PID_SIA, tab);
942         gfar_set_attribute(be32_to_cpu(value->ip4dst),
943                            be32_to_cpu(mask->ip4dst),
944                            RQFCR_PID_DIA, tab);
945         gfar_set_attribute(be16_to_cpu(value->pdst),
946                            be16_to_cpu(mask->pdst),
947                            RQFCR_PID_DPT, tab);
948         gfar_set_attribute(be16_to_cpu(value->psrc),
949                            be16_to_cpu(mask->psrc),
950                            RQFCR_PID_SPT, tab);
951         gfar_set_attribute(value->tos, mask->tos, RQFCR_PID_TOS, tab);
952 }
953
954 /* Translates value and mask for RAW-IP4 */
955 static void gfar_set_user_ip(struct ethtool_usrip4_spec *value,
956                              struct ethtool_usrip4_spec *mask,
957                              struct filer_table *tab)
958 {
959         gfar_set_attribute(be32_to_cpu(value->ip4src),
960                            be32_to_cpu(mask->ip4src),
961                            RQFCR_PID_SIA, tab);
962         gfar_set_attribute(be32_to_cpu(value->ip4dst),
963                            be32_to_cpu(mask->ip4dst),
964                            RQFCR_PID_DIA, tab);
965         gfar_set_attribute(value->tos, mask->tos, RQFCR_PID_TOS, tab);
966         gfar_set_attribute(value->proto, mask->proto, RQFCR_PID_L4P, tab);
967         gfar_set_attribute(be32_to_cpu(value->l4_4_bytes),
968                            be32_to_cpu(mask->l4_4_bytes),
969                            RQFCR_PID_ARB, tab);
970
971 }
972
973 /* Translates value and mask for ETHER spec */
974 static void gfar_set_ether(struct ethhdr *value, struct ethhdr *mask,
975                            struct filer_table *tab)
976 {
977         u32 upper_temp_mask = 0;
978         u32 lower_temp_mask = 0;
979
980         /* Source address */
981         if (!is_broadcast_ether_addr(mask->h_source)) {
982                 if (is_zero_ether_addr(mask->h_source)) {
983                         upper_temp_mask = 0xFFFFFFFF;
984                         lower_temp_mask = 0xFFFFFFFF;
985                 } else {
986                         upper_temp_mask = mask->h_source[0] << 16 |
987                                           mask->h_source[1] << 8  |
988                                           mask->h_source[2];
989                         lower_temp_mask = mask->h_source[3] << 16 |
990                                           mask->h_source[4] << 8  |
991                                           mask->h_source[5];
992                 }
993                 /* Upper 24bit */
994                 gfar_set_attribute(value->h_source[0] << 16 |
995                                    value->h_source[1] << 8  |
996                                    value->h_source[2],
997                                    upper_temp_mask, RQFCR_PID_SAH, tab);
998                 /* And the same for the lower part */
999                 gfar_set_attribute(value->h_source[3] << 16 |
1000                                    value->h_source[4] << 8  |
1001                                    value->h_source[5],
1002                                    lower_temp_mask, RQFCR_PID_SAL, tab);
1003         }
1004         /* Destination address */
1005         if (!is_broadcast_ether_addr(mask->h_dest)) {
1006                 /* Special for destination is limited broadcast */
1007                 if ((is_broadcast_ether_addr(value->h_dest) &&
1008                     is_zero_ether_addr(mask->h_dest))) {
1009                         gfar_set_parse_bits(RQFPR_EBC, RQFPR_EBC, tab);
1010                 } else {
1011                         if (is_zero_ether_addr(mask->h_dest)) {
1012                                 upper_temp_mask = 0xFFFFFFFF;
1013                                 lower_temp_mask = 0xFFFFFFFF;
1014                         } else {
1015                                 upper_temp_mask = mask->h_dest[0] << 16 |
1016                                                   mask->h_dest[1] << 8  |
1017                                                   mask->h_dest[2];
1018                                 lower_temp_mask = mask->h_dest[3] << 16 |
1019                                                   mask->h_dest[4] << 8  |
1020                                                   mask->h_dest[5];
1021                         }
1022
1023                         /* Upper 24bit */
1024                         gfar_set_attribute(value->h_dest[0] << 16 |
1025                                            value->h_dest[1] << 8  |
1026                                            value->h_dest[2],
1027                                            upper_temp_mask, RQFCR_PID_DAH, tab);
1028                         /* And the same for the lower part */
1029                         gfar_set_attribute(value->h_dest[3] << 16 |
1030                                            value->h_dest[4] << 8  |
1031                                            value->h_dest[5],
1032                                            lower_temp_mask, RQFCR_PID_DAL, tab);
1033                 }
1034         }
1035
1036         gfar_set_attribute(be16_to_cpu(value->h_proto),
1037                            be16_to_cpu(mask->h_proto),
1038                            RQFCR_PID_ETY, tab);
1039 }
1040
1041 static inline u32 vlan_tci_vid(struct ethtool_rx_flow_spec *rule)
1042 {
1043         return be16_to_cpu(rule->h_ext.vlan_tci) & VLAN_VID_MASK;
1044 }
1045
1046 static inline u32 vlan_tci_vidm(struct ethtool_rx_flow_spec *rule)
1047 {
1048         return be16_to_cpu(rule->m_ext.vlan_tci) & VLAN_VID_MASK;
1049 }
1050
1051 static inline u32 vlan_tci_cfi(struct ethtool_rx_flow_spec *rule)
1052 {
1053         return be16_to_cpu(rule->h_ext.vlan_tci) & VLAN_CFI_MASK;
1054 }
1055
1056 static inline u32 vlan_tci_cfim(struct ethtool_rx_flow_spec *rule)
1057 {
1058         return be16_to_cpu(rule->m_ext.vlan_tci) & VLAN_CFI_MASK;
1059 }
1060
1061 static inline u32 vlan_tci_prio(struct ethtool_rx_flow_spec *rule)
1062 {
1063         return (be16_to_cpu(rule->h_ext.vlan_tci) & VLAN_PRIO_MASK) >>
1064                 VLAN_PRIO_SHIFT;
1065 }
1066
1067 static inline u32 vlan_tci_priom(struct ethtool_rx_flow_spec *rule)
1068 {
1069         return (be16_to_cpu(rule->m_ext.vlan_tci) & VLAN_PRIO_MASK) >>
1070                 VLAN_PRIO_SHIFT;
1071 }
1072
1073 /* Convert a rule to binary filter format of gianfar */
1074 static int gfar_convert_to_filer(struct ethtool_rx_flow_spec *rule,
1075                                  struct filer_table *tab)
1076 {
1077         u32 vlan = 0, vlan_mask = 0;
1078         u32 id = 0, id_mask = 0;
1079         u32 cfi = 0, cfi_mask = 0;
1080         u32 prio = 0, prio_mask = 0;
1081         u32 old_index = tab->index;
1082
1083         /* Check if vlan is wanted */
1084         if ((rule->flow_type & FLOW_EXT) &&
1085             (rule->m_ext.vlan_tci != cpu_to_be16(0xFFFF))) {
1086                 if (!rule->m_ext.vlan_tci)
1087                         rule->m_ext.vlan_tci = cpu_to_be16(0xFFFF);
1088
1089                 vlan = RQFPR_VLN;
1090                 vlan_mask = RQFPR_VLN;
1091
1092                 /* Separate the fields */
1093                 id = vlan_tci_vid(rule);
1094                 id_mask = vlan_tci_vidm(rule);
1095                 cfi = vlan_tci_cfi(rule);
1096                 cfi_mask = vlan_tci_cfim(rule);
1097                 prio = vlan_tci_prio(rule);
1098                 prio_mask = vlan_tci_priom(rule);
1099
1100                 if (cfi_mask) {
1101                         if (cfi)
1102                                 vlan |= RQFPR_CFI;
1103                         vlan_mask |= RQFPR_CFI;
1104                 }
1105         }
1106
1107         switch (rule->flow_type & ~FLOW_EXT) {
1108         case TCP_V4_FLOW:
1109                 gfar_set_parse_bits(RQFPR_IPV4 | RQFPR_TCP | vlan,
1110                                     RQFPR_IPV4 | RQFPR_TCP | vlan_mask, tab);
1111                 gfar_set_basic_ip(&rule->h_u.tcp_ip4_spec,
1112                                   &rule->m_u.tcp_ip4_spec, tab);
1113                 break;
1114         case UDP_V4_FLOW:
1115                 gfar_set_parse_bits(RQFPR_IPV4 | RQFPR_UDP | vlan,
1116                                     RQFPR_IPV4 | RQFPR_UDP | vlan_mask, tab);
1117                 gfar_set_basic_ip(&rule->h_u.udp_ip4_spec,
1118                                   &rule->m_u.udp_ip4_spec, tab);
1119                 break;
1120         case SCTP_V4_FLOW:
1121                 gfar_set_parse_bits(RQFPR_IPV4 | vlan, RQFPR_IPV4 | vlan_mask,
1122                                     tab);
1123                 gfar_set_attribute(132, 0, RQFCR_PID_L4P, tab);
1124                 gfar_set_basic_ip((struct ethtool_tcpip4_spec *)&rule->h_u,
1125                                   (struct ethtool_tcpip4_spec *)&rule->m_u,
1126                                   tab);
1127                 break;
1128         case IP_USER_FLOW:
1129                 gfar_set_parse_bits(RQFPR_IPV4 | vlan, RQFPR_IPV4 | vlan_mask,
1130                                     tab);
1131                 gfar_set_user_ip((struct ethtool_usrip4_spec *) &rule->h_u,
1132                                  (struct ethtool_usrip4_spec *) &rule->m_u,
1133                                  tab);
1134                 break;
1135         case ETHER_FLOW:
1136                 if (vlan)
1137                         gfar_set_parse_bits(vlan, vlan_mask, tab);
1138                 gfar_set_ether((struct ethhdr *) &rule->h_u,
1139                                (struct ethhdr *) &rule->m_u, tab);
1140                 break;
1141         default:
1142                 return -1;
1143         }
1144
1145         /* Set the vlan attributes in the end */
1146         if (vlan) {
1147                 gfar_set_attribute(id, id_mask, RQFCR_PID_VID, tab);
1148                 gfar_set_attribute(prio, prio_mask, RQFCR_PID_PRI, tab);
1149         }
1150
1151         /* If there has been nothing written till now, it must be a default */
1152         if (tab->index == old_index) {
1153                 gfar_set_mask(0xFFFFFFFF, tab);
1154                 tab->fe[tab->index].ctrl = 0x20;
1155                 tab->fe[tab->index].prop = 0x0;
1156                 tab->index++;
1157         }
1158
1159         /* Remove last AND */
1160         tab->fe[tab->index - 1].ctrl &= (~RQFCR_AND);
1161
1162         /* Specify which queue to use or to drop */
1163         if (rule->ring_cookie == RX_CLS_FLOW_DISC)
1164                 tab->fe[tab->index - 1].ctrl |= RQFCR_RJE;
1165         else
1166                 tab->fe[tab->index - 1].ctrl |= (rule->ring_cookie << 10);
1167
1168         /* Only big enough entries can be clustered */
1169         if (tab->index > (old_index + 2)) {
1170                 tab->fe[old_index + 1].ctrl |= RQFCR_CLE;
1171                 tab->fe[tab->index - 1].ctrl |= RQFCR_CLE;
1172         }
1173
1174         /* In rare cases the cache can be full while there is
1175          * free space in hw
1176          */
1177         if (tab->index > MAX_FILER_CACHE_IDX - 1)
1178                 return -EBUSY;
1179
1180         return 0;
1181 }
1182
1183 /* Write the bit-pattern from software's buffer to hardware registers */
1184 static int gfar_write_filer_table(struct gfar_private *priv,
1185                                   struct filer_table *tab)
1186 {
1187         u32 i = 0;
1188         if (tab->index > MAX_FILER_IDX - 1)
1189                 return -EBUSY;
1190
1191         /* Fill regular entries */
1192         for (; i < MAX_FILER_IDX && (tab->fe[i].ctrl | tab->fe[i].prop); i++)
1193                 gfar_write_filer(priv, i, tab->fe[i].ctrl, tab->fe[i].prop);
1194         /* Fill the rest with fall-troughs */
1195         for (; i < MAX_FILER_IDX; i++)
1196                 gfar_write_filer(priv, i, 0x60, 0xFFFFFFFF);
1197         /* Last entry must be default accept
1198          * because that's what people expect
1199          */
1200         gfar_write_filer(priv, i, 0x20, 0x0);
1201
1202         return 0;
1203 }
1204
1205 static int gfar_check_capability(struct ethtool_rx_flow_spec *flow,
1206                                  struct gfar_private *priv)
1207 {
1208
1209         if (flow->flow_type & FLOW_EXT) {
1210                 if (~flow->m_ext.data[0] || ~flow->m_ext.data[1])
1211                         netdev_warn(priv->ndev,
1212                                     "User-specific data not supported!\n");
1213                 if (~flow->m_ext.vlan_etype)
1214                         netdev_warn(priv->ndev,
1215                                     "VLAN-etype not supported!\n");
1216         }
1217         if (flow->flow_type == IP_USER_FLOW)
1218                 if (flow->h_u.usr_ip4_spec.ip_ver != ETH_RX_NFC_IP4)
1219                         netdev_warn(priv->ndev,
1220                                     "IP-Version differing from IPv4 not supported!\n");
1221
1222         return 0;
1223 }
1224
1225 static int gfar_process_filer_changes(struct gfar_private *priv)
1226 {
1227         struct ethtool_flow_spec_container *j;
1228         struct filer_table *tab;
1229         s32 ret = 0;
1230
1231         /* So index is set to zero, too! */
1232         tab = kzalloc(sizeof(*tab), GFP_KERNEL);
1233         if (tab == NULL)
1234                 return -ENOMEM;
1235
1236         /* Now convert the existing filer data from flow_spec into
1237          * filer tables binary format
1238          */
1239         list_for_each_entry(j, &priv->rx_list.list, list) {
1240                 ret = gfar_convert_to_filer(&j->fs, tab);
1241                 if (ret == -EBUSY) {
1242                         netdev_err(priv->ndev,
1243                                    "Rule not added: No free space!\n");
1244                         goto end;
1245                 }
1246                 if (ret == -1) {
1247                         netdev_err(priv->ndev,
1248                                    "Rule not added: Unsupported Flow-type!\n");
1249                         goto end;
1250                 }
1251         }
1252
1253         /* Write everything to hardware */
1254         ret = gfar_write_filer_table(priv, tab);
1255         if (ret == -EBUSY) {
1256                 netdev_err(priv->ndev, "Rule not added: No free space!\n");
1257                 goto end;
1258         }
1259
1260 end:
1261         kfree(tab);
1262         return ret;
1263 }
1264
1265 static void gfar_invert_masks(struct ethtool_rx_flow_spec *flow)
1266 {
1267         u32 i = 0;
1268
1269         for (i = 0; i < sizeof(flow->m_u); i++)
1270                 flow->m_u.hdata[i] ^= 0xFF;
1271
1272         flow->m_ext.vlan_etype ^= cpu_to_be16(0xFFFF);
1273         flow->m_ext.vlan_tci ^= cpu_to_be16(0xFFFF);
1274         flow->m_ext.data[0] ^= cpu_to_be32(~0);
1275         flow->m_ext.data[1] ^= cpu_to_be32(~0);
1276 }
1277
1278 static int gfar_add_cls(struct gfar_private *priv,
1279                         struct ethtool_rx_flow_spec *flow)
1280 {
1281         struct ethtool_flow_spec_container *temp, *comp;
1282         int ret = 0;
1283
1284         temp = kmalloc(sizeof(*temp), GFP_KERNEL);
1285         if (temp == NULL)
1286                 return -ENOMEM;
1287         memcpy(&temp->fs, flow, sizeof(temp->fs));
1288
1289         gfar_invert_masks(&temp->fs);
1290         ret = gfar_check_capability(&temp->fs, priv);
1291         if (ret)
1292                 goto clean_mem;
1293         /* Link in the new element at the right @location */
1294         if (list_empty(&priv->rx_list.list)) {
1295                 ret = gfar_check_filer_hardware(priv);
1296                 if (ret != 0)
1297                         goto clean_mem;
1298                 list_add(&temp->list, &priv->rx_list.list);
1299                 goto process;
1300         } else {
1301                 list_for_each_entry(comp, &priv->rx_list.list, list) {
1302                         if (comp->fs.location > flow->location) {
1303                                 list_add_tail(&temp->list, &comp->list);
1304                                 goto process;
1305                         }
1306                         if (comp->fs.location == flow->location) {
1307                                 netdev_err(priv->ndev,
1308                                            "Rule not added: ID %d not free!\n",
1309                                            flow->location);
1310                                 ret = -EBUSY;
1311                                 goto clean_mem;
1312                         }
1313                 }
1314                 list_add_tail(&temp->list, &priv->rx_list.list);
1315         }
1316
1317 process:
1318         priv->rx_list.count++;
1319         ret = gfar_process_filer_changes(priv);
1320         if (ret)
1321                 goto clean_list;
1322         return ret;
1323
1324 clean_list:
1325         priv->rx_list.count--;
1326         list_del(&temp->list);
1327 clean_mem:
1328         kfree(temp);
1329         return ret;
1330 }
1331
1332 static int gfar_del_cls(struct gfar_private *priv, u32 loc)
1333 {
1334         struct ethtool_flow_spec_container *comp;
1335         u32 ret = -EINVAL;
1336
1337         if (list_empty(&priv->rx_list.list))
1338                 return ret;
1339
1340         list_for_each_entry(comp, &priv->rx_list.list, list) {
1341                 if (comp->fs.location == loc) {
1342                         list_del(&comp->list);
1343                         kfree(comp);
1344                         priv->rx_list.count--;
1345                         gfar_process_filer_changes(priv);
1346                         ret = 0;
1347                         break;
1348                 }
1349         }
1350
1351         return ret;
1352 }
1353
1354 static int gfar_get_cls(struct gfar_private *priv, struct ethtool_rxnfc *cmd)
1355 {
1356         struct ethtool_flow_spec_container *comp;
1357         u32 ret = -EINVAL;
1358
1359         list_for_each_entry(comp, &priv->rx_list.list, list) {
1360                 if (comp->fs.location == cmd->fs.location) {
1361                         memcpy(&cmd->fs, &comp->fs, sizeof(cmd->fs));
1362                         gfar_invert_masks(&cmd->fs);
1363                         ret = 0;
1364                         break;
1365                 }
1366         }
1367
1368         return ret;
1369 }
1370
1371 static int gfar_get_cls_all(struct gfar_private *priv,
1372                             struct ethtool_rxnfc *cmd, u32 *rule_locs)
1373 {
1374         struct ethtool_flow_spec_container *comp;
1375         u32 i = 0;
1376
1377         list_for_each_entry(comp, &priv->rx_list.list, list) {
1378                 if (i == cmd->rule_cnt)
1379                         return -EMSGSIZE;
1380                 rule_locs[i] = comp->fs.location;
1381                 i++;
1382         }
1383
1384         cmd->data = MAX_FILER_IDX;
1385         cmd->rule_cnt = i;
1386
1387         return 0;
1388 }
1389
1390 static int gfar_set_nfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
1391 {
1392         struct gfar_private *priv = netdev_priv(dev);
1393         int ret = 0;
1394
1395         if (test_bit(GFAR_RESETTING, &priv->state))
1396                 return -EBUSY;
1397
1398         mutex_lock(&priv->rx_queue_access);
1399
1400         switch (cmd->cmd) {
1401         case ETHTOOL_SRXFH:
1402                 ret = gfar_set_hash_opts(priv, cmd);
1403                 break;
1404         case ETHTOOL_SRXCLSRLINS:
1405                 if ((cmd->fs.ring_cookie != RX_CLS_FLOW_DISC &&
1406                      cmd->fs.ring_cookie >= priv->num_rx_queues) ||
1407                     cmd->fs.location >= MAX_FILER_IDX) {
1408                         ret = -EINVAL;
1409                         break;
1410                 }
1411                 ret = gfar_add_cls(priv, &cmd->fs);
1412                 break;
1413         case ETHTOOL_SRXCLSRLDEL:
1414                 ret = gfar_del_cls(priv, cmd->fs.location);
1415                 break;
1416         default:
1417                 ret = -EINVAL;
1418         }
1419
1420         mutex_unlock(&priv->rx_queue_access);
1421
1422         return ret;
1423 }
1424
1425 static int gfar_get_nfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
1426                         u32 *rule_locs)
1427 {
1428         struct gfar_private *priv = netdev_priv(dev);
1429         int ret = 0;
1430
1431         switch (cmd->cmd) {
1432         case ETHTOOL_GRXRINGS:
1433                 cmd->data = priv->num_rx_queues;
1434                 break;
1435         case ETHTOOL_GRXCLSRLCNT:
1436                 cmd->rule_cnt = priv->rx_list.count;
1437                 break;
1438         case ETHTOOL_GRXCLSRULE:
1439                 ret = gfar_get_cls(priv, cmd);
1440                 break;
1441         case ETHTOOL_GRXCLSRLALL:
1442                 ret = gfar_get_cls_all(priv, cmd, rule_locs);
1443                 break;
1444         default:
1445                 ret = -EINVAL;
1446                 break;
1447         }
1448
1449         return ret;
1450 }
1451
1452 static int gfar_get_ts_info(struct net_device *dev,
1453                             struct kernel_ethtool_ts_info *info)
1454 {
1455         struct gfar_private *priv = netdev_priv(dev);
1456         struct platform_device *ptp_dev;
1457         struct device_node *ptp_node;
1458         struct ptp_qoriq *ptp = NULL;
1459
1460         if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)) {
1461                 info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE;
1462                 return 0;
1463         }
1464
1465         ptp_node = of_find_compatible_node(NULL, NULL, "fsl,etsec-ptp");
1466         if (ptp_node) {
1467                 ptp_dev = of_find_device_by_node(ptp_node);
1468                 of_node_put(ptp_node);
1469                 if (ptp_dev)
1470                         ptp = platform_get_drvdata(ptp_dev);
1471         }
1472
1473         if (ptp)
1474                 info->phc_index = ptp->phc_index;
1475
1476         info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE |
1477                                 SOF_TIMESTAMPING_RX_HARDWARE |
1478                                 SOF_TIMESTAMPING_RAW_HARDWARE |
1479                                 SOF_TIMESTAMPING_TX_SOFTWARE;
1480         info->tx_types = (1 << HWTSTAMP_TX_OFF) |
1481                          (1 << HWTSTAMP_TX_ON);
1482         info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) |
1483                            (1 << HWTSTAMP_FILTER_ALL);
1484         return 0;
1485 }
1486
1487 const struct ethtool_ops gfar_ethtool_ops = {
1488         .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
1489                                      ETHTOOL_COALESCE_MAX_FRAMES,
1490         .get_drvinfo = gfar_gdrvinfo,
1491         .get_regs_len = gfar_reglen,
1492         .get_regs = gfar_get_regs,
1493         .get_link = ethtool_op_get_link,
1494         .get_coalesce = gfar_gcoalesce,
1495         .set_coalesce = gfar_scoalesce,
1496         .get_ringparam = gfar_gringparam,
1497         .set_ringparam = gfar_sringparam,
1498         .get_pauseparam = gfar_gpauseparam,
1499         .set_pauseparam = gfar_spauseparam,
1500         .get_strings = gfar_gstrings,
1501         .get_sset_count = gfar_sset_count,
1502         .get_ethtool_stats = gfar_fill_stats,
1503         .get_msglevel = gfar_get_msglevel,
1504         .set_msglevel = gfar_set_msglevel,
1505 #ifdef CONFIG_PM
1506         .get_wol = gfar_get_wol,
1507         .set_wol = gfar_set_wol,
1508 #endif
1509         .set_rxnfc = gfar_set_nfc,
1510         .get_rxnfc = gfar_get_nfc,
1511         .get_ts_info = gfar_get_ts_info,
1512         .get_link_ksettings = phy_ethtool_get_link_ksettings,
1513         .set_link_ksettings = phy_ethtool_set_link_ksettings,
1514 };
This page took 0.117698 seconds and 4 git commands to generate.