]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/s390/net/qeth_main.c
Merge branch 'for-2.6.24' of git://git.kernel.org/pub/scm/linux/kernel/git/galak...
[linux-2.6-omap-h63xx.git] / drivers / s390 / net / qeth_main.c
index fe6164795edaf720cc482cf938741f0331d7feab..ff999ff0b6272a9edc2dc1feb5990f549642e416 100644 (file)
@@ -823,14 +823,15 @@ __qeth_delete_all_mc(struct qeth_card *card, unsigned long *flags)
 again:
        list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {
                if (addr->is_multicast) {
+                       list_del(&addr->entry);
                        spin_unlock_irqrestore(&card->ip_lock, *flags);
                        rc = qeth_deregister_addr_entry(card, addr);
                        spin_lock_irqsave(&card->ip_lock, *flags);
                        if (!rc) {
-                               list_del(&addr->entry);
                                kfree(addr);
                                goto again;
-                       }
+                       } else
+                               list_add(&addr->entry, &card->ip_list);
                }
        }
 }
@@ -2701,10 +2702,15 @@ qeth_process_inbound_buffer(struct qeth_card *card,
                        qeth_layer2_rebuild_skb(card, skb, hdr);
                else if (hdr->hdr.l3.id == QETH_HEADER_TYPE_LAYER3)
                        vlan_tag = qeth_rebuild_skb(card, skb, hdr);
-               else { /*in case of OSN*/
+               else if (hdr->hdr.osn.id == QETH_HEADER_TYPE_OSN) {
                        skb_push(skb, sizeof(struct qeth_hdr));
                        skb_copy_to_linear_data(skb, hdr,
                                                sizeof(struct qeth_hdr));
+               } else { /* unknown header type */
+                       dev_kfree_skb_any(skb);
+                       QETH_DBF_TEXT(trace, 3, "inbunkno");
+                       QETH_DBF_HEX(control, 3, hdr, QETH_DBF_CONTROL_LEN);
+                       continue;
                }
                /* is device UP ? */
                if (!(card->dev->flags & IFF_UP)){
@@ -6574,11 +6580,12 @@ qeth_hard_header_parse(const struct sk_buff *skb, unsigned char *haddr)
 {
        const struct qeth_card *card;
        const struct ethhdr *eth;
+       struct net_device *dev = skb->dev;
 
        if (dev->type != ARPHRD_IEEE802_TR)
                return 0;
 
-       card = qeth_get_card_from_dev(skb->dev);
+       card = qeth_get_card_from_dev(dev);
        if (card->options.layer2)
                goto haveheader;
 #ifdef CONFIG_QETH_IPV6
@@ -6636,7 +6643,8 @@ qeth_netdev_init(struct net_device *dev)
        dev->vlan_rx_kill_vid = qeth_vlan_rx_kill_vid;
        dev->vlan_rx_add_vid = qeth_vlan_rx_add_vid;
 #endif
-       dev->header_ops = &qeth_null_ops;
+       if (qeth_get_netdev_flags(card) & IFF_NOARP)
+               dev->header_ops = &qeth_null_ops;
 
 #ifdef CONFIG_QETH_IPV6
        /*IPv6 address autoconfiguration stuff*/