[PATCH] bonding: fix feature consolidation
[pandora-kernel.git] / drivers / net / bonding / bond_main.c
index 8032126..94cec3c 100644 (file)
@@ -1604,35 +1604,27 @@ static int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_
        (NETIF_F_SG|NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM)
 
 /* 
- * Compute the features available to the bonding device by 
- * intersection of all of the slave devices' BOND_INTERSECT_FEATURES.
- * Call this after attaching or detaching a slave to update the 
- * bond's features.
+ * Compute the common dev->feature set available to all slaves.  Some
+ * feature bits are managed elsewhere, so preserve feature bits set on
+ * master device that are not part of the examined set.
  */
 static int bond_compute_features(struct bonding *bond)
 {
-       int i;
+       unsigned long features = BOND_INTERSECT_FEATURES;
        struct slave *slave;
        struct net_device *bond_dev = bond->dev;
-       int features = bond->bond_features;
+       int i;
 
-       bond_for_each_slave(bond, slave, i) {
-               struct net_device * slave_dev = slave->dev;
-               if (i == 0) {
-                       features |= BOND_INTERSECT_FEATURES;
-               }
-               features &=
-                       ~(~slave_dev->features & BOND_INTERSECT_FEATURES);
-       }
+       bond_for_each_slave(bond, slave, i)
+               features &= (slave->dev->features & BOND_INTERSECT_FEATURES);
 
-       /* turn off NETIF_F_SG if we need a csum and h/w can't do it */
        if ((features & NETIF_F_SG) && 
-               !(features & (NETIF_F_IP_CSUM |
-                             NETIF_F_NO_CSUM |
-                             NETIF_F_HW_CSUM))) {
+           !(features & (NETIF_F_IP_CSUM |
+                         NETIF_F_NO_CSUM |
+                         NETIF_F_HW_CSUM)))
                features &= ~NETIF_F_SG;
-       }
 
+       features |= (bond_dev->features & ~BOND_INTERSECT_FEATURES);
        bond_dev->features = features;
 
        return 0;
@@ -4561,8 +4553,6 @@ static int __init bond_init(struct net_device *bond_dev, struct bond_params *par
                               NETIF_F_HW_VLAN_RX |
                               NETIF_F_HW_VLAN_FILTER);
 
-       bond->bond_features = bond_dev->features;
-
 #ifdef CONFIG_PROC_FS
        bond_create_proc_entry(bond);
 #endif