1500856ebSRafal Jaworowski /* 2500856ebSRafal Jaworowski * (C) Copyright 2007 Semihalf 3500856ebSRafal Jaworowski * 4500856ebSRafal Jaworowski * Written by: Rafal Jaworowski <raj@semihalf.com> 5500856ebSRafal Jaworowski * 61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 7500856ebSRafal Jaworowski */ 8500856ebSRafal Jaworowski 9500856ebSRafal Jaworowski #include <config.h> 10500856ebSRafal Jaworowski #include <common.h> 11500856ebSRafal Jaworowski #include <net.h> 12500856ebSRafal Jaworowski #include <linux/types.h> 13500856ebSRafal Jaworowski #include <api_public.h> 14500856ebSRafal Jaworowski 15500856ebSRafal Jaworowski DECLARE_GLOBAL_DATA_PTR; 16500856ebSRafal Jaworowski 17500856ebSRafal Jaworowski #define DEBUG 18500856ebSRafal Jaworowski #undef DEBUG 19500856ebSRafal Jaworowski 20500856ebSRafal Jaworowski #ifdef DEBUG 21500856ebSRafal Jaworowski #define debugf(fmt, args...) do { printf("%s(): ", __func__); printf(fmt, ##args); } while (0) 22500856ebSRafal Jaworowski #else 23500856ebSRafal Jaworowski #define debugf(fmt, args...) 24500856ebSRafal Jaworowski #endif 25500856ebSRafal Jaworowski 26500856ebSRafal Jaworowski #define errf(fmt, args...) do { printf("ERROR @ %s(): ", __func__); printf(fmt, ##args); } while (0) 27500856ebSRafal Jaworowski 28*11db3abeSJeroen Hofstee #ifdef CONFIG_CMD_NET 29500856ebSRafal Jaworowski 30500856ebSRafal Jaworowski static int dev_valid_net(void *cookie) 31500856ebSRafal Jaworowski { 32500856ebSRafal Jaworowski return ((void *)eth_get_dev() == cookie) ? 1 : 0; 33500856ebSRafal Jaworowski } 34500856ebSRafal Jaworowski 35500856ebSRafal Jaworowski int dev_open_net(void *cookie) 36500856ebSRafal Jaworowski { 37500856ebSRafal Jaworowski if (!dev_valid_net(cookie)) 38500856ebSRafal Jaworowski return API_ENODEV; 39500856ebSRafal Jaworowski 40500856ebSRafal Jaworowski if (eth_init(gd->bd) < 0) 41500856ebSRafal Jaworowski return API_EIO; 42500856ebSRafal Jaworowski 43500856ebSRafal Jaworowski return 0; 44500856ebSRafal Jaworowski } 45500856ebSRafal Jaworowski 46500856ebSRafal Jaworowski int dev_close_net(void *cookie) 47500856ebSRafal Jaworowski { 48500856ebSRafal Jaworowski if (!dev_valid_net(cookie)) 49500856ebSRafal Jaworowski return API_ENODEV; 50500856ebSRafal Jaworowski 51500856ebSRafal Jaworowski eth_halt(); 52500856ebSRafal Jaworowski return 0; 53500856ebSRafal Jaworowski } 54500856ebSRafal Jaworowski 55500856ebSRafal Jaworowski /* 56500856ebSRafal Jaworowski * There can only be one active eth interface at a time - use what is 57500856ebSRafal Jaworowski * currently set to eth_current 58500856ebSRafal Jaworowski */ 59500856ebSRafal Jaworowski int dev_enum_net(struct device_info *di) 60500856ebSRafal Jaworowski { 61500856ebSRafal Jaworowski struct eth_device *eth_current = eth_get_dev(); 62500856ebSRafal Jaworowski 63500856ebSRafal Jaworowski di->type = DEV_TYP_NET; 64500856ebSRafal Jaworowski di->cookie = (void *)eth_current; 65500856ebSRafal Jaworowski if (di->cookie == NULL) 66500856ebSRafal Jaworowski return 0; 67500856ebSRafal Jaworowski 68500856ebSRafal Jaworowski memcpy(di->di_net.hwaddr, eth_current->enetaddr, 6); 69500856ebSRafal Jaworowski 70500856ebSRafal Jaworowski debugf("device found, returning cookie 0x%08x\n", 71500856ebSRafal Jaworowski (u_int32_t)di->cookie); 72500856ebSRafal Jaworowski 73500856ebSRafal Jaworowski return 1; 74500856ebSRafal Jaworowski } 75500856ebSRafal Jaworowski 76500856ebSRafal Jaworowski int dev_write_net(void *cookie, void *buf, int len) 77500856ebSRafal Jaworowski { 78500856ebSRafal Jaworowski /* XXX verify that cookie points to a valid net device??? */ 79500856ebSRafal Jaworowski 80500856ebSRafal Jaworowski return eth_send(buf, len); 81500856ebSRafal Jaworowski } 82500856ebSRafal Jaworowski 83500856ebSRafal Jaworowski int dev_read_net(void *cookie, void *buf, int len) 84500856ebSRafal Jaworowski { 85500856ebSRafal Jaworowski /* XXX verify that cookie points to a valid net device??? */ 86500856ebSRafal Jaworowski 87500856ebSRafal Jaworowski return eth_receive(buf, len); 88500856ebSRafal Jaworowski } 89*11db3abeSJeroen Hofstee 90*11db3abeSJeroen Hofstee #else 91*11db3abeSJeroen Hofstee 92*11db3abeSJeroen Hofstee int dev_open_net(void *cookie) 93*11db3abeSJeroen Hofstee { 94*11db3abeSJeroen Hofstee return API_ENODEV; 95*11db3abeSJeroen Hofstee } 96*11db3abeSJeroen Hofstee 97*11db3abeSJeroen Hofstee int dev_close_net(void *cookie) 98*11db3abeSJeroen Hofstee { 99*11db3abeSJeroen Hofstee return API_ENODEV; 100*11db3abeSJeroen Hofstee } 101*11db3abeSJeroen Hofstee 102*11db3abeSJeroen Hofstee int dev_enum_net(struct device_info *di) 103*11db3abeSJeroen Hofstee { 104*11db3abeSJeroen Hofstee return 0; 105*11db3abeSJeroen Hofstee } 106*11db3abeSJeroen Hofstee 107*11db3abeSJeroen Hofstee int dev_write_net(void *cookie, void *buf, int len) 108*11db3abeSJeroen Hofstee { 109*11db3abeSJeroen Hofstee return API_ENODEV; 110*11db3abeSJeroen Hofstee } 111*11db3abeSJeroen Hofstee 112*11db3abeSJeroen Hofstee int dev_read_net(void *cookie, void *buf, int len) 113*11db3abeSJeroen Hofstee { 114*11db3abeSJeroen Hofstee return API_ENODEV; 115*11db3abeSJeroen Hofstee } 116*11db3abeSJeroen Hofstee 117*11db3abeSJeroen Hofstee #endif 118