diff options
Diffstat (limited to 'drivers/net/gianfar_ethtool.c')
-rw-r--r-- | drivers/net/gianfar_ethtool.c | 185 |
1 files changed, 45 insertions, 140 deletions
diff --git a/drivers/net/gianfar_ethtool.c b/drivers/net/gianfar_ethtool.c index 9bda023c0235..239e3330495f 100644 --- a/drivers/net/gianfar_ethtool.c +++ b/drivers/net/gianfar_ethtool.c | |||
@@ -9,7 +9,7 @@ | |||
9 | * Maintainer: Kumar Gala | 9 | * Maintainer: Kumar Gala |
10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> | 10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> |
11 | * | 11 | * |
12 | * Copyright 2003-2006, 2008-2009 Freescale Semiconductor, Inc. | 12 | * Copyright 2003-2006, 2008-2009, 2011 Freescale Semiconductor, Inc. |
13 | * | 13 | * |
14 | * This software may be used and distributed according to | 14 | * This software may be used and distributed according to |
15 | * the terms of the GNU Public License, Version 2, incorporated herein | 15 | * the terms of the GNU Public License, Version 2, incorporated herein |
@@ -254,7 +254,7 @@ static unsigned int gfar_usecs2ticks(struct gfar_private *priv, unsigned int use | |||
254 | 254 | ||
255 | /* Make sure we return a number greater than 0 | 255 | /* Make sure we return a number greater than 0 |
256 | * if usecs > 0 */ | 256 | * if usecs > 0 */ |
257 | return ((usecs * 1000 + count - 1) / count); | 257 | return (usecs * 1000 + count - 1) / count; |
258 | } | 258 | } |
259 | 259 | ||
260 | /* Convert ethernet clock ticks to microseconds */ | 260 | /* Convert ethernet clock ticks to microseconds */ |
@@ -278,7 +278,7 @@ static unsigned int gfar_ticks2usecs(struct gfar_private *priv, unsigned int tic | |||
278 | 278 | ||
279 | /* Make sure we return a number greater than 0 */ | 279 | /* Make sure we return a number greater than 0 */ |
280 | /* if ticks is > 0 */ | 280 | /* if ticks is > 0 */ |
281 | return ((ticks * count) / 1000); | 281 | return (ticks * count) / 1000; |
282 | } | 282 | } |
283 | 283 | ||
284 | /* Get the coalescing parameters, and put them in the cvals | 284 | /* Get the coalescing parameters, and put them in the cvals |
@@ -517,15 +517,15 @@ static int gfar_sringparam(struct net_device *dev, struct ethtool_ringparam *rva | |||
517 | return err; | 517 | return err; |
518 | } | 518 | } |
519 | 519 | ||
520 | static int gfar_set_rx_csum(struct net_device *dev, uint32_t data) | 520 | int gfar_set_features(struct net_device *dev, u32 features) |
521 | { | 521 | { |
522 | struct gfar_private *priv = netdev_priv(dev); | 522 | struct gfar_private *priv = netdev_priv(dev); |
523 | unsigned long flags; | 523 | unsigned long flags; |
524 | int err = 0, i = 0; | 524 | int err = 0, i = 0; |
525 | u32 changed = dev->features ^ features; | ||
525 | 526 | ||
526 | if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_CSUM)) | 527 | if (!(changed & NETIF_F_RXCSUM)) |
527 | return -EOPNOTSUPP; | 528 | return 0; |
528 | |||
529 | 529 | ||
530 | if (dev->flags & IFF_UP) { | 530 | if (dev->flags & IFF_UP) { |
531 | /* Halt TX and RX, and process the frames which | 531 | /* Halt TX and RX, and process the frames which |
@@ -538,7 +538,7 @@ static int gfar_set_rx_csum(struct net_device *dev, uint32_t data) | |||
538 | 538 | ||
539 | unlock_tx_qs(priv); | 539 | unlock_tx_qs(priv); |
540 | unlock_rx_qs(priv); | 540 | unlock_rx_qs(priv); |
541 | local_irq_save(flags); | 541 | local_irq_restore(flags); |
542 | 542 | ||
543 | for (i = 0; i < priv->num_rx_queues; i++) | 543 | for (i = 0; i < priv->num_rx_queues; i++) |
544 | gfar_clean_rx_ring(priv->rx_queue[i], | 544 | gfar_clean_rx_ring(priv->rx_queue[i], |
@@ -546,58 +546,15 @@ static int gfar_set_rx_csum(struct net_device *dev, uint32_t data) | |||
546 | 546 | ||
547 | /* Now we take down the rings to rebuild them */ | 547 | /* Now we take down the rings to rebuild them */ |
548 | stop_gfar(dev); | 548 | stop_gfar(dev); |
549 | } | ||
550 | 549 | ||
551 | spin_lock_irqsave(&priv->bflock, flags); | 550 | dev->features = features; |
552 | priv->rx_csum_enable = data; | ||
553 | spin_unlock_irqrestore(&priv->bflock, flags); | ||
554 | 551 | ||
555 | if (dev->flags & IFF_UP) { | ||
556 | err = startup_gfar(dev); | 552 | err = startup_gfar(dev); |
557 | netif_tx_wake_all_queues(dev); | 553 | netif_tx_wake_all_queues(dev); |
558 | } | 554 | } |
559 | return err; | 555 | return err; |
560 | } | 556 | } |
561 | 557 | ||
562 | static uint32_t gfar_get_rx_csum(struct net_device *dev) | ||
563 | { | ||
564 | struct gfar_private *priv = netdev_priv(dev); | ||
565 | |||
566 | if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_CSUM)) | ||
567 | return 0; | ||
568 | |||
569 | return priv->rx_csum_enable; | ||
570 | } | ||
571 | |||
572 | static int gfar_set_tx_csum(struct net_device *dev, uint32_t data) | ||
573 | { | ||
574 | struct gfar_private *priv = netdev_priv(dev); | ||
575 | |||
576 | if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_CSUM)) | ||
577 | return -EOPNOTSUPP; | ||
578 | |||
579 | netif_tx_lock_bh(dev); | ||
580 | |||
581 | if (data) | ||
582 | dev->features |= NETIF_F_IP_CSUM; | ||
583 | else | ||
584 | dev->features &= ~NETIF_F_IP_CSUM; | ||
585 | |||
586 | netif_tx_unlock_bh(dev); | ||
587 | |||
588 | return 0; | ||
589 | } | ||
590 | |||
591 | static uint32_t gfar_get_tx_csum(struct net_device *dev) | ||
592 | { | ||
593 | struct gfar_private *priv = netdev_priv(dev); | ||
594 | |||
595 | if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_CSUM)) | ||
596 | return 0; | ||
597 | |||
598 | return (dev->features & NETIF_F_IP_CSUM) != 0; | ||
599 | } | ||
600 | |||
601 | static uint32_t gfar_get_msglevel(struct net_device *dev) | 558 | static uint32_t gfar_get_msglevel(struct net_device *dev) |
602 | { | 559 | { |
603 | struct gfar_private *priv = netdev_priv(dev); | 560 | struct gfar_private *priv = netdev_priv(dev); |
@@ -635,51 +592,16 @@ static int gfar_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | |||
635 | if (wol->wolopts & ~WAKE_MAGIC) | 592 | if (wol->wolopts & ~WAKE_MAGIC) |
636 | return -EINVAL; | 593 | return -EINVAL; |
637 | 594 | ||
595 | device_set_wakeup_enable(&dev->dev, wol->wolopts & WAKE_MAGIC); | ||
596 | |||
638 | spin_lock_irqsave(&priv->bflock, flags); | 597 | spin_lock_irqsave(&priv->bflock, flags); |
639 | priv->wol_en = wol->wolopts & WAKE_MAGIC ? 1 : 0; | 598 | priv->wol_en = !!device_may_wakeup(&dev->dev); |
640 | device_set_wakeup_enable(&dev->dev, priv->wol_en); | ||
641 | spin_unlock_irqrestore(&priv->bflock, flags); | 599 | spin_unlock_irqrestore(&priv->bflock, flags); |
642 | 600 | ||
643 | return 0; | 601 | return 0; |
644 | } | 602 | } |
645 | #endif | 603 | #endif |
646 | 604 | ||
647 | static int gfar_ethflow_to_class(int flow_type, u64 *class) | ||
648 | { | ||
649 | switch (flow_type) { | ||
650 | case TCP_V4_FLOW: | ||
651 | *class = CLASS_CODE_TCP_IPV4; | ||
652 | break; | ||
653 | case UDP_V4_FLOW: | ||
654 | *class = CLASS_CODE_UDP_IPV4; | ||
655 | break; | ||
656 | case AH_V4_FLOW: | ||
657 | case ESP_V4_FLOW: | ||
658 | *class = CLASS_CODE_AH_ESP_IPV4; | ||
659 | break; | ||
660 | case SCTP_V4_FLOW: | ||
661 | *class = CLASS_CODE_SCTP_IPV4; | ||
662 | break; | ||
663 | case TCP_V6_FLOW: | ||
664 | *class = CLASS_CODE_TCP_IPV6; | ||
665 | break; | ||
666 | case UDP_V6_FLOW: | ||
667 | *class = CLASS_CODE_UDP_IPV6; | ||
668 | break; | ||
669 | case AH_V6_FLOW: | ||
670 | case ESP_V6_FLOW: | ||
671 | *class = CLASS_CODE_AH_ESP_IPV6; | ||
672 | break; | ||
673 | case SCTP_V6_FLOW: | ||
674 | *class = CLASS_CODE_SCTP_IPV6; | ||
675 | break; | ||
676 | default: | ||
677 | return 0; | ||
678 | } | ||
679 | |||
680 | return 1; | ||
681 | } | ||
682 | |||
683 | static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | 605 | static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) |
684 | { | 606 | { |
685 | u32 fcr = 0x0, fpr = FPR_FILER_MASK; | 607 | u32 fcr = 0x0, fpr = FPR_FILER_MASK; |
@@ -687,15 +609,15 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
687 | if (ethflow & RXH_L2DA) { | 609 | if (ethflow & RXH_L2DA) { |
688 | fcr = RQFCR_PID_DAH |RQFCR_CMP_NOMATCH | | 610 | fcr = RQFCR_PID_DAH |RQFCR_CMP_NOMATCH | |
689 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; | 611 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; |
690 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 612 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
691 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 613 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
692 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 614 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
693 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 615 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
694 | 616 | ||
695 | fcr = RQFCR_PID_DAL | RQFCR_AND | RQFCR_CMP_NOMATCH | | 617 | fcr = RQFCR_PID_DAL | RQFCR_AND | RQFCR_CMP_NOMATCH | |
696 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; | 618 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; |
697 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 619 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
698 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 620 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
699 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 621 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
700 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 622 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
701 | } | 623 | } |
@@ -704,16 +626,16 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
704 | fcr = RQFCR_PID_VID | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 626 | fcr = RQFCR_PID_VID | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
705 | RQFCR_AND | RQFCR_HASHTBL_0; | 627 | RQFCR_AND | RQFCR_HASHTBL_0; |
706 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 628 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
707 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 629 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
708 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 630 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
709 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 631 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
710 | } | 632 | } |
711 | 633 | ||
712 | if (ethflow & RXH_IP_SRC) { | 634 | if (ethflow & RXH_IP_SRC) { |
713 | fcr = RQFCR_PID_SIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 635 | fcr = RQFCR_PID_SIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
714 | RQFCR_AND | RQFCR_HASHTBL_0; | 636 | RQFCR_AND | RQFCR_HASHTBL_0; |
715 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 637 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
716 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 638 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
717 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 639 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
718 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 640 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
719 | } | 641 | } |
@@ -721,8 +643,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
721 | if (ethflow & (RXH_IP_DST)) { | 643 | if (ethflow & (RXH_IP_DST)) { |
722 | fcr = RQFCR_PID_DIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 644 | fcr = RQFCR_PID_DIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
723 | RQFCR_AND | RQFCR_HASHTBL_0; | 645 | RQFCR_AND | RQFCR_HASHTBL_0; |
724 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 646 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
725 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 647 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
726 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 648 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
727 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 649 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
728 | } | 650 | } |
@@ -730,8 +652,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
730 | if (ethflow & RXH_L3_PROTO) { | 652 | if (ethflow & RXH_L3_PROTO) { |
731 | fcr = RQFCR_PID_L4P | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 653 | fcr = RQFCR_PID_L4P | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
732 | RQFCR_AND | RQFCR_HASHTBL_0; | 654 | RQFCR_AND | RQFCR_HASHTBL_0; |
733 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 655 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
734 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 656 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
735 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 657 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
736 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 658 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
737 | } | 659 | } |
@@ -739,8 +661,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
739 | if (ethflow & RXH_L4_B_0_1) { | 661 | if (ethflow & RXH_L4_B_0_1) { |
740 | fcr = RQFCR_PID_SPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 662 | fcr = RQFCR_PID_SPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
741 | RQFCR_AND | RQFCR_HASHTBL_0; | 663 | RQFCR_AND | RQFCR_HASHTBL_0; |
742 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 664 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
743 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 665 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
744 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 666 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
745 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 667 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
746 | } | 668 | } |
@@ -748,8 +670,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
748 | if (ethflow & RXH_L4_B_2_3) { | 670 | if (ethflow & RXH_L4_B_2_3) { |
749 | fcr = RQFCR_PID_DPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 671 | fcr = RQFCR_PID_DPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
750 | RQFCR_AND | RQFCR_HASHTBL_0; | 672 | RQFCR_AND | RQFCR_HASHTBL_0; |
751 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 673 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
752 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 674 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
753 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 675 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
754 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 676 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
755 | } | 677 | } |
@@ -777,23 +699,18 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
777 | case UDP_V6_FLOW: | 699 | case UDP_V6_FLOW: |
778 | cmp_rqfpr = RQFPR_IPV6 |RQFPR_UDP; | 700 | cmp_rqfpr = RQFPR_IPV6 |RQFPR_UDP; |
779 | break; | 701 | break; |
780 | case IPV4_FLOW: | ||
781 | cmp_rqfpr = RQFPR_IPV4; | ||
782 | case IPV6_FLOW: | ||
783 | cmp_rqfpr = RQFPR_IPV6; | ||
784 | break; | ||
785 | default: | 702 | default: |
786 | printk(KERN_ERR "Right now this class is not supported\n"); | 703 | printk(KERN_ERR "Right now this class is not supported\n"); |
787 | return 0; | 704 | return 0; |
788 | } | 705 | } |
789 | 706 | ||
790 | for (i = 0; i < MAX_FILER_IDX + 1; i++) { | 707 | for (i = 0; i < MAX_FILER_IDX + 1; i++) { |
791 | local_rqfpr[j] = ftp_rqfpr[i]; | 708 | local_rqfpr[j] = priv->ftp_rqfpr[i]; |
792 | local_rqfcr[j] = ftp_rqfcr[i]; | 709 | local_rqfcr[j] = priv->ftp_rqfcr[i]; |
793 | j--; | 710 | j--; |
794 | if ((ftp_rqfcr[i] == (RQFCR_PID_PARSE | | 711 | if ((priv->ftp_rqfcr[i] == (RQFCR_PID_PARSE | |
795 | RQFCR_CLE |RQFCR_AND)) && | 712 | RQFCR_CLE |RQFCR_AND)) && |
796 | (ftp_rqfpr[i] == cmp_rqfpr)) | 713 | (priv->ftp_rqfpr[i] == cmp_rqfpr)) |
797 | break; | 714 | break; |
798 | } | 715 | } |
799 | 716 | ||
@@ -807,20 +724,22 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
807 | * if it was already programmed, we need to overwrite these rules | 724 | * if it was already programmed, we need to overwrite these rules |
808 | */ | 725 | */ |
809 | for (l = i+1; l < MAX_FILER_IDX; l++) { | 726 | for (l = i+1; l < MAX_FILER_IDX; l++) { |
810 | if ((ftp_rqfcr[l] & RQFCR_CLE) && | 727 | if ((priv->ftp_rqfcr[l] & RQFCR_CLE) && |
811 | !(ftp_rqfcr[l] & RQFCR_AND)) { | 728 | !(priv->ftp_rqfcr[l] & RQFCR_AND)) { |
812 | ftp_rqfcr[l] = RQFCR_CLE | RQFCR_CMP_EXACT | | 729 | priv->ftp_rqfcr[l] = RQFCR_CLE | RQFCR_CMP_EXACT | |
813 | RQFCR_HASHTBL_0 | RQFCR_PID_MASK; | 730 | RQFCR_HASHTBL_0 | RQFCR_PID_MASK; |
814 | ftp_rqfpr[l] = FPR_FILER_MASK; | 731 | priv->ftp_rqfpr[l] = FPR_FILER_MASK; |
815 | gfar_write_filer(priv, l, ftp_rqfcr[l], ftp_rqfpr[l]); | 732 | gfar_write_filer(priv, l, priv->ftp_rqfcr[l], |
733 | priv->ftp_rqfpr[l]); | ||
816 | break; | 734 | break; |
817 | } | 735 | } |
818 | 736 | ||
819 | if (!(ftp_rqfcr[l] & RQFCR_CLE) && (ftp_rqfcr[l] & RQFCR_AND)) | 737 | if (!(priv->ftp_rqfcr[l] & RQFCR_CLE) && |
738 | (priv->ftp_rqfcr[l] & RQFCR_AND)) | ||
820 | continue; | 739 | continue; |
821 | else { | 740 | else { |
822 | local_rqfpr[j] = ftp_rqfpr[l]; | 741 | local_rqfpr[j] = priv->ftp_rqfpr[l]; |
823 | local_rqfcr[j] = ftp_rqfcr[l]; | 742 | local_rqfcr[j] = priv->ftp_rqfcr[l]; |
824 | j--; | 743 | j--; |
825 | } | 744 | } |
826 | } | 745 | } |
@@ -833,8 +752,8 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
833 | 752 | ||
834 | /* Write back the popped out rules again */ | 753 | /* Write back the popped out rules again */ |
835 | for (k = j+1; k < MAX_FILER_IDX; k++) { | 754 | for (k = j+1; k < MAX_FILER_IDX; k++) { |
836 | ftp_rqfpr[priv->cur_filer_idx] = local_rqfpr[k]; | 755 | priv->ftp_rqfpr[priv->cur_filer_idx] = local_rqfpr[k]; |
837 | ftp_rqfcr[priv->cur_filer_idx] = local_rqfcr[k]; | 756 | priv->ftp_rqfcr[priv->cur_filer_idx] = local_rqfcr[k]; |
838 | gfar_write_filer(priv, priv->cur_filer_idx, | 757 | gfar_write_filer(priv, priv->cur_filer_idx, |
839 | local_rqfcr[k], local_rqfpr[k]); | 758 | local_rqfcr[k], local_rqfpr[k]); |
840 | if (!priv->cur_filer_idx) | 759 | if (!priv->cur_filer_idx) |
@@ -847,18 +766,9 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
847 | 766 | ||
848 | static int gfar_set_hash_opts(struct gfar_private *priv, struct ethtool_rxnfc *cmd) | 767 | static int gfar_set_hash_opts(struct gfar_private *priv, struct ethtool_rxnfc *cmd) |
849 | { | 768 | { |
850 | u64 class; | ||
851 | |||
852 | if (!gfar_ethflow_to_class(cmd->flow_type, &class)) | ||
853 | return -EINVAL; | ||
854 | |||
855 | if (class < CLASS_CODE_USER_PROG1 || | ||
856 | class > CLASS_CODE_SCTP_IPV6) | ||
857 | return -EINVAL; | ||
858 | |||
859 | /* write the filer rules here */ | 769 | /* write the filer rules here */ |
860 | if (!gfar_ethflow_to_filer_table(priv, cmd->data, cmd->flow_type)) | 770 | if (!gfar_ethflow_to_filer_table(priv, cmd->data, cmd->flow_type)) |
861 | return -1; | 771 | return -EINVAL; |
862 | 772 | ||
863 | return 0; | 773 | return 0; |
864 | } | 774 | } |
@@ -893,11 +803,6 @@ const struct ethtool_ops gfar_ethtool_ops = { | |||
893 | .get_strings = gfar_gstrings, | 803 | .get_strings = gfar_gstrings, |
894 | .get_sset_count = gfar_sset_count, | 804 | .get_sset_count = gfar_sset_count, |
895 | .get_ethtool_stats = gfar_fill_stats, | 805 | .get_ethtool_stats = gfar_fill_stats, |
896 | .get_rx_csum = gfar_get_rx_csum, | ||
897 | .get_tx_csum = gfar_get_tx_csum, | ||
898 | .set_rx_csum = gfar_set_rx_csum, | ||
899 | .set_tx_csum = gfar_set_tx_csum, | ||
900 | .set_sg = ethtool_op_set_sg, | ||
901 | .get_msglevel = gfar_get_msglevel, | 806 | .get_msglevel = gfar_get_msglevel, |
902 | .set_msglevel = gfar_set_msglevel, | 807 | .set_msglevel = gfar_set_msglevel, |
903 | #ifdef CONFIG_PM | 808 | #ifdef CONFIG_PM |