Patchwork [U-Boot,10/10] pxe: add ipappend support

login
register
mail settings
Submitter Rob Herring
Date Dec. 3, 2012, 3 a.m.
Message ID <1354503629-25621-11-git-send-email-robherring2@gmail.com>
Download mbox | patch
Permalink /patch/203277/
State Accepted
Delegated to: Joe Hershberger
Headers show

Comments

Rob Herring - Dec. 3, 2012, 3 a.m.
From: Rob Herring <rob.herring@calxeda.com>

Add ipappend support to pass network device information to the kernel.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 common/cmd_pxe.c |   47 ++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 44 insertions(+), 3 deletions(-)

Patch

diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c
index f834d31..893cabc 100644
--- a/common/cmd_pxe.c
+++ b/common/cmd_pxe.c
@@ -450,6 +450,7 @@  struct pxe_label {
 	char *append;
 	char *initrd;
 	char *fdt;
+	int ipappend;
 	int attempted;
 	int localboot;
 	int localboot_val;
@@ -583,7 +584,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);
 
@@ -622,9 +627,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");
@@ -686,6 +721,7 @@  enum token_type {
 	T_INCLUDE,
 	T_FDT,
 	T_ONTIMEOUT,
+	T_IPAPPEND,
 	T_INVALID
 };
 
@@ -715,6 +751,7 @@  static const struct token keywords[] = {
 	{"include", T_INCLUDE},
 	{"fdt", T_FDT},
 	{"ontimeout", T_ONTIMEOUT,},
+	{"ipappend", T_IPAPPEND,},
 	{NULL, T_INVALID}
 };
 
@@ -1106,6 +1143,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;