]> git.sur5r.net Git - u-boot/blobdiff - common/cmd_pxe.c
pxe: Use ethact setting for pxe
[u-boot] / common / cmd_pxe.c
index 6b31deab5bea493000996ceb057eff336fde3b20..f785c0e99b391525895d5bba01f63d5eebfb94f9 100644 (file)
@@ -55,37 +55,21 @@ static char *from_env(char *envvar)
  */
 static int format_mac_pxe(char *outbuf, size_t outbuf_len)
 {
-       size_t ethaddr_len;
-       char *p, *ethaddr;
+       uchar ethaddr[6];
 
-       ethaddr = from_env("ethaddr");
-
-       if (!ethaddr)
-               return -ENOENT;
-
-       ethaddr_len = strlen(ethaddr);
-
-       /*
-        * ethaddr_len + 4 gives room for "01-", ethaddr, and a NUL byte at
-        * the end.
-        */
-       if (outbuf_len < ethaddr_len + 4) {
-               printf("outbuf is too small (%d < %d)\n",
-                               outbuf_len, ethaddr_len + 4);
+       if (outbuf_len < 21) {
+               printf("outbuf is too small (%d < 21)\n", outbuf_len);
 
                return -EINVAL;
        }
 
-       strcpy(outbuf, "01-");
-
-       for (p = outbuf + 3; *ethaddr; ethaddr++, p++) {
-               if (*ethaddr == ':')
-                       *p = '-';
-               else
-                       *p = tolower(*ethaddr);
-       }
+       if (!eth_getenv_enetaddr_by_index("eth", eth_get_dev_index(),
+                                         ethaddr))
+               return -ENOENT;
 
-       *p = '\0';
+       sprintf(outbuf, "01-%02x-%02x-%02x-%02x-%02x-%02x",
+               ethaddr[0], ethaddr[1], ethaddr[2],
+               ethaddr[3], ethaddr[4], ethaddr[5]);
 
        return 1;
 }
@@ -450,6 +434,7 @@ struct pxe_label {
        char *kernel;
        char *append;
        char *initrd;
+       char *fdt;
        int attempted;
        int localboot;
        struct list_head list;
@@ -517,6 +502,9 @@ static void label_destroy(struct pxe_label *label)
        if (label->initrd)
                free(label->initrd);
 
+       if (label->fdt)
+               free(label->fdt);
+
        free(label);
 }
 
@@ -541,6 +529,9 @@ static void label_print(void *data)
 
        if (label->initrd)
                printf("\t\tinitrd: %s\n", label->initrd);
+
+       if (label->fdt)
+               printf("\tfdt: %s\n", label->fdt);
 }
 
 /*
@@ -628,10 +619,29 @@ static void label_boot(struct pxe_label *label)
        bootm_argv[1] = getenv("kernel_addr_r");
 
        /*
-        * fdt usage is optional.  If there is an fdt_addr specified, we will
-        * pass it along to bootm, and adjust argc appropriately.
+        * fdt usage is optional:
+        * It handles the following scenarios. All scenarios are exclusive
+        *
+        * Scenario 1: If fdt_addr_r specified and "fdt" label is defined in
+        * pxe file, retrieve fdt blob from server. Pass fdt_addr_r to bootm,
+        * and adjust argc appropriately.
+        *
+        * Scenario 2: If there is an fdt_addr specified, pass it along to
+        * bootm, and adjust argc appropriately.
+        *
+        * Scenario 3: fdt blob is not available.
         */
-       bootm_argv[3] = getenv("fdt_addr");
+       bootm_argv[3] = getenv("fdt_addr_r");
+
+       /* if fdt label is defined then get fdt from server */
+       if (bootm_argv[3] && label->fdt) {
+               if (get_relfile_envaddr(label->fdt, "fdt_addr_r") < 0) {
+                       printf("Skipping %s for failure retrieving fdt\n",
+                                       label->name);
+                       return;
+               }
+       } else
+               bootm_argv[3] = getenv("fdt_addr");
 
        if (bootm_argv[3])
                bootm_argc = 4;
@@ -658,6 +668,7 @@ enum token_type {
        T_DEFAULT,
        T_PROMPT,
        T_INCLUDE,
+       T_FDT,
        T_INVALID
 };
 
@@ -685,6 +696,7 @@ static const struct token keywords[] = {
        {"append", T_APPEND},
        {"initrd", T_INITRD},
        {"include", T_INCLUDE},
+       {"fdt", T_FDT},
        {NULL, T_INVALID}
 };
 
@@ -1074,6 +1086,11 @@ static int parse_label(char **c, struct pxe_menu *cfg)
                                err = parse_sliteral(c, &label->initrd);
                        break;
 
+               case T_FDT:
+                       if (!label->fdt)
+                               err = parse_sliteral(c, &label->fdt);
+                       break;
+
                case T_LOCALBOOT:
                        err = parse_integer(c, &label->localboot);
                        break;
@@ -1247,7 +1264,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg)
        /*
         * Create a menu and add items for all the labels.
         */
-       m = menu_create(cfg->title, cfg->timeout, cfg->prompt, label_print);
+       m = menu_create(cfg->title, cfg->timeout, cfg->prompt, label_print,
+                       NULL, NULL);
 
        if (!m)
                return NULL;