1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2500856ebSRafal Jaworowski /*
3500856ebSRafal Jaworowski * (C) Copyright 2007 Semihalf
4500856ebSRafal Jaworowski *
5500856ebSRafal Jaworowski * Written by: Rafal Jaworowski <raj@semihalf.com>
6500856ebSRafal Jaworowski */
7500856ebSRafal Jaworowski
8500856ebSRafal Jaworowski #include <config.h>
9500856ebSRafal Jaworowski #include <common.h>
10500856ebSRafal Jaworowski #include <net.h>
11500856ebSRafal Jaworowski #include <linux/types.h>
12500856ebSRafal Jaworowski #include <api_public.h>
13500856ebSRafal Jaworowski
14500856ebSRafal Jaworowski #define DEBUG
15500856ebSRafal Jaworowski #undef DEBUG
16500856ebSRafal Jaworowski
17500856ebSRafal Jaworowski #ifdef DEBUG
18500856ebSRafal Jaworowski #define debugf(fmt, args...) do { printf("%s(): ", __func__); printf(fmt, ##args); } while (0)
19500856ebSRafal Jaworowski #else
20500856ebSRafal Jaworowski #define debugf(fmt, args...)
21500856ebSRafal Jaworowski #endif
22500856ebSRafal Jaworowski
23500856ebSRafal Jaworowski #define errf(fmt, args...) do { printf("ERROR @ %s(): ", __func__); printf(fmt, ##args); } while (0)
24500856ebSRafal Jaworowski
2521181578SMichal Simek #if defined(CONFIG_CMD_NET) && !defined(CONFIG_DM_ETH)
26500856ebSRafal Jaworowski
dev_valid_net(void * cookie)27500856ebSRafal Jaworowski static int dev_valid_net(void *cookie)
28500856ebSRafal Jaworowski {
29500856ebSRafal Jaworowski return ((void *)eth_get_dev() == cookie) ? 1 : 0;
30500856ebSRafal Jaworowski }
31500856ebSRafal Jaworowski
dev_open_net(void * cookie)32500856ebSRafal Jaworowski int dev_open_net(void *cookie)
33500856ebSRafal Jaworowski {
34500856ebSRafal Jaworowski if (!dev_valid_net(cookie))
35500856ebSRafal Jaworowski return API_ENODEV;
36500856ebSRafal Jaworowski
37d2eaec60SJoe Hershberger if (eth_init() < 0)
38500856ebSRafal Jaworowski return API_EIO;
39500856ebSRafal Jaworowski
40500856ebSRafal Jaworowski return 0;
41500856ebSRafal Jaworowski }
42500856ebSRafal Jaworowski
dev_close_net(void * cookie)43500856ebSRafal Jaworowski int dev_close_net(void *cookie)
44500856ebSRafal Jaworowski {
45500856ebSRafal Jaworowski if (!dev_valid_net(cookie))
46500856ebSRafal Jaworowski return API_ENODEV;
47500856ebSRafal Jaworowski
48500856ebSRafal Jaworowski eth_halt();
49500856ebSRafal Jaworowski return 0;
50500856ebSRafal Jaworowski }
51500856ebSRafal Jaworowski
52500856ebSRafal Jaworowski /*
53500856ebSRafal Jaworowski * There can only be one active eth interface at a time - use what is
54500856ebSRafal Jaworowski * currently set to eth_current
55500856ebSRafal Jaworowski */
dev_enum_net(struct device_info * di)56500856ebSRafal Jaworowski int dev_enum_net(struct device_info *di)
57500856ebSRafal Jaworowski {
58500856ebSRafal Jaworowski struct eth_device *eth_current = eth_get_dev();
59500856ebSRafal Jaworowski
60500856ebSRafal Jaworowski di->type = DEV_TYP_NET;
61500856ebSRafal Jaworowski di->cookie = (void *)eth_current;
62500856ebSRafal Jaworowski if (di->cookie == NULL)
63500856ebSRafal Jaworowski return 0;
64500856ebSRafal Jaworowski
65500856ebSRafal Jaworowski memcpy(di->di_net.hwaddr, eth_current->enetaddr, 6);
66500856ebSRafal Jaworowski
67500856ebSRafal Jaworowski debugf("device found, returning cookie 0x%08x\n",
68500856ebSRafal Jaworowski (u_int32_t)di->cookie);
69500856ebSRafal Jaworowski
70500856ebSRafal Jaworowski return 1;
71500856ebSRafal Jaworowski }
72500856ebSRafal Jaworowski
dev_write_net(void * cookie,void * buf,int len)73500856ebSRafal Jaworowski int dev_write_net(void *cookie, void *buf, int len)
74500856ebSRafal Jaworowski {
75500856ebSRafal Jaworowski /* XXX verify that cookie points to a valid net device??? */
76500856ebSRafal Jaworowski
77500856ebSRafal Jaworowski return eth_send(buf, len);
78500856ebSRafal Jaworowski }
79500856ebSRafal Jaworowski
dev_read_net(void * cookie,void * buf,int len)80500856ebSRafal Jaworowski int dev_read_net(void *cookie, void *buf, int len)
81500856ebSRafal Jaworowski {
82500856ebSRafal Jaworowski /* XXX verify that cookie points to a valid net device??? */
83500856ebSRafal Jaworowski
84500856ebSRafal Jaworowski return eth_receive(buf, len);
85500856ebSRafal Jaworowski }
8611db3abeSJeroen Hofstee
8711db3abeSJeroen Hofstee #else
8811db3abeSJeroen Hofstee
dev_open_net(void * cookie)8911db3abeSJeroen Hofstee int dev_open_net(void *cookie)
9011db3abeSJeroen Hofstee {
9111db3abeSJeroen Hofstee return API_ENODEV;
9211db3abeSJeroen Hofstee }
9311db3abeSJeroen Hofstee
dev_close_net(void * cookie)9411db3abeSJeroen Hofstee int dev_close_net(void *cookie)
9511db3abeSJeroen Hofstee {
9611db3abeSJeroen Hofstee return API_ENODEV;
9711db3abeSJeroen Hofstee }
9811db3abeSJeroen Hofstee
dev_enum_net(struct device_info * di)9911db3abeSJeroen Hofstee int dev_enum_net(struct device_info *di)
10011db3abeSJeroen Hofstee {
10111db3abeSJeroen Hofstee return 0;
10211db3abeSJeroen Hofstee }
10311db3abeSJeroen Hofstee
dev_write_net(void * cookie,void * buf,int len)10411db3abeSJeroen Hofstee int dev_write_net(void *cookie, void *buf, int len)
10511db3abeSJeroen Hofstee {
10611db3abeSJeroen Hofstee return API_ENODEV;
10711db3abeSJeroen Hofstee }
10811db3abeSJeroen Hofstee
dev_read_net(void * cookie,void * buf,int len)10911db3abeSJeroen Hofstee int dev_read_net(void *cookie, void *buf, int len)
11011db3abeSJeroen Hofstee {
11111db3abeSJeroen Hofstee return API_ENODEV;
11211db3abeSJeroen Hofstee }
11311db3abeSJeroen Hofstee
11411db3abeSJeroen Hofstee #endif
115