net: fec: fix ethtool set_pauseparam duplex bug
[deliverable/linux.git] / drivers / net / ethernet / freescale / fec_main.c
index 38d9d276ab8b8c006fe13f1aa76eac2e55a2d775..045ea71f2b5962622ec0dcab96e81016b2225956 100644 (file)
@@ -320,6 +320,11 @@ static void *swap_buffer(void *bufaddr, int len)
        return bufaddr;
 }
 
+static inline bool is_ipv4_pkt(struct sk_buff *skb)
+{
+       return skb->protocol == htons(ETH_P_IP) && ip_hdr(skb)->version == 4;
+}
+
 static int
 fec_enet_clear_csum(struct sk_buff *skb, struct net_device *ndev)
 {
@@ -330,7 +335,8 @@ fec_enet_clear_csum(struct sk_buff *skb, struct net_device *ndev)
        if (unlikely(skb_cow_head(skb, 0)))
                return -1;
 
-       ip_hdr(skb)->check = 0;
+       if (is_ipv4_pkt(skb))
+               ip_hdr(skb)->check = 0;
        *(__sum16 *)(skb->head + skb->csum_start + skb->csum_offset) = 0;
 
        return 0;
@@ -1661,6 +1667,7 @@ static int fec_enet_mii_probe(struct net_device *ndev)
        /* mask with MAC supported features */
        if (id_entry->driver_data & FEC_QUIRK_HAS_GBIT) {
                phy_dev->supported &= PHY_GBIT_FEATURES;
+               phy_dev->supported &= ~SUPPORTED_1000baseT_Half;
 #if !defined(CONFIG_M5272)
                phy_dev->supported |= SUPPORTED_Pause;
 #endif
@@ -1890,7 +1897,7 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
                phy_start_aneg(fep->phy_dev);
        }
        if (netif_running(ndev))
-               fec_restart(ndev, 0);
+               fec_restart(ndev, fep->full_duplex);
 
        return 0;
 }
This page took 0.024694 seconds and 5 git commands to generate.