Merge branch 'davinci-next' of git://gitorious.org/linux-davinci/linux-davinci into...
[pandora-kernel.git] / net / bridge / br_device.c
index 21e5901..a6b2f86 100644 (file)
@@ -74,13 +74,23 @@ out:
        return NETDEV_TX_OK;
 }
 
+static int br_dev_init(struct net_device *dev)
+{
+       struct net_bridge *br = netdev_priv(dev);
+
+       br->stats = alloc_percpu(struct br_cpu_netstats);
+       if (!br->stats)
+               return -ENOMEM;
+
+       return 0;
+}
+
 static int br_dev_open(struct net_device *dev)
 {
        struct net_bridge *br = netdev_priv(dev);
 
        netif_carrier_off(dev);
-
-       br_features_recompute(br);
+       netdev_update_features(dev);
        netif_start_queue(dev);
        br_stp_enable_bridge(br);
        br_multicast_open(br);
@@ -177,48 +187,11 @@ static void br_getinfo(struct net_device *dev, struct ethtool_drvinfo *info)
        strcpy(info->bus_info, "N/A");
 }
 
-static int br_set_sg(struct net_device *dev, u32 data)
-{
-       struct net_bridge *br = netdev_priv(dev);
-
-       if (data)
-               br->feature_mask |= NETIF_F_SG;
-       else
-               br->feature_mask &= ~NETIF_F_SG;
-
-       br_features_recompute(br);
-       return 0;
-}
-
-static int br_set_tso(struct net_device *dev, u32 data)
-{
-       struct net_bridge *br = netdev_priv(dev);
-
-       if (data)
-               br->feature_mask |= NETIF_F_TSO;
-       else
-               br->feature_mask &= ~NETIF_F_TSO;
-
-       br_features_recompute(br);
-       return 0;
-}
-
-static int br_set_tx_csum(struct net_device *dev, u32 data)
+static u32 br_fix_features(struct net_device *dev, u32 features)
 {
        struct net_bridge *br = netdev_priv(dev);
 
-       if (data)
-               br->feature_mask |= NETIF_F_NO_CSUM;
-       else
-               br->feature_mask &= ~NETIF_F_ALL_CSUM;
-
-       br_features_recompute(br);
-       return 0;
-}
-
-static int br_set_flags(struct net_device *netdev, u32 data)
-{
-       return ethtool_op_set_flags(netdev, data, ETH_FLAG_TXVLAN);
+       return br_features_recompute(br, features);
 }
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
@@ -319,21 +292,12 @@ static int br_del_slave(struct net_device *dev, struct net_device *slave_dev)
 static const struct ethtool_ops br_ethtool_ops = {
        .get_drvinfo    = br_getinfo,
        .get_link       = ethtool_op_get_link,
-       .get_tx_csum    = ethtool_op_get_tx_csum,
-       .set_tx_csum    = br_set_tx_csum,
-       .get_sg         = ethtool_op_get_sg,
-       .set_sg         = br_set_sg,
-       .get_tso        = ethtool_op_get_tso,
-       .set_tso        = br_set_tso,
-       .get_ufo        = ethtool_op_get_ufo,
-       .set_ufo        = ethtool_op_set_ufo,
-       .get_flags      = ethtool_op_get_flags,
-       .set_flags      = br_set_flags,
 };
 
 static const struct net_device_ops br_netdev_ops = {
        .ndo_open                = br_dev_open,
        .ndo_stop                = br_dev_stop,
+       .ndo_init                = br_dev_init,
        .ndo_start_xmit          = br_dev_xmit,
        .ndo_get_stats64         = br_get_stats64,
        .ndo_set_mac_address     = br_set_mac_address,
@@ -347,6 +311,7 @@ static const struct net_device_ops br_netdev_ops = {
 #endif
        .ndo_add_slave           = br_add_slave,
        .ndo_del_slave           = br_del_slave,
+       .ndo_fix_features        = br_fix_features,
 };
 
 static void br_dev_free(struct net_device *dev)
@@ -357,18 +322,49 @@ static void br_dev_free(struct net_device *dev)
        free_netdev(dev);
 }
 
+static struct device_type br_type = {
+       .name   = "bridge",
+};
+
 void br_dev_setup(struct net_device *dev)
 {
+       struct net_bridge *br = netdev_priv(dev);
+
        random_ether_addr(dev->dev_addr);
        ether_setup(dev);
 
        dev->netdev_ops = &br_netdev_ops;
        dev->destructor = br_dev_free;
        SET_ETHTOOL_OPS(dev, &br_ethtool_ops);
+       SET_NETDEV_DEVTYPE(dev, &br_type);
        dev->tx_queue_len = 0;
        dev->priv_flags = IFF_EBRIDGE;
 
        dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA |
                        NETIF_F_GSO_MASK | NETIF_F_NO_CSUM | NETIF_F_LLTX |
-                       NETIF_F_NETNS_LOCAL | NETIF_F_GSO | NETIF_F_HW_VLAN_TX;
+                       NETIF_F_NETNS_LOCAL | NETIF_F_HW_VLAN_TX;
+       dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA |
+                          NETIF_F_GSO_MASK | NETIF_F_NO_CSUM |
+                          NETIF_F_HW_VLAN_TX;
+
+       br->dev = dev;
+       spin_lock_init(&br->lock);
+       INIT_LIST_HEAD(&br->port_list);
+       spin_lock_init(&br->hash_lock);
+
+       br->bridge_id.prio[0] = 0x80;
+       br->bridge_id.prio[1] = 0x00;
+
+       memcpy(br->group_addr, br_group_address, ETH_ALEN);
+
+       br->stp_enabled = BR_NO_STP;
+       br->designated_root = br->bridge_id;
+       br->bridge_max_age = br->max_age = 20 * HZ;
+       br->bridge_hello_time = br->hello_time = 2 * HZ;
+       br->bridge_forward_delay = br->forward_delay = 15 * HZ;
+       br->ageing_time = 300 * HZ;
+
+       br_netfilter_rtable_init(br);
+       br_stp_timer_init(br);
+       br_multicast_init(br);
 }