]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - net/bootme.c
ARM: imx6: clocks: remove function local definitions of mxc_ccm_reg and anatop_regs
[karo-tx-uboot.git] / net / bootme.c
index 56ae37834707f2e55c3bcd7d1b015aa60df3ed68..928734688b4db83f77a7d0fa8b5d3d1345a5511b 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define WINCE_VRAM_BASE                0x80000000
-#define CE_FIX_ADDRESS(a)      ((void *)((a) - WINCE_VRAM_BASE + CONFIG_SYS_SDRAM_BASE))
-
-#ifndef INT_MAX
-#define INT_MAX                        ((int)(~0 >> 1))
-#endif
-
-/* Bin image parse states */
-#define CE_PS_RTI_ADDR         0
-#define CE_PS_RTI_LEN          1
-#define CE_PS_E_ADDR           2
-#define CE_PS_E_LEN            3
-#define CE_PS_E_CHKSUM         4
-#define CE_PS_E_DATA           5
-
-#define CE_MIN(a, b)           (((a) < (b)) ? (a) : (b))
-#define CE_MAX(a, b)           (((a) > (b)) ? (a) : (b))
-
-#define _STRMAC(s)             #s
-#define STRMAC(s)              _STRMAC(s)
-
 static enum bootme_state bootme_state;
 static int bootme_src_port = 0xdeadface;
 static int bootme_dst_port = 0xdeadbeef;
 static uchar bootme_ether[ETH_ALEN];
-static IPaddr_t bootme_ip;
+static struct in_addr bootme_ip;
 static int bootme_timed_out;
-//static size_t input_len, input_size;
-//static void *input_packet;
 static const char *output_packet; /* used by first send udp */
 static int output_packet_len;
 static unsigned long bootme_timeout;
@@ -76,10 +53,10 @@ static void __attribute__((unused)) ce_dump_block(const void *ptr, int length)
                }
 
                printf("%02x ", p[i]);
-               if (!((i + 1) % 16)){
+               if (!((i + 1) % 16)) {
                        printf("      ");
                        for (j = i - 15; j <= i; j++){
-                               if((p[j] > 0x1f) && (p[j] < 0x7f)) {
+                               if ((p[j] > 0x1f) && (p[j] < 0x7f)) {
                                        printf("%c", p[j]);
                                } else {
                                        printf(".");
@@ -97,6 +74,7 @@ static inline void ce_dump_block(void *ptr, int length)
 
 static void bootme_timeout_handler(void)
 {
+       printf("%s\n", __func__);
        net_set_state(NETLOOP_SUCCESS);
        bootme_timed_out++;
 }
@@ -115,14 +93,14 @@ static inline int env_changed(int *id)
 
 static int env_id;
 
-static int is_broadcast(IPaddr_t ip)
+static int is_broadcast(struct in_addr ip)
 {
-       static IPaddr_t netmask;
-       static IPaddr_t our_ip;
+       static struct in_addr netmask;
+       static struct in_addr our_ip;
 
-       return (ip == ~0 ||                             /* 255.255.255.255 */
-           ((netmask & our_ip) == (netmask & ip) &&    /* on the same net */
-           (netmask | ip) == ~0));             /* broadcast to our net */
+       return (ip.s_addr == ~0 ||                      /* 255.255.255.255 */
+           ((netmask.s_addr & our_ip.s_addr) == (netmask.s_addr & ip.s_addr) && /* on the same net */
+           (netmask.s_addr | ip.s_addr) == ~0));       /* broadcast to our net */
 }
 
 static int check_net_config(void)
@@ -132,11 +110,11 @@ static int check_net_config(void)
                char *bip;
 
                bootme_dst_port = EDBG_DOWNLOAD_PORT;
-               if (bootme_ip == 0) {
+               if (bootme_ip.s_addr == 0) {
                        bip = getenv("bootmeip");
                        if (bip) {
-                               bootme_ip = getenv_IPaddr("bootmeip");
-                               if (!bootme_ip)
+                               bootme_ip = getenv_ip("bootmeip");
+                               if (!bootme_ip.s_addr)
                                        return -EINVAL;
                                p = strchr(bip, ':');
                                if (p) {
@@ -163,13 +141,13 @@ static int check_net_config(void)
                        memset(bootme_ether, 0, sizeof(bootme_ether));
 
                net_init();
-               NetServerIP = bootme_ip;
+               net_copy_ip(&net_server_ip, &bootme_ip);
        }
        return 0;
 }
 
 static void bootme_wait_arp_handler(uchar *pkt, unsigned dest,
-                               IPaddr_t sip, unsigned src,
+                               struct in_addr sip, unsigned src,
                                unsigned len)
 {
        net_set_state(NETLOOP_SUCCESS); /* got arp reply - quit net loop */
@@ -190,18 +168,18 @@ static inline char next_cursor(char c)
        return 0;
 }
 
-static void bootme_handler(uchar *pkt, unsigned dest_port, IPaddr_t src_ip,
+static void bootme_handler(uchar *pkt, unsigned dest_port, struct in_addr src_ip,
                        unsigned src_port, unsigned len)
 {
        uchar *eth_pkt = pkt;
        unsigned eth_len = len;
        static char cursor = '|';
-       enum bootme_state last_state = BOOTME_INIT;
-#if 1
+       enum bootme_state last_state = bootme_state;
+
        debug("received packet of len %d from %pI4:%d to port %d\n",
                len, &src_ip, src_port, dest_port);
        ce_dump_block(pkt, len);
-#endif
+
        if (!bootme_packet_handler) {
                printf("No packet handler set for BOOTME protocol; dropping packet\n");
                return;
@@ -212,38 +190,48 @@ static void bootme_handler(uchar *pkt, unsigned dest_port, IPaddr_t src_ip,
        printf("%c\x08", cursor);
        cursor = next_cursor(cursor);
 
-       if (is_broadcast(bootme_ip)) {
-               bootme_ip = src_ip;
-       } else if (src_ip != bootme_ip) {
+       if (!is_broadcast(bootme_ip) && src_ip.s_addr != bootme_ip.s_addr) {
                debug("src_ip %pI4 does not match destination IP %pI4\n",
                        &src_ip, &bootme_ip);
                return; /* not from our server */
        }
-
-       last_state = bootme_state;
-       bootme_dst_port = src_port;
-       debug("bootme_dst_port set to %d\n", bootme_dst_port);
+       if (bootme_state == BOOTME_INIT || bootme_state == BOOTME_DEBUG_INIT) {
+               struct ethernet_hdr *eth = (struct ethernet_hdr *)(pkt -
+                                       net_eth_hdr_size() - IP_UDP_HDR_SIZE);
+               memcpy(bootme_ether, eth->et_src, sizeof(bootme_ether));
+               printf("Target MAC address set to %pM\n", bootme_ether);
+
+               if (is_broadcast(bootme_ip)) {
+                       net_copy_ip(&bootme_ip, &src_ip);
+               }
+       }
        if (bootme_state == BOOTME_INIT) {
                bootme_src_port = EDBG_SVC_PORT;
                debug("%s: bootme_src_port set to %d\n", __func__, bootme_src_port);
        }
+
+       debug("bootme_dst_port %d -> %d\n", bootme_dst_port, src_port);
+       bootme_dst_port = src_port;
+
        bootme_state = bootme_packet_handler(eth_pkt, eth_len);
        debug("bootme_packet_handler() returned %d\n", bootme_state);
        if (bootme_state != last_state)
-               debug("bootme_state: %d -> %d\n", last_state, bootme_state);
+               debug("%s@%d: bootme_state: %d -> %d\n", __func__, __LINE__,
+                       last_state, bootme_state);
        switch (bootme_state) {
        case BOOTME_INIT:
+       case BOOTME_DEBUG_INIT:
                break;
 
        case BOOTME_DOWNLOAD:
                if (last_state != BOOTME_INIT)
-                       NetBootFileXferSize += len - 4;
+                       net_boot_file_size += len - 4;
                /* fallthru */
        case BOOTME_DEBUG:
-               if (last_state == BOOTME_INIT) {
+               if (last_state == BOOTME_INIT ||
+                       last_state == BOOTME_DEBUG_INIT)
                        bootme_timeout = 3 * 1000;
-               }
-               NetSetTimeout(bootme_timeout, bootme_timeout_handler);
+               net_set_timeout_handler(bootme_timeout, bootme_timeout_handler);
                break;
 
        case BOOTME_DONE:
@@ -263,21 +251,24 @@ void BootmeStart(void)
                check_net_config();
 
        if (output_packet_len == 0 ||
-               memcmp(bootme_ether, NetEtherNullAddr, ETH_ALEN) != 0) {
+               is_valid_ethaddr(bootme_ether)) {
                /* wait for incoming packet */
                net_set_udp_handler(bootme_handler);
                bootme_timed_out = 0;
-               NetSetTimeout(bootme_timeout, bootme_timeout_handler);
+               net_set_timeout_handler(bootme_timeout, bootme_timeout_handler);
        } else {
                /* send ARP request */
                uchar *pkt;
 
                net_set_arp_handler(bootme_wait_arp_handler);
-               assert(NetTxPacket != NULL);
-               pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
+               assert(net_tx_packet != NULL);
+               pkt = (uchar *)net_tx_packet + net_eth_hdr_size() + IP_UDP_HDR_SIZE;
                memcpy(pkt, output_packet, output_packet_len);
-               NetSendUDPPacket(bootme_ether, bootme_ip, bootme_dst_port,
+               debug("%s@%d: Sending ARP request:\n", __func__, __LINE__);
+               ce_dump_block(pkt, output_packet_len);
+               net_send_udp_packet(bootme_ether, bootme_ip, bootme_dst_port,
                                bootme_src_port, output_packet_len);
+               output_packet_len = 0;
        }
 }
 
@@ -285,27 +276,24 @@ int bootme_send_frame(const void *buf, size_t len)
 {
        int ret;
        struct eth_device *eth;
-       int inited = 0;
        uchar *pkt;
 
        eth = eth_get_dev();
        if (eth == NULL)
                return -EINVAL;
 
-       if (bootme_state == BOOTME_INIT)
+       if (bootme_state == BOOTME_INIT || bootme_state == BOOTME_DEBUG_INIT)
                check_net_config();
 
        debug("%s: buf: %p len: %u from %pI4:%d to %pI4:%d\n",
-               __func__, buf, len, &NetOurIP, bootme_src_port, &bootme_ip, bootme_dst_port);
-
-       if (memcmp(bootme_ether, NetEtherNullAddr, ETH_ALEN) == 0) {
-               if (eth->state == ETH_STATE_ACTIVE)
-                       return 0;       /* inside net loop */
+               __func__, buf, len, &net_ip, bootme_src_port, &bootme_ip,
+               bootme_dst_port);
 
+       if (is_zero_ethaddr(bootme_ether)) {
                output_packet = buf;
                output_packet_len = len;
                /* wait for arp reply and send packet */
-               ret = NetLoop(BOOTME);
+               ret = net_loop(BOOTME);
                if (ret < 0) {
                        /* drop packet */
                        output_packet_len = 0;
@@ -318,36 +306,33 @@ int bootme_send_frame(const void *buf, size_t len)
 
        if (eth->state != ETH_STATE_ACTIVE) {
                if (eth_is_on_demand_init()) {
-                       ret = eth_init(gd->bd);
+                       ret = eth_init();
                        if (ret < 0)
                                return ret;
                        eth_set_last_protocol(BOOTME);
                } else {
-                       eth_init_state_only(gd->bd);
+                       eth_init_state_only();
                }
-               inited = 1;
        }
 
-       assert(NetTxPacket != NULL);
-       pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
+       assert(net_tx_packet != NULL);
+       pkt = (uchar *)net_tx_packet + net_eth_hdr_size() + IP_UDP_HDR_SIZE;
        memcpy(pkt, buf, len);
 
-       ret = NetSendUDPPacket(bootme_ether, bootme_ip, bootme_dst_port,
+       ret = net_send_udp_packet(bootme_ether, bootme_ip, bootme_dst_port,
                        bootme_src_port, len);
-       if (inited) {
-               debug("Stopping network\n");
-               if (eth_is_on_demand_init())
-                       eth_halt();
-               else
-                       eth_halt_state_only();
-       }
+       if (ret)
+               printf("Failed to send packet: %d\n", ret);
+
        return ret;
 }
 
-static void bootme_init(IPaddr_t server_ip)
+static void bootme_init(struct in_addr server_ip)
 {
+       debug("%s@%d: bootme_state: %d -> %d\n", __func__, __LINE__,
+               bootme_state, BOOTME_INIT);
        bootme_state = BOOTME_INIT;
-       bootme_ip = server_ip;
+       net_copy_ip(&bootme_ip, &server_ip);
        /* force reconfiguration in check_net_config() */
        env_id = 0;
 }
@@ -358,7 +343,7 @@ int BootMeDownload(bootme_hand_f *handler)
 
        bootme_packet_handler = handler;
 
-       ret = NetLoop(BOOTME);
+       ret = net_loop(BOOTME);
        if (ret < 0)
                return BOOTME_ERROR;
        if (bootme_timed_out && bootme_state != BOOTME_INIT)
@@ -374,11 +359,14 @@ int BootMeDebugStart(bootme_hand_f *handler)
        bootme_packet_handler = handler;
 
        bootme_init(bootme_ip);
-       bootme_state = BOOTME_DEBUG;
+       debug("%s@%d: bootme_state: %d -> %d\n", __func__, __LINE__,
+               bootme_state, BOOTME_DEBUG_INIT);
+       bootme_state = BOOTME_DEBUG_INIT;
+
        bootme_timeout = 3 * 1000;
-       NetSetTimeout(bootme_timeout, bootme_timeout_handler);
+       net_set_timeout_handler(bootme_timeout, bootme_timeout_handler);
 
-       ret = NetLoop(BOOTME);
+       ret = net_loop(BOOTME);
        if (ret < 0)
                return BOOTME_ERROR;
        if (bootme_timed_out)
@@ -386,11 +374,11 @@ int BootMeDebugStart(bootme_hand_f *handler)
        return bootme_state;
 }
 
-int BootMeRequest(IPaddr_t server_ip, const void *buf, size_t len, int timeout)
+int BootMeRequest(struct in_addr server_ip, const void *buf, size_t len, int timeout)
 {
        bootme_init(server_ip);
        bootme_timeout = timeout * 1000;
        bootme_timed_out = 0;
-       NetSetTimeout(bootme_timeout, bootme_timeout_handler);
+       net_set_timeout_handler(bootme_timeout, bootme_timeout_handler);
        return bootme_send_frame(buf, len);
 }