}
 
 /* tp->lock is held. */
-static void __tg3_set_one_mac_addr(struct tg3 *tp, u8 *mac_addr, int index)
+static void __tg3_set_one_mac_addr(struct tg3 *tp, const u8 *mac_addr,
+                                  int index)
 {
        u32 addr_high, addr_low;
 
        return err;
 }
 
-static int tg3_get_device_address(struct tg3 *tp)
+static int tg3_get_device_address(struct tg3 *tp, u8 *addr)
 {
-       struct net_device *dev = tp->dev;
        u32 hi, lo, mac_offset;
        int addr_ok = 0;
        int err;
 
-       if (!eth_platform_get_mac_address(&tp->pdev->dev, dev->dev_addr))
+       if (!eth_platform_get_mac_address(&tp->pdev->dev, addr))
                return 0;
 
        if (tg3_flag(tp, IS_SSB_CORE)) {
-               err = ssb_gige_get_macaddr(tp->pdev, &dev->dev_addr[0]);
-               if (!err && is_valid_ether_addr(&dev->dev_addr[0]))
+               err = ssb_gige_get_macaddr(tp->pdev, addr);
+               if (!err && is_valid_ether_addr(addr))
                        return 0;
        }
 
        /* First try to get it from MAC address mailbox. */
        tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_HIGH_MBOX, &hi);
        if ((hi >> 16) == 0x484b) {
-               dev->dev_addr[0] = (hi >>  8) & 0xff;
-               dev->dev_addr[1] = (hi >>  0) & 0xff;
+               addr[0] = (hi >>  8) & 0xff;
+               addr[1] = (hi >>  0) & 0xff;
 
                tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_LOW_MBOX, &lo);
-               dev->dev_addr[2] = (lo >> 24) & 0xff;
-               dev->dev_addr[3] = (lo >> 16) & 0xff;
-               dev->dev_addr[4] = (lo >>  8) & 0xff;
-               dev->dev_addr[5] = (lo >>  0) & 0xff;
+               addr[2] = (lo >> 24) & 0xff;
+               addr[3] = (lo >> 16) & 0xff;
+               addr[4] = (lo >>  8) & 0xff;
+               addr[5] = (lo >>  0) & 0xff;
 
                /* Some old bootcode may report a 0 MAC address in SRAM */
-               addr_ok = is_valid_ether_addr(&dev->dev_addr[0]);
+               addr_ok = is_valid_ether_addr(addr);
        }
        if (!addr_ok) {
                /* Next, try NVRAM. */
                if (!tg3_flag(tp, NO_NVRAM) &&
                    !tg3_nvram_read_be32(tp, mac_offset + 0, &hi) &&
                    !tg3_nvram_read_be32(tp, mac_offset + 4, &lo)) {
-                       memcpy(&dev->dev_addr[0], ((char *)&hi) + 2, 2);
-                       memcpy(&dev->dev_addr[2], (char *)&lo, sizeof(lo));
+                       memcpy(&addr[0], ((char *)&hi) + 2, 2);
+                       memcpy(&addr[2], (char *)&lo, sizeof(lo));
                }
                /* Finally just fetch it out of the MAC control regs. */
                else {
                        hi = tr32(MAC_ADDR_0_HIGH);
                        lo = tr32(MAC_ADDR_0_LOW);
 
-                       dev->dev_addr[5] = lo & 0xff;
-                       dev->dev_addr[4] = (lo >> 8) & 0xff;
-                       dev->dev_addr[3] = (lo >> 16) & 0xff;
-                       dev->dev_addr[2] = (lo >> 24) & 0xff;
-                       dev->dev_addr[1] = hi & 0xff;
-                       dev->dev_addr[0] = (hi >> 8) & 0xff;
+                       addr[5] = lo & 0xff;
+                       addr[4] = (lo >> 8) & 0xff;
+                       addr[3] = (lo >> 16) & 0xff;
+                       addr[2] = (lo >> 24) & 0xff;
+                       addr[1] = hi & 0xff;
+                       addr[0] = (hi >> 8) & 0xff;
                }
        }
 
-       if (!is_valid_ether_addr(&dev->dev_addr[0]))
+       if (!is_valid_ether_addr(addr))
                return -EINVAL;
        return 0;
 }
        char str[40];
        u64 dma_mask, persist_dma_mask;
        netdev_features_t features = 0;
+       u8 addr[ETH_ALEN] __aligned(2);
 
        err = pci_enable_device(pdev);
        if (err) {
                tp->rx_pending = 63;
        }
 
-       err = tg3_get_device_address(tp);
+       err = tg3_get_device_address(tp, addr);
        if (err) {
                dev_err(&pdev->dev,
                        "Could not obtain valid ethernet address, aborting\n");
                goto err_out_apeunmap;
        }
+       eth_hw_addr_set(dev, addr);
 
        intmbx = MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW;
        rcvmbx = MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW;