aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/skge.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/skge.c')
-rw-r--r--drivers/net/skge.c86
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
540static 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
550static 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
561static 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. */
569static 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
580static void skge_get_pauseparam(struct net_device *dev, 540static 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 */
789static int skge_phys_id(struct net_device *dev, u32 data) 749static 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);