{IPA_RC_SETIP_NO_STARTLAN,      "Setip no startlan received"},
        {IPA_RC_SETIP_ALREADY_RECEIVED, "Setip already received"},
        {IPA_RC_IP_ADDR_ALREADY_USED,   "IP address already in use on LAN"},
-       {IPA_RC_MULTICAST_FULL,         "No task available, multicast full"},
+       {IPA_RC_MC_ADDR_NOT_FOUND,      "Multicast address not found"},
        {IPA_RC_SETIP_INVALID_VERSION,  "SETIP invalid IP version"},
        {IPA_RC_UNSUPPORTED_SUBCMD,     "Unsupported assist subcommand"},
        {IPA_RC_ARP_ASSIST_NO_ENABLE,   "Only partial success, no enable"},
 
        IPA_RC_SETIP_NO_STARTLAN        = 0xe008,
        IPA_RC_SETIP_ALREADY_RECEIVED   = 0xe009,
        IPA_RC_IP_ADDR_ALREADY_USED     = 0xe00a,
-       IPA_RC_MULTICAST_FULL           = 0xe00b,
+       IPA_RC_MC_ADDR_NOT_FOUND        = 0xe00b,
        IPA_RC_SETIP_INVALID_VERSION    = 0xe00d,
        IPA_RC_UNSUPPORTED_SUBCMD       = 0xe00e,
        IPA_RC_ARP_ASSIST_NO_ENABLE     = 0xe00f,
 
 static void __qeth_l3_delete_all_mc(struct qeth_card *card,
                                        unsigned long *flags)
 {
+       struct list_head fail_list;
        struct qeth_ipaddr *addr, *tmp;
        int rc;
+
+       INIT_LIST_HEAD(&fail_list);
 again:
        list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {
                if (addr->is_multicast) {
                        spin_unlock_irqrestore(&card->ip_lock, *flags);
                        rc = qeth_l3_deregister_addr_entry(card, addr);
                        spin_lock_irqsave(&card->ip_lock, *flags);
-                       if (!rc) {
+                       if (!rc || (rc == IPA_RC_MC_ADDR_NOT_FOUND))
                                kfree(addr);
-                               goto again;
-                       } else
-                               list_add(&addr->entry, &card->ip_list);
+                       else
+                               list_add_tail(&addr->entry, &fail_list);
+                       goto again;
                }
        }
+       list_splice(&fail_list, &card->ip_list);
 }
 
 static void qeth_l3_set_ip_addr_list(struct qeth_card *card)
                        spin_unlock_irqrestore(&card->ip_lock, flags);
                        rc = qeth_l3_deregister_addr_entry(card, addr);
                        spin_lock_irqsave(&card->ip_lock, flags);
-                       if (!rc)
+                       if (!rc || (rc == IPA_RC_PRIMARY_ALREADY_DEFINED))
                                kfree(addr);
                        else
                                list_add_tail(&addr->entry, &card->ip_list);