
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(-)
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;