| /* |
| * Command for controlling Ethernet interface. |
| * |
| * Copyright 2015 Chromium OS Authors |
| */ |
| |
| #include "common.h" |
| |
| #include "drivers/bus/usb/usb.h" |
| #include "drivers/net/net.h" |
| #include "netboot/netboot.h" |
| |
| /* Wait for the device to show up for no longer than 5 seconds. */ |
| #define DEV_TIMEOUT_US 5000000 |
| |
| static NetDevice *get_net_device(void) |
| { |
| NetDevice *ndev = net_get_device(); |
| int ready = 0; |
| |
| if (ndev) |
| ndev->ready(ndev, &ready); |
| |
| if (!ready) { |
| net_wait_for_link(); |
| ndev = net_get_device(); |
| } |
| |
| return ndev; |
| } |
| |
| static int do_enet(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
| { |
| NetDevice *ndev; |
| int ready; |
| |
| if (argc < 2) |
| return CMD_RET_USAGE; |
| |
| ndev = get_net_device(); |
| if (!ndev) |
| return CMD_RET_FAILURE; |
| |
| if (!strcmp(argv[1], "send")) { |
| unsigned long addr; |
| int length; |
| |
| if (argc != 4) |
| return CMD_RET_USAGE; |
| |
| if (!ready) |
| return CMD_RET_FAILURE; |
| |
| /* We might want to chek these for sanity. */ |
| addr = strtoul(argv[2], 0, 16); |
| length = strtoul(argv[1], 0, 0); |
| |
| ndev->send(ndev, (void *) addr, length); |
| return CMD_RET_SUCCESS; |
| } |
| |
| if (!strcmp(argv[1], "dhcp")) { |
| uip_ipaddr_t my_ip, next_ip, server_ip; |
| const char *dhcp_bootfile; |
| |
| if (!try_dhcp(&my_ip, &next_ip, &server_ip, &dhcp_bootfile)) |
| return CMD_RET_SUCCESS; |
| |
| } |
| return CMD_RET_FAILURE; |
| } |
| |
| U_BOOT_CMD( |
| enet, 5, 1, |
| "ethernet interface utilities", |
| "dhcp - try obtainitg IP address over DHCP\n" |
| "enet send addr len - send a frame from memory,\n" |
| " 'len' bytes starting at address 'addr'\n" |
| ); |