cmd_arc.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /*
  2. * Command for accessing Arcturus factory environment.
  3. *
  4. * Copyright 2013-2015 Arcturus Networks Inc.
  5. * http://www.arcturusnetworks.com/products/ucp1020/
  6. * by Oleksandr G Zhadan et al.
  7. *
  8. * SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause
  9. *
  10. */
  11. #include <common.h>
  12. #include <div64.h>
  13. #include <malloc.h>
  14. #include <spi_flash.h>
  15. #include <asm/io.h>
  16. #ifndef CONFIG_SF_DEFAULT_SPEED
  17. # define CONFIG_SF_DEFAULT_SPEED 1000000
  18. #endif
  19. #ifndef CONFIG_SF_DEFAULT_MODE
  20. # define CONFIG_SF_DEFAULT_MODE SPI_MODE0
  21. #endif
  22. #ifndef CONFIG_SF_DEFAULT_CS
  23. # define CONFIG_SF_DEFAULT_CS 0
  24. #endif
  25. #ifndef CONFIG_SF_DEFAULT_BUS
  26. # define CONFIG_SF_DEFAULT_BUS 0
  27. #endif
  28. #define MAX_SERIAL_SIZE 15
  29. #define MAX_HWADDR_SIZE 17
  30. #define FIRM_ADDR1 (0x200 - sizeof(smac))
  31. #define FIRM_ADDR2 (0x400 - sizeof(smac))
  32. #define FIRM_ADDR3 (CONFIG_ENV_SECT_SIZE + 0x200 - sizeof(smac))
  33. #define FIRM_ADDR4 (CONFIG_ENV_SECT_SIZE + 0x400 - sizeof(smac))
  34. static struct spi_flash *flash;
  35. char smac[4][18];
  36. static int ishwaddr(char *hwaddr)
  37. {
  38. if (strlen(hwaddr) == MAX_HWADDR_SIZE)
  39. if (hwaddr[2] == ':' &&
  40. hwaddr[5] == ':' &&
  41. hwaddr[8] == ':' &&
  42. hwaddr[11] == ':' &&
  43. hwaddr[14] == ':')
  44. return 0;
  45. return -1;
  46. }
  47. static int set_arc_product(int argc, char *const argv[])
  48. {
  49. int err = 0;
  50. char *mystrerr = "ERROR: Failed to save factory info in spi location";
  51. if (argc != 5)
  52. return -1;
  53. /* Check serial number */
  54. if (strlen(argv[1]) != MAX_SERIAL_SIZE)
  55. return -1;
  56. /* Check HWaddrs */
  57. if (ishwaddr(argv[2]) || ishwaddr(argv[3]) || ishwaddr(argv[4]))
  58. return -1;
  59. strcpy(smac[3], argv[1]);
  60. strcpy(smac[2], argv[2]);
  61. strcpy(smac[1], argv[3]);
  62. strcpy(smac[0], argv[4]);
  63. flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
  64. CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
  65. /*
  66. * Save factory defaults
  67. */
  68. if (spi_flash_write(flash, FIRM_ADDR1, sizeof(smac), smac)) {
  69. printf("%s: %s [1]\n", __func__, mystrerr);
  70. err++;
  71. }
  72. if (spi_flash_write(flash, FIRM_ADDR2, sizeof(smac), smac)) {
  73. printf("%s: %s [2]\n", __func__, mystrerr);
  74. err++;
  75. }
  76. if (spi_flash_write(flash, FIRM_ADDR3, sizeof(smac), smac)) {
  77. printf("%s: %s [3]\n", __func__, mystrerr);
  78. err++;
  79. }
  80. if (spi_flash_write(flash, FIRM_ADDR4, sizeof(smac), smac)) {
  81. printf("%s: %s [4]\n", __func__, mystrerr);
  82. err++;
  83. }
  84. if (err == 4) {
  85. printf("%s: %s [ALL]\n", __func__, mystrerr);
  86. return -2;
  87. }
  88. return 0;
  89. }
  90. int get_arc_info(void)
  91. {
  92. int location = 1;
  93. char *myerr = "ERROR: Failed to read all 4 factory info spi locations";
  94. flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
  95. CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
  96. if (spi_flash_read(flash, FIRM_ADDR1, sizeof(smac), smac)) {
  97. location++;
  98. if (spi_flash_read(flash, FIRM_ADDR2, sizeof(smac), smac)) {
  99. location++;
  100. if (spi_flash_read(flash, FIRM_ADDR3, sizeof(smac),
  101. smac)) {
  102. location++;
  103. if (spi_flash_read(flash, FIRM_ADDR4,
  104. sizeof(smac), smac)) {
  105. printf("%s: %s\n", __func__, myerr);
  106. return -2;
  107. }
  108. }
  109. }
  110. }
  111. if (smac[3][0] != 0) {
  112. if (location > 1)
  113. printf("Using region %d\n", location);
  114. printf("SERIAL: ");
  115. if (smac[3][0] == 0xFF) {
  116. printf("\t<not found>\n");
  117. } else {
  118. printf("\t%s\n", smac[3]);
  119. setenv("SERIAL", smac[3]);
  120. }
  121. }
  122. if (strcmp(smac[2], "00:00:00:00:00:00") == 0)
  123. return 0;
  124. printf("HWADDR0:");
  125. if (smac[2][0] == 0xFF) {
  126. printf("\t<not found>\n");
  127. } else {
  128. char *ret = getenv("ethaddr");
  129. if (strcmp(ret, __stringify(CONFIG_ETHADDR)) == 0) {
  130. setenv("ethaddr", smac[2]);
  131. printf("\t%s (factory)\n", smac[2]);
  132. } else {
  133. printf("\t%s\n", ret);
  134. }
  135. }
  136. if (strcmp(smac[1], "00:00:00:00:00:00") == 0) {
  137. setenv("eth1addr", smac[2]);
  138. setenv("eth2addr", smac[2]);
  139. return 0;
  140. }
  141. printf("HWADDR1:");
  142. if (smac[1][0] == 0xFF) {
  143. printf("\t<not found>\n");
  144. } else {
  145. char *ret = getenv("eth1addr");
  146. if (strcmp(ret, __stringify(CONFIG_ETH1ADDR)) == 0) {
  147. setenv("eth1addr", smac[1]);
  148. printf("\t%s (factory)\n", smac[1]);
  149. } else {
  150. printf("\t%s\n", ret);
  151. }
  152. }
  153. if (strcmp(smac[0], "00:00:00:00:00:00") == 0) {
  154. setenv("eth2addr", smac[1]);
  155. return 0;
  156. }
  157. printf("HWADDR2:");
  158. if (smac[0][0] == 0xFF) {
  159. printf("\t<not found>\n");
  160. } else {
  161. char *ret = getenv("eth2addr");
  162. if (strcmp(ret, __stringify(CONFIG_ETH2ADDR)) == 0) {
  163. setenv("eth2addr", smac[0]);
  164. printf("\t%s (factory)\n", smac[0]);
  165. } else {
  166. printf("\t%s\n", ret);
  167. }
  168. }
  169. return 0;
  170. }
  171. static int do_arc_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
  172. {
  173. const char *cmd;
  174. int ret = -1;
  175. cmd = argv[1];
  176. --argc;
  177. ++argv;
  178. if (strcmp(cmd, "product") == 0) {
  179. ret = set_arc_product(argc, argv);
  180. goto done;
  181. }
  182. if (strcmp(cmd, "info") == 0) {
  183. ret = get_arc_info();
  184. goto done;
  185. }
  186. done:
  187. if (ret == -1)
  188. return CMD_RET_USAGE;
  189. return ret;
  190. }
  191. U_BOOT_CMD(arc, 6, 1, do_arc_cmd,
  192. "Arcturus product command sub-system",
  193. "product serial hwaddr0 hwaddr1 hwaddr2 - save Arcturus factory env\n"
  194. "info - show Arcturus factory env\n\n");