{
        u32 data;
 
-       data = (addr[5] << 8) | addr[4] | (num ? XGMAC_ADDR_AE : 0);
-       writel(data, ioaddr + XGMAC_ADDR_HIGH(num));
-       data = (addr[3] << 24) | (addr[2] << 16) | (addr[1] << 8) | addr[0];
-       writel(data, ioaddr + XGMAC_ADDR_LOW(num));
+       if (addr) {
+               data = (addr[5] << 8) | addr[4] | (num ? XGMAC_ADDR_AE : 0);
+               writel(data, ioaddr + XGMAC_ADDR_HIGH(num));
+               data = (addr[3] << 24) | (addr[2] << 16) | (addr[1] << 8) | addr[0];
+               writel(data, ioaddr + XGMAC_ADDR_LOW(num));
+       } else {
+               writel(0, ioaddr + XGMAC_ADDR_HIGH(num));
+               writel(0, ioaddr + XGMAC_ADDR_LOW(num));
+       }
 }
 
 static void xgmac_get_mac_addr(void __iomem *ioaddr, unsigned char *addr,
        if ((netdev_mc_count(dev) + reg - 1) > XGMAC_MAX_FILTER_ADDR) {
                use_hash = true;
                value |= XGMAC_FRAME_FILTER_HMC | XGMAC_FRAME_FILTER_HPF;
+       } else {
+               use_hash = false;
        }
        netdev_for_each_mc_addr(ha, dev) {
                if (use_hash) {
        }
 
 out:
+       for (i = reg; i < XGMAC_MAX_FILTER_ADDR; i++)
+               xgmac_set_mac_addr(ioaddr, NULL, reg);
        for (i = 0; i < XGMAC_NUM_HASH; i++)
                writel(hash_filter[i], ioaddr + XGMAC_HASH(i));