/* * cmd_emac.c- Sigmastar * * Copyright (C) 2018 Sigmastar Technology Corp. * * Author: richard.guo * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ //-------------------------------------------------------------------------------------------------#include "e1000.h" /* * EMAC Read/Write Utilities */ #include #include #include #include //#include /*----------------------------------------------------------------------- * Definitions */ #define EMAC_INPUT_LEN 2 #define EMAC_ADDR_INPUT_LEN 7 #define MAX_EMAC_BYTES 0x1000 /* Maximum number of bytes we can handle */ extern int MDrv_EMAC_initialize(bd_t * bis); extern void MDrv_EMAC_PowerMode(u8 mode); extern void MDrv_EMAC_WaveTest(u8 mode); extern void MHal_EMAC_Write_SA1_MAC_Address(u8 m0,u8 m1,u8 m2,u8 m3,u8 m4,u8 m5); extern void MHal_EMAC_Write_SA2_MAC_Address(u8 m0,u8 m1,u8 m2,u8 m3,u8 m4,u8 m5); extern void MHal_EMAC_Write_SA3_MAC_Address(u8 m0,u8 m1,u8 m2,u8 m3,u8 m4,u8 m5); extern void MHal_EMAC_Write_SA4_MAC_Address(u8 m0,u8 m1,u8 m2,u8 m3,u8 m4,u8 m5); extern u8 MY_MAC[6]; /* * emac init * * Syntax: * estart */ #define MACADDR_ENV "ethaddr" #define MACADDR_FORMAT "XX:XX:XX:XX:XX:XX" int do_emac (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { bd_t * bis=NULL; #if 0 char * macaddr; if ( NULL != (macaddr = getenv(MACADDR_ENV)) && strlen(macaddr) == strlen(MACADDR_FORMAT) && ':' == macaddr[2] && ':' == macaddr[5] && ':' == macaddr[8] && ':' == macaddr[11] && ':' == macaddr[14] ) { macaddr[2] = '\0'; macaddr[5] = '\0'; macaddr[8] = '\0'; macaddr[11] = '\0'; macaddr[14] = '\0'; MY_MAC[0] = (u8)simple_strtoul(&(macaddr[0]), NULL, 16); MY_MAC[1] = (u8)simple_strtoul(&(macaddr[3]), NULL, 16); MY_MAC[2] = (u8)simple_strtoul(&(macaddr[6]), NULL, 16); MY_MAC[3] = (u8)simple_strtoul(&(macaddr[9]), NULL, 16); MY_MAC[4] = (u8)simple_strtoul(&(macaddr[12]), NULL, 16); MY_MAC[5] = (u8)simple_strtoul(&(macaddr[15]), NULL, 16); /* set back to ':' or the environment variable would be destoried */ // REVIEW: this coding style is dangerous macaddr[2] = ':'; macaddr[5] = ':'; macaddr[8] = ':'; macaddr[11] = ':'; macaddr[14] = ':'; } #endif MDrv_EMAC_initialize(bis); printf("(Re)start EMAC...\n"); return 0; } int do_ewavetest (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { u8 mode = simple_strtoul(argv[1], NULL, 16); printf("start EMAC ewavetest mode:%d...\n", mode); MDrv_EMAC_WaveTest(mode); printf("finish EMAC ewavetest mode:%d...\n", mode); return 0; } int do_setMac(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char *cmdline_buf = NULL; if ((argc < EMAC_ADDR_INPUT_LEN) || (argc > EMAC_ADDR_INPUT_LEN)) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } MY_MAC[0] = simple_strtoul(argv[1], NULL, 16); MY_MAC[1] = simple_strtoul(argv[2], NULL, 16); MY_MAC[2] = simple_strtoul(argv[3], NULL, 16); MY_MAC[3] = simple_strtoul(argv[4], NULL, 16); MY_MAC[4] = simple_strtoul(argv[5], NULL, 16); MY_MAC[5] = simple_strtoul(argv[6], NULL, 16); cmdline_buf = malloc(64); if(cmdline_buf == NULL) { printf("%s: malloc() failed, at %d\n", __func__, __LINE__); //cyber return -1; } sprintf(cmdline_buf, "setenv -f "MACADDR_ENV" %02X:%02X:%02X:%02X:%02X:%02X", MY_MAC[0], MY_MAC[1], MY_MAC[2], MY_MAC[3], MY_MAC[4], MY_MAC[5]); run_command(cmdline_buf, 0); free(cmdline_buf); //run_command("saveenv", 0); printf("MAC Address %02X:%02X:%02X:%02X:%02X:%02X\n",MY_MAC[0], MY_MAC[1], MY_MAC[2], MY_MAC[3], MY_MAC[4], MY_MAC[5]); // Set MAC address ------------------------------------------------------ MHal_EMAC_Write_SA1_MAC_Address(MY_MAC[0], MY_MAC[1], MY_MAC[2], MY_MAC[3], MY_MAC[4], MY_MAC[5]); MHal_EMAC_Write_SA2_MAC_Address(MY_MAC[0], MY_MAC[1], MY_MAC[2], MY_MAC[3], MY_MAC[4], MY_MAC[5]); MHal_EMAC_Write_SA3_MAC_Address(MY_MAC[0], MY_MAC[1], MY_MAC[2], MY_MAC[3], MY_MAC[4], MY_MAC[5]); MHal_EMAC_Write_SA4_MAC_Address(MY_MAC[0], MY_MAC[1], MY_MAC[2], MY_MAC[3], MY_MAC[4], MY_MAC[5]); return 0; } extern int emac_init; extern void MDrv_EMAC_DumpReg(void); int do_dumpMac(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { if (!emac_init) { printf("Please start emac first!\n"); return 0; } printf("Dump EMAC Register\n"); MDrv_EMAC_DumpReg(); return 0; } extern u8 MDrv_EMAC_Bist(u8 bEnable); extern int NetLoop(enum proto_t protocol); int do_bistMac(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { u8 count = simple_strtoul(argv[1], NULL, 16); if (!emac_init) { printf("Please start emac first!\n"); return 0; } if (0 == count) printf("Usage:\n ebist count (count:0~255 times)\n Ex: ebist 10\n"); else { u8 idx= 0; char buffer[256], ip_addr[][15] = { "10.0.0.253", "127.0.0.1", "172.16.90.254", "192.168.0.1", "224.30.0.253", "0" }; if (MDrv_EMAC_Bist(1)) { for (; idx < count; idx++) { memset(buffer, 0 , sizeof(buffer)); sprintf(buffer, "ping %s", ip_addr[idx%5]); printf("\n=========> %s for PHY Loopback test.....\n", buffer); run_command(buffer, 0); } } MDrv_EMAC_Bist(0); } return 0; } int do_Loopback(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { if (!emac_init) { printf("Please start emac first!\n"); return 0; } MDrv_EMAC_Bist(2); return 0; } int do_loadspi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { ulong ram_start; ulong spi_start; ulong len,i; if (argc != 4) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } spi_start = simple_strtoul(argv[1], NULL, 10); ram_start = simple_strtoul(argv[2], NULL, 10); len = simple_strtoul(argv[3], NULL, 10); printf("copy from spi(%lux) to ram(%lux) with len=%lux\n",spi_start,ram_start,len); for(i=0;i