Skip to content

Commit

Permalink
[ARM] DNS323: Read MAC address from flash
Browse files Browse the repository at this point in the history
Based on similar code from the tsx09 series of machines, just rips the MAC
address out of flash and stuffs it into the NIC. Tested on a DNS323 rev B1.
It's possible (though unlikely) that an A1 will have the MAC in a different
location in flash.

Signed-off-by: Matt Palmer <mpalmer@hezmatt.org>
  • Loading branch information
Matt Palmer authored and Nicolas Pitre committed Dec 11, 2008
1 parent fb6f552 commit a93f44c
Showing 1 changed file with 95 additions and 16 deletions.
111 changes: 95 additions & 16 deletions arch/arm/mach-orion5x/dns323-setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,6 @@ static int __init dns323_pci_init(void)

subsys_initcall(dns323_pci_init);

/****************************************************************************
* Ethernet
*/

static struct mv643xx_eth_platform_data dns323_eth_data = {
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
};

/****************************************************************************
* 8MiB NOR flash (Spansion S29GL064M90TFIR4)
*
Expand Down Expand Up @@ -142,6 +134,90 @@ static struct platform_device dns323_nor_flash = {
.num_resources = 1,
};

/****************************************************************************
* Ethernet
*/

static struct mv643xx_eth_platform_data dns323_eth_data = {
.phy_addr = MV643XX_ETH_PHY_ADDR(8),
};

/* dns323_parse_hex_*() taken from tsx09-common.c; should a common copy of these
* functions be kept somewhere?
*/
static int __init dns323_parse_hex_nibble(char n)
{
if (n >= '0' && n <= '9')
return n - '0';

if (n >= 'A' && n <= 'F')
return n - 'A' + 10;

if (n >= 'a' && n <= 'f')
return n - 'a' + 10;

return -1;
}

static int __init dns323_parse_hex_byte(const char *b)
{
int hi;
int lo;

hi = dns323_parse_hex_nibble(b[0]);
lo = dns323_parse_hex_nibble(b[1]);

if (hi < 0 || lo < 0)
return -1;

return (hi << 4) | lo;
}

static int __init dns323_read_mac_addr(void)
{
u_int8_t addr[6];
int i;
char *mac_page;

/* MAC address is stored as a regular ol' string in /dev/mtdblock4
* (0x007d0000-0x00800000) starting at offset 196480 (0x2ff80).
*/
mac_page = ioremap(DNS323_NOR_BOOT_BASE + 0x7d0000 + 196480, 1024);
if (!mac_page)
return -ENOMEM;

/* Sanity check the string we're looking at */
for (i = 0; i < 5; i++) {
if (*(mac_page + (i * 3) + 2) != ':') {
goto error_fail;
}
}

for (i = 0; i < 6; i++) {
int byte;

byte = dns323_parse_hex_byte(mac_page + (i * 3));
if (byte < 0) {
goto error_fail;
}

addr[i] = byte;
}

iounmap(mac_page);
printk("DNS323: Found ethernet MAC address: ");
for (i = 0; i < 6; i++)
printk("%.2x%s", addr[i], (i < 5) ? ":" : ".\n");

memcpy(dns323_eth_data.mac_addr, addr, 6);

return 0;

error_fail:
iounmap(mac_page);
return -EINVAL;
}

/****************************************************************************
* GPIO LEDs (simple - doesn't use hardware blinking support)
*/
Expand Down Expand Up @@ -267,14 +343,6 @@ static void __init dns323_init(void)
orion5x_mpp_conf(dns323_mpp_modes);
writel(0, MPP_DEV_CTRL); /* DEV_D[31:16] */

/*
* Configure peripherals.
*/
orion5x_ehci0_init();
orion5x_eth_init(&dns323_eth_data);
orion5x_i2c_init();
orion5x_uart0_init();

/* setup flash mapping
* CS3 holds a 8 MB Spansion S29GL064M90TFIR4
*/
Expand All @@ -288,6 +356,17 @@ static void __init dns323_init(void)
i2c_register_board_info(0, dns323_i2c_devices,
ARRAY_SIZE(dns323_i2c_devices));

/*
* Configure peripherals.
*/
if (dns323_read_mac_addr() < 0)
printk("DNS323: Failed to read MAC address\n");

orion5x_ehci0_init();
orion5x_eth_init(&dns323_eth_data);
orion5x_i2c_init();
orion5x_uart0_init();

/* register dns323 specific power-off method */
if (gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0 ||
gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0)
Expand Down

0 comments on commit a93f44c

Please sign in to comment.