1500856ebSRafal Jaworowski /* 2500856ebSRafal Jaworowski * (C) Copyright 2007 Semihalf 3500856ebSRafal Jaworowski * 4500856ebSRafal Jaworowski * Written by: Rafal Jaworowski <raj@semihalf.com> 5500856ebSRafal Jaworowski * 6*1a459660SWolfgang 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 28500856ebSRafal Jaworowski 29500856ebSRafal Jaworowski static int dev_valid_net(void *cookie) 30500856ebSRafal Jaworowski { 31500856ebSRafal Jaworowski return ((void *)eth_get_dev() == cookie) ? 1 : 0; 32500856ebSRafal Jaworowski } 33500856ebSRafal Jaworowski 34500856ebSRafal Jaworowski int dev_open_net(void *cookie) 35500856ebSRafal Jaworowski { 36500856ebSRafal Jaworowski if (!dev_valid_net(cookie)) 37500856ebSRafal Jaworowski return API_ENODEV; 38500856ebSRafal Jaworowski 39500856ebSRafal Jaworowski if (eth_init(gd->bd) < 0) 40500856ebSRafal Jaworowski return API_EIO; 41500856ebSRafal Jaworowski 42500856ebSRafal Jaworowski return 0; 43500856ebSRafal Jaworowski } 44500856ebSRafal Jaworowski 45500856ebSRafal Jaworowski int dev_close_net(void *cookie) 46500856ebSRafal Jaworowski { 47500856ebSRafal Jaworowski if (!dev_valid_net(cookie)) 48500856ebSRafal Jaworowski return API_ENODEV; 49500856ebSRafal Jaworowski 50500856ebSRafal Jaworowski eth_halt(); 51500856ebSRafal Jaworowski return 0; 52500856ebSRafal Jaworowski } 53500856ebSRafal Jaworowski 54500856ebSRafal Jaworowski /* 55500856ebSRafal Jaworowski * There can only be one active eth interface at a time - use what is 56500856ebSRafal Jaworowski * currently set to eth_current 57500856ebSRafal Jaworowski */ 58500856ebSRafal Jaworowski int dev_enum_net(struct device_info *di) 59500856ebSRafal Jaworowski { 60500856ebSRafal Jaworowski struct eth_device *eth_current = eth_get_dev(); 61500856ebSRafal Jaworowski 62500856ebSRafal Jaworowski di->type = DEV_TYP_NET; 63500856ebSRafal Jaworowski di->cookie = (void *)eth_current; 64500856ebSRafal Jaworowski if (di->cookie == NULL) 65500856ebSRafal Jaworowski return 0; 66500856ebSRafal Jaworowski 67500856ebSRafal Jaworowski memcpy(di->di_net.hwaddr, eth_current->enetaddr, 6); 68500856ebSRafal Jaworowski 69500856ebSRafal Jaworowski debugf("device found, returning cookie 0x%08x\n", 70500856ebSRafal Jaworowski (u_int32_t)di->cookie); 71500856ebSRafal Jaworowski 72500856ebSRafal Jaworowski return 1; 73500856ebSRafal Jaworowski } 74500856ebSRafal Jaworowski 75500856ebSRafal Jaworowski int dev_write_net(void *cookie, void *buf, int len) 76500856ebSRafal Jaworowski { 77500856ebSRafal Jaworowski /* XXX verify that cookie points to a valid net device??? */ 78500856ebSRafal Jaworowski 79500856ebSRafal Jaworowski return eth_send(buf, len); 80500856ebSRafal Jaworowski } 81500856ebSRafal Jaworowski 82500856ebSRafal Jaworowski int dev_read_net(void *cookie, void *buf, int len) 83500856ebSRafal Jaworowski { 84500856ebSRafal Jaworowski /* XXX verify that cookie points to a valid net device??? */ 85500856ebSRafal Jaworowski 86500856ebSRafal Jaworowski return eth_receive(buf, len); 87500856ebSRafal Jaworowski } 88