#include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/netdevice.h>
+#include <linux/of_net.h>
 #include <linux/spi/spi.h>
 
 #include "w5100.h"
        const struct spi_device_id *id = spi_get_device_id(spi);
        const struct w5100_ops *ops;
        int priv_size;
+       const void *mac = of_get_mac_address(spi->dev.of_node);
 
        switch (id->driver_data) {
        case W5100:
                return -EINVAL;
        }
 
-       return w5100_probe(&spi->dev, ops, priv_size, NULL, spi->irq, -EINVAL);
+       return w5100_probe(&spi->dev, ops, priv_size, mac, spi->irq, -EINVAL);
 }
 
 static int w5100_spi_remove(struct spi_device *spi)
 
 static int w5100_mmio_probe(struct platform_device *pdev)
 {
        struct wiznet_platform_data *data = dev_get_platdata(&pdev->dev);
-       u8 *mac_addr = NULL;
+       const void *mac_addr = NULL;
        struct resource *mem;
        const struct w5100_ops *ops;
        int irq;
 EXPORT_SYMBOL_GPL(w5100_ops_priv);
 
 int w5100_probe(struct device *dev, const struct w5100_ops *ops,
-               int sizeof_ops_priv, u8 *mac_addr, int irq, int link_gpio)
+               int sizeof_ops_priv, const void *mac_addr, int irq,
+               int link_gpio)
 {
        struct w5100_priv *priv;
        struct net_device *ndev;
 
 void *w5100_ops_priv(const struct net_device *ndev);
 
 int w5100_probe(struct device *dev, const struct w5100_ops *ops,
-               int sizeof_ops_priv, u8 *mac_addr, int irq, int link_gpio);
+               int sizeof_ops_priv, const void *mac_addr, int irq,
+               int link_gpio);
 int w5100_remove(struct device *dev);
 
 extern const struct dev_pm_ops w5100_pm_ops;