if (qeth_l3_is_addr_covered_by_ipato(card, addr)) {
                        QETH_CARD_TEXT(card, 2, "tkovaddr");
-                       addr->set_flags |= QETH_IPA_SETIP_TAKEOVER_FLAG;
+                       addr->ipato = 1;
                }
                hash_add(card->ip_htable, &addr->hnode,
                                qeth_l3_ipaddr_hash(addr));
        }
 }
 
+static u32 qeth_l3_get_setdelip_flags(struct qeth_ipaddr *addr, bool set)
+{
+       switch (addr->type) {
+       case QETH_IP_TYPE_RXIP:
+               return (set) ? QETH_IPA_SETIP_TAKEOVER_FLAG : 0;
+       case QETH_IP_TYPE_VIPA:
+               return (set) ? QETH_IPA_SETIP_VIPA_FLAG :
+                              QETH_IPA_DELIP_VIPA_FLAG;
+       default:
+               return (set && addr->ipato) ? QETH_IPA_SETIP_TAKEOVER_FLAG : 0;
+       }
+}
+
 static int qeth_l3_send_setdelip(struct qeth_card *card,
-               struct qeth_ipaddr *addr, int ipacmd, unsigned int flags)
+                                struct qeth_ipaddr *addr,
+                                enum qeth_ipa_cmds ipacmd)
 {
-       int rc;
        struct qeth_cmd_buffer *iob;
        struct qeth_ipa_cmd *cmd;
        __u8 netmask[16];
+       u32 flags;
 
        QETH_CARD_TEXT(card, 4, "setdelip");
-       QETH_CARD_TEXT_(card, 4, "flags%02X", flags);
 
        iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
        if (!iob)
                return -ENOMEM;
        cmd = __ipa_cmd(iob);
+
+       flags = qeth_l3_get_setdelip_flags(addr, ipacmd == IPA_CMD_SETIP);
+       QETH_CARD_TEXT_(card, 4, "flags%02X", flags);
+
        if (addr->proto == QETH_PROT_IPV6) {
                memcpy(cmd->data.setdelip6.ip_addr, &addr->u.a6.addr,
                       sizeof(struct in6_addr));
                cmd->data.setdelip4.flags = flags;
        }
 
-       rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
-
-       return rc;
+       return qeth_send_ipa_cmd(card, iob, NULL, NULL);
 }
 
 static int qeth_l3_send_setrouting(struct qeth_card *card,
        hash_for_each(card->ip_htable, i, addr, hnode) {
                if (addr->type != QETH_IP_TYPE_NORMAL)
                        continue;
-               if (qeth_l3_is_addr_covered_by_ipato(card, addr))
-                       addr->set_flags |= QETH_IPA_SETIP_TAKEOVER_FLAG;
-               else
-                       addr->set_flags &= ~QETH_IPA_SETIP_TAKEOVER_FLAG;
+               addr->ipato = qeth_l3_is_addr_covered_by_ipato(card, addr);
        }
 }
 
                memcpy(&addr.u.a4.addr, ip, 4);
        else
                memcpy(&addr.u.a6.addr, ip, 16);
-       if (type == QETH_IP_TYPE_RXIP) {
-               addr.set_flags = QETH_IPA_SETIP_TAKEOVER_FLAG;
-       } else {
-               addr.set_flags = QETH_IPA_SETIP_VIPA_FLAG;
-               addr.del_flags = QETH_IPA_DELIP_VIPA_FLAG;
-       }
 
        spin_lock_bh(&card->ip_lock);
        rc = add ? qeth_l3_add_ip(card, &addr) : qeth_l3_delete_ip(card, &addr);
                if (addr->is_multicast)
                        rc =  qeth_l3_send_setdelmc(card, addr, IPA_CMD_SETIPM);
                else
-                       rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_SETIP,
-                                       addr->set_flags);
+                       rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_SETIP);
                if (rc)
                        QETH_CARD_TEXT(card, 2, "failed");
        } while ((--cnt > 0) && rc);
        if (addr->is_multicast)
                rc = qeth_l3_send_setdelmc(card, addr, IPA_CMD_DELIPM);
        else
-               rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_DELIP,
-                                       addr->del_flags);
+               rc = qeth_l3_send_setdelip(card, addr, IPA_CMD_DELIP);
        if (rc)
                QETH_CARD_TEXT(card, 2, "failed");