diff options
Diffstat (limited to 'drivers/net/skge.c')
-rw-r--r-- | drivers/net/skge.c | 86 |
1 files changed, 21 insertions, 65 deletions
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 35b28f42d208..310dcbce2519 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -537,46 +537,6 @@ static int skge_nway_reset(struct net_device *dev) | |||
537 | return 0; | 537 | return 0; |
538 | } | 538 | } |
539 | 539 | ||
540 | static int skge_set_sg(struct net_device *dev, u32 data) | ||
541 | { | ||
542 | struct skge_port *skge = netdev_priv(dev); | ||
543 | struct skge_hw *hw = skge->hw; | ||
544 | |||
545 | if (hw->chip_id == CHIP_ID_GENESIS && data) | ||
546 | return -EOPNOTSUPP; | ||
547 | return ethtool_op_set_sg(dev, data); | ||
548 | } | ||
549 | |||
550 | static int skge_set_tx_csum(struct net_device *dev, u32 data) | ||
551 | { | ||
552 | struct skge_port *skge = netdev_priv(dev); | ||
553 | struct skge_hw *hw = skge->hw; | ||
554 | |||
555 | if (hw->chip_id == CHIP_ID_GENESIS && data) | ||
556 | return -EOPNOTSUPP; | ||
557 | |||
558 | return ethtool_op_set_tx_csum(dev, data); | ||
559 | } | ||
560 | |||
561 | static u32 skge_get_rx_csum(struct net_device *dev) | ||
562 | { | ||
563 | struct skge_port *skge = netdev_priv(dev); | ||
564 | |||
565 | return skge->rx_csum; | ||
566 | } | ||
567 | |||
568 | /* Only Yukon supports checksum offload. */ | ||
569 | static int skge_set_rx_csum(struct net_device *dev, u32 data) | ||
570 | { | ||
571 | struct skge_port *skge = netdev_priv(dev); | ||
572 | |||
573 | if (skge->hw->chip_id == CHIP_ID_GENESIS && data) | ||
574 | return -EOPNOTSUPP; | ||
575 | |||
576 | skge->rx_csum = data; | ||
577 | return 0; | ||
578 | } | ||
579 | |||
580 | static void skge_get_pauseparam(struct net_device *dev, | 540 | static void skge_get_pauseparam(struct net_device *dev, |
581 | struct ethtool_pauseparam *ecmd) | 541 | struct ethtool_pauseparam *ecmd) |
582 | { | 542 | { |
@@ -786,28 +746,27 @@ static void skge_led(struct skge_port *skge, enum led_mode mode) | |||
786 | } | 746 | } |
787 | 747 | ||
788 | /* blink LED's for finding board */ | 748 | /* blink LED's for finding board */ |
789 | static int skge_phys_id(struct net_device *dev, u32 data) | 749 | static int skge_set_phys_id(struct net_device *dev, |
750 | enum ethtool_phys_id_state state) | ||
790 | { | 751 | { |
791 | struct skge_port *skge = netdev_priv(dev); | 752 | struct skge_port *skge = netdev_priv(dev); |
792 | unsigned long ms; | ||
793 | enum led_mode mode = LED_MODE_TST; | ||
794 | 753 | ||
795 | if (!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ)) | 754 | switch (state) { |
796 | ms = jiffies_to_msecs(MAX_SCHEDULE_TIMEOUT / HZ) * 1000; | 755 | case ETHTOOL_ID_ACTIVE: |
797 | else | 756 | return -EINVAL; |
798 | ms = data * 1000; | ||
799 | 757 | ||
800 | while (ms > 0) { | 758 | case ETHTOOL_ID_ON: |
801 | skge_led(skge, mode); | 759 | skge_led(skge, LED_MODE_TST); |
802 | mode ^= LED_MODE_TST; | 760 | break; |
803 | 761 | ||
804 | if (msleep_interruptible(BLINK_MS)) | 762 | case ETHTOOL_ID_OFF: |
805 | break; | 763 | skge_led(skge, LED_MODE_OFF); |
806 | ms -= BLINK_MS; | 764 | break; |
807 | } | ||
808 | 765 | ||
809 | /* back to regular LED state */ | 766 | case ETHTOOL_ID_INACTIVE: |
810 | skge_led(skge, netif_running(dev) ? LED_MODE_ON : LED_MODE_OFF); | 767 | /* back to regular LED state */ |
768 | skge_led(skge, netif_running(dev) ? LED_MODE_ON : LED_MODE_OFF); | ||
769 | } | ||
811 | 770 | ||
812 | return 0; | 771 | return 0; |
813 | } | 772 | } |
@@ -925,12 +884,8 @@ static const struct ethtool_ops skge_ethtool_ops = { | |||
925 | .set_pauseparam = skge_set_pauseparam, | 884 | .set_pauseparam = skge_set_pauseparam, |
926 | .get_coalesce = skge_get_coalesce, | 885 | .get_coalesce = skge_get_coalesce, |
927 | .set_coalesce = skge_set_coalesce, | 886 | .set_coalesce = skge_set_coalesce, |
928 | .set_sg = skge_set_sg, | ||
929 | .set_tx_csum = skge_set_tx_csum, | ||
930 | .get_rx_csum = skge_get_rx_csum, | ||
931 | .set_rx_csum = skge_set_rx_csum, | ||
932 | .get_strings = skge_get_strings, | 887 | .get_strings = skge_get_strings, |
933 | .phys_id = skge_phys_id, | 888 | .set_phys_id = skge_set_phys_id, |
934 | .get_sset_count = skge_get_sset_count, | 889 | .get_sset_count = skge_get_sset_count, |
935 | .get_ethtool_stats = skge_get_ethtool_stats, | 890 | .get_ethtool_stats = skge_get_ethtool_stats, |
936 | }; | 891 | }; |
@@ -3085,7 +3040,8 @@ static struct sk_buff *skge_rx_get(struct net_device *dev, | |||
3085 | } | 3040 | } |
3086 | 3041 | ||
3087 | skb_put(skb, len); | 3042 | skb_put(skb, len); |
3088 | if (skge->rx_csum) { | 3043 | |
3044 | if (dev->features & NETIF_F_RXCSUM) { | ||
3089 | skb->csum = csum; | 3045 | skb->csum = csum; |
3090 | skb->ip_summed = CHECKSUM_COMPLETE; | 3046 | skb->ip_summed = CHECKSUM_COMPLETE; |
3091 | } | 3047 | } |
@@ -3847,10 +3803,10 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port, | |||
3847 | setup_timer(&skge->link_timer, xm_link_timer, (unsigned long) skge); | 3803 | setup_timer(&skge->link_timer, xm_link_timer, (unsigned long) skge); |
3848 | 3804 | ||
3849 | if (hw->chip_id != CHIP_ID_GENESIS) { | 3805 | if (hw->chip_id != CHIP_ID_GENESIS) { |
3850 | dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; | 3806 | dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG | |
3851 | skge->rx_csum = 1; | 3807 | NETIF_F_RXCSUM; |
3808 | dev->features |= dev->hw_features; | ||
3852 | } | 3809 | } |
3853 | dev->features |= NETIF_F_GRO; | ||
3854 | 3810 | ||
3855 | /* read the mac address */ | 3811 | /* read the mac address */ |
3856 | memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN); | 3812 | memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN); |