diff options
Diffstat (limited to 'net/8021q/vlan_dev.c')
-rw-r--r-- | net/8021q/vlan_dev.c | 49 |
1 files changed, 16 insertions, 33 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index b4b9068e55a7..96bad8f233e2 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -290,7 +290,7 @@ static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev, | |||
290 | 290 | ||
291 | static int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | 291 | static int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) |
292 | { | 292 | { |
293 | struct net_device_stats *stats = &dev->stats; | 293 | struct netdev_queue *txq = netdev_get_tx_queue(dev, 0); |
294 | struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data); | 294 | struct vlan_ethhdr *veth = (struct vlan_ethhdr *)(skb->data); |
295 | 295 | ||
296 | /* Handle non-VLAN frames if they are sent to us, for example by DHCP. | 296 | /* Handle non-VLAN frames if they are sent to us, for example by DHCP. |
@@ -309,7 +309,7 @@ static int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
309 | vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb); | 309 | vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb); |
310 | skb = __vlan_put_tag(skb, vlan_tci); | 310 | skb = __vlan_put_tag(skb, vlan_tci); |
311 | if (!skb) { | 311 | if (!skb) { |
312 | stats->tx_dropped++; | 312 | txq->tx_dropped++; |
313 | return NETDEV_TX_OK; | 313 | return NETDEV_TX_OK; |
314 | } | 314 | } |
315 | 315 | ||
@@ -317,8 +317,8 @@ static int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
317 | vlan_dev_info(dev)->cnt_inc_headroom_on_tx++; | 317 | vlan_dev_info(dev)->cnt_inc_headroom_on_tx++; |
318 | } | 318 | } |
319 | 319 | ||
320 | stats->tx_packets++; | 320 | txq->tx_packets++; |
321 | stats->tx_bytes += skb->len; | 321 | txq->tx_bytes += skb->len; |
322 | 322 | ||
323 | skb->dev = vlan_dev_info(dev)->real_dev; | 323 | skb->dev = vlan_dev_info(dev)->real_dev; |
324 | dev_queue_xmit(skb); | 324 | dev_queue_xmit(skb); |
@@ -328,15 +328,15 @@ static int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
328 | static int vlan_dev_hwaccel_hard_start_xmit(struct sk_buff *skb, | 328 | static int vlan_dev_hwaccel_hard_start_xmit(struct sk_buff *skb, |
329 | struct net_device *dev) | 329 | struct net_device *dev) |
330 | { | 330 | { |
331 | struct net_device_stats *stats = &dev->stats; | 331 | struct netdev_queue *txq = netdev_get_tx_queue(dev, 0); |
332 | u16 vlan_tci; | 332 | u16 vlan_tci; |
333 | 333 | ||
334 | vlan_tci = vlan_dev_info(dev)->vlan_id; | 334 | vlan_tci = vlan_dev_info(dev)->vlan_id; |
335 | vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb); | 335 | vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb); |
336 | skb = __vlan_hwaccel_put_tag(skb, vlan_tci); | 336 | skb = __vlan_hwaccel_put_tag(skb, vlan_tci); |
337 | 337 | ||
338 | stats->tx_packets++; | 338 | txq->tx_packets++; |
339 | stats->tx_bytes += skb->len; | 339 | txq->tx_bytes += skb->len; |
340 | 340 | ||
341 | skb->dev = vlan_dev_info(dev)->real_dev; | 341 | skb->dev = vlan_dev_info(dev)->real_dev; |
342 | dev_queue_xmit(skb); | 342 | dev_queue_xmit(skb); |
@@ -441,7 +441,7 @@ static int vlan_dev_open(struct net_device *dev) | |||
441 | return -ENETDOWN; | 441 | return -ENETDOWN; |
442 | 442 | ||
443 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) { | 443 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) { |
444 | err = dev_unicast_add(real_dev, dev->dev_addr, ETH_ALEN); | 444 | err = dev_unicast_add(real_dev, dev->dev_addr); |
445 | if (err < 0) | 445 | if (err < 0) |
446 | goto out; | 446 | goto out; |
447 | } | 447 | } |
@@ -470,7 +470,7 @@ clear_allmulti: | |||
470 | dev_set_allmulti(real_dev, -1); | 470 | dev_set_allmulti(real_dev, -1); |
471 | del_unicast: | 471 | del_unicast: |
472 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) | 472 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) |
473 | dev_unicast_delete(real_dev, dev->dev_addr, ETH_ALEN); | 473 | dev_unicast_delete(real_dev, dev->dev_addr); |
474 | out: | 474 | out: |
475 | netif_carrier_off(dev); | 475 | netif_carrier_off(dev); |
476 | return err; | 476 | return err; |
@@ -492,7 +492,7 @@ static int vlan_dev_stop(struct net_device *dev) | |||
492 | dev_set_promiscuity(real_dev, -1); | 492 | dev_set_promiscuity(real_dev, -1); |
493 | 493 | ||
494 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) | 494 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) |
495 | dev_unicast_delete(real_dev, dev->dev_addr, dev->addr_len); | 495 | dev_unicast_delete(real_dev, dev->dev_addr); |
496 | 496 | ||
497 | netif_carrier_off(dev); | 497 | netif_carrier_off(dev); |
498 | return 0; | 498 | return 0; |
@@ -511,13 +511,13 @@ static int vlan_dev_set_mac_address(struct net_device *dev, void *p) | |||
511 | goto out; | 511 | goto out; |
512 | 512 | ||
513 | if (compare_ether_addr(addr->sa_data, real_dev->dev_addr)) { | 513 | if (compare_ether_addr(addr->sa_data, real_dev->dev_addr)) { |
514 | err = dev_unicast_add(real_dev, addr->sa_data, ETH_ALEN); | 514 | err = dev_unicast_add(real_dev, addr->sa_data); |
515 | if (err < 0) | 515 | if (err < 0) |
516 | return err; | 516 | return err; |
517 | } | 517 | } |
518 | 518 | ||
519 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) | 519 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) |
520 | dev_unicast_delete(real_dev, dev->dev_addr, ETH_ALEN); | 520 | dev_unicast_delete(real_dev, dev->dev_addr); |
521 | 521 | ||
522 | out: | 522 | out: |
523 | memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); | 523 | memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); |
@@ -644,7 +644,6 @@ static int vlan_dev_init(struct net_device *dev) | |||
644 | dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN; | 644 | dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN; |
645 | dev->netdev_ops = &vlan_netdev_ops; | 645 | dev->netdev_ops = &vlan_netdev_ops; |
646 | } | 646 | } |
647 | netdev_resync_ops(dev); | ||
648 | 647 | ||
649 | if (is_vlan_dev(real_dev)) | 648 | if (is_vlan_dev(real_dev)) |
650 | subclass = 1; | 649 | subclass = 1; |
@@ -671,13 +670,7 @@ static int vlan_ethtool_get_settings(struct net_device *dev, | |||
671 | struct ethtool_cmd *cmd) | 670 | struct ethtool_cmd *cmd) |
672 | { | 671 | { |
673 | const struct vlan_dev_info *vlan = vlan_dev_info(dev); | 672 | const struct vlan_dev_info *vlan = vlan_dev_info(dev); |
674 | struct net_device *real_dev = vlan->real_dev; | 673 | return dev_ethtool_get_settings(vlan->real_dev, cmd); |
675 | |||
676 | if (!real_dev->ethtool_ops || | ||
677 | !real_dev->ethtool_ops->get_settings) | ||
678 | return -EOPNOTSUPP; | ||
679 | |||
680 | return real_dev->ethtool_ops->get_settings(real_dev, cmd); | ||
681 | } | 674 | } |
682 | 675 | ||
683 | static void vlan_ethtool_get_drvinfo(struct net_device *dev, | 676 | static void vlan_ethtool_get_drvinfo(struct net_device *dev, |
@@ -691,24 +684,13 @@ static void vlan_ethtool_get_drvinfo(struct net_device *dev, | |||
691 | static u32 vlan_ethtool_get_rx_csum(struct net_device *dev) | 684 | static u32 vlan_ethtool_get_rx_csum(struct net_device *dev) |
692 | { | 685 | { |
693 | const struct vlan_dev_info *vlan = vlan_dev_info(dev); | 686 | const struct vlan_dev_info *vlan = vlan_dev_info(dev); |
694 | struct net_device *real_dev = vlan->real_dev; | 687 | return dev_ethtool_get_rx_csum(vlan->real_dev); |
695 | |||
696 | if (real_dev->ethtool_ops == NULL || | ||
697 | real_dev->ethtool_ops->get_rx_csum == NULL) | ||
698 | return 0; | ||
699 | return real_dev->ethtool_ops->get_rx_csum(real_dev); | ||
700 | } | 688 | } |
701 | 689 | ||
702 | static u32 vlan_ethtool_get_flags(struct net_device *dev) | 690 | static u32 vlan_ethtool_get_flags(struct net_device *dev) |
703 | { | 691 | { |
704 | const struct vlan_dev_info *vlan = vlan_dev_info(dev); | 692 | const struct vlan_dev_info *vlan = vlan_dev_info(dev); |
705 | struct net_device *real_dev = vlan->real_dev; | 693 | return dev_ethtool_get_flags(vlan->real_dev); |
706 | |||
707 | if (!(real_dev->features & NETIF_F_HW_VLAN_RX) || | ||
708 | real_dev->ethtool_ops == NULL || | ||
709 | real_dev->ethtool_ops->get_flags == NULL) | ||
710 | return 0; | ||
711 | return real_dev->ethtool_ops->get_flags(real_dev); | ||
712 | } | 694 | } |
713 | 695 | ||
714 | static const struct ethtool_ops vlan_ethtool_ops = { | 696 | static const struct ethtool_ops vlan_ethtool_ops = { |
@@ -756,6 +738,7 @@ void vlan_setup(struct net_device *dev) | |||
756 | ether_setup(dev); | 738 | ether_setup(dev); |
757 | 739 | ||
758 | dev->priv_flags |= IFF_802_1Q_VLAN; | 740 | dev->priv_flags |= IFF_802_1Q_VLAN; |
741 | dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; | ||
759 | dev->tx_queue_len = 0; | 742 | dev->tx_queue_len = 0; |
760 | 743 | ||
761 | dev->netdev_ops = &vlan_netdev_ops; | 744 | dev->netdev_ops = &vlan_netdev_ops; |