17ac2fe2dSIlya Yanok /* 27ac2fe2dSIlya Yanok * (C) Copyright 2000-2004 37ac2fe2dSIlya Yanok * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 47ac2fe2dSIlya Yanok * 57ac2fe2dSIlya Yanok * (C) Copyright 2012 67ac2fe2dSIlya Yanok * Ilya Yanok <ilya.yanok@gmail.com> 77ac2fe2dSIlya Yanok * 81a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 97ac2fe2dSIlya Yanok */ 107ac2fe2dSIlya Yanok #include <common.h> 1136afd451SNikita Kiryanov #include <errno.h> 127ac2fe2dSIlya Yanok #include <spl.h> 137ac2fe2dSIlya Yanok #include <net.h> 147ac2fe2dSIlya Yanok 157ac2fe2dSIlya Yanok DECLARE_GLOBAL_DATA_PTR; 167ac2fe2dSIlya Yanok 177ec03893SSimon Glass #if defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT) 18*2a2ee2acSSimon Glass static int spl_net_load_image(struct spl_image_info *spl_image, 19*2a2ee2acSSimon Glass struct spl_boot_device *bootdev) 207ac2fe2dSIlya Yanok { 217ac2fe2dSIlya Yanok int rv; 227ac2fe2dSIlya Yanok 237ac2fe2dSIlya Yanok env_init(); 247ac2fe2dSIlya Yanok env_relocate(); 257ac2fe2dSIlya Yanok setenv("autoload", "yes"); 267ac2fe2dSIlya Yanok load_addr = CONFIG_SYS_TEXT_BASE - sizeof(struct image_header); 27d2eaec60SJoe Hershberger rv = eth_initialize(); 287ac2fe2dSIlya Yanok if (rv == 0) { 297ac2fe2dSIlya Yanok printf("No Ethernet devices found\n"); 3036afd451SNikita Kiryanov return -ENODEV; 317ac2fe2dSIlya Yanok } 32ecdfd69aSSimon Glass if (bootdev->boot_device_name) 33ecdfd69aSSimon Glass setenv("ethact", bootdev->boot_device_name); 34bc0571fcSJoe Hershberger rv = net_loop(BOOTP); 357ac2fe2dSIlya Yanok if (rv < 0) { 367ac2fe2dSIlya Yanok printf("Problem booting with BOOTP\n"); 3736afd451SNikita Kiryanov return rv; 387ac2fe2dSIlya Yanok } 39*2a2ee2acSSimon Glass return spl_parse_image_header(spl_image, 4071316c1dSSimon Glass (struct image_header *)load_addr); 417ac2fe2dSIlya Yanok } 427ec03893SSimon Glass #endif 437ec03893SSimon Glass 447ec03893SSimon Glass #ifdef CONFIG_SPL_ETH_SUPPORT 45*2a2ee2acSSimon Glass int spl_net_load_image_cpgmac(struct spl_image_info *spl_image, 46*2a2ee2acSSimon Glass struct spl_boot_device *bootdev) 477ec03893SSimon Glass { 487ec03893SSimon Glass #ifdef CONFIG_SPL_ETH_DEVICE 497ec03893SSimon Glass bootdev->boot_device_name = CONFIG_SPL_ETH_DEVICE; 507ec03893SSimon Glass #endif 517ec03893SSimon Glass 52*2a2ee2acSSimon Glass return spl_net_load_image(spl_image, bootdev); 537ec03893SSimon Glass } 547ec03893SSimon Glass SPL_LOAD_IMAGE_METHOD(0, BOOT_DEVICE_CPGMAC, spl_net_load_image_cpgmac); 557ec03893SSimon Glass #endif 567ec03893SSimon Glass 577ec03893SSimon Glass #ifdef CONFIG_SPL_USBETH_SUPPORT 58*2a2ee2acSSimon Glass int spl_net_load_image_usb(struct spl_image_info *spl_image, 59*2a2ee2acSSimon Glass struct spl_boot_device *bootdev) 607ec03893SSimon Glass { 617ec03893SSimon Glass bootdev->boot_device_name = "usb_ether"; 627ec03893SSimon Glass 63*2a2ee2acSSimon Glass return spl_net_load_image(spl_image, bootdev); 647ec03893SSimon Glass } 657ec03893SSimon Glass SPL_LOAD_IMAGE_METHOD(0, BOOT_DEVICE_USBETH, spl_net_load_image_usb); 667ec03893SSimon Glass #endif 67