igb: convert to ndo_fix_features
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>
Wed, 8 Jun 2011 08:38:01 +0000 (08:38 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 21 Jun 2011 08:15:07 +0000 (01:15 -0700)
Private rx_csum flags are now duplicate of netdev->features & NETIF_F_RXCSUM.
Removing this needs deeper surgery.

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>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/igb/igb_ethtool.c
drivers/net/igb/igb_main.c

index fdc895e5a3f86afe3442e1ea4bdfe1a1890d9a8e..1862c97508ea712dbd5f7f727e22f32fafab988f 100644 (file)
@@ -318,65 +318,6 @@ static int igb_set_pauseparam(struct net_device *netdev,
        return retval;
 }
 
-static u32 igb_get_rx_csum(struct net_device *netdev)
-{
-       struct igb_adapter *adapter = netdev_priv(netdev);
-       return !!(adapter->rx_ring[0]->flags & IGB_RING_FLAG_RX_CSUM);
-}
-
-static int igb_set_rx_csum(struct net_device *netdev, u32 data)
-{
-       struct igb_adapter *adapter = netdev_priv(netdev);
-       int i;
-
-       for (i = 0; i < adapter->num_rx_queues; i++) {
-               if (data)
-                       adapter->rx_ring[i]->flags |= IGB_RING_FLAG_RX_CSUM;
-               else
-                       adapter->rx_ring[i]->flags &= ~IGB_RING_FLAG_RX_CSUM;
-       }
-
-       return 0;
-}
-
-static u32 igb_get_tx_csum(struct net_device *netdev)
-{
-       return (netdev->features & NETIF_F_IP_CSUM) != 0;
-}
-
-static int igb_set_tx_csum(struct net_device *netdev, u32 data)
-{
-       struct igb_adapter *adapter = netdev_priv(netdev);
-
-       if (data) {
-               netdev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
-               if (adapter->hw.mac.type >= e1000_82576)
-                       netdev->features |= NETIF_F_SCTP_CSUM;
-       } else {
-               netdev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
-                                     NETIF_F_SCTP_CSUM);
-       }
-
-       return 0;
-}
-
-static int igb_set_tso(struct net_device *netdev, u32 data)
-{
-       struct igb_adapter *adapter = netdev_priv(netdev);
-
-       if (data) {
-               netdev->features |= NETIF_F_TSO;
-               netdev->features |= NETIF_F_TSO6;
-       } else {
-               netdev->features &= ~NETIF_F_TSO;
-               netdev->features &= ~NETIF_F_TSO6;
-       }
-
-       dev_info(&adapter->pdev->dev, "TSO is %s\n",
-                data ? "Enabled" : "Disabled");
-       return 0;
-}
-
 static u32 igb_get_msglevel(struct net_device *netdev)
 {
        struct igb_adapter *adapter = netdev_priv(netdev);
@@ -2207,14 +2148,6 @@ static const struct ethtool_ops igb_ethtool_ops = {
        .set_ringparam          = igb_set_ringparam,
        .get_pauseparam         = igb_get_pauseparam,
        .set_pauseparam         = igb_set_pauseparam,
-       .get_rx_csum            = igb_get_rx_csum,
-       .set_rx_csum            = igb_set_rx_csum,
-       .get_tx_csum            = igb_get_tx_csum,
-       .set_tx_csum            = igb_set_tx_csum,
-       .get_sg                 = ethtool_op_get_sg,
-       .set_sg                 = ethtool_op_set_sg,
-       .get_tso                = ethtool_op_get_tso,
-       .set_tso                = igb_set_tso,
        .self_test              = igb_diag_test,
        .get_strings            = igb_get_strings,
        .set_phys_id            = igb_set_phys_id,
index fd64c56a433d536d831d12b8db6be6f92d5546dc..6e67258c4b4e91303aa643e001d6cb6816b1411d 100644 (file)
@@ -1748,6 +1748,21 @@ void igb_reset(struct igb_adapter *adapter)
        igb_get_phy_info(hw);
 }
 
+static int igb_set_features(struct net_device *netdev, u32 features)
+{
+       struct igb_adapter *adapter = netdev_priv(netdev);
+       int i;
+
+       for (i = 0; i < adapter->num_rx_queues; i++) {
+               if (features & NETIF_F_RXCSUM)
+                       adapter->rx_ring[i]->flags |= IGB_RING_FLAG_RX_CSUM;
+               else
+                       adapter->rx_ring[i]->flags &= ~IGB_RING_FLAG_RX_CSUM;
+       }
+
+       return 0;
+}
+
 static const struct net_device_ops igb_netdev_ops = {
        .ndo_open               = igb_open,
        .ndo_stop               = igb_close,
@@ -1770,6 +1785,7 @@ static const struct net_device_ops igb_netdev_ops = {
 #ifdef CONFIG_NET_POLL_CONTROLLER
        .ndo_poll_controller    = igb_netpoll,
 #endif
+       .ndo_set_features       = igb_set_features,
 };
 
 /**
@@ -1909,17 +1925,18 @@ static int __devinit igb_probe(struct pci_dev *pdev,
                dev_info(&pdev->dev,
                        "PHY reset is blocked due to SOL/IDER session.\n");
 
-       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;
@@ -1931,8 +1948,10 @@ static int __devinit igb_probe(struct pci_dev *pdev,
                netdev->vlan_features |= NETIF_F_HIGHDMA;
        }
 
-       if (hw->mac.type >= e1000_82576)
+       if (hw->mac.type >= e1000_82576) {
+               netdev->hw_features |= NETIF_F_SCTP_CSUM;
                netdev->features |= NETIF_F_SCTP_CSUM;
+       }
 
        adapter->en_mng_pt = igb_enable_mng_pass_thru(hw);