ixgbevf: convert to ndo_fix_features
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>
Wed, 8 Jun 2011 08:53:03 +0000 (08:53 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 27 Aug 2011 06:55:12 +0000 (23:55 -0700)
Private rx_csum flags are now duplicate of netdev->features & NETIF_F_RXCSUM.
Removing this needs deeper surgery.

Since ixgbevf doesn't change hardware state on RX csum enable/disable
its reset is avoided.

Things noticed:
 - HW VLAN acceleration probably can be toggled, but it's left as is
 - the resets on RX csum offload change can probably be avoided
 - there is A LOT of copy-and-pasted code here

Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbevf/ethtool.c
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c

index deee3754b1f7a29e186c8b90549fb438c7d350a4..e1d9e3b634480e67369ab676e43e3c691f00aea0 100644 (file)
@@ -117,44 +117,6 @@ static int ixgbevf_get_settings(struct net_device *netdev,
        return 0;
 }
 
-static u32 ixgbevf_get_rx_csum(struct net_device *netdev)
-{
-       struct ixgbevf_adapter *adapter = netdev_priv(netdev);
-       return adapter->flags & IXGBE_FLAG_RX_CSUM_ENABLED;
-}
-
-static int ixgbevf_set_rx_csum(struct net_device *netdev, u32 data)
-{
-       struct ixgbevf_adapter *adapter = netdev_priv(netdev);
-       if (data)
-               adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
-       else
-               adapter->flags &= ~IXGBE_FLAG_RX_CSUM_ENABLED;
-
-       if (netif_running(netdev)) {
-               if (!adapter->dev_closed)
-                       ixgbevf_reinit_locked(adapter);
-       } else {
-               ixgbevf_reset(adapter);
-       }
-
-       return 0;
-}
-
-static int ixgbevf_set_tso(struct net_device *netdev, u32 data)
-{
-       if (data) {
-               netdev->features |= NETIF_F_TSO;
-               netdev->features |= NETIF_F_TSO6;
-       } else {
-               netif_tx_stop_all_queues(netdev);
-               netdev->features &= ~NETIF_F_TSO;
-               netdev->features &= ~NETIF_F_TSO6;
-               netif_tx_start_all_queues(netdev);
-       }
-       return 0;
-}
-
 static u32 ixgbevf_get_msglevel(struct net_device *netdev)
 {
        struct ixgbevf_adapter *adapter = netdev_priv(netdev);
@@ -720,16 +682,8 @@ static struct ethtool_ops ixgbevf_ethtool_ops = {
        .get_link               = ethtool_op_get_link,
        .get_ringparam          = ixgbevf_get_ringparam,
        .set_ringparam          = ixgbevf_set_ringparam,
-       .get_rx_csum            = ixgbevf_get_rx_csum,
-       .set_rx_csum            = ixgbevf_set_rx_csum,
-       .get_tx_csum            = ethtool_op_get_tx_csum,
-       .set_tx_csum            = ethtool_op_set_tx_ipv6_csum,
-       .get_sg                 = ethtool_op_get_sg,
-       .set_sg                 = ethtool_op_set_sg,
        .get_msglevel           = ixgbevf_get_msglevel,
        .set_msglevel           = ixgbevf_set_msglevel,
-       .get_tso                = ethtool_op_get_tso,
-       .set_tso                = ixgbevf_set_tso,
        .self_test              = ixgbevf_diag_test,
        .get_sset_count         = ixgbevf_get_sset_count,
        .get_strings            = ixgbevf_get_strings,
index bc12dd8d474a9b08e88875419be3c8d48d494187..98963970206eb49d8391feb27c7a085301c3ce60 100644 (file)
@@ -3253,6 +3253,18 @@ static struct rtnl_link_stats64 *ixgbevf_get_stats(struct net_device *netdev,
        return stats;
 }
 
+static int ixgbevf_set_features(struct net_device *netdev, u32 features)
+{
+       struct ixgbevf_adapter *adapter = netdev_priv(netdev);
+
+       if (features & NETIF_F_RXCSUM)
+               adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
+       else
+               adapter->flags &= ~IXGBE_FLAG_RX_CSUM_ENABLED;
+
+       return 0;
+}
+
 static const struct net_device_ops ixgbe_netdev_ops = {
        .ndo_open               = ixgbevf_open,
        .ndo_stop               = ixgbevf_close,
@@ -3265,6 +3277,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
        .ndo_tx_timeout         = ixgbevf_tx_timeout,
        .ndo_vlan_rx_add_vid    = ixgbevf_vlan_rx_add_vid,
        .ndo_vlan_rx_kill_vid   = ixgbevf_vlan_rx_kill_vid,
+       .ndo_set_features       = ixgbevf_set_features,
 };
 
 static void ixgbevf_assign_netdev_ops(struct net_device *dev)
@@ -3377,16 +3390,18 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev,
        /* setup the private structure */
        err = ixgbevf_sw_init(adapter);
 
-       netdev->features = NETIF_F_SG |
+       netdev->hw_features = NETIF_F_SG |
                           NETIF_F_IP_CSUM |
+                          NETIF_F_IPV6_CSUM |
+                          NETIF_F_TSO |
+                          NETIF_F_TSO6 |
+                          NETIF_F_RXCSUM;
+
+       netdev->features = netdev->hw_features |
                           NETIF_F_HW_VLAN_TX |
                           NETIF_F_HW_VLAN_RX |
                           NETIF_F_HW_VLAN_FILTER;
 
-       netdev->features |= NETIF_F_IPV6_CSUM;
-       netdev->features |= NETIF_F_TSO;
-       netdev->features |= NETIF_F_TSO6;
-       netdev->features |= NETIF_F_GRO;
        netdev->vlan_features |= NETIF_F_TSO;
        netdev->vlan_features |= NETIF_F_TSO6;
        netdev->vlan_features |= NETIF_F_IP_CSUM;