Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[safe/jmp/linux-2.6] / net / 8021q / vlan.c
index f0e335a..d1e1054 100644 (file)
@@ -46,13 +46,13 @@ int vlan_net_id;
 /* Our listing of VLAN group(s) */
 static struct hlist_head vlan_group_hash[VLAN_GRP_HASH_SIZE];
 
-static char vlan_fullname[] = "802.1Q VLAN Support";
-static char vlan_version[] = DRV_VERSION;
-static char vlan_copyright[] = "Ben Greear <greearb@candelatech.com>";
-static char vlan_buggyright[] = "David S. Miller <davem@redhat.com>";
+const char vlan_fullname[] = "802.1Q VLAN Support";
+const char vlan_version[] = DRV_VERSION;
+static const char vlan_copyright[] = "Ben Greear <greearb@candelatech.com>";
+static const char vlan_buggyright[] = "David S. Miller <davem@redhat.com>";
 
-static struct packet_type vlan_packet_type = {
-       .type = __constant_htons(ETH_P_8021Q),
+static struct packet_type vlan_packet_type __read_mostly = {
+       .type = cpu_to_be16(ETH_P_8021Q),
        .func = vlan_skb_recv, /* VLAN receive method */
 };
 
@@ -144,6 +144,7 @@ void unregister_vlan_dev(struct net_device *dev)
 {
        struct vlan_dev_info *vlan = vlan_dev_info(dev);
        struct net_device *real_dev = vlan->real_dev;
+       const struct net_device_ops *ops = real_dev->netdev_ops;
        struct vlan_group *grp;
        u16 vlan_id = vlan->vlan_id;
 
@@ -156,7 +157,7 @@ void unregister_vlan_dev(struct net_device *dev)
         * HW accelerating devices or SW vlan input packet processing.
         */
        if (real_dev->features & NETIF_F_HW_VLAN_FILTER)
-               real_dev->vlan_rx_kill_vid(real_dev, vlan_id);
+               ops->ndo_vlan_rx_kill_vid(real_dev, vlan_id);
 
        vlan_group_set_device(grp, vlan_id, NULL);
        grp->nr_vlans--;
@@ -170,7 +171,7 @@ void unregister_vlan_dev(struct net_device *dev)
                vlan_gvrp_uninit_applicant(real_dev);
 
                if (real_dev->features & NETIF_F_HW_VLAN_RX)
-                       real_dev->vlan_rx_register(real_dev, NULL);
+                       ops->ndo_vlan_rx_register(real_dev, NULL);
 
                hlist_del_rcu(&grp->hlist);
 
@@ -205,21 +206,21 @@ static void vlan_transfer_operstate(const struct net_device *dev,
 
 int vlan_check_real_dev(struct net_device *real_dev, u16 vlan_id)
 {
-       char *name = real_dev->name;
+       const char *name = real_dev->name;
+       const struct net_device_ops *ops = real_dev->netdev_ops;
 
        if (real_dev->features & NETIF_F_VLAN_CHALLENGED) {
                pr_info("8021q: VLANs not supported on %s\n", name);
                return -EOPNOTSUPP;
        }
 
-       if ((real_dev->features & NETIF_F_HW_VLAN_RX) &&
-           !real_dev->vlan_rx_register) {
+       if ((real_dev->features & NETIF_F_HW_VLAN_RX) && !ops->ndo_vlan_rx_register) {
                pr_info("8021q: device %s has buggy VLAN hw accel\n", name);
                return -EOPNOTSUPP;
        }
 
        if ((real_dev->features & NETIF_F_HW_VLAN_FILTER) &&
-           (!real_dev->vlan_rx_add_vid || !real_dev->vlan_rx_kill_vid)) {
+           (!ops->ndo_vlan_rx_add_vid || !ops->ndo_vlan_rx_kill_vid)) {
                pr_info("8021q: Device %s has buggy VLAN hw accel\n", name);
                return -EOPNOTSUPP;
        }
@@ -240,6 +241,7 @@ int register_vlan_dev(struct net_device *dev)
 {
        struct vlan_dev_info *vlan = vlan_dev_info(dev);
        struct net_device *real_dev = vlan->real_dev;
+       const struct net_device_ops *ops = real_dev->netdev_ops;
        u16 vlan_id = vlan->vlan_id;
        struct vlan_group *grp, *ngrp = NULL;
        int err;
@@ -275,9 +277,9 @@ int register_vlan_dev(struct net_device *dev)
        grp->nr_vlans++;
 
        if (ngrp && real_dev->features & NETIF_F_HW_VLAN_RX)
-               real_dev->vlan_rx_register(real_dev, ngrp);
+               ops->ndo_vlan_rx_register(real_dev, ngrp);
        if (real_dev->features & NETIF_F_HW_VLAN_FILTER)
-               real_dev->vlan_rx_add_vid(real_dev, vlan_id);
+               ops->ndo_vlan_rx_add_vid(real_dev, vlan_id);
 
        return 0;
 
@@ -490,6 +492,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
                                continue;
 
                        dev_change_flags(vlandev, flgs & ~IFF_UP);
+                       vlan_transfer_operstate(dev, vlandev);
                }
                break;
 
@@ -505,6 +508,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
                                continue;
 
                        dev_change_flags(vlandev, flgs | IFF_UP);
+                       vlan_transfer_operstate(dev, vlandev);
                }
                break;