Commit f6673653 authored by Manuel Lauss's avatar Manuel Lauss Committed by Ralf Baechle

MIPS: au1000_eth: Get ethernet address from platform_data

au1000_eth uses firmware calls to get a valid MAC address, and changes
it depending on platform device id.  This patch moves this logic out of
the driver into the platform device registration part, where boards with
supported chips can use whatever firmware interface they need; the default
implementation maintains compatibility with existing, YAMON-based firmware.
Tested-by: default avatarWolfgang Grandegger <wg@denx.de>
Acked-by: default avatarFlorian Fainelli <florian@openwrt.org>
Signed-off-by: default avatarManuel Lauss <manuel.lauss@googlemail.com>
To: Linux-MIPS <linux-mips@linux-mips.org>
Cc: netdev@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/1481/Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 12bf3f24
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
*/ */
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/etherdevice.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/serial_8250.h> #include <linux/serial_8250.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -21,6 +22,8 @@ ...@@ -21,6 +22,8 @@
#include <asm/mach-au1x00/au1100_mmc.h> #include <asm/mach-au1x00/au1100_mmc.h>
#include <asm/mach-au1x00/au1xxx_eth.h> #include <asm/mach-au1x00/au1xxx_eth.h>
#include <prom.h>
#define PORT(_base, _irq) \ #define PORT(_base, _irq) \
{ \ { \
.mapbase = _base, \ .mapbase = _base, \
...@@ -434,17 +437,27 @@ static int __init au1xxx_platform_init(void) ...@@ -434,17 +437,27 @@ static int __init au1xxx_platform_init(void)
{ {
unsigned int uartclk = get_au1x00_uart_baud_base() * 16; unsigned int uartclk = get_au1x00_uart_baud_base() * 16;
int err, i; int err, i;
unsigned char ethaddr[6];
/* Fill up uartclk. */ /* Fill up uartclk. */
for (i = 0; au1x00_uart_data[i].flags; i++) for (i = 0; au1x00_uart_data[i].flags; i++)
au1x00_uart_data[i].uartclk = uartclk; au1x00_uart_data[i].uartclk = uartclk;
/* use firmware-provided mac addr if available and necessary */
i = prom_get_ethernet_addr(ethaddr);
if (!i && !is_valid_ether_addr(au1xxx_eth0_platform_data.mac))
memcpy(au1xxx_eth0_platform_data.mac, ethaddr, 6);
err = platform_add_devices(au1xxx_platform_devices, err = platform_add_devices(au1xxx_platform_devices,
ARRAY_SIZE(au1xxx_platform_devices)); ARRAY_SIZE(au1xxx_platform_devices));
#ifndef CONFIG_SOC_AU1100 #ifndef CONFIG_SOC_AU1100
ethaddr[5] += 1; /* next addr for 2nd MAC */
if (!i && !is_valid_ether_addr(au1xxx_eth1_platform_data.mac))
memcpy(au1xxx_eth1_platform_data.mac, ethaddr, 6);
/* Register second MAC if enabled in pinfunc */ /* Register second MAC if enabled in pinfunc */
if (!err && !(au_readl(SYS_PINFUNC) & (u32)SYS_PF_NI2)) if (!err && !(au_readl(SYS_PINFUNC) & (u32)SYS_PF_NI2))
platform_device_register(&au1xxx_eth1_device); err = platform_device_register(&au1xxx_eth1_device);
#endif #endif
return err; return err;
......
...@@ -9,6 +9,7 @@ struct au1000_eth_platform_data { ...@@ -9,6 +9,7 @@ struct au1000_eth_platform_data {
int phy_addr; int phy_addr;
int phy_busid; int phy_busid;
int phy_irq; int phy_irq;
char mac[6];
}; };
void __init au1xxx_override_eth_cfg(unsigned port, void __init au1xxx_override_eth_cfg(unsigned port,
......
...@@ -104,14 +104,6 @@ MODULE_VERSION(DRV_VERSION); ...@@ -104,14 +104,6 @@ MODULE_VERSION(DRV_VERSION);
* complete immediately. * complete immediately.
*/ */
/* These addresses are only used if yamon doesn't tell us what
* the mac address is, and the mac address is not passed on the
* command line.
*/
static unsigned char au1000_mac_addr[6] __devinitdata = {
0x00, 0x50, 0xc2, 0x0c, 0x30, 0x00
};
struct au1000_private *au_macs[NUM_ETH_INTERFACES]; struct au1000_private *au_macs[NUM_ETH_INTERFACES];
/* /*
...@@ -1002,7 +994,6 @@ static int __devinit au1000_probe(struct platform_device *pdev) ...@@ -1002,7 +994,6 @@ static int __devinit au1000_probe(struct platform_device *pdev)
db_dest_t *pDB, *pDBfree; db_dest_t *pDB, *pDBfree;
int irq, i, err = 0; int irq, i, err = 0;
struct resource *base, *macen; struct resource *base, *macen;
char ethaddr[6];
base = platform_get_resource(pdev, IORESOURCE_MEM, 0); base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!base) { if (!base) {
...@@ -1079,24 +1070,13 @@ static int __devinit au1000_probe(struct platform_device *pdev) ...@@ -1079,24 +1070,13 @@ static int __devinit au1000_probe(struct platform_device *pdev)
} }
aup->mac_id = pdev->id; aup->mac_id = pdev->id;
if (pdev->id == 0) { if (pdev->id == 0)
if (prom_get_ethernet_addr(ethaddr) == 0)
memcpy(au1000_mac_addr, ethaddr, sizeof(au1000_mac_addr));
else {
netdev_info(dev, "No MAC address found\n");
/* Use the hard coded MAC addresses */
}
au1000_setup_hw_rings(aup, MAC0_RX_DMA_ADDR, MAC0_TX_DMA_ADDR); au1000_setup_hw_rings(aup, MAC0_RX_DMA_ADDR, MAC0_TX_DMA_ADDR);
} else if (pdev->id == 1) else if (pdev->id == 1)
au1000_setup_hw_rings(aup, MAC1_RX_DMA_ADDR, MAC1_TX_DMA_ADDR); au1000_setup_hw_rings(aup, MAC1_RX_DMA_ADDR, MAC1_TX_DMA_ADDR);
/* /* set a random MAC now in case platform_data doesn't provide one */
* Assign to the Ethernet ports two consecutive MAC addresses random_ether_addr(dev->dev_addr);
* to match those that are printed on their stickers
*/
memcpy(dev->dev_addr, au1000_mac_addr, sizeof(au1000_mac_addr));
dev->dev_addr[5] += pdev->id;
*aup->enable = 0; *aup->enable = 0;
aup->mac_enabled = 0; aup->mac_enabled = 0;
...@@ -1106,6 +1086,9 @@ static int __devinit au1000_probe(struct platform_device *pdev) ...@@ -1106,6 +1086,9 @@ static int __devinit au1000_probe(struct platform_device *pdev)
dev_info(&pdev->dev, "no platform_data passed, PHY search on MAC0\n"); dev_info(&pdev->dev, "no platform_data passed, PHY search on MAC0\n");
aup->phy1_search_mac0 = 1; aup->phy1_search_mac0 = 1;
} else { } else {
if (is_valid_ether_addr(pd->mac))
memcpy(dev->dev_addr, pd->mac, 6);
aup->phy_static_config = pd->phy_static_config; aup->phy_static_config = pd->phy_static_config;
aup->phy_search_highest_addr = pd->phy_search_highest_addr; aup->phy_search_highest_addr = pd->phy_search_highest_addr;
aup->phy1_search_mac0 = pd->phy1_search_mac0; aup->phy1_search_mac0 = pd->phy1_search_mac0;
......
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