return -EOPNOTSUPP;
 }
 
+static u32 igbvf_get_rx_csum(struct net_device *netdev)
+{
+       struct igbvf_adapter *adapter = netdev_priv(netdev);
+       return !(adapter->flags & IGBVF_FLAG_RX_CSUM_DISABLED);
+}
+
+static int igbvf_set_rx_csum(struct net_device *netdev, u32 data)
+{
+       struct igbvf_adapter *adapter = netdev_priv(netdev);
+
+       if (data)
+               adapter->flags &= ~IGBVF_FLAG_RX_CSUM_DISABLED;
+       else
+               adapter->flags |= IGBVF_FLAG_RX_CSUM_DISABLED;
+
+       return 0;
+}
+
 static u32 igbvf_get_tx_csum(struct net_device *netdev)
 {
        return ((netdev->features & NETIF_F_IP_CSUM) != 0);
 static int igbvf_set_tso(struct net_device *netdev, u32 data)
 {
        struct igbvf_adapter *adapter = netdev_priv(netdev);
-       int i;
-       struct net_device *v_netdev;
 
        if (data) {
                netdev->features |= NETIF_F_TSO;
        } else {
                netdev->features &= ~NETIF_F_TSO;
                netdev->features &= ~NETIF_F_TSO6;
-               /* disable TSO on all VLANs if they're present */
-               if (!adapter->vlgrp)
-                       goto tso_out;
-               for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
-                       v_netdev = vlan_group_get_device(adapter->vlgrp, i);
-                       if (!v_netdev)
-                               continue;
-
-                       v_netdev->features &= ~NETIF_F_TSO;
-                       v_netdev->features &= ~NETIF_F_TSO6;
-                       vlan_group_set_device(adapter->vlgrp, i, v_netdev);
-               }
        }
 
-tso_out:
        dev_info(&adapter->pdev->dev, "TSO is %s\n",
                 data ? "Enabled" : "Disabled");
-       adapter->flags |= FLAG_TSO_FORCE;
        return 0;
 }
 
        .set_ringparam          = igbvf_set_ringparam,
        .get_pauseparam         = igbvf_get_pauseparam,
        .set_pauseparam         = igbvf_set_pauseparam,
+       .get_rx_csum            = igbvf_get_rx_csum,
+       .set_rx_csum            = igbvf_set_rx_csum,
        .get_tx_csum            = igbvf_get_tx_csum,
        .set_tx_csum            = igbvf_set_tx_csum,
        .get_sg                 = ethtool_op_get_sg,
 
 };
 
 /* hardware capability, feature, and workaround flags */
-#define FLAG_HAS_HW_VLAN_FILTER           (1 << 0)
-#define FLAG_HAS_JUMBO_FRAMES             (1 << 1)
-#define FLAG_MSI_ENABLED                  (1 << 2)
-#define FLAG_RX_CSUM_ENABLED              (1 << 3)
-#define FLAG_TSO_FORCE                    (1 << 4)
+#define IGBVF_FLAG_RX_CSUM_DISABLED             (1 << 0)
 
 #define IGBVF_RX_DESC_ADV(R, i)     \
        (&((((R).desc))[i].rx_desc))
 
 
 static struct igbvf_info igbvf_vf_info = {
        .mac                    = e1000_vfadapt,
-       .flags                  = FLAG_HAS_JUMBO_FRAMES
-                                 | FLAG_RX_CSUM_ENABLED,
+       .flags                  = 0,
        .pba                    = 10,
        .init_ops               = e1000_init_function_pointers_vf,
 };
        skb->ip_summed = CHECKSUM_NONE;
 
        /* Ignore Checksum bit is set or checksum is disabled through ethtool */
-       if ((status_err & E1000_RXD_STAT_IXSM))
+       if ((status_err & E1000_RXD_STAT_IXSM) ||
+           (adapter->flags & IGBVF_FLAG_RX_CSUM_DISABLED))
                return;
+
        /* TCP/UDP checksum error bit is set */
        if (status_err &
            (E1000_RXDEXT_STATERR_TCPE | E1000_RXDEXT_STATERR_IPE)) {
                adapter->hw_csum_err++;
                return;
        }
+
        /* It must be a TCP or UDP packet with a valid checksum */
        if (status_err & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS))
                skb->ip_summed = CHECKSUM_UNNECESSARY;
                return -EINVAL;
        }
 
-       /* Jumbo frame size limits */
-       if (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) {
-               if (!(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
-                       dev_err(&adapter->pdev->dev,
-                               "Jumbo Frames not supported.\n");
-                       return -EINVAL;
-               }
-       }
-
 #define MAX_STD_JUMBO_FRAME_SIZE 9234
        if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) {
                dev_err(&adapter->pdev->dev, "MTU > 9216 not supported.\n");