struct slave *slave;
        struct net_device *bond_dev = bond->dev;
        unsigned long features = bond_dev->features;
-       unsigned short max_hard_header_len = ETH_HLEN;
+       unsigned short max_hard_header_len = max((u16)ETH_HLEN,
+                                               bond_dev->hard_header_len);
        int i;
 
        features &= ~(NETIF_F_ALL_CSUM | BOND_VLAN_FEATURES);
 
        char command[IFNAMSIZ + 1] = { 0, };
        char *ifname;
        int i, res, found, ret = count;
+       u32 original_mtu;
        struct slave *slave;
        struct net_device *dev = NULL;
        struct bonding *bond = to_bond(d);
                }
 
                /* Set the slave's MTU to match the bond */
+               original_mtu = dev->mtu;
                if (dev->mtu != bond->dev->mtu) {
                        if (dev->change_mtu) {
                                res = dev->change_mtu(dev,
                }
                rtnl_lock();
                res = bond_enslave(bond->dev, dev);
+               bond_for_each_slave(bond, slave, i)
+                       if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0)
+                               slave->original_mtu = original_mtu;
                rtnl_unlock();
                if (res) {
                        ret = res;
                bond_for_each_slave(bond, slave, i)
                        if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
                                dev = slave->dev;
+                               original_mtu = slave->original_mtu;
                                break;
                        }
                if (dev) {
                        }
                        /* set the slave MTU to the default */
                        if (dev->change_mtu) {
-                               dev->change_mtu(dev, 1500);
+                               dev->change_mtu(dev, original_mtu);
                        } else {
-                               dev->mtu = 1500;
+                               dev->mtu = original_mtu;
                        }
                }
                else {