diff options
| author | Rob Herring <rob.herring@calxeda.com> | 2012-12-02 21:00:29 -0600 | 
|---|---|---|
| committer | Joe Hershberger <joe.hershberger@ni.com> | 2013-06-24 19:10:14 -0500 | 
| commit | 98f646764d237b1776638cc83efba61bf92d8709 (patch) | |
| tree | 9af005e2299baa7c71c5adae154c34f19da97fd1 /common/cmd_pxe.c | |
| parent | 58d9ff936f106d8319a4be8a253a66adc2772736 (diff) | |
| download | olio-uboot-2014.01-98f646764d237b1776638cc83efba61bf92d8709.tar.xz olio-uboot-2014.01-98f646764d237b1776638cc83efba61bf92d8709.zip | |
pxe: add ipappend support
Add ipappend support to pass network device information to the kernel.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Diffstat (limited to 'common/cmd_pxe.c')
| -rw-r--r-- | common/cmd_pxe.c | 47 | 
1 files changed, 44 insertions, 3 deletions
| diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 3958e215d..1fb75d8ae 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -452,6 +452,7 @@ struct pxe_label {  	char *append;  	char *initrd;  	char *fdt; +	int ipappend;  	int attempted;  	int localboot;  	int localboot_val; @@ -585,7 +586,11 @@ static int label_boot(struct pxe_label *label)  {  	char *bootm_argv[] = { "bootm", NULL, NULL, NULL, NULL };  	char initrd_str[22]; +	char mac_str[29] = ""; +	char ip_str[68] = ""; +	char *bootargs;  	int bootm_argc = 3; +	int len = 0;  	label_print(label); @@ -624,9 +629,39 @@ static int label_boot(struct pxe_label *label)  		return 1;  	} -	if (label->append) { -		setenv("bootargs", label->append); -		printf("append: %s\n", label->append); +	if (label->ipappend & 0x1) { +		sprintf(ip_str, " ip=%s:%s:%s:%s", +			getenv("ipaddr"), getenv("serverip"), +			getenv("gatewayip"), getenv("netmask")); +		len += strlen(ip_str); +	} + +	if (label->ipappend & 0x2) { +		int err; +		strcpy(mac_str, " BOOTIF="); +		err = format_mac_pxe(mac_str + 8, sizeof(mac_str) - 8); +		if (err < 0) +			mac_str[0] = '\0'; +		len += strlen(mac_str); +	} + +	if (label->append) +		len += strlen(label->append); + +	if (len) { +		bootargs = malloc(len + 1); +		if (!bootargs) +			return 1; +		bootargs[0] = '\0'; +		if (label->append) +			strcpy(bootargs, label->append); +		strcat(bootargs, ip_str); +		strcat(bootargs, mac_str); + +		setenv("bootargs", bootargs); +		printf("append: %s\n", bootargs); + +		free(bootargs);  	}  	bootm_argv[1] = getenv("kernel_addr_r"); @@ -689,6 +724,7 @@ enum token_type {  	T_INCLUDE,  	T_FDT,  	T_ONTIMEOUT, +	T_IPAPPEND,  	T_INVALID  }; @@ -718,6 +754,7 @@ static const struct token keywords[] = {  	{"include", T_INCLUDE},  	{"fdt", T_FDT},  	{"ontimeout", T_ONTIMEOUT,}, +	{"ipappend", T_IPAPPEND,},  	{NULL, T_INVALID}  }; @@ -1109,6 +1146,10 @@ static int parse_label(char **c, struct pxe_menu *cfg)  			err = parse_integer(c, &label->localboot_val);  			break; +		case T_IPAPPEND: +			err = parse_integer(c, &label->ipappend); +			break; +  		case T_EOL:  			break; |