aboutsummaryrefslogtreecommitdiffstats
path: root/net/8021q/vlan_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/8021q/vlan_dev.c')
-rw-r--r--net/8021q/vlan_dev.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
index 8d77b6ee4477..f044ae56a313 100644
--- a/net/8021q/vlan_dev.c
+++ b/net/8021q/vlan_dev.c
@@ -223,7 +223,8 @@ int vlan_dev_change_flags(const struct net_device *dev, u32 flags, u32 mask)
223 u32 old_flags = vlan->flags; 223 u32 old_flags = vlan->flags;
224 224
225 if (mask & ~(VLAN_FLAG_REORDER_HDR | VLAN_FLAG_GVRP | 225 if (mask & ~(VLAN_FLAG_REORDER_HDR | VLAN_FLAG_GVRP |
226 VLAN_FLAG_LOOSE_BINDING | VLAN_FLAG_MVRP)) 226 VLAN_FLAG_LOOSE_BINDING | VLAN_FLAG_MVRP |
227 VLAN_FLAG_BRIDGE_BINDING))
227 return -EINVAL; 228 return -EINVAL;
228 229
229 vlan->flags = (old_flags & ~mask) | (flags & mask); 230 vlan->flags = (old_flags & ~mask) | (flags & mask);
@@ -296,7 +297,8 @@ static int vlan_dev_open(struct net_device *dev)
296 if (vlan->flags & VLAN_FLAG_MVRP) 297 if (vlan->flags & VLAN_FLAG_MVRP)
297 vlan_mvrp_request_join(dev); 298 vlan_mvrp_request_join(dev);
298 299
299 if (netif_carrier_ok(real_dev)) 300 if (netif_carrier_ok(real_dev) &&
301 !(vlan->flags & VLAN_FLAG_BRIDGE_BINDING))
300 netif_carrier_on(dev); 302 netif_carrier_on(dev);
301 return 0; 303 return 0;
302 304
@@ -326,7 +328,8 @@ static int vlan_dev_stop(struct net_device *dev)
326 if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr)) 328 if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
327 dev_uc_del(real_dev, dev->dev_addr); 329 dev_uc_del(real_dev, dev->dev_addr);
328 330
329 netif_carrier_off(dev); 331 if (!(vlan->flags & VLAN_FLAG_BRIDGE_BINDING))
332 netif_carrier_off(dev);
330 return 0; 333 return 0;
331} 334}
332 335
@@ -550,7 +553,8 @@ static const struct net_device_ops vlan_netdev_ops;
550 553
551static int vlan_dev_init(struct net_device *dev) 554static int vlan_dev_init(struct net_device *dev)
552{ 555{
553 struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; 556 struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
557 struct net_device *real_dev = vlan->real_dev;
554 558
555 netif_carrier_off(dev); 559 netif_carrier_off(dev);
556 560
@@ -561,6 +565,9 @@ static int vlan_dev_init(struct net_device *dev)
561 (1<<__LINK_STATE_DORMANT))) | 565 (1<<__LINK_STATE_DORMANT))) |
562 (1<<__LINK_STATE_PRESENT); 566 (1<<__LINK_STATE_PRESENT);
563 567
568 if (vlan->flags & VLAN_FLAG_BRIDGE_BINDING)
569 dev->state |= (1 << __LINK_STATE_NOCARRIER);
570
564 dev->hw_features = NETIF_F_HW_CSUM | NETIF_F_SG | 571 dev->hw_features = NETIF_F_HW_CSUM | NETIF_F_SG |
565 NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE | 572 NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE |
566 NETIF_F_GSO_ENCAP_ALL | 573 NETIF_F_GSO_ENCAP_ALL |
@@ -591,8 +598,7 @@ static int vlan_dev_init(struct net_device *dev)
591#endif 598#endif
592 599
593 dev->needed_headroom = real_dev->needed_headroom; 600 dev->needed_headroom = real_dev->needed_headroom;
594 if (vlan_hw_offload_capable(real_dev->features, 601 if (vlan_hw_offload_capable(real_dev->features, vlan->vlan_proto)) {
595 vlan_dev_priv(dev)->vlan_proto)) {
596 dev->header_ops = &vlan_passthru_header_ops; 602 dev->header_ops = &vlan_passthru_header_ops;
597 dev->hard_header_len = real_dev->hard_header_len; 603 dev->hard_header_len = real_dev->hard_header_len;
598 } else { 604 } else {
@@ -606,8 +612,8 @@ static int vlan_dev_init(struct net_device *dev)
606 612
607 vlan_dev_set_lockdep_class(dev, vlan_dev_get_lock_subclass(dev)); 613 vlan_dev_set_lockdep_class(dev, vlan_dev_get_lock_subclass(dev));
608 614
609 vlan_dev_priv(dev)->vlan_pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats); 615 vlan->vlan_pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats);
610 if (!vlan_dev_priv(dev)->vlan_pcpu_stats) 616 if (!vlan->vlan_pcpu_stats)
611 return -ENOMEM; 617 return -ENOMEM;
612 618
613 return 0; 619 return 0;