Commit 78b9b2c4 authored by Antoine Ténart's avatar Antoine Ténart Committed by David S. Miller

net: pxa168_eth: rework the MAC address setup

This patch rework the way the MAC address is retrieved. The MAC address
can now, in addition to being random, be set in the device tree or
retrieved from the Ethernet controller MAC address registers. The
probing function will try to get a MAC address in the following order:
- From the device tree.
- From the Ethernet controller MAC address registers.
- Generate a random one.

This patch also adds a function to read the MAC address from the
Ethernet Controller registers.
Signed-off-by: default avatarAntoine Tenart <antoine.tenart@free-electrons.com>
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 39830689
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_net.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pxa168_eth.h> #include <linux/pxa168_eth.h>
...@@ -606,6 +607,21 @@ static void pxa168_eth_set_rx_mode(struct net_device *dev) ...@@ -606,6 +607,21 @@ static void pxa168_eth_set_rx_mode(struct net_device *dev)
update_hash_table_mac_address(pep, NULL, ha->addr); update_hash_table_mac_address(pep, NULL, ha->addr);
} }
static void pxa168_eth_get_mac_address(struct net_device *dev,
unsigned char *addr)
{
struct pxa168_eth_private *pep = netdev_priv(dev);
unsigned int mac_h = rdl(pep, MAC_ADDR_HIGH);
unsigned int mac_l = rdl(pep, MAC_ADDR_LOW);
addr[0] = (mac_h >> 24) & 0xff;
addr[1] = (mac_h >> 16) & 0xff;
addr[2] = (mac_h >> 8) & 0xff;
addr[3] = mac_h & 0xff;
addr[4] = (mac_l >> 8) & 0xff;
addr[5] = mac_l & 0xff;
}
static int pxa168_eth_set_mac_address(struct net_device *dev, void *addr) static int pxa168_eth_set_mac_address(struct net_device *dev, void *addr)
{ {
struct sockaddr *sa = addr; struct sockaddr *sa = addr;
...@@ -1467,6 +1483,7 @@ static int pxa168_eth_probe(struct platform_device *pdev) ...@@ -1467,6 +1483,7 @@ static int pxa168_eth_probe(struct platform_device *pdev)
struct resource *res; struct resource *res;
struct clk *clk; struct clk *clk;
struct device_node *np; struct device_node *np;
const unsigned char *mac_addr = NULL;
int err; int err;
printk(KERN_NOTICE "PXA168 10/100 Ethernet Driver\n"); printk(KERN_NOTICE "PXA168 10/100 Ethernet Driver\n");
...@@ -1508,8 +1525,19 @@ static int pxa168_eth_probe(struct platform_device *pdev) ...@@ -1508,8 +1525,19 @@ static int pxa168_eth_probe(struct platform_device *pdev)
INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task); INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task);
dev_info(&pdev->dev, "Using random mac address\n"); if (pdev->dev.of_node)
eth_hw_addr_random(dev); mac_addr = of_get_mac_address(pdev->dev.of_node);
if (mac_addr && is_valid_ether_addr(mac_addr)) {
ether_addr_copy(dev->dev_addr, mac_addr);
} else {
/* try reading the mac address, if set by the bootloader */
pxa168_eth_get_mac_address(dev, dev->dev_addr);
if (!is_valid_ether_addr(dev->dev_addr)) {
dev_info(&pdev->dev, "Using random mac address\n");
eth_hw_addr_random(dev);
}
}
pep->rx_ring_size = NUM_RX_DESCS; pep->rx_ring_size = NUM_RX_DESCS;
pep->tx_ring_size = NUM_TX_DESCS; pep->tx_ring_size = NUM_TX_DESCS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment