/*
 *(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[6] = {
	{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}%c",
			board_name, board_name, 0);
		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%c",
			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],
			0) ;
		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();
	}
}
