/* Unregister Mac address for the port */
        mlx4_put_eth_qp(mdev->dev, priv->port, priv->mac, priv->base_qpn);
-       mdev->mac_removed[priv->port] = 1;
+       if (!(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN))
+               mdev->mac_removed[priv->port] = 1;
 
        /* Remove flow steering rules for the port*/
        if (mdev->dev->caps.steering_mode ==
 
                [0] = "RSS support",
                [1] = "RSS Toeplitz Hash Function support",
                [2] = "RSS XOR Hash Function support",
-               [3] = "Device manage flow steering support"
+               [3] = "Device manage flow steering support",
+               [4] = "Automatic mac reassignment support"
        };
        int i;
 
 #define QUERY_DEV_CAP_BMME_FLAGS_OFFSET                0x94
 #define QUERY_DEV_CAP_RSVD_LKEY_OFFSET         0x98
 #define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET                0xa0
+#define QUERY_DEV_CAP_FW_REASSIGN_MAC          0x9d
 
        dev_cap->flags2 = 0;
        mailbox = mlx4_alloc_cmd_mailbox(dev);
                 QUERY_DEV_CAP_BMME_FLAGS_OFFSET);
        MLX4_GET(dev_cap->reserved_lkey, outbox,
                 QUERY_DEV_CAP_RSVD_LKEY_OFFSET);
+       MLX4_GET(field, outbox, QUERY_DEV_CAP_FW_REASSIGN_MAC);
+       if (field & 1<<6)
+               dev_cap->flags2 |= MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN;
        MLX4_GET(dev_cap->max_icm_sz, outbox,
                 QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET);
        if (dev_cap->flags & MLX4_DEV_CAP_FLAG_COUNTERS)
 
        MLX4_DEV_CAP_FLAG2_RSS                  = 1LL <<  0,
        MLX4_DEV_CAP_FLAG2_RSS_TOP              = 1LL <<  1,
        MLX4_DEV_CAP_FLAG2_RSS_XOR              = 1LL <<  2,
-       MLX4_DEV_CAP_FLAG2_FS_EN                = 1LL <<  3
+       MLX4_DEV_CAP_FLAG2_FS_EN                = 1LL <<  3,
+       MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN     = 1LL <<  4
 };
 
 enum {