X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fatm%2Fbr2684.c;h=680ccb12aae8652d194735c0645c78a040d1f8e9;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=91a89d3a24f2d136ade222bfe26833acd2bae566;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/net/atm/br2684.c b/net/atm/br2684.c index 91a89d3a2..680ccb12a 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c @@ -18,6 +18,7 @@ Author: Marcell GAL, 2000, XDSL Ltd, Hungary #include #include #include +#include #include #include @@ -97,7 +98,7 @@ struct br2684_dev { * do read-locking under interrupt context, so write locking must block * the current CPU's interrupts */ -static rwlock_t devs_lock = RW_LOCK_UNLOCKED; +static DEFINE_RWLOCK(devs_lock); static LIST_HEAD(br2684_devs); @@ -190,7 +191,7 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct br2684_dev *brdev, dev_kfree_skb(skb); return 0; } - atomic_add(skb->truesize, &atmvcc->sk->sk_wmem_alloc); + atomic_add(skb->truesize, &sk_atm(atmvcc)->sk_wmem_alloc); ATM_SKB(skb)->atm_options = atmvcc->atm_options; brdev->stats.tx_packets++; brdev->stats.tx_bytes += skb->len; @@ -220,7 +221,7 @@ static int br2684_start_xmit(struct sk_buff *skb, struct net_device *dev) /* netif_stop_queue(dev); */ dev_kfree_skb(skb); read_unlock(&devs_lock); - return -EUNATCH; + return 0; } if (!br2684_xmit_vcc(skb, brdev, brvcc)) { /* @@ -289,21 +290,20 @@ xmit will add the additional header part in that case */ * This is similar to eth_type_trans, which cannot be used because of * our dev->hard_header_len */ -static inline unsigned short br_type_trans(struct sk_buff *skb, - struct net_device *dev) +static inline __be16 br_type_trans(struct sk_buff *skb, struct net_device *dev) { struct ethhdr *eth; unsigned char *rawp; - eth = skb->mac.ethernet; + eth = eth_hdr(skb); - if (*eth->h_dest & 1) { - if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0) + if (is_multicast_ether_addr(eth->h_dest)) { + if (!compare_ether_addr(eth->h_dest, dev->broadcast)) skb->pkt_type = PACKET_BROADCAST; else skb->pkt_type = PACKET_MULTICAST; } - else if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN)) + else if (compare_ether_addr(eth->h_dest, dev->dev_addr)) skb->pkt_type = PACKET_OTHERHOST; if (ntohs(eth->h_proto) >= 1536) @@ -557,13 +557,13 @@ Note: we do not have explicit unassign, but look at _push() barrier(); atmvcc->push = br2684_push; skb_queue_head_init(©); - skb_migrate(&atmvcc->sk->sk_receive_queue, ©); - while ((skb = skb_dequeue(©))) { + skb_migrate(&sk_atm(atmvcc)->sk_receive_queue, ©); + while ((skb = skb_dequeue(©)) != NULL) { BRPRIV(skb->dev)->stats.rx_bytes -= skb->len; BRPRIV(skb->dev)->stats.rx_packets--; br2684_push(atmvcc, skb); } - (void) try_module_get(THIS_MODULE); + __module_get(THIS_MODULE); return 0; error: write_unlock_irq(&devs_lock);