From: Tim Harvey <tharvey@xxxxxxxxxxxxx> Date: Wed, 5 Mar 2014 14:45:12 -0800 > @@ -4748,6 +4750,7 @@ static struct net_device *sky2_init_netdev(struct sky2_hw *hw, unsigned port, > { > struct sky2_port *sky2; > struct net_device *dev = alloc_etherdev(sizeof(*sky2)); > + unsigned char *iap, tmpaddr[ETH_ALEN]; > > if (!dev) > return NULL; > @@ -4805,8 +4808,17 @@ static struct net_device *sky2_init_netdev(struct sky2_hw *hw, unsigned port, > > dev->features |= dev->hw_features; > > - /* read the mac address */ > - memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN); > + /* try to get mac address in the following order: > + * 1) from device tree data > + * 2) from internal registers set by bootloader > + */ > + iap = of_get_mac_address(hw->pdev->dev.of_node); > + if (!iap) { > + memcpy_fromio(&tmpaddr, hw->regs + B2_MAC_1 + port * 8, > + ETH_ALEN); > + iap = tmpaddr; > + } > + ether_addr_copy(dev->dev_addr, iap); As Stephen Hemminger suggested do this like: iap = of_get_mac_address(hw->pdev->dev.of_node); if (iap) memcpy(dev->dev_addr, iap, ETH_ALEN); else memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN); That way you don't need the on-stack buffer. -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html