Add support for reading/storing MAC address in env variable
authorPiotr Dymacz <pepe2k@gmail.com>
Thu, 1 Sep 2016 21:21:53 +0000 (23:21 +0200)
committerPiotr Dymacz <pepe2k@gmail.com>
Thu, 1 Sep 2016 21:21:53 +0000 (23:21 +0200)
Use ethaddr variable for MAC address. If variable is not set,
try to get MAC from defined FLASH offset or if it's not there,
use fake/static one. Also, set ethaddr with MAC address from
FLASH.

If ethaddr variable is set (ex. user saved it in writable env
or defined during build), set MAC address based on its value.

u-boot/board/ar7240/common/common.c
u-boot/lib_mips/board.c

index 3eae06093810b4470bd3e35975e392435d4c54ac..d4f2c54fabcb7e50a6aaf3655347ce53e5aa9d81 100644 (file)
        #define CONFIG_BOARD_CUSTOM_STRING      "Unknown/OEM"
 #endif
 
-#define ALIGN_SIZE             "8"
+#define ALIGN_SIZE     "8"
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static u32 mac_is_not_valid = 1;
+static u32 mac_is_not_valid = 0;
 
 /*
  * Put QCA SOC name, version and revision in buffer
@@ -127,9 +127,9 @@ void print_board_info(void)
 
        /* tCL-tRCD-tRP-tRAS latency */
        printf("CL%d-%d-%d-%d\n", qca_dram_cas_lat(),
-                                                         qca_dram_trcd_lat(),
-                                                         qca_dram_trp_lat(),
-                                                         qca_dram_tras_lat());
+                                 qca_dram_trcd_lat(),
+                                 qca_dram_trp_lat(),
+                                 qca_dram_tras_lat());
 
        /* SPI NOR FLASH sizes and types */
        printf("%" ALIGN_SIZE "s ", "FLASH:");
@@ -159,34 +159,30 @@ void print_board_info(void)
        #if (SOC_TYPE & QCA_AR934X_SOC) |\
                (SOC_TYPE & QCA_QCA955X_SOC)
        if (!qca_pcie0_in_ep_mode()) {
-               if (qca_pcie_dev_info(0, &vid, &did)) {
+               if (qca_pcie_dev_info(0, &vid, &did))
                        printf("%04X:%04X", vid, did);
-               } else {
+               else
                        puts("no device");
-               }
        } else {
                puts("EP mode");
        }
        #elif (SOC_TYPE & QCA_QCA953X_SOC)
-       if (qca_pcie_dev_info(0, &vid, &did)) {
+       if (qca_pcie_dev_info(0, &vid, &did))
                printf("%04X:%04X", vid, did);
-       } else {
+       else
                puts("no device");
-       }
        #endif
 
        #if (SOC_TYPE & QCA_QCA956X_SOC)
-       if (qca_pcie_dev_info(1, &vid, &did)) {
+       if (qca_pcie_dev_info(1, &vid, &did))
                printf("%04X:%04X", vid, did);
-       } else {
+       else
                puts("no device");
-       }
        #elif (SOC_TYPE & QCA_QCA955X_SOC)
-       if (qca_pcie_dev_info(1, &vid, &did)) {
+       if (qca_pcie_dev_info(1, &vid, &did))
                printf(", %04X:%04X", vid, did);
-       } else {
+       else
                puts(", no device");
-       }
        #endif
 
        puts("\n");
@@ -197,11 +193,10 @@ void print_board_info(void)
                bd->bi_enetaddr[0],bd->bi_enetaddr[1], bd->bi_enetaddr[2],
                bd->bi_enetaddr[3], bd->bi_enetaddr[4], bd->bi_enetaddr[5]);
 
-       if (mac_is_not_valid) {
+       if (mac_is_not_valid)
                puts(" (fixed)\n");
-       } else {
+       else
                puts("\n");
-       }
 
        /* System clocks */
        printf("%" ALIGN_SIZE "s CPU/RAM/AHB/SPI/REF\n", "CLOCKS:");
@@ -238,13 +233,13 @@ void macaddr_init(u8 *mac_addr)
         * U/L bit == 0 -> Burned-In-Address (BIA) MAC address
         */
        if (CHECK_BIT((buffer[0] & 0xFF), 0) != 0 ||
-               CHECK_BIT((buffer[0] & 0xFF), 1) != 0) {
+           CHECK_BIT((buffer[0] & 0xFF), 1) != 0) {
                memcpy(buffer, fixed_mac, 6);
-       } else {
-               mac_is_not_valid = 0;
+               mac_is_not_valid = 1;
        }
 #else
        memcpy(buffer, fixed_mac, 6);
+       mac_is_not_valid = 1;
 #endif
 
        memcpy(mac_addr, buffer, 6);
index 0af59811e9753a70b3e53982acc2c838b4dc221e..7723c23388de509259b8b950b4f389266491702d 100644 (file)
@@ -310,8 +310,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
 #ifndef CFG_ENV_IS_NOWHERE
        extern char *env_name_spec;
 #endif
+       char buf[20];
        bd_t *bd;
        char *s;
+       int i;
 
        gd = id;
 
@@ -406,7 +408,22 @@ void board_init_r(gd_t *id, ulong dest_addr)
 #endif
 
        /* Init MAC address in board data info */
-       macaddr_init(bd->bi_enetaddr);
+       if ((s = getenv("ethaddr")) != NULL && strlen(s) == 17) {
+               /* Use the one from env */
+               for (i = 0; i < 6; i++)
+                       bd->bi_enetaddr[i] =
+                               simple_strtoul((char *)(s + (i * 3)), NULL, 16);
+       } else {
+               /* Use the one provided by board func */
+               macaddr_init(bd->bi_enetaddr);
+
+               /* And revrite it to env variable */
+               for (i = 0; i < 6; i++)
+                       sprintf((char *)(buf + (i * 3)), "%02X%c",
+                               bd->bi_enetaddr[i], i < 5 ? ':' : '\0');
+
+               setenv("ethaddr", buf);
+       }
 
        /* Print some information about board */
        print_board_info();