#define QETH_BROADCAST_WITH_ECHO    0x01
 #define QETH_BROADCAST_WITHOUT_ECHO 0x02
-#define QETH_LAYER2_MAC_READ       0x01
 #define QETH_LAYER2_MAC_REGISTERED  0x02
 struct qeth_card_info {
        unsigned short unit_addr2;
 
                struct qeth_reply *reply, unsigned long data)
 {
        struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
+       struct qeth_ipacmd_setadpparms *adp_cmd;
 
        QETH_CARD_TEXT(card, 4, "chgmaccb");
        if (qeth_setadpparms_inspect_rc(cmd))
                return 0;
 
-       if (IS_LAYER3(card) || !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
-               ether_addr_copy(card->dev->dev_addr,
-                               cmd->data.setadapterparms.data.change_addr.addr);
-               card->info.mac_bits |= QETH_LAYER2_MAC_READ;
-       }
+       adp_cmd = &cmd->data.setadapterparms;
+       if (IS_LAYER2(card) && IS_OSD(card) && !IS_VM_NIC(card) &&
+           !(adp_cmd->hdr.flags & QETH_SETADP_FLAGS_VIRTUAL_MAC))
+               return 0;
+
+       ether_addr_copy(card->dev->dev_addr, adp_cmd->data.change_addr.addr);
        return 0;
 }
 
 
 };
 
 #define IS_IQD(card)   ((card)->info.type == QETH_CARD_TYPE_IQD)
+#define IS_OSD(card)   ((card)->info.type == QETH_CARD_TYPE_OSD)
 #define IS_OSN(card)   ((card)->info.type == QETH_CARD_TYPE_OSN)
+#define IS_VM_NIC(card)        ((card)->info.guestlan)
 
 #define QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE 0x18
 /* only the first two bytes are looked at in qeth_get_cardname_short */
        __u8  reserved3[8];
 };
 
+#define QETH_SETADP_FLAGS_VIRTUAL_MAC  0x80    /* for CHANGE_ADDR_READ_MAC */
+
 struct qeth_ipacmd_setadpparms_hdr {
-       __u32 supp_hw_cmds;
-       __u32 reserved1;
-       __u16 cmdlength;
-       __u16 reserved2;
-       __u32 command_code;
-       __u16 return_code;
-       __u8  used_total;
-       __u8  seq_no;
-       __u32 reserved3;
-} __attribute__ ((packed));
+       u32 supp_hw_cmds;
+       u32 reserved1;
+       u16 cmdlength;
+       u16 reserved2;
+       u32 command_code;
+       u16 return_code;
+       u8 used_total;
+       u8 seq_no;
+       u8 flags;
+       u8 reserved3[3];
+};
 
 struct qeth_ipacmd_setadpparms {
        struct qeth_ipacmd_setadpparms_hdr hdr;
 
                /* fall back to alternative mechanism: */
        }
 
-       if (card->info.type == QETH_CARD_TYPE_IQD ||
-           card->info.type == QETH_CARD_TYPE_OSM ||
-           card->info.type == QETH_CARD_TYPE_OSX ||
-           card->info.guestlan) {
+       if (!IS_OSN(card)) {
                rc = qeth_setadpparms_change_macaddr(card);
-               if (!rc)
+               if (!rc && is_valid_ether_addr(card->dev->dev_addr))
                        goto out;
                QETH_DBF_MESSAGE(2, "READ_MAC Assist failed on device %x: %#x\n",
                                 CARD_DEVID(card), rc);
                                       PAGE_SIZE * (QDIO_MAX_ELEMENTS_PER_BUFFER - 1));
        }
 
-       qeth_l2_request_initial_mac(card);
+       if (!is_valid_ether_addr(card->dev->dev_addr))
+               qeth_l2_request_initial_mac(card);
        netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT);
        rc = register_netdev(card->dev);
        if (!rc && carrier_ok)