Commit 7ff0bcf6 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

qeth: do vlan cleanup

- unify vlan and nonvlan rx path
- kill card->vlangrp and qeth_l3_vlan_rx_register
Signed-off-by: default avatarJiri Pirko <jpirko@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 53515734
...@@ -720,7 +720,7 @@ struct qeth_card { ...@@ -720,7 +720,7 @@ struct qeth_card {
wait_queue_head_t wait_q; wait_queue_head_t wait_q;
spinlock_t vlanlock; spinlock_t vlanlock;
spinlock_t mclock; spinlock_t mclock;
struct vlan_group *vlangrp; unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
struct list_head vid_list; struct list_head vid_list;
struct list_head mc_list; struct list_head mc_list;
struct work_struct kernel_thread_starter; struct work_struct kernel_thread_starter;
......
...@@ -1097,7 +1097,6 @@ static int qeth_setup_card(struct qeth_card *card) ...@@ -1097,7 +1097,6 @@ static int qeth_setup_card(struct qeth_card *card)
card->dev = NULL; card->dev = NULL;
spin_lock_init(&card->vlanlock); spin_lock_init(&card->vlanlock);
spin_lock_init(&card->mclock); spin_lock_init(&card->mclock);
card->vlangrp = NULL;
spin_lock_init(&card->lock); spin_lock_init(&card->lock);
spin_lock_init(&card->ip_lock); spin_lock_init(&card->ip_lock);
spin_lock_init(&card->thread_mask_lock); spin_lock_init(&card->thread_mask_lock);
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/bitops.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -23,6 +24,7 @@ ...@@ -23,6 +24,7 @@
#include <linux/inetdevice.h> #include <linux/inetdevice.h>
#include <linux/igmp.h> #include <linux/igmp.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/if_vlan.h>
#include <net/ip.h> #include <net/ip.h>
#include <net/arp.h> #include <net/arp.h>
...@@ -1696,16 +1698,18 @@ static void qeth_l3_add_mc(struct qeth_card *card, struct in_device *in4_dev) ...@@ -1696,16 +1698,18 @@ static void qeth_l3_add_mc(struct qeth_card *card, struct in_device *in4_dev)
static void qeth_l3_add_vlan_mc(struct qeth_card *card) static void qeth_l3_add_vlan_mc(struct qeth_card *card)
{ {
struct in_device *in_dev; struct in_device *in_dev;
struct vlan_group *vg; u16 vid;
int i;
QETH_CARD_TEXT(card, 4, "addmcvl"); QETH_CARD_TEXT(card, 4, "addmcvl");
if (!qeth_is_supported(card, IPA_FULL_VLAN) || (card->vlangrp == NULL)) if (!qeth_is_supported(card, IPA_FULL_VLAN))
return; return;
vg = card->vlangrp; for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) {
for (i = 0; i < VLAN_N_VID; i++) { struct net_device *netdev;
struct net_device *netdev = vlan_group_get_device(vg, i);
rcu_read_lock();
netdev = __vlan_find_dev_deep(card->dev, vid);
rcu_read_unlock();
if (netdev == NULL || if (netdev == NULL ||
!(netdev->flags & IFF_UP)) !(netdev->flags & IFF_UP))
continue; continue;
...@@ -1759,16 +1763,16 @@ static void qeth_l3_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev) ...@@ -1759,16 +1763,16 @@ static void qeth_l3_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev)
static void qeth_l3_add_vlan_mc6(struct qeth_card *card) static void qeth_l3_add_vlan_mc6(struct qeth_card *card)
{ {
struct inet6_dev *in_dev; struct inet6_dev *in_dev;
struct vlan_group *vg; u16 vid;
int i;
QETH_CARD_TEXT(card, 4, "admc6vl"); QETH_CARD_TEXT(card, 4, "admc6vl");
if (!qeth_is_supported(card, IPA_FULL_VLAN) || (card->vlangrp == NULL)) if (!qeth_is_supported(card, IPA_FULL_VLAN))
return; return;
vg = card->vlangrp; for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) {
for (i = 0; i < VLAN_N_VID; i++) { struct net_device *netdev;
struct net_device *netdev = vlan_group_get_device(vg, i);
netdev = __vlan_find_dev_deep(card->dev, vid);
if (netdev == NULL || if (netdev == NULL ||
!(netdev->flags & IFF_UP)) !(netdev->flags & IFF_UP))
continue; continue;
...@@ -1806,10 +1810,12 @@ static void qeth_l3_free_vlan_addresses4(struct qeth_card *card, ...@@ -1806,10 +1810,12 @@ static void qeth_l3_free_vlan_addresses4(struct qeth_card *card,
struct in_device *in_dev; struct in_device *in_dev;
struct in_ifaddr *ifa; struct in_ifaddr *ifa;
struct qeth_ipaddr *addr; struct qeth_ipaddr *addr;
struct net_device *netdev;
QETH_CARD_TEXT(card, 4, "frvaddr4"); QETH_CARD_TEXT(card, 4, "frvaddr4");
in_dev = in_dev_get(vlan_group_get_device(card->vlangrp, vid)); netdev = __vlan_find_dev_deep(card->dev, vid);
in_dev = in_dev_get(netdev);
if (!in_dev) if (!in_dev)
return; return;
for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
...@@ -1832,10 +1838,12 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card, ...@@ -1832,10 +1838,12 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card,
struct inet6_dev *in6_dev; struct inet6_dev *in6_dev;
struct inet6_ifaddr *ifa; struct inet6_ifaddr *ifa;
struct qeth_ipaddr *addr; struct qeth_ipaddr *addr;
struct net_device *netdev;
QETH_CARD_TEXT(card, 4, "frvaddr6"); QETH_CARD_TEXT(card, 4, "frvaddr6");
in6_dev = in6_dev_get(vlan_group_get_device(card->vlangrp, vid)); netdev = __vlan_find_dev_deep(card->dev, vid);
in6_dev = in6_dev_get(netdev);
if (!in6_dev) if (!in6_dev)
return; return;
list_for_each_entry(ifa, &in6_dev->addr_list, if_list) { list_for_each_entry(ifa, &in6_dev->addr_list, if_list) {
...@@ -1856,26 +1864,15 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card, ...@@ -1856,26 +1864,15 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card,
static void qeth_l3_free_vlan_addresses(struct qeth_card *card, static void qeth_l3_free_vlan_addresses(struct qeth_card *card,
unsigned short vid) unsigned short vid)
{ {
if (!card->vlangrp)
return;
qeth_l3_free_vlan_addresses4(card, vid); qeth_l3_free_vlan_addresses4(card, vid);
qeth_l3_free_vlan_addresses6(card, vid); qeth_l3_free_vlan_addresses6(card, vid);
} }
static void qeth_l3_vlan_rx_register(struct net_device *dev, static void qeth_l3_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
struct vlan_group *grp)
{ {
struct qeth_card *card = dev->ml_priv; struct qeth_card *card = dev->ml_priv;
unsigned long flags;
QETH_CARD_TEXT(card, 4, "vlanreg");
spin_lock_irqsave(&card->vlanlock, flags);
card->vlangrp = grp;
spin_unlock_irqrestore(&card->vlanlock, flags);
}
static void qeth_l3_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) set_bit(vid, card->active_vlans);
{
return; return;
} }
...@@ -1892,7 +1889,7 @@ static void qeth_l3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) ...@@ -1892,7 +1889,7 @@ static void qeth_l3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
spin_lock_irqsave(&card->vlanlock, flags); spin_lock_irqsave(&card->vlanlock, flags);
/* unregister IP addresses of vlan device */ /* unregister IP addresses of vlan device */
qeth_l3_free_vlan_addresses(card, vid); qeth_l3_free_vlan_addresses(card, vid);
vlan_group_set_device(card->vlangrp, vid, NULL); clear_bit(vid, card->active_vlans);
spin_unlock_irqrestore(&card->vlanlock, flags); spin_unlock_irqrestore(&card->vlanlock, flags);
qeth_l3_set_multicast_list(card->dev); qeth_l3_set_multicast_list(card->dev);
} }
...@@ -2014,10 +2011,8 @@ static int qeth_l3_process_inbound_buffer(struct qeth_card *card, ...@@ -2014,10 +2011,8 @@ static int qeth_l3_process_inbound_buffer(struct qeth_card *card,
&vlan_tag); &vlan_tag);
len = skb->len; len = skb->len;
if (is_vlan && !card->options.sniffer) if (is_vlan && !card->options.sniffer)
vlan_gro_receive(&card->napi, card->vlangrp, __vlan_hwaccel_put_tag(skb, vlan_tag);
vlan_tag, skb); napi_gro_receive(&card->napi, skb);
else
napi_gro_receive(&card->napi, skb);
break; break;
case QETH_HEADER_TYPE_LAYER2: /* for HiperSockets sniffer */ case QETH_HEADER_TYPE_LAYER2: /* for HiperSockets sniffer */
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
...@@ -2118,15 +2113,15 @@ static int qeth_l3_verify_vlan_dev(struct net_device *dev, ...@@ -2118,15 +2113,15 @@ static int qeth_l3_verify_vlan_dev(struct net_device *dev,
struct qeth_card *card) struct qeth_card *card)
{ {
int rc = 0; int rc = 0;
struct vlan_group *vg; u16 vid;
int i;
vg = card->vlangrp; for_each_set_bit(vid, card->active_vlans, VLAN_N_VID) {
if (!vg) struct net_device *netdev;
return rc;
for (i = 0; i < VLAN_N_VID; i++) { rcu_read_lock();
if (vlan_group_get_device(vg, i) == dev) { netdev = __vlan_find_dev_deep(dev, vid);
rcu_read_unlock();
if (netdev == dev) {
rc = QETH_VLAN_CARD; rc = QETH_VLAN_CARD;
break; break;
} }
...@@ -2803,7 +2798,7 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, ...@@ -2803,7 +2798,7 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
* before we're going to overwrite this location with next hop ip. * before we're going to overwrite this location with next hop ip.
* v6 uses passthrough, v4 sets the tag in the QDIO header. * v6 uses passthrough, v4 sets the tag in the QDIO header.
*/ */
if (card->vlangrp && vlan_tx_tag_present(skb)) { if (vlan_tx_tag_present(skb)) {
if ((ipv == 4) || (card->info.type == QETH_CARD_TYPE_IQD)) if ((ipv == 4) || (card->info.type == QETH_CARD_TYPE_IQD))
hdr->hdr.l3.ext_flags = QETH_HDR_EXT_VLAN_FRAME; hdr->hdr.l3.ext_flags = QETH_HDR_EXT_VLAN_FRAME;
else else
...@@ -2988,8 +2983,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2988,8 +2983,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
skb_pull(new_skb, ETH_HLEN); skb_pull(new_skb, ETH_HLEN);
} }
if (ipv != 4 && card->vlangrp && if (ipv != 4 && vlan_tx_tag_present(new_skb)) {
vlan_tx_tag_present(new_skb)) {
skb_push(new_skb, VLAN_HLEN); skb_push(new_skb, VLAN_HLEN);
skb_copy_to_linear_data(new_skb, new_skb->data + 4, 4); skb_copy_to_linear_data(new_skb, new_skb->data + 4, 4);
skb_copy_to_linear_data_offset(new_skb, 4, skb_copy_to_linear_data_offset(new_skb, 4,
...@@ -3233,14 +3227,13 @@ static const struct net_device_ops qeth_l3_netdev_ops = { ...@@ -3233,14 +3227,13 @@ static const struct net_device_ops qeth_l3_netdev_ops = {
.ndo_start_xmit = qeth_l3_hard_start_xmit, .ndo_start_xmit = qeth_l3_hard_start_xmit,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_multicast_list = qeth_l3_set_multicast_list, .ndo_set_multicast_list = qeth_l3_set_multicast_list,
.ndo_do_ioctl = qeth_l3_do_ioctl, .ndo_do_ioctl = qeth_l3_do_ioctl,
.ndo_change_mtu = qeth_change_mtu, .ndo_change_mtu = qeth_change_mtu,
.ndo_fix_features = qeth_l3_fix_features, .ndo_fix_features = qeth_l3_fix_features,
.ndo_set_features = qeth_l3_set_features, .ndo_set_features = qeth_l3_set_features,
.ndo_vlan_rx_register = qeth_l3_vlan_rx_register,
.ndo_vlan_rx_add_vid = qeth_l3_vlan_rx_add_vid, .ndo_vlan_rx_add_vid = qeth_l3_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = qeth_l3_vlan_rx_kill_vid, .ndo_vlan_rx_kill_vid = qeth_l3_vlan_rx_kill_vid,
.ndo_tx_timeout = qeth_tx_timeout, .ndo_tx_timeout = qeth_tx_timeout,
}; };
static const struct net_device_ops qeth_l3_osa_netdev_ops = { static const struct net_device_ops qeth_l3_osa_netdev_ops = {
...@@ -3250,14 +3243,13 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = { ...@@ -3250,14 +3243,13 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = {
.ndo_start_xmit = qeth_l3_hard_start_xmit, .ndo_start_xmit = qeth_l3_hard_start_xmit,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_multicast_list = qeth_l3_set_multicast_list, .ndo_set_multicast_list = qeth_l3_set_multicast_list,
.ndo_do_ioctl = qeth_l3_do_ioctl, .ndo_do_ioctl = qeth_l3_do_ioctl,
.ndo_change_mtu = qeth_change_mtu, .ndo_change_mtu = qeth_change_mtu,
.ndo_fix_features = qeth_l3_fix_features, .ndo_fix_features = qeth_l3_fix_features,
.ndo_set_features = qeth_l3_set_features, .ndo_set_features = qeth_l3_set_features,
.ndo_vlan_rx_register = qeth_l3_vlan_rx_register,
.ndo_vlan_rx_add_vid = qeth_l3_vlan_rx_add_vid, .ndo_vlan_rx_add_vid = qeth_l3_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = qeth_l3_vlan_rx_kill_vid, .ndo_vlan_rx_kill_vid = qeth_l3_vlan_rx_kill_vid,
.ndo_tx_timeout = qeth_tx_timeout, .ndo_tx_timeout = qeth_tx_timeout,
.ndo_neigh_setup = qeth_l3_neigh_setup, .ndo_neigh_setup = qeth_l3_neigh_setup,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment