Changeset 11910


Ignore:
Timestamp:
2008-07-22T18:35:29+02:00 (10 years ago)
Author:
juhosg
Message:

[ar71xx] parse mac address on RouterBOARDs

Location:
trunk/target/linux/ar71xx/files
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar71xx/files/arch/mips/ar71xx/platform.c

    r11894 r11910  
    2323#include <asm/mach-ar71xx/platform.h> 
    2424 
     25static u8 ar71xx_mac_base[ETH_ALEN] __initdata; 
     26 
    2527/* 
    2628 * OHCI (USB full speed host controller) 
     
    233235                        BUG(); 
    234236                } 
     237                memcpy(ar71xx_eth0_data.mac_addr, ar71xx_mac_base, ETH_ALEN); 
    235238                ar71xx_eth0_data.phy_if_mode = phy_if_mode; 
    236239                ar71xx_eth0_data.phy_mask = phy_mask; 
     
    248251                        BUG(); 
    249252                } 
     253                memcpy(ar71xx_eth1_data.mac_addr, ar71xx_mac_base, ETH_ALEN); 
     254                ar71xx_eth1_data.mac_addr[5] += id; 
    250255                ar71xx_eth1_data.phy_if_mode = phy_if_mode; 
    251256                ar71xx_eth1_data.phy_mask = phy_mask; 
     
    287292} 
    288293 
     294void __init ar71xx_set_mac_base(char *mac_str) 
     295{ 
     296        u8 tmp[ETH_ALEN]; 
     297        int t; 
     298 
     299        t = sscanf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", 
     300                        &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5]); 
     301 
     302        if (t == ETH_ALEN) 
     303                memcpy(ar71xx_mac_base, tmp, ETH_ALEN); 
     304        else 
     305                printk(KERN_DEBUG "AR71XX: failed to parse mac address " 
     306                                "\"%s\"\n", mac_str); 
     307} 
     308 
    289309static int __init ar71xx_machine_setup(void) 
    290310{ 
  • trunk/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c

    r11894 r11910  
    1919 
    2020#include <asm/mach-ar71xx/ar71xx.h> 
     21#include <asm/mach-ar71xx/platform.h> 
    2122 
    2223struct board_rec { 
     
    2526}; 
    2627 
    27 static int prom_argc __initdata; 
    28 static char **prom_argv __initdata; 
    29 static char **prom_envp __initdata; 
     28static int ar71xx_prom_argc __initdata; 
     29static char **ar71xx_prom_argv __initdata; 
     30static char **ar71xx_prom_envp __initdata; 
    3031 
    3132static struct board_rec boards[] __initdata = { 
     
    4243}; 
    4344 
    44 char *(*prom_getenv)(const char *envname) __initdata; 
    45  
    46 static __init char *dummy_getenv(const char *envname) 
    47 { 
    48         return NULL; 
    49 } 
    50  
    51 static void __init routerboot_printargs(void) 
     45static __init void routerboot_printargs(void) 
    5246{ 
    5347        int i; 
    5448 
    55         for (i = 0; i < prom_argc; i++) 
     49        for (i = 0; i < ar71xx_prom_argc; i++) 
    5650                printk(KERN_DEBUG "prom: routerboot envp[%d]: %s\n", 
    57                                 i, prom_envp[i]); 
     51                                i, ar71xx_prom_argv[i]); 
    5852} 
    5953 
    6054static __init char *routerboot_getenv(const char *envname) 
    6155{ 
     56        int len = strlen(envname); 
     57        int i; 
     58 
     59        for (i = 0; i < ar71xx_prom_argc; i++) { 
     60                char *env = ar71xx_prom_argv[i]; 
     61                if (strncmp(envname, env, len) == 0 && (env)[len] == '=') 
     62                        return env + len + 1; 
     63        } 
     64 
     65        return NULL; 
     66} 
     67 
     68static __init char *redboot_getenv(const char *envname) 
     69{ 
     70        int len = strlen(envname); 
    6271        char **env; 
    63         int i = strlen(envname); 
    6472 
    65         for (env = prom_envp; *env != NULL; env++) 
    66                 if (strncmp(envname, *env, i) == 0 && (*env)[i] == '=') 
    67                         return *env + i + 1; 
     73        for (env = ar71xx_prom_envp; *env != NULL; env++) 
     74                if (strncmp(envname, *env, len) == 0 && (*env)[len] == '=') 
     75                        return *env + len + 1; 
    6876 
    6977        return NULL; 
     
    8391void __init prom_init(void) 
    8492{ 
    85         char *board; 
     93        char *board = NULL; 
     94        char *mac = NULL; 
    8695 
    8796        printk(KERN_DEBUG "prom: fw_arg0=%08x, fw_arg1=%08x, " 
     
    9099                        (unsigned int)fw_arg2, (unsigned int)fw_arg3); 
    91100 
    92         prom_getenv = dummy_getenv; 
    93  
    94         if ((fw_arg0 == 7) && (fw_arg2 == 0)) { 
    95                 prom_argc = fw_arg0; 
    96                 prom_envp = (char **)fw_arg1; 
    97                 prom_getenv = routerboot_getenv; 
     101        if ((fw_arg0 == 7) && (fw_arg2 == 0) && (fw_arg3 == 0)) { 
     102                 /* assume RouterBOOT */ 
     103                ar71xx_prom_argc = fw_arg0; 
     104                ar71xx_prom_argv = (char **)fw_arg1; 
    98105                routerboot_printargs(); 
     106                board = routerboot_getenv("board"); 
     107                mac = routerboot_getenv("kmac"); 
     108        } else { 
     109                /* assume Redboot */ 
     110                ar71xx_prom_argc = fw_arg0; 
     111                ar71xx_prom_argv = (char **)fw_arg1; 
     112                ar71xx_prom_envp = (char **)fw_arg2; 
     113                mac = redboot_getenv("ethaddr"); 
    99114        } 
    100115 
    101         board = prom_getenv("board"); 
    102116        if (board) 
    103117                mips_machtype = find_board_byname(board); 
    104118        else 
    105119                mips_machtype = MACH_AR71XX_GENERIC; 
     120 
     121        if (mac) 
     122                ar71xx_set_mac_base(mac); 
    106123 
    107124        ar71xx_print_cmdline(); 
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h

    r11894 r11910  
    1919#include <linux/init.h> 
    2020#include <linux/types.h> 
     21#include <linux/random.h> 
    2122#include <linux/spinlock.h> 
    2223#include <linux/interrupt.h> 
     
    3637 
    3738#define AG71XX_DRV_NAME         "ag71xx" 
    38 #define AG71XX_DRV_VERSION      "0.3.9" 
     39#define AG71XX_DRV_VERSION      "0.3.10" 
    3940 
    4041#define AG71XX_NAPI_TX          1 
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c

    r11894 r11910  
    693693static int __init ag71xx_probe(struct platform_device *pdev) 
    694694{ 
    695         static u8 default_mac[ETH_ALEN] = {0x00, 0xba, 0xdb, 0xad, 0xba, 0xd0}; 
    696695        struct net_device *dev; 
    697696        struct resource *res; 
    698697        struct ag71xx *ag; 
     698        struct ag71xx_platform_data *pdata; 
    699699        int err; 
    700700 
    701         if (!pdev->dev.platform_data) { 
     701        pdata = pdev->dev.platform_data; 
     702        if (!pdata) { 
    702703                dev_err(&pdev->dev, "no platform data specified\n"); 
    703704                err = -ENXIO; 
     
    766767        netif_napi_add(dev, &ag->napi, ag71xx_poll, AG71XX_NAPI_WEIGHT); 
    767768 
    768         memcpy(dev->dev_addr, default_mac, ETH_ALEN); 
    769         dev->dev_addr[5] += pdev->id & 0xff; 
     769        if (is_valid_ether_addr(pdata->mac_addr)) 
     770                memcpy(dev->dev_addr, pdata->mac_addr, ETH_ALEN); 
     771        else { 
     772                dev->dev_addr[0] = 0xde; 
     773                dev->dev_addr[1] = 0xad; 
     774                get_random_bytes(&dev->dev_addr[2], 3); 
     775                dev->dev_addr[5] = pdev->id & 0xff; 
     776        } 
    770777 
    771778        err = register_netdev(dev); 
  • trunk/target/linux/ar71xx/files/include/asm-mips/mach-ar71xx/platform.h

    r11894 r11910  
    1313#define __ASM_MACH_AR71XX_PLATFORM_H 
    1414 
     15#include <linux/if_ether.h> 
    1516#include <linux/skbuff.h> 
    1617#include <linux/phy.h> 
     
    2324        phy_interface_t phy_if_mode; 
    2425        u32             mii_if; 
     26        u8              mac_addr[ETH_ALEN]; 
    2527}; 
    2628 
     
    3739                                struct spi_board_info const *info, 
    3840                                unsigned n) __init; 
     41 
     42extern void ar71xx_set_mac_base(char *mac_str) __init; 
    3943extern void ar71xx_add_device_eth(unsigned int id, phy_interface_t phy_if_mode, 
    4044                                u32 phy_mask) __init; 
Note: See TracChangeset for help on using the changeset viewer.