sc->opmode != NL80211_IFTYPE_MESH_POINT &&
                test_bit(ATH_STAT_PROMISC, sc->status))
                rfilt |= AR5K_RX_FILTER_PROM;
-       if (sc->opmode == NL80211_IFTYPE_ADHOC)
+       if (sc->opmode == NL80211_IFTYPE_STATION ||
+               sc->opmode == NL80211_IFTYPE_ADHOC) {
                rfilt |= AR5K_RX_FILTER_BEACON;
+       }
 +      if (sc->opmode == NL80211_IFTYPE_MESH_POINT)
 +              rfilt |= AR5K_RX_FILTER_CONTROL | AR5K_RX_FILTER_BEACON |
 +                      AR5K_RX_FILTER_PROBEREQ | AR5K_RX_FILTER_PROM;
  
        /* Set filters */
 -      ath5k_hw_set_rx_filter(ah,rfilt);
 +      ath5k_hw_set_rx_filter(ah, rfilt);
  
        /* Set multicast bits */
        ath5k_hw_set_mcast_filter(ah, mfilt[0], mfilt[1]);
 
        }
  
        skb->vlan_tci = vlan_tci;
+       cb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK);
+ 
+       return (polling ? netif_receive_skb(skb) : netif_rx(skb));
+ }
+ EXPORT_SYMBOL(__vlan_hwaccel_rx);
+ 
+ int vlan_hwaccel_do_receive(struct sk_buff *skb)
+ {
+       struct vlan_hwaccel_cb *cb = vlan_hwaccel_cb(skb);
+       struct net_device *dev = cb->dev;
+       struct net_device_stats *stats;
+ 
        netif_nit_deliver(skb);
  
-       skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK);
-       if (skb->dev == NULL) {
-               dev_kfree_skb_any(skb);
-               /* Not NET_RX_DROP, this is not being dropped
-                * due to congestion. */
-               return NET_RX_SUCCESS;
+       if (dev == NULL) {
+               kfree_skb(skb);
+               return -1;
        }
+ 
+       skb->dev = dev;
+       skb->priority = vlan_get_ingress_priority(dev, skb->vlan_tci);
        skb->vlan_tci = 0;
  
-       stats = &skb->dev->stats;
 -      dev->last_rx = jiffies;
 -
+       stats = &dev->stats;
        stats->rx_packets++;
        stats->rx_bytes += skb->len;
  
 
  static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
                                    struct udphdr  *uh,
                                    __be32 saddr, __be32 daddr,
 -                                  struct hlist_head udptable[])
 +                                  struct udp_table *udptable)
  {
        struct sock *sk;
 +      struct udp_hslot *hslot = &udptable->hash[udp_hashfn(net, ntohs(uh->dest))];
        int dif;
  
 -      read_lock(&udp_hash_lock);
 -      sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
 +      spin_lock(&hslot->lock);
 +      sk = sk_head(&hslot->head);
        dif = skb->dev->ifindex;
-       sk = udp_v4_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif);
+       sk = udp_v4_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
        if (sk) {
                struct sock *sknext = NULL;
  
 
  {
        struct sock *sk, *sk2;
        const struct udphdr *uh = udp_hdr(skb);
 +      struct udp_hslot *hslot = &udptable->hash[udp_hashfn(net, ntohs(uh->dest))];
        int dif;
  
 -      read_lock(&udp_hash_lock);
 -      sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
 +      spin_lock(&hslot->lock);
 +      sk = sk_head(&hslot->head);
        dif = inet6_iif(skb);
-       sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif);
+       sk = udp_v6_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
        if (!sk) {
                kfree_skb(skb);
                goto out;