Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[safe/jmp/linux-2.6] / drivers / s390 / net / qeth_l3_main.c
index e95220a..999552c 100644 (file)
@@ -28,8 +28,6 @@
 #include "qeth_l3.h"
 #include "qeth_core_offl.h"
 
-DEFINE_PER_CPU(char[256], qeth_l3_dbf_txt_buf);
-
 static int qeth_l3_set_offline(struct ccwgroup_device *);
 static int qeth_l3_recover(void *);
 static int qeth_l3_stop(struct net_device *);
@@ -259,7 +257,7 @@ static int __qeth_l3_insert_ip_todo(struct qeth_card *card,
                                addr->users += add ? 1 : -1;
                        if (add && (addr->type == QETH_IP_TYPE_NORMAL) &&
                            qeth_l3_is_addr_covered_by_ipato(card, addr)) {
-                               QETH_DBF_TEXT(trace, 2, "tkovaddr");
+                               QETH_DBF_TEXT(TRACE, 2, "tkovaddr");
                                addr->set_flags |= QETH_IPA_SETIP_TAKEOVER_FLAG;
                        }
                        list_add_tail(&addr->entry, card->ip_tbd_list);
@@ -273,13 +271,13 @@ static int qeth_l3_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
        unsigned long flags;
        int rc = 0;
 
-       QETH_DBF_TEXT(trace, 4, "delip");
+       QETH_DBF_TEXT(TRACE, 4, "delip");
 
        if (addr->proto == QETH_PROT_IPV4)
-               QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, 4);
+               QETH_DBF_HEX(TRACE, 4, &addr->u.a4.addr, 4);
        else {
-               QETH_DBF_HEX(trace, 4, &addr->u.a6.addr, 8);
-               QETH_DBF_HEX(trace, 4, ((char *)&addr->u.a6.addr) + 8, 8);
+               QETH_DBF_HEX(TRACE, 4, &addr->u.a6.addr, 8);
+               QETH_DBF_HEX(TRACE, 4, ((char *)&addr->u.a6.addr) + 8, 8);
        }
        spin_lock_irqsave(&card->ip_lock, flags);
        rc = __qeth_l3_insert_ip_todo(card, addr, 0);
@@ -292,12 +290,12 @@ static int qeth_l3_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
        unsigned long flags;
        int rc = 0;
 
-       QETH_DBF_TEXT(trace, 4, "addip");
+       QETH_DBF_TEXT(TRACE, 4, "addip");
        if (addr->proto == QETH_PROT_IPV4)
-               QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, 4);
+               QETH_DBF_HEX(TRACE, 4, &addr->u.a4.addr, 4);
        else {
-               QETH_DBF_HEX(trace, 4, &addr->u.a6.addr, 8);
-               QETH_DBF_HEX(trace, 4, ((char *)&addr->u.a6.addr) + 8, 8);
+               QETH_DBF_HEX(TRACE, 4, &addr->u.a6.addr, 8);
+               QETH_DBF_HEX(TRACE, 4, ((char *)&addr->u.a6.addr) + 8, 8);
        }
        spin_lock_irqsave(&card->ip_lock, flags);
        rc = __qeth_l3_insert_ip_todo(card, addr, 1);
@@ -313,7 +311,6 @@ static struct qeth_ipaddr *qeth_l3_get_addr_buffer(
 
        addr = kzalloc(sizeof(struct qeth_ipaddr), GFP_ATOMIC);
        if (addr == NULL) {
-               PRINT_WARN("Not enough memory to add address\n");
                return NULL;
        }
        addr->type = QETH_IP_TYPE_NORMAL;
@@ -326,10 +323,10 @@ static void qeth_l3_delete_mc_addresses(struct qeth_card *card)
        struct qeth_ipaddr *iptodo;
        unsigned long flags;
 
-       QETH_DBF_TEXT(trace, 4, "delmc");
+       QETH_DBF_TEXT(TRACE, 4, "delmc");
        iptodo = qeth_l3_get_addr_buffer(QETH_PROT_IPV4);
        if (!iptodo) {
-               QETH_DBF_TEXT(trace, 2, "dmcnomem");
+               QETH_DBF_TEXT(TRACE, 2, "dmcnomem");
                return;
        }
        iptodo->type = QETH_IP_TYPE_DEL_ALL_MC;
@@ -430,14 +427,14 @@ static void qeth_l3_set_ip_addr_list(struct qeth_card *card)
        unsigned long flags;
        int rc;
 
-       QETH_DBF_TEXT(trace, 2, "sdiplist");
-       QETH_DBF_HEX(trace, 2, &card, sizeof(void *));
+       QETH_DBF_TEXT(TRACE, 2, "sdiplist");
+       QETH_DBF_HEX(TRACE, 2, &card, sizeof(void *));
 
        spin_lock_irqsave(&card->ip_lock, flags);
        tbd_list = card->ip_tbd_list;
        card->ip_tbd_list = kmalloc(sizeof(struct list_head), GFP_ATOMIC);
        if (!card->ip_tbd_list) {
-               QETH_DBF_TEXT(trace, 0, "silnomem");
+               QETH_DBF_TEXT(TRACE, 0, "silnomem");
                card->ip_tbd_list = tbd_list;
                spin_unlock_irqrestore(&card->ip_lock, flags);
                return;
@@ -461,7 +458,7 @@ static void qeth_l3_set_ip_addr_list(struct qeth_card *card)
                        spin_unlock_irqrestore(&card->ip_lock, flags);
                        rc = qeth_l3_register_addr_entry(card, todo);
                        spin_lock_irqsave(&card->ip_lock, flags);
-                       if (!rc)
+                       if (!rc || (rc == IPA_RC_LAN_OFFLINE))
                                list_add_tail(&todo->entry, &card->ip_list);
                        else
                                kfree(todo);
@@ -488,7 +485,7 @@ static void qeth_l3_clear_ip_list(struct qeth_card *card, int clean,
        struct qeth_ipaddr *addr, *tmp;
        unsigned long flags;
 
-       QETH_DBF_TEXT(trace, 4, "clearip");
+       QETH_DBF_TEXT(TRACE, 4, "clearip");
        spin_lock_irqsave(&card->ip_lock, flags);
        /* clear todo list */
        list_for_each_entry_safe(addr, tmp, card->ip_tbd_list, entry) {
@@ -546,7 +543,7 @@ static int qeth_l3_send_setdelmc(struct qeth_card *card,
        struct qeth_cmd_buffer *iob;
        struct qeth_ipa_cmd *cmd;
 
-       QETH_DBF_TEXT(trace, 4, "setdelmc");
+       QETH_DBF_TEXT(TRACE, 4, "setdelmc");
 
        iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
@@ -584,8 +581,8 @@ static int qeth_l3_send_setdelip(struct qeth_card *card,
        struct qeth_ipa_cmd *cmd;
        __u8 netmask[16];
 
-       QETH_DBF_TEXT(trace, 4, "setdelip");
-       QETH_DBF_TEXT_(trace, 4, "flags%02X", flags);
+       QETH_DBF_TEXT(TRACE, 4, "setdelip");
+       QETH_DBF_TEXT_(TRACE, 4, "flags%02X", flags);
 
        iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
@@ -614,7 +611,7 @@ static int qeth_l3_send_setrouting(struct qeth_card *card,
        struct qeth_ipa_cmd *cmd;
        struct qeth_cmd_buffer *iob;
 
-       QETH_DBF_TEXT(trace, 4, "setroutg");
+       QETH_DBF_TEXT(TRACE, 4, "setroutg");
        iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot);
        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
        cmd->data.setrtg.type = (type);
@@ -651,15 +648,6 @@ static void qeth_l3_correct_routing_type(struct qeth_card *card,
                }
        }
 out_inval:
-       PRINT_WARN("Routing type '%s' not supported for interface %s.\n"
-                  "Router status set to 'no router'.\n",
-                  ((*type == PRIMARY_ROUTER)? "primary router" :
-                   (*type == SECONDARY_ROUTER)? "secondary router" :
-                   (*type == PRIMARY_CONNECTOR)? "primary connector" :
-                   (*type == SECONDARY_CONNECTOR)? "secondary connector" :
-                   (*type == MULTICAST_ROUTER)? "multicast router" :
-                   "unknown"),
-                  card->dev->name);
        *type = NO_ROUTER;
 }
 
@@ -667,7 +655,7 @@ int qeth_l3_setrouting_v4(struct qeth_card *card)
 {
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "setrtg4");
+       QETH_DBF_TEXT(TRACE, 3, "setrtg4");
 
        qeth_l3_correct_routing_type(card, &card->options.route4.type,
                                  QETH_PROT_IPV4);
@@ -676,9 +664,9 @@ int qeth_l3_setrouting_v4(struct qeth_card *card)
                                  QETH_PROT_IPV4);
        if (rc) {
                card->options.route4.type = NO_ROUTER;
-               PRINT_WARN("Error (0x%04x) while setting routing type on %s. "
-                          "Type set to 'no router'.\n",
-                          rc, QETH_CARD_IFNAME(card));
+               QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type"
+                       " on %s. Type set to 'no router'.\n", rc,
+                       QETH_CARD_IFNAME(card));
        }
        return rc;
 }
@@ -687,7 +675,7 @@ int qeth_l3_setrouting_v6(struct qeth_card *card)
 {
        int rc = 0;
 
-       QETH_DBF_TEXT(trace, 3, "setrtg6");
+       QETH_DBF_TEXT(TRACE, 3, "setrtg6");
 #ifdef CONFIG_QETH_IPV6
 
        if (!qeth_is_supported(card, IPA_IPV6))
@@ -699,9 +687,9 @@ int qeth_l3_setrouting_v6(struct qeth_card *card)
                                  QETH_PROT_IPV6);
        if (rc) {
                card->options.route6.type = NO_ROUTER;
-               PRINT_WARN("Error (0x%04x) while setting routing type on %s. "
-                          "Type set to 'no router'.\n",
-                          rc, QETH_CARD_IFNAME(card));
+               QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type"
+                       " on %s. Type set to 'no router'.\n", rc,
+                       QETH_CARD_IFNAME(card));
        }
 #endif
        return rc;
@@ -731,7 +719,7 @@ int qeth_l3_add_ipato_entry(struct qeth_card *card,
        unsigned long flags;
        int rc = 0;
 
-       QETH_DBF_TEXT(trace, 2, "addipato");
+       QETH_DBF_TEXT(TRACE, 2, "addipato");
        spin_lock_irqsave(&card->ip_lock, flags);
        list_for_each_entry(ipatoe, &card->ipato.entries, entry) {
                if (ipatoe->proto != new->proto)
@@ -739,7 +727,6 @@ int qeth_l3_add_ipato_entry(struct qeth_card *card,
                if (!memcmp(ipatoe->addr, new->addr,
                            (ipatoe->proto == QETH_PROT_IPV4)? 4:16) &&
                    (ipatoe->mask_bits == new->mask_bits)) {
-                       PRINT_WARN("ipato entry already exists!\n");
                        rc = -EEXIST;
                        break;
                }
@@ -757,7 +744,7 @@ void qeth_l3_del_ipato_entry(struct qeth_card *card,
        struct qeth_ipato_entry *ipatoe, *tmp;
        unsigned long flags;
 
-       QETH_DBF_TEXT(trace, 2, "delipato");
+       QETH_DBF_TEXT(TRACE, 2, "delipato");
        spin_lock_irqsave(&card->ip_lock, flags);
        list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) {
                if (ipatoe->proto != proto)
@@ -785,11 +772,11 @@ int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
        ipaddr = qeth_l3_get_addr_buffer(proto);
        if (ipaddr) {
                if (proto == QETH_PROT_IPV4) {
-                       QETH_DBF_TEXT(trace, 2, "addvipa4");
+                       QETH_DBF_TEXT(TRACE, 2, "addvipa4");
                        memcpy(&ipaddr->u.a4.addr, addr, 4);
                        ipaddr->u.a4.mask = 0;
                } else if (proto == QETH_PROT_IPV6) {
-                       QETH_DBF_TEXT(trace, 2, "addvipa6");
+                       QETH_DBF_TEXT(TRACE, 2, "addvipa6");
                        memcpy(&ipaddr->u.a6.addr, addr, 16);
                        ipaddr->u.a6.pfxlen = 0;
                }
@@ -804,7 +791,6 @@ int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
                rc = -EEXIST;
        spin_unlock_irqrestore(&card->ip_lock, flags);
        if (rc) {
-               PRINT_WARN("Cannot add VIPA. Address already exists!\n");
                return rc;
        }
        if (!qeth_l3_add_ip(card, ipaddr))
@@ -821,11 +807,11 @@ void qeth_l3_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
        ipaddr = qeth_l3_get_addr_buffer(proto);
        if (ipaddr) {
                if (proto == QETH_PROT_IPV4) {
-                       QETH_DBF_TEXT(trace, 2, "delvipa4");
+                       QETH_DBF_TEXT(TRACE, 2, "delvipa4");
                        memcpy(&ipaddr->u.a4.addr, addr, 4);
                        ipaddr->u.a4.mask = 0;
                } else if (proto == QETH_PROT_IPV6) {
-                       QETH_DBF_TEXT(trace, 2, "delvipa6");
+                       QETH_DBF_TEXT(TRACE, 2, "delvipa6");
                        memcpy(&ipaddr->u.a6.addr, addr, 16);
                        ipaddr->u.a6.pfxlen = 0;
                }
@@ -850,11 +836,11 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
        ipaddr = qeth_l3_get_addr_buffer(proto);
        if (ipaddr) {
                if (proto == QETH_PROT_IPV4) {
-                       QETH_DBF_TEXT(trace, 2, "addrxip4");
+                       QETH_DBF_TEXT(TRACE, 2, "addrxip4");
                        memcpy(&ipaddr->u.a4.addr, addr, 4);
                        ipaddr->u.a4.mask = 0;
                } else if (proto == QETH_PROT_IPV6) {
-                       QETH_DBF_TEXT(trace, 2, "addrxip6");
+                       QETH_DBF_TEXT(TRACE, 2, "addrxip6");
                        memcpy(&ipaddr->u.a6.addr, addr, 16);
                        ipaddr->u.a6.pfxlen = 0;
                }
@@ -869,7 +855,6 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
                rc = -EEXIST;
        spin_unlock_irqrestore(&card->ip_lock, flags);
        if (rc) {
-               PRINT_WARN("Cannot add RXIP. Address already exists!\n");
                return rc;
        }
        if (!qeth_l3_add_ip(card, ipaddr))
@@ -886,11 +871,11 @@ void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
        ipaddr = qeth_l3_get_addr_buffer(proto);
        if (ipaddr) {
                if (proto == QETH_PROT_IPV4) {
-                       QETH_DBF_TEXT(trace, 2, "addrxip4");
+                       QETH_DBF_TEXT(TRACE, 2, "addrxip4");
                        memcpy(&ipaddr->u.a4.addr, addr, 4);
                        ipaddr->u.a4.mask = 0;
                } else if (proto == QETH_PROT_IPV6) {
-                       QETH_DBF_TEXT(trace, 2, "addrxip6");
+                       QETH_DBF_TEXT(TRACE, 2, "addrxip6");
                        memcpy(&ipaddr->u.a6.addr, addr, 16);
                        ipaddr->u.a6.pfxlen = 0;
                }
@@ -910,15 +895,15 @@ static int qeth_l3_register_addr_entry(struct qeth_card *card,
        int cnt = 3;
 
        if (addr->proto == QETH_PROT_IPV4) {
-               QETH_DBF_TEXT(trace, 2, "setaddr4");
-               QETH_DBF_HEX(trace, 3, &addr->u.a4.addr, sizeof(int));
+               QETH_DBF_TEXT(TRACE, 2, "setaddr4");
+               QETH_DBF_HEX(TRACE, 3, &addr->u.a4.addr, sizeof(int));
        } else if (addr->proto == QETH_PROT_IPV6) {
-               QETH_DBF_TEXT(trace, 2, "setaddr6");
-               QETH_DBF_HEX(trace, 3, &addr->u.a6.addr, 8);
-               QETH_DBF_HEX(trace, 3, ((char *)&addr->u.a6.addr) + 8, 8);
+               QETH_DBF_TEXT(TRACE, 2, "setaddr6");
+               QETH_DBF_HEX(TRACE, 3, &addr->u.a6.addr, 8);
+               QETH_DBF_HEX(TRACE, 3, ((char *)&addr->u.a6.addr) + 8, 8);
        } else {
-               QETH_DBF_TEXT(trace, 2, "setaddr?");
-               QETH_DBF_HEX(trace, 3, addr, sizeof(struct qeth_ipaddr));
+               QETH_DBF_TEXT(TRACE, 2, "setaddr?");
+               QETH_DBF_HEX(TRACE, 3, addr, sizeof(struct qeth_ipaddr));
        }
        do {
                if (addr->is_multicast)
@@ -927,10 +912,10 @@ static int qeth_l3_register_addr_entry(struct qeth_card *card,
                        rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_SETIP,
                                        addr->set_flags);
                if (rc)
-                       QETH_DBF_TEXT(trace, 2, "failed");
+                       QETH_DBF_TEXT(TRACE, 2, "failed");
        } while ((--cnt > 0) && rc);
        if (rc) {
-               QETH_DBF_TEXT(trace, 2, "FAILED");
+               QETH_DBF_TEXT(TRACE, 2, "FAILED");
                qeth_l3_ipaddr_to_string(addr->proto, (u8 *)&addr->u, buf);
                PRINT_WARN("Could not register IP address %s (rc=0x%x/%d)\n",
                           buf, rc, rc);
@@ -944,15 +929,15 @@ static int qeth_l3_deregister_addr_entry(struct qeth_card *card,
        int rc = 0;
 
        if (addr->proto == QETH_PROT_IPV4) {
-               QETH_DBF_TEXT(trace, 2, "deladdr4");
-               QETH_DBF_HEX(trace, 3, &addr->u.a4.addr, sizeof(int));
+               QETH_DBF_TEXT(TRACE, 2, "deladdr4");
+               QETH_DBF_HEX(TRACE, 3, &addr->u.a4.addr, sizeof(int));
        } else if (addr->proto == QETH_PROT_IPV6) {
-               QETH_DBF_TEXT(trace, 2, "deladdr6");
-               QETH_DBF_HEX(trace, 3, &addr->u.a6.addr, 8);
-               QETH_DBF_HEX(trace, 3, ((char *)&addr->u.a6.addr) + 8, 8);
+               QETH_DBF_TEXT(TRACE, 2, "deladdr6");
+               QETH_DBF_HEX(TRACE, 3, &addr->u.a6.addr, 8);
+               QETH_DBF_HEX(TRACE, 3, ((char *)&addr->u.a6.addr) + 8, 8);
        } else {
-               QETH_DBF_TEXT(trace, 2, "deladdr?");
-               QETH_DBF_HEX(trace, 3, addr, sizeof(struct qeth_ipaddr));
+               QETH_DBF_TEXT(TRACE, 2, "deladdr?");
+               QETH_DBF_HEX(TRACE, 3, addr, sizeof(struct qeth_ipaddr));
        }
        if (addr->is_multicast)
                rc = qeth_l3_send_setdelmc(card, addr, IPA_CMD_DELIPM);
@@ -960,7 +945,7 @@ static int qeth_l3_deregister_addr_entry(struct qeth_card *card,
                rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_DELIP,
                                        addr->del_flags);
        if (rc) {
-               QETH_DBF_TEXT(trace, 2, "failed");
+               QETH_DBF_TEXT(TRACE, 2, "failed");
                /* TODO: re-activate this warning as soon as we have a
                 * clean mirco code
                qeth_ipaddr_to_string(addr->proto, (u8 *)&addr->u, buf);
@@ -1000,7 +985,7 @@ static int qeth_l3_send_setadp_mode(struct qeth_card *card, __u32 command,
        struct qeth_cmd_buffer *iob;
        struct qeth_ipa_cmd *cmd;
 
-       QETH_DBF_TEXT(trace, 4, "adpmode");
+       QETH_DBF_TEXT(TRACE, 4, "adpmode");
 
        iob = qeth_get_adapter_cmd(card, command,
                                   sizeof(struct qeth_ipacmd_setadpparms));
@@ -1015,30 +1000,30 @@ static int qeth_l3_setadapter_hstr(struct qeth_card *card)
 {
        int rc;
 
-       QETH_DBF_TEXT(trace, 4, "adphstr");
+       QETH_DBF_TEXT(TRACE, 4, "adphstr");
 
        if (qeth_adp_supported(card, IPA_SETADP_SET_BROADCAST_MODE)) {
                rc = qeth_l3_send_setadp_mode(card,
                                        IPA_SETADP_SET_BROADCAST_MODE,
                                        card->options.broadcast_mode);
                if (rc)
-                       PRINT_WARN("couldn't set broadcast mode on "
+                       QETH_DBF_MESSAGE(2, "couldn't set broadcast mode on "
                                   "device %s: x%x\n",
                                   CARD_BUS_ID(card), rc);
                rc = qeth_l3_send_setadp_mode(card,
                                        IPA_SETADP_ALTER_MAC_ADDRESS,
                                        card->options.macaddr_mode);
                if (rc)
-                       PRINT_WARN("couldn't set macaddr mode on "
+                       QETH_DBF_MESSAGE(2, "couldn't set macaddr mode on "
                                   "device %s: x%x\n", CARD_BUS_ID(card), rc);
                return rc;
        }
        if (card->options.broadcast_mode == QETH_TR_BROADCAST_LOCAL)
-               PRINT_WARN("set adapter parameters not available "
+               QETH_DBF_MESSAGE(2, "set adapter parameters not available "
                           "to set broadcast mode, using ALLRINGS "
                           "on device %s:\n", CARD_BUS_ID(card));
        if (card->options.macaddr_mode == QETH_TR_MACADDR_CANONICAL)
-               PRINT_WARN("set adapter parameters not available "
+               QETH_DBF_MESSAGE(2, "set adapter parameters not available "
                           "to set macaddr mode, using NONCANONICAL "
                           "on device %s:\n", CARD_BUS_ID(card));
        return 0;
@@ -1048,13 +1033,13 @@ static int qeth_l3_setadapter_parms(struct qeth_card *card)
 {
        int rc;
 
-       QETH_DBF_TEXT(setup, 2, "setadprm");
+       QETH_DBF_TEXT(SETUP, 2, "setadprm");
 
        if (!qeth_is_supported(card, IPA_SETADAPTERPARMS)) {
                PRINT_WARN("set adapter parameters not supported "
                           "on device %s.\n",
                           CARD_BUS_ID(card));
-               QETH_DBF_TEXT(setup, 2, " notsupp");
+               QETH_DBF_TEXT(SETUP, 2, " notsupp");
                return 0;
        }
        rc = qeth_query_setadapterparms(card);
@@ -1083,7 +1068,7 @@ static int qeth_l3_default_setassparms_cb(struct qeth_card *card,
 {
        struct qeth_ipa_cmd *cmd;
 
-       QETH_DBF_TEXT(trace, 4, "defadpcb");
+       QETH_DBF_TEXT(TRACE, 4, "defadpcb");
 
        cmd = (struct qeth_ipa_cmd *) data;
        if (cmd->hdr.return_code == 0) {
@@ -1096,7 +1081,7 @@ static int qeth_l3_default_setassparms_cb(struct qeth_card *card,
        if (cmd->data.setassparms.hdr.assist_no == IPA_INBOUND_CHECKSUM &&
            cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) {
                card->info.csum_mask = cmd->data.setassparms.data.flags_32bit;
-               QETH_DBF_TEXT_(trace, 3, "csum:%d", card->info.csum_mask);
+               QETH_DBF_TEXT_(TRACE, 3, "csum:%d", card->info.csum_mask);
        }
        return 0;
 }
@@ -1108,7 +1093,7 @@ static struct qeth_cmd_buffer *qeth_l3_get_setassparms_cmd(
        struct qeth_cmd_buffer *iob;
        struct qeth_ipa_cmd *cmd;
 
-       QETH_DBF_TEXT(trace, 4, "getasscm");
+       QETH_DBF_TEXT(TRACE, 4, "getasscm");
        iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot);
 
        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
@@ -1130,7 +1115,7 @@ static int qeth_l3_send_setassparms(struct qeth_card *card,
        int rc;
        struct qeth_ipa_cmd *cmd;
 
-       QETH_DBF_TEXT(trace, 4, "sendassp");
+       QETH_DBF_TEXT(TRACE, 4, "sendassp");
 
        cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
        if (len <= sizeof(__u32))
@@ -1149,7 +1134,7 @@ static int qeth_l3_send_simple_setassparms_ipv6(struct qeth_card *card,
        int rc;
        struct qeth_cmd_buffer *iob;
 
-       QETH_DBF_TEXT(trace, 4, "simassp6");
+       QETH_DBF_TEXT(TRACE, 4, "simassp6");
        iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code,
                                       0, QETH_PROT_IPV6);
        rc = qeth_l3_send_setassparms(card, iob, 0, 0,
@@ -1165,7 +1150,7 @@ static int qeth_l3_send_simple_setassparms(struct qeth_card *card,
        int length = 0;
        struct qeth_cmd_buffer *iob;
 
-       QETH_DBF_TEXT(trace, 4, "simassp4");
+       QETH_DBF_TEXT(TRACE, 4, "simassp4");
        if (data)
                length = sizeof(__u32);
        iob = qeth_l3_get_setassparms_cmd(card, ipa_func, cmd_code,
@@ -1179,7 +1164,7 @@ static int qeth_l3_start_ipa_arp_processing(struct qeth_card *card)
 {
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "ipaarp");
+       QETH_DBF_TEXT(TRACE, 3, "ipaarp");
 
        if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) {
                PRINT_WARN("ARP processing not supported "
@@ -1200,7 +1185,7 @@ static int qeth_l3_start_ipa_ip_fragmentation(struct qeth_card *card)
 {
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "ipaipfrg");
+       QETH_DBF_TEXT(TRACE, 3, "ipaipfrg");
 
        if (!qeth_is_supported(card, IPA_IP_FRAGMENTATION)) {
                PRINT_INFO("Hardware IP fragmentation not supported on %s\n",
@@ -1223,7 +1208,7 @@ static int qeth_l3_start_ipa_source_mac(struct qeth_card *card)
 {
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "stsrcmac");
+       QETH_DBF_TEXT(TRACE, 3, "stsrcmac");
 
        if (!card->options.fake_ll)
                return -EOPNOTSUPP;
@@ -1247,7 +1232,7 @@ static int qeth_l3_start_ipa_vlan(struct qeth_card *card)
 {
        int rc = 0;
 
-       QETH_DBF_TEXT(trace, 3, "strtvlan");
+       QETH_DBF_TEXT(TRACE, 3, "strtvlan");
 
        if (!qeth_is_supported(card, IPA_FULL_VLAN)) {
                PRINT_WARN("VLAN not supported on %s\n",
@@ -1271,7 +1256,7 @@ static int qeth_l3_start_ipa_multicast(struct qeth_card *card)
 {
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "stmcast");
+       QETH_DBF_TEXT(TRACE, 3, "stmcast");
 
        if (!qeth_is_supported(card, IPA_MULTICASTING)) {
                PRINT_WARN("Multicast not supported on %s\n",
@@ -1297,7 +1282,7 @@ static int qeth_l3_query_ipassists_cb(struct qeth_card *card,
 {
        struct qeth_ipa_cmd *cmd;
 
-       QETH_DBF_TEXT(setup, 2, "qipasscb");
+       QETH_DBF_TEXT(SETUP, 2, "qipasscb");
 
        cmd = (struct qeth_ipa_cmd *) data;
        if (cmd->hdr.prot_version == QETH_PROT_IPV4) {
@@ -1307,9 +1292,9 @@ static int qeth_l3_query_ipassists_cb(struct qeth_card *card,
                card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
                card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
        }
-       QETH_DBF_TEXT(setup, 2, "suppenbl");
-       QETH_DBF_TEXT_(setup, 2, "%x", cmd->hdr.ipa_supported);
-       QETH_DBF_TEXT_(setup, 2, "%x", cmd->hdr.ipa_enabled);
+       QETH_DBF_TEXT(SETUP, 2, "suppenbl");
+       QETH_DBF_TEXT_(SETUP, 2, "%x", cmd->hdr.ipa_supported);
+       QETH_DBF_TEXT_(SETUP, 2, "%x", cmd->hdr.ipa_enabled);
        return 0;
 }
 
@@ -1319,7 +1304,7 @@ static int qeth_l3_query_ipassists(struct qeth_card *card,
        int rc;
        struct qeth_cmd_buffer *iob;
 
-       QETH_DBF_TEXT_(setup, 2, "qipassi%i", prot);
+       QETH_DBF_TEXT_(SETUP, 2, "qipassi%i", prot);
        iob = qeth_get_ipacmd_buffer(card, IPA_CMD_QIPASSIST, prot);
        rc = qeth_send_ipa_cmd(card, iob, qeth_l3_query_ipassists_cb, NULL);
        return rc;
@@ -1330,7 +1315,7 @@ static int qeth_l3_softsetup_ipv6(struct qeth_card *card)
 {
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "softipv6");
+       QETH_DBF_TEXT(TRACE, 3, "softipv6");
 
        if (card->info.type == QETH_CARD_TYPE_IQD)
                goto out;
@@ -1375,7 +1360,7 @@ static int qeth_l3_start_ipa_ipv6(struct qeth_card *card)
 {
        int rc = 0;
 
-       QETH_DBF_TEXT(trace, 3, "strtipv6");
+       QETH_DBF_TEXT(TRACE, 3, "strtipv6");
 
        if (!qeth_is_supported(card, IPA_IPV6)) {
                PRINT_WARN("IPv6 not supported on %s\n",
@@ -1392,7 +1377,7 @@ static int qeth_l3_start_ipa_broadcast(struct qeth_card *card)
 {
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "stbrdcst");
+       QETH_DBF_TEXT(TRACE, 3, "stbrdcst");
        card->info.broadcast_capable = 0;
        if (!qeth_is_supported(card, IPA_FILTERING)) {
                PRINT_WARN("Broadcast not supported on %s\n",
@@ -1462,7 +1447,7 @@ static int qeth_l3_start_ipa_checksum(struct qeth_card *card)
 {
        int rc = 0;
 
-       QETH_DBF_TEXT(trace, 3, "strtcsum");
+       QETH_DBF_TEXT(TRACE, 3, "strtcsum");
 
        if (card->options.checksum_type == NO_CHECKSUMMING) {
                PRINT_WARN("Using no checksumming on %s.\n",
@@ -1493,7 +1478,7 @@ static int qeth_l3_start_ipa_tso(struct qeth_card *card)
 {
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "sttso");
+       QETH_DBF_TEXT(TRACE, 3, "sttso");
 
        if (!qeth_is_supported(card, IPA_OUTBOUND_TSO)) {
                PRINT_WARN("Outbound TSO not supported on %s\n",
@@ -1518,7 +1503,7 @@ static int qeth_l3_start_ipa_tso(struct qeth_card *card)
 
 static int qeth_l3_start_ipassists(struct qeth_card *card)
 {
-       QETH_DBF_TEXT(trace, 3, "strtipas");
+       QETH_DBF_TEXT(TRACE, 3, "strtipas");
        qeth_l3_start_ipa_arp_processing(card); /* go on*/
        qeth_l3_start_ipa_ip_fragmentation(card);       /* go on*/
        qeth_l3_start_ipa_source_mac(card);     /* go on*/
@@ -1538,7 +1523,7 @@ static int qeth_l3_put_unique_id(struct qeth_card *card)
        struct qeth_cmd_buffer *iob;
        struct qeth_ipa_cmd *cmd;
 
-       QETH_DBF_TEXT(trace, 2, "puniqeid");
+       QETH_DBF_TEXT(TRACE, 2, "puniqeid");
 
        if ((card->info.unique_id & UNIQUE_ID_NOT_BY_CARD) ==
                UNIQUE_ID_NOT_BY_CARD)
@@ -1575,7 +1560,7 @@ static int qeth_l3_iqd_read_initial_mac(struct qeth_card *card)
        struct qeth_cmd_buffer *iob;
        struct qeth_ipa_cmd *cmd;
 
-       QETH_DBF_TEXT(setup, 2, "hsrmac");
+       QETH_DBF_TEXT(SETUP, 2, "hsrmac");
 
        iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR,
                                     QETH_PROT_IPV6);
@@ -1616,7 +1601,7 @@ static int qeth_l3_get_unique_id(struct qeth_card *card)
        struct qeth_cmd_buffer *iob;
        struct qeth_ipa_cmd *cmd;
 
-       QETH_DBF_TEXT(setup, 2, "guniqeid");
+       QETH_DBF_TEXT(SETUP, 2, "guniqeid");
 
        if (!qeth_is_supported(card, IPA_IPV6)) {
                card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
@@ -1649,7 +1634,7 @@ static void qeth_l3_add_mc(struct qeth_card *card, struct in_device *in4_dev)
        struct ip_mc_list *im4;
        char buf[MAX_ADDR_LEN];
 
-       QETH_DBF_TEXT(trace, 4, "addmc");
+       QETH_DBF_TEXT(TRACE, 4, "addmc");
        for (im4 = in4_dev->mc_list; im4; im4 = im4->next) {
                qeth_l3_get_mac_for_ipm(im4->multiaddr, buf, in4_dev->dev);
                ipm = qeth_l3_get_addr_buffer(QETH_PROT_IPV4);
@@ -1669,7 +1654,7 @@ static void qeth_l3_add_vlan_mc(struct qeth_card *card)
        struct vlan_group *vg;
        int i;
 
-       QETH_DBF_TEXT(trace, 4, "addmcvl");
+       QETH_DBF_TEXT(TRACE, 4, "addmcvl");
        if (!qeth_is_supported(card, IPA_FULL_VLAN) || (card->vlangrp == NULL))
                return;
 
@@ -1693,7 +1678,7 @@ static void qeth_l3_add_multicast_ipv4(struct qeth_card *card)
 {
        struct in_device *in4_dev;
 
-       QETH_DBF_TEXT(trace, 4, "chkmcv4");
+       QETH_DBF_TEXT(TRACE, 4, "chkmcv4");
        in4_dev = in_dev_get(card->dev);
        if (in4_dev == NULL)
                return;
@@ -1711,7 +1696,7 @@ static void qeth_l3_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev)
        struct ifmcaddr6 *im6;
        char buf[MAX_ADDR_LEN];
 
-       QETH_DBF_TEXT(trace, 4, "addmc6");
+       QETH_DBF_TEXT(TRACE, 4, "addmc6");
        for (im6 = in6_dev->mc_list; im6 != NULL; im6 = im6->next) {
                ndisc_mc_map(&im6->mca_addr, buf, in6_dev->dev, 0);
                ipm = qeth_l3_get_addr_buffer(QETH_PROT_IPV6);
@@ -1732,7 +1717,7 @@ static void qeth_l3_add_vlan_mc6(struct qeth_card *card)
        struct vlan_group *vg;
        int i;
 
-       QETH_DBF_TEXT(trace, 4, "admc6vl");
+       QETH_DBF_TEXT(TRACE, 4, "admc6vl");
        if (!qeth_is_supported(card, IPA_FULL_VLAN) || (card->vlangrp == NULL))
                return;
 
@@ -1756,7 +1741,7 @@ static void qeth_l3_add_multicast_ipv6(struct qeth_card *card)
 {
        struct inet6_dev *in6_dev;
 
-       QETH_DBF_TEXT(trace, 4, "chkmcv6");
+       QETH_DBF_TEXT(TRACE, 4, "chkmcv6");
        if (!qeth_is_supported(card, IPA_IPV6))
                return ;
        in6_dev = in6_dev_get(card->dev);
@@ -1777,7 +1762,7 @@ static void qeth_l3_free_vlan_addresses4(struct qeth_card *card,
        struct in_ifaddr *ifa;
        struct qeth_ipaddr *addr;
 
-       QETH_DBF_TEXT(trace, 4, "frvaddr4");
+       QETH_DBF_TEXT(TRACE, 4, "frvaddr4");
 
        in_dev = in_dev_get(vlan_group_get_device(card->vlangrp, vid));
        if (!in_dev)
@@ -1803,7 +1788,7 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card,
        struct inet6_ifaddr *ifa;
        struct qeth_ipaddr *addr;
 
-       QETH_DBF_TEXT(trace, 4, "frvaddr6");
+       QETH_DBF_TEXT(TRACE, 4, "frvaddr6");
 
        in6_dev = in6_dev_get(vlan_group_get_device(card->vlangrp, vid));
        if (!in6_dev)
@@ -1838,7 +1823,7 @@ static void qeth_l3_vlan_rx_register(struct net_device *dev,
        struct qeth_card *card = netdev_priv(dev);
        unsigned long flags;
 
-       QETH_DBF_TEXT(trace, 4, "vlanreg");
+       QETH_DBF_TEXT(TRACE, 4, "vlanreg");
        spin_lock_irqsave(&card->vlanlock, flags);
        card->vlangrp = grp;
        spin_unlock_irqrestore(&card->vlanlock, flags);
@@ -1876,7 +1861,7 @@ static void qeth_l3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
        struct qeth_card *card = netdev_priv(dev);
        unsigned long flags;
 
-       QETH_DBF_TEXT_(trace, 4, "kid:%d", vid);
+       QETH_DBF_TEXT_(TRACE, 4, "kid:%d", vid);
        spin_lock_irqsave(&card->vlanlock, flags);
        /* unregister IP addresses of vlan device */
        qeth_l3_free_vlan_addresses(card, vid);
@@ -2006,8 +1991,8 @@ static void qeth_l3_process_inbound_buffer(struct qeth_card *card,
                        break;
                default:
                        dev_kfree_skb_any(skb);
-                       QETH_DBF_TEXT(trace, 3, "inbunkno");
-                       QETH_DBF_HEX(control, 3, hdr, QETH_DBF_CONTROL_LEN);
+                       QETH_DBF_TEXT(TRACE, 3, "inbunkno");
+                       QETH_DBF_HEX(CTRL, 3, hdr, QETH_DBF_CTRL_LEN);
                        continue;
                }
 
@@ -2072,9 +2057,9 @@ static struct qeth_card *qeth_l3_get_card_from_dev(struct net_device *dev)
                card = netdev_priv(dev);
        else if (rc == QETH_VLAN_CARD)
                card = netdev_priv(vlan_dev_info(dev)->real_dev);
-       if (card->options.layer2)
+       if (card && card->options.layer2)
                card = NULL;
-       QETH_DBF_TEXT_(trace, 4, "%d", rc);
+       QETH_DBF_TEXT_(TRACE, 4, "%d", rc);
        return card ;
 }
 
@@ -2082,8 +2067,8 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode)
 {
        int rc = 0;
 
-       QETH_DBF_TEXT(setup, 2, "stopcard");
-       QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
+       QETH_DBF_TEXT(SETUP, 2, "stopcard");
+       QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
 
        qeth_set_allowed_threads(card, 0, 1);
        if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD))
@@ -2093,10 +2078,15 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode)
            (card->state == CARD_STATE_UP)) {
                if (recovery_mode)
                        qeth_l3_stop(card->dev);
+               else {
+                       rtnl_lock();
+                       dev_close(card->dev);
+                       rtnl_unlock();
+               }
                if (!card->use_hard_stop) {
                        rc = qeth_send_stoplan(card);
                        if (rc)
-                               QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+                               QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
                }
                card->state = CARD_STATE_SOFTSETUP;
        }
@@ -2110,7 +2100,7 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode)
                    (card->info.type != QETH_CARD_TYPE_IQD)) {
                        rc = qeth_l3_put_unique_id(card);
                        if (rc)
-                               QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+                               QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
                }
                qeth_qdio_clear_card(card, 0);
                qeth_clear_qdio_buffers(card);
@@ -2129,7 +2119,7 @@ static void qeth_l3_set_multicast_list(struct net_device *dev)
 {
        struct qeth_card *card = netdev_priv(dev);
 
-       QETH_DBF_TEXT(trace, 3, "setmulti");
+       QETH_DBF_TEXT(TRACE, 3, "setmulti");
        qeth_l3_delete_mc_addresses(card);
        qeth_l3_add_multicast_ipv4(card);
 #ifdef CONFIG_QETH_IPV6
@@ -2169,7 +2159,7 @@ static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries)
        int tmp;
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "arpstnoe");
+       QETH_DBF_TEXT(TRACE, 3, "arpstnoe");
 
        /*
         * currently GuestLAN only supports the ARP assist function
@@ -2179,8 +2169,6 @@ static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries)
        if (card->info.guestlan)
                return -EOPNOTSUPP;
        if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) {
-               PRINT_WARN("ARP processing not supported "
-                          "on %s!\n", QETH_CARD_IFNAME(card));
                return -EOPNOTSUPP;
        }
        rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING,
@@ -2188,8 +2176,8 @@ static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries)
                                          no_entries);
        if (rc) {
                tmp = rc;
-               PRINT_WARN("Could not set number of ARP entries on %s: "
-                       "%s (0x%x/%d)\n", QETH_CARD_IFNAME(card),
+               QETH_DBF_MESSAGE(2, "Could not set number of ARP entries on "
+                       "%s: %s (0x%x/%d)\n", QETH_CARD_IFNAME(card),
                        qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
        }
        return rc;
@@ -2223,17 +2211,17 @@ static int qeth_l3_arp_query_cb(struct qeth_card *card,
        int uentry_size;
        int i;
 
-       QETH_DBF_TEXT(trace, 4, "arpquecb");
+       QETH_DBF_TEXT(TRACE, 4, "arpquecb");
 
        qinfo = (struct qeth_arp_query_info *) reply->param;
        cmd = (struct qeth_ipa_cmd *) data;
        if (cmd->hdr.return_code) {
-               QETH_DBF_TEXT_(trace, 4, "qaer1%i", cmd->hdr.return_code);
+               QETH_DBF_TEXT_(TRACE, 4, "qaer1%i", cmd->hdr.return_code);
                return 0;
        }
        if (cmd->data.setassparms.hdr.return_code) {
                cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code;
-               QETH_DBF_TEXT_(trace, 4, "qaer2%i", cmd->hdr.return_code);
+               QETH_DBF_TEXT_(TRACE, 4, "qaer2%i", cmd->hdr.return_code);
                return 0;
        }
        qdata = &cmd->data.setassparms.data.query_arp;
@@ -2255,17 +2243,14 @@ static int qeth_l3_arp_query_cb(struct qeth_card *card,
        /* check if there is enough room in userspace */
        if ((qinfo->udata_len - qinfo->udata_offset) <
                        qdata->no_entries * uentry_size){
-               QETH_DBF_TEXT_(trace, 4, "qaer3%i", -ENOMEM);
+               QETH_DBF_TEXT_(TRACE, 4, "qaer3%i", -ENOMEM);
                cmd->hdr.return_code = -ENOMEM;
-               PRINT_WARN("query ARP user space buffer is too small for "
-                          "the returned number of ARP entries. "
-                          "Aborting query!\n");
                goto out_error;
        }
-       QETH_DBF_TEXT_(trace, 4, "anore%i",
+       QETH_DBF_TEXT_(TRACE, 4, "anore%i",
                       cmd->data.setassparms.hdr.number_of_replies);
-       QETH_DBF_TEXT_(trace, 4, "aseqn%i", cmd->data.setassparms.hdr.seq_no);
-       QETH_DBF_TEXT_(trace, 4, "anoen%i", qdata->no_entries);
+       QETH_DBF_TEXT_(TRACE, 4, "aseqn%i", cmd->data.setassparms.hdr.seq_no);
+       QETH_DBF_TEXT_(TRACE, 4, "anoen%i", qdata->no_entries);
 
        if (qinfo->mask_bits & QETH_QARP_STRIP_ENTRIES) {
                /* strip off "media specific information" */
@@ -2301,7 +2286,7 @@ static int qeth_l3_send_ipa_arp_cmd(struct qeth_card *card,
                        unsigned long),
                void *reply_param)
 {
-       QETH_DBF_TEXT(trace, 4, "sendarp");
+       QETH_DBF_TEXT(TRACE, 4, "sendarp");
 
        memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
        memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
@@ -2317,12 +2302,10 @@ static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata)
        int tmp;
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "arpquery");
+       QETH_DBF_TEXT(TRACE, 3, "arpquery");
 
        if (!qeth_is_supported(card,/*IPA_QUERY_ARP_ADDR_INFO*/
                               IPA_ARP_PROCESSING)) {
-               PRINT_WARN("ARP processing not supported "
-                          "on %s!\n", QETH_CARD_IFNAME(card));
                return -EOPNOTSUPP;
        }
        /* get size of userspace buffer and mask_bits -> 6 bytes */
@@ -2341,7 +2324,7 @@ static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata)
                                   qeth_l3_arp_query_cb, (void *)&qinfo);
        if (rc) {
                tmp = rc;
-               PRINT_WARN("Error while querying ARP cache on %s: %s "
+               QETH_DBF_MESSAGE(2, "Error while querying ARP cache on %s: %s "
                        "(0x%x/%d)\n", QETH_CARD_IFNAME(card),
                        qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
                if (copy_to_user(udata, qinfo.udata, 4))
@@ -2362,7 +2345,7 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card,
        int tmp;
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "arpadent");
+       QETH_DBF_TEXT(TRACE, 3, "arpadent");
 
        /*
         * currently GuestLAN only supports the ARP assist function
@@ -2372,8 +2355,6 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card,
        if (card->info.guestlan)
                return -EOPNOTSUPP;
        if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) {
-               PRINT_WARN("ARP processing not supported "
-                          "on %s!\n", QETH_CARD_IFNAME(card));
                return -EOPNOTSUPP;
        }
 
@@ -2388,10 +2369,9 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card,
        if (rc) {
                tmp = rc;
                qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
-               PRINT_WARN("Could not add ARP entry for address %s on %s: "
-                          "%s (0x%x/%d)\n",
-                          buf, QETH_CARD_IFNAME(card),
-                          qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
+               QETH_DBF_MESSAGE(2, "Could not add ARP entry for address %s "
+                       "on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card),
+                       qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
        }
        return rc;
 }
@@ -2404,7 +2384,7 @@ static int qeth_l3_arp_remove_entry(struct qeth_card *card,
        int tmp;
        int rc;
 
-       QETH_DBF_TEXT(trace, 3, "arprment");
+       QETH_DBF_TEXT(TRACE, 3, "arprment");
 
        /*
         * currently GuestLAN only supports the ARP assist function
@@ -2414,8 +2394,6 @@ static int qeth_l3_arp_remove_entry(struct qeth_card *card,
        if (card->info.guestlan)
                return -EOPNOTSUPP;
        if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) {
-               PRINT_WARN("ARP processing not supported "
-                          "on %s!\n", QETH_CARD_IFNAME(card));
                return -EOPNOTSUPP;
        }
        memcpy(buf, entry, 12);
@@ -2430,10 +2408,9 @@ static int qeth_l3_arp_remove_entry(struct qeth_card *card,
                tmp = rc;
                memset(buf, 0, 16);
                qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
-               PRINT_WARN("Could not delete ARP entry for address %s on %s: "
-                          "%s (0x%x/%d)\n",
-                          buf, QETH_CARD_IFNAME(card),
-                          qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
+               QETH_DBF_MESSAGE(2, "Could not delete ARP entry for address %s"
+                       " on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card),
+                       qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
        }
        return rc;
 }
@@ -2443,7 +2420,7 @@ static int qeth_l3_arp_flush_cache(struct qeth_card *card)
        int rc;
        int tmp;
 
-       QETH_DBF_TEXT(trace, 3, "arpflush");
+       QETH_DBF_TEXT(TRACE, 3, "arpflush");
 
        /*
         * currently GuestLAN only supports the ARP assist function
@@ -2453,16 +2430,14 @@ static int qeth_l3_arp_flush_cache(struct qeth_card *card)
        if (card->info.guestlan || (card->info.type == QETH_CARD_TYPE_IQD))
                return -EOPNOTSUPP;
        if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) {
-               PRINT_WARN("ARP processing not supported "
-                          "on %s!\n", QETH_CARD_IFNAME(card));
                return -EOPNOTSUPP;
        }
        rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING,
                                          IPA_CMD_ASS_ARP_FLUSH_CACHE, 0);
        if (rc) {
                tmp = rc;
-               PRINT_WARN("Could not flush ARP cache on %s: %s (0x%x/%d)\n",
-                       QETH_CARD_IFNAME(card),
+               QETH_DBF_MESSAGE(2, "Could not flush ARP cache on %s: %s "
+                       "(0x%x/%d)\n", QETH_CARD_IFNAME(card),
                        qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
        }
        return rc;
@@ -2552,15 +2527,13 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                rc = -EOPNOTSUPP;
        }
        if (rc)
-               QETH_DBF_TEXT_(trace, 2, "ioce%d", rc);
+               QETH_DBF_TEXT_(TRACE, 2, "ioce%d", rc);
        return rc;
 }
 
 static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
                struct sk_buff *skb, int ipv, int cast_type)
 {
-       QETH_DBF_TEXT(trace, 6, "fillhdr");
-
        memset(hdr, 0, sizeof(struct qeth_hdr));
        hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3;
        hdr->hdr.l3.ext_flags = 0;
@@ -2570,9 +2543,10 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
         * v6 uses passthrough, v4 sets the tag in the QDIO header.
         */
        if (card->vlangrp && vlan_tx_tag_present(skb)) {
-               hdr->hdr.l3.ext_flags = (ipv == 4) ?
-                       QETH_HDR_EXT_VLAN_FRAME :
-                       QETH_HDR_EXT_INCLUDE_VLAN_TAG;
+               if ((ipv == 4) || (card->info.type == QETH_CARD_TYPE_IQD))
+                       hdr->hdr.l3.ext_flags = QETH_HDR_EXT_VLAN_FRAME;
+               else
+                       hdr->hdr.l3.ext_flags = QETH_HDR_EXT_INCLUDE_VLAN_TAG;
                hdr->hdr.l3.vlan_id = vlan_tx_tag_get(skb);
        }
 
@@ -2638,8 +2612,6 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
        enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO;
        struct qeth_eddp_context *ctx = NULL;
 
-       QETH_DBF_TEXT(trace, 6, "l3xmit");
-
        if ((card->info.type == QETH_CARD_TYPE_IQD) &&
            (skb->protocol != htons(ETH_P_IPV6)) &&
            (skb->protocol != htons(ETH_P_IP)))
@@ -2724,7 +2696,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
                ctx = qeth_eddp_create_context(card, new_skb, hdr,
                                                skb->sk->sk_protocol);
                if (ctx == NULL) {
-                       PRINT_WARN("could not create eddp context\n");
+                       QETH_DBF_MESSAGE(2, "could not create eddp context\n");
                        goto tx_drop;
                }
        } else {
@@ -2792,6 +2764,7 @@ tx_drop:
        if ((new_skb != skb) && new_skb)
                dev_kfree_skb_any(new_skb);
        dev_kfree_skb_any(skb);
+       netif_wake_queue(dev);
        return NETDEV_TX_OK;
 }
 
@@ -2799,7 +2772,7 @@ static int qeth_l3_open(struct net_device *dev)
 {
        struct qeth_card *card = netdev_priv(dev);
 
-       QETH_DBF_TEXT(trace, 4, "qethopen");
+       QETH_DBF_TEXT(TRACE, 4, "qethopen");
        if (card->state != CARD_STATE_SOFTSETUP)
                return -ENODEV;
        card->data.state = CH_STATE_UP;
@@ -2816,7 +2789,7 @@ static int qeth_l3_stop(struct net_device *dev)
 {
        struct qeth_card *card = netdev_priv(dev);
 
-       QETH_DBF_TEXT(trace, 4, "qethstop");
+       QETH_DBF_TEXT(TRACE, 4, "qethstop");
        netif_tx_disable(dev);
        card->dev->flags &= ~IFF_UP;
        if (card->state == CARD_STATE_UP)
@@ -2890,6 +2863,7 @@ static struct ethtool_ops qeth_l3_ethtool_ops = {
        .get_ethtool_stats = qeth_core_get_ethtool_stats,
        .get_stats_count = qeth_core_get_stats_count,
        .get_drvinfo = qeth_core_get_drvinfo,
+       .get_settings = qeth_core_ethtool_get_settings,
 };
 
 /*
@@ -2982,7 +2956,6 @@ static void qeth_l3_qdio_input_handler(struct ccw_device *ccwdev,
        int index;
        int i;
 
-       QETH_DBF_TEXT(trace, 6, "qdinput");
        card = (struct qeth_card *) card_ptr;
        net_dev = card->dev;
        if (card->options.performance_stats) {
@@ -2991,11 +2964,11 @@ static void qeth_l3_qdio_input_handler(struct ccw_device *ccwdev,
        }
        if (status & QDIO_STATUS_LOOK_FOR_ERROR) {
                if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION) {
-                       QETH_DBF_TEXT(trace, 1, "qdinchk");
-                       QETH_DBF_TEXT_(trace, 1, "%s", CARD_BUS_ID(card));
-                       QETH_DBF_TEXT_(trace, 1, "%04X%04X",
+                       QETH_DBF_TEXT(TRACE, 1, "qdinchk");
+                       QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card));
+                       QETH_DBF_TEXT_(TRACE, 1, "%04X%04X",
                                        first_element, count);
-                       QETH_DBF_TEXT_(trace, 1, "%04X%04X", queue, status);
+                       QETH_DBF_TEXT_(TRACE, 1, "%04X%04X", queue, status);
                        qeth_schedule_recovery(card);
                        return;
                }
@@ -3059,8 +3032,8 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
        enum qeth_card_states recover_flag;
 
        BUG_ON(!card);
-       QETH_DBF_TEXT(setup, 2, "setonlin");
-       QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
+       QETH_DBF_TEXT(SETUP, 2, "setonlin");
+       QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
 
        qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1);
        if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)) {
@@ -3072,23 +3045,23 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
        recover_flag = card->state;
        rc = ccw_device_set_online(CARD_RDEV(card));
        if (rc) {
-               QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
                return -EIO;
        }
        rc = ccw_device_set_online(CARD_WDEV(card));
        if (rc) {
-               QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
                return -EIO;
        }
        rc = ccw_device_set_online(CARD_DDEV(card));
        if (rc) {
-               QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
                return -EIO;
        }
 
        rc = qeth_core_hardsetup_card(card);
        if (rc) {
-               QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
                goto out_remove;
        }
 
@@ -3101,11 +3074,11 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
        qeth_print_status_message(card);
 
        /* softsetup */
-       QETH_DBF_TEXT(setup, 2, "softsetp");
+       QETH_DBF_TEXT(SETUP, 2, "softsetp");
 
        rc = qeth_send_startlan(card);
        if (rc) {
-               QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
                if (rc == 0xe080) {
                        PRINT_WARN("LAN on card %s if offline! "
                                   "Waiting for STARTLAN from card.\n",
@@ -3119,30 +3092,36 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
 
        rc = qeth_l3_setadapter_parms(card);
        if (rc)
-               QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
        rc = qeth_l3_start_ipassists(card);
        if (rc)
-               QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "3err%d", rc);
        rc = qeth_l3_setrouting_v4(card);
        if (rc)
-               QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "4err%d", rc);
        rc = qeth_l3_setrouting_v6(card);
        if (rc)
-               QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc);
        netif_tx_disable(card->dev);
 
        rc = qeth_init_qdio_queues(card);
        if (rc) {
-               QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
                goto out_remove;
        }
        card->state = CARD_STATE_SOFTSETUP;
        netif_carrier_on(card->dev);
 
        qeth_set_allowed_threads(card, 0xffffffff, 0);
-       if ((recover_flag == CARD_STATE_RECOVER) && recovery_mode) {
+       if (recover_flag == CARD_STATE_RECOVER) {
+               if (recovery_mode)
                        qeth_l3_open(card->dev);
-                       qeth_l3_set_multicast_list(card->dev);
+               else {
+                       rtnl_lock();
+                       dev_open(card->dev);
+                       rtnl_unlock();
+               }
+               qeth_l3_set_multicast_list(card->dev);
        }
        /* let user_space know that device is online */
        kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);
@@ -3172,8 +3151,8 @@ static int __qeth_l3_set_offline(struct ccwgroup_device *cgdev,
        int rc = 0, rc2 = 0, rc3 = 0;
        enum qeth_card_states recover_flag;
 
-       QETH_DBF_TEXT(setup, 3, "setoffl");
-       QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
+       QETH_DBF_TEXT(SETUP, 3, "setoffl");
+       QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *));
 
        if (card->dev && netif_carrier_ok(card->dev))
                netif_carrier_off(card->dev);
@@ -3189,7 +3168,7 @@ static int __qeth_l3_set_offline(struct ccwgroup_device *cgdev,
        if (!rc)
                rc = (rc2) ? rc2 : rc3;
        if (rc)
-               QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+               QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
        if (recover_flag == CARD_STATE_UP)
                card->state = CARD_STATE_RECOVER;
        /* let user_space know that device is offline */
@@ -3208,11 +3187,11 @@ static int qeth_l3_recover(void *ptr)
        int rc = 0;
 
        card = (struct qeth_card *) ptr;
-       QETH_DBF_TEXT(trace, 2, "recover1");
-       QETH_DBF_HEX(trace, 2, &card, sizeof(void *));
+       QETH_DBF_TEXT(TRACE, 2, "recover1");
+       QETH_DBF_HEX(TRACE, 2, &card, sizeof(void *));
        if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
                return 0;
-       QETH_DBF_TEXT(trace, 2, "recover2");
+       QETH_DBF_TEXT(TRACE, 2, "recover2");
        PRINT_WARN("Recovery of device %s started ...\n",
                   CARD_BUS_ID(card));
        card->use_hard_stop = 1;
@@ -3258,7 +3237,7 @@ static int qeth_l3_ip_event(struct notifier_block *this,
        if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
-       QETH_DBF_TEXT(trace, 3, "ipevent");
+       QETH_DBF_TEXT(TRACE, 3, "ipevent");
        card = qeth_l3_get_card_from_dev(dev);
        if (!card)
                return NOTIFY_DONE;
@@ -3305,7 +3284,7 @@ static int qeth_l3_ip6_event(struct notifier_block *this,
        struct qeth_ipaddr *addr;
        struct qeth_card *card;
 
-       QETH_DBF_TEXT(trace, 3, "ip6event");
+       QETH_DBF_TEXT(TRACE, 3, "ip6event");
 
        card = qeth_l3_get_card_from_dev(dev);
        if (!card)
@@ -3348,7 +3327,7 @@ static int qeth_l3_register_notifiers(void)
 {
        int rc;
 
-       QETH_DBF_TEXT(trace, 5, "regnotif");
+       QETH_DBF_TEXT(TRACE, 5, "regnotif");
        rc = register_inetaddr_notifier(&qeth_l3_ip_notifier);
        if (rc)
                return rc;
@@ -3367,7 +3346,7 @@ static int qeth_l3_register_notifiers(void)
 static void qeth_l3_unregister_notifiers(void)
 {
 
-       QETH_DBF_TEXT(trace, 5, "unregnot");
+       QETH_DBF_TEXT(TRACE, 5, "unregnot");
        BUG_ON(unregister_inetaddr_notifier(&qeth_l3_ip_notifier));
 #ifdef CONFIG_QETH_IPV6
        BUG_ON(unregister_inet6addr_notifier(&qeth_l3_ip6_notifier));