| /* |
| *(C) Copyright 2005-2008 Netstal Maschinen AG |
| * Niklaus Giger (Niklaus.Giger@netstal.com) |
| * |
| * This source code is free software; you can redistribute it |
| * and/or modify it in source code form under the terms of the GNU |
| * General Public License as published by the Free Software |
| * Foundation; either version 2 of the License, or (at your option) |
| * any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
| */ |
| |
| #include <common.h> |
| #include <command.h> |
| #include <net.h> |
| #include "nm.h" |
| |
| DECLARE_GLOBAL_DATA_PTR; |
| |
| #define DEFAULT_ETH_ADDR "ethaddr" |
| |
| typedef struct {u8 id; char *name;} generation_info; |
| |
| generation_info generations[7] = { |
| {HW_GENERATION_HCU2, "HCU2"}, |
| {HW_GENERATION_HCU3, "HCU3"}, |
| {HW_GENERATION_HCU4, "HCU4"}, |
| {HW_GENERATION_HCU5, "HCU5"}, |
| {HW_GENERATION_MCU, "MCU"}, |
| {HW_GENERATION_MCU20, "MCU20"}, |
| {HW_GENERATION_MCU25, "MCU25"}, |
| }; |
| |
| void nm_show_print(int generation, int index, int hw_capabilities) |
| { |
| int j; |
| char *generationName=0; |
| |
| /* reset ANSI terminal color mode */ |
| printf("\x1B""[0m""Netstal Maschinen AG: "); |
| for (j=0; j < (sizeof(generations)/sizeof(generations[0])); j++) { |
| if (generations[j].id == generation) { |
| generationName = generations[j].name; |
| break; |
| } |
| } |
| printf("%s: index %d HW 0x%x\n", generationName, index, hw_capabilities); |
| for (j = 0;j < 6; j++) { |
| hcu_led_set(1 << j); |
| udelay(200 * 1000); |
| } |
| } |
| |
| void set_params_for_sw_install(int install_requested, char *board_name ) |
| { |
| if (install_requested) { |
| char string[128]; |
| |
| printf("\n\n%s SW-Installation: %d patching boot parameters\n", |
| board_name, install_requested); |
| setenv("bootdelay", "0"); |
| setenv("loadaddr", "0x01000000"); |
| setenv("serverip", "172.25.1.1"); |
| setenv("bootcmd", "run install"); |
| sprintf(string, "tftp ${loadaddr} admin/sw_on_hd; " |
| "tftp ${loadaddr} installer/%s_sw_inst; " |
| "run boot_sw_inst", board_name); |
| setenv("install", string); |
| sprintf(string, "setenv bootargs emac(0,0)c:%s/%s_sw_inst " |
| "e=${ipaddr} h=${serverip} f=0x1000; " |
| "bootvx ${loadaddr}\0", |
| board_name, board_name); |
| setenv("boot_sw_inst", string); |
| } |
| } |
| |
| void common_misc_init_r(void) |
| { |
| char *s = getenv(DEFAULT_ETH_ADDR); |
| char *e; |
| int i; |
| u32 serial = get_serial_number(); |
| IPaddr_t ipaddr; |
| char *ipstring; |
| |
| for (i = 0; i < 6; ++i) { |
| gd->bd->bi_enetaddr[i] = s ? simple_strtoul(s, &e, 16) : 0; |
| if (s) |
| s = (*e) ? e + 1 : e; |
| } |
| |
| if (gd->bd->bi_enetaddr[3] == 0 && |
| gd->bd->bi_enetaddr[4] == 0 && |
| gd->bd->bi_enetaddr[5] == 0) { |
| char ethaddr[22]; |
| |
| /* Must be in sync with CONFIG_ETHADDR */ |
| gd->bd->bi_enetaddr[0] = 0x00; |
| gd->bd->bi_enetaddr[1] = 0x60; |
| gd->bd->bi_enetaddr[2] = 0x13; |
| gd->bd->bi_enetaddr[3] = (serial >> 16) & 0xff; |
| gd->bd->bi_enetaddr[4] = (serial >> 8) & 0xff; |
| gd->bd->bi_enetaddr[5] = hcu_get_slot(); |
| sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X\0", |
| gd->bd->bi_enetaddr[0], gd->bd->bi_enetaddr[1], |
| gd->bd->bi_enetaddr[2], gd->bd->bi_enetaddr[3], |
| gd->bd->bi_enetaddr[4], gd->bd->bi_enetaddr[5]) ; |
| printf("%s: Setting eth %s serial 0x%x\n", __FUNCTION__, |
| ethaddr, serial); |
| setenv(DEFAULT_ETH_ADDR, ethaddr); |
| } |
| |
| /* IP-Adress update */ |
| ipstring = getenv("ipaddr"); |
| if (ipstring == 0) |
| ipaddr = string_to_ip("172.25.1.99"); |
| else |
| ipaddr = string_to_ip(ipstring); |
| if ((ipaddr & 0xff) != (32 + hcu_get_slot())) { |
| char tmp[22]; |
| |
| ipaddr = (ipaddr & 0xffffff00) + 32 + hcu_get_slot(); |
| ip_to_string (ipaddr, tmp); |
| printf("%s: enforce %s\n", __FUNCTION__, tmp); |
| setenv("ipaddr", tmp); |
| saveenv(); |
| } |
| } |