static int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg);
 static void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg,
                               int data);
+static void pch_gbe_set_multi(struct net_device *netdev);
 
 #ifdef CONFIG_PCH_PTP
 static struct sock_filter ptp_filter[] = {
        pch_gbe_wait_clr_bit(&hw->reg->ADDR_MASK, PCH_GBE_BUSY);
 }
 
-/**
- * pch_gbe_mac_save_mac_addr_regs - Save MAC addresse registers
- * @hw:                Pointer to the HW structure
- * @addr:      Pointer to the MAC address
- * @index:  MAC address array register
- */
-static void
-pch_gbe_mac_save_mac_addr_regs(struct pch_gbe_hw *hw,
-                       struct pch_gbe_regs_mac_adr *mac_adr, u32 index)
-{
-       mac_adr->high = ioread32(&hw->reg->mac_adr[index].high);
-       mac_adr->low = ioread32(&hw->reg->mac_adr[index].low);
-}
-
-/**
- * pch_gbe_mac_store_mac_addr_regs - Store MAC addresse registers
- * @hw:                Pointer to the HW structure
- * @addr:      Pointer to the MAC address
- * @index:  MAC address array register
- */
-static void
-pch_gbe_mac_store_mac_addr_regs(struct pch_gbe_hw *hw,
-                       struct pch_gbe_regs_mac_adr *mac_adr, u32 index)
-{
-       u32 adrmask;
-
-       adrmask = ioread32(&hw->reg->ADDR_MASK);
-       iowrite32((adrmask | (0x0001 << index)), &hw->reg->ADDR_MASK);
-       /* wait busy */
-       pch_gbe_wait_clr_bit(&hw->reg->ADDR_MASK, PCH_GBE_BUSY);
-       /* Set the MAC address to the MAC address xA/xB register */
-       iowrite32(mac_adr->high, &hw->reg->mac_adr[index].high);
-       iowrite32(mac_adr->low, &hw->reg->mac_adr[index].low);
-       iowrite32((adrmask & ~(0x0001 << index)), &hw->reg->ADDR_MASK);
-       /* wait busy */
-       pch_gbe_wait_clr_bit(&hw->reg->ADDR_MASK, PCH_GBE_BUSY);
-}
-
-#define MAC_ADDR_LIST_NUM 16
 /**
  * pch_gbe_mac_reset_hw - Reset hardware
  * @hw:        Pointer to the HW structure
  */
 static void pch_gbe_mac_reset_hw(struct pch_gbe_hw *hw)
 {
-       struct pch_gbe_regs_mac_adr mac_addr_list[MAC_ADDR_LIST_NUM];
-       int i;
-
        /* Read the MAC address. and store to the private data */
        pch_gbe_mac_read_mac_addr(hw);
-       /* Read other MAC addresses */
-       for (i = 1; i < MAC_ADDR_LIST_NUM; i++)
-               pch_gbe_mac_save_mac_addr_regs(hw, &mac_addr_list[i], i);
        iowrite32(PCH_GBE_ALL_RST, &hw->reg->RESET);
 #ifdef PCH_GBE_MAC_IFOP_RGMII
        iowrite32(PCH_GBE_MODE_GMII_ETHER, &hw->reg->MODE);
        pch_gbe_wait_clr_bit(&hw->reg->RESET, PCH_GBE_ALL_RST);
        /* Setup the receive addresses */
        pch_gbe_mac_mar_set(hw, hw->mac.addr, 0);
-       for (i = 1; i < MAC_ADDR_LIST_NUM; i++)
-               pch_gbe_mac_store_mac_addr_regs(hw, &mac_addr_list[i], i);
        return;
 }
 
 static void pch_gbe_mac_reset_rx(struct pch_gbe_hw *hw)
 {
-       struct pch_gbe_regs_mac_adr mac_addr_list[MAC_ADDR_LIST_NUM];
-       int i;
-
        /* Read the MAC addresses. and store to the private data */
        pch_gbe_mac_read_mac_addr(hw);
-       for (i = 1; i < MAC_ADDR_LIST_NUM; i++)
-               pch_gbe_mac_save_mac_addr_regs(hw, &mac_addr_list[i], i);
        iowrite32(PCH_GBE_RX_RST, &hw->reg->RESET);
        pch_gbe_wait_clr_bit_irq(&hw->reg->RESET, PCH_GBE_RX_RST);
        /* Setup the MAC addresses */
        pch_gbe_mac_mar_set(hw, hw->mac.addr, 0);
-       for (i = 1; i < MAC_ADDR_LIST_NUM; i++)
-               pch_gbe_mac_store_mac_addr_regs(hw, &mac_addr_list[i], i);
        return;
 }
 
 void pch_gbe_reset(struct pch_gbe_adapter *adapter)
 {
        pch_gbe_mac_reset_hw(&adapter->hw);
+       /* reprogram multicast address register after reset */
+       pch_gbe_set_multi(adapter->netdev);
        /* Setup the receive address. */
        pch_gbe_mac_init_rx_addrs(&adapter->hw, PCH_GBE_MAR_ENTRIES);
        if (pch_gbe_hal_init_hw(&adapter->hw))
                /* Stop Receive */
                pch_gbe_mac_reset_rx(hw);
        }
+       /* reprogram multicast address register after reset */
+       pch_gbe_set_multi(adapter->netdev);
 }
 
 static void pch_gbe_start_receive(struct pch_gbe_hw *hw)
 }
 
 
-static void pch_gbe_set_multi(struct net_device *netdev);
 /**
  * pch_gbe_up - Up GbE network device
  * @adapter:  Board private structure